SHARE
TWEET

Untitled

a guest Nov 10th, 2015 378 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name            Dollchan Extension Tools Syn-ch 2.1
  3. // @version         15.1.28.0
  4. // @namespace       http://www.freedollchan.org/scripts/*
  5. // @author          Sthephan Shinkufag @ FreeDollChan
  6. // @copyright       (c) 2015 Dollchan Extension Tools Team. See the LICENSE file for license rights and limitations (MIT).
  7. // @description     Doing some profit for imageboards
  8. // @icon            https://raw.github.com/SthephanShinkufag/Dollchan-Extension-Tools/master/Icon.png
  9. // @updateURL       https://raw.github.com/SthephanShinkufag/Dollchan-Extension-Tools/master/Dollchan_Extension_Tools.meta.js
  10. // @run-at          document-start
  11. // @grant           GM_getValue
  12. // @grant           GM_setValue
  13. // @grant           GM_deleteValue
  14. // @grant           GM_openInTab
  15. // @grant           GM_xmlhttpRequest
  16. // @grant           unsafeWindow
  17. // @include         http://syn-ch.org*
  18. // @include         http://syn-ch.com*
  19. // @include         http://syn-ch.ru*
  20. // ==/UserScript==
  21. (function de_main_func_outer() {
  22.  
  23. !function(global, framework, undefined){
  24.  
  25.  
  26.  
  27.  
  28. var OBJECT          = 'Object'
  29.   , FUNCTION        = 'Function'
  30.   , ARRAY           = 'Array'
  31.   , STRING          = 'String'
  32.   , NUMBER          = 'Number'
  33.   , REGEXP          = 'RegExp'
  34.   , DATE            = 'Date'
  35.   , MAP             = 'Map'
  36.   , SET             = 'Set'
  37.   , WEAKMAP         = 'WeakMap'
  38.   , WEAKSET         = 'WeakSet'
  39.   , SYMBOL          = 'Symbol'
  40.   , PROMISE         = 'Promise'
  41.   , MATH            = 'Math'
  42.   , ARGUMENTS       = 'Arguments'
  43.   , PROTOTYPE       = 'prototype'
  44.   , CONSTRUCTOR     = 'constructor'
  45.   , TO_STRING       = 'toString'
  46.   , TO_STRING_TAG   = TO_STRING + 'Tag'
  47.   , TO_LOCALE       = 'toLocaleString'
  48.   , HAS_OWN         = 'hasOwnProperty'
  49.   , FOR_EACH        = 'forEach'
  50.   , ITERATOR        = 'iterator'
  51.   , FF_ITERATOR     = '@@' + ITERATOR
  52.   , PROCESS         = 'process'
  53.   , CREATE_ELEMENT  = 'createElement'
  54.  
  55.   , Function        = global[FUNCTION]
  56.   , Object          = global[OBJECT]
  57.   , Array           = global[ARRAY]
  58.   , String          = global[STRING]
  59.   , Number          = global[NUMBER]
  60.   , RegExp          = global[REGEXP]
  61.   , Date            = global[DATE]
  62.   , Map             = global[MAP]
  63.   , Set             = global[SET]
  64.   , WeakMap         = global[WEAKMAP]
  65.   , WeakSet         = global[WEAKSET]
  66.   , Symbol          = global[SYMBOL]
  67.   , Math            = global[MATH]
  68.   , TypeError       = global.TypeError
  69.   , RangeError      = global.RangeError
  70.   , setTimeout      = global.setTimeout
  71.   , setImmediate    = global.setImmediate
  72.   , clearImmediate  = global.clearImmediate
  73.   , parseInt        = global.parseInt
  74.   , isFinite        = global.isFinite
  75.   , process         = global[PROCESS]
  76.   , nextTick        = process && process.nextTick
  77.   , document        = global.document
  78.   , html            = document && document.documentElement
  79.   , navigator       = global.navigator
  80.   , define          = global.define
  81.   , ArrayProto      = Array[PROTOTYPE]
  82.   , ObjectProto     = Object[PROTOTYPE]
  83.   , FunctionProto   = Function[PROTOTYPE]
  84.   , Infinity        = 1 / 0
  85.   , DOT             = '.'
  86.  
  87.   , CONSOLE_METHODS = 'assert,clear,count,debug,dir,dirxml,error,exception,' +
  88.       'group,groupCollapsed,groupEnd,info,isIndependentlyComposed,log,' +
  89.       'markTimeline,profile,profileEnd,table,time,timeEnd,timeline,' +
  90.       'timelineEnd,timeStamp,trace,warn';
  91.  
  92.  
  93. function isObject(it){
  94.   return it !== null && (typeof it == 'object' || typeof it == 'function');
  95. }
  96. function isFunction(it){
  97.   return typeof it == 'function';
  98. }
  99.  
  100. var isNative = ctx(/./.test, /\[native code\]\s*\}\s*$/, 1);
  101.  
  102.  
  103.  
  104. var toString = ObjectProto[TO_STRING];
  105. function setToStringTag(it, tag, stat){
  106.   if(it && !has(it = stat ? it : it[PROTOTYPE], SYMBOL_TAG))hidden(it, SYMBOL_TAG, tag);
  107. }
  108. function cof(it){
  109.   return toString.call(it).slice(8, -1);
  110. }
  111. function classof(it){
  112.   var O, T;
  113.   return it == undefined ? it === undefined ? 'Undefined' : 'Null'
  114.     : typeof (T = (O = Object(it))[SYMBOL_TAG]) == 'string' ? T : cof(O);
  115. }
  116.  
  117.  
  118. var call  = FunctionProto.call
  119.   , apply = FunctionProto.apply
  120.   , REFERENCE_GET;
  121.  
  122. function part(){
  123.   var fn     = assertFunction(this)
  124.     , length = arguments.length
  125.     , args   = Array(length)
  126.     , i      = 0
  127.     , _      = path._
  128.     , holder = false;
  129.   while(length > i)if((args[i] = arguments[i++]) === _)holder = true;
  130.   return function(){
  131.     var that    = this
  132.       , _length = arguments.length
  133.       , i = 0, j = 0, _args;
  134.     if(!holder && !_length)return invoke(fn, args, that);
  135.     _args = args.slice();
  136.     if(holder)for(;length > i; i++)if(_args[i] === _)_args[i] = arguments[j++];
  137.     while(_length > j)_args.push(arguments[j++]);
  138.     return invoke(fn, _args, that);
  139.   }
  140. }
  141.  
  142. function ctx(fn, that, length){
  143.   assertFunction(fn);
  144.   if(~length && that === undefined)return fn;
  145.   switch(length){
  146.     case 1: return function(a){
  147.       return fn.call(that, a);
  148.     }
  149.     case 2: return function(a, b){
  150.       return fn.call(that, a, b);
  151.     }
  152.     case 3: return function(a, b, c){
  153.       return fn.call(that, a, b, c);
  154.     }
  155.   } return function(){
  156.       return fn.apply(that, arguments);
  157.   }
  158. }
  159.  
  160.  
  161. function invoke(fn, args, that){
  162.   var un = that === undefined;
  163.   switch(args.length | 0){
  164.     case 0: return un ? fn()
  165.                       : fn.call(that);
  166.     case 1: return un ? fn(args[0])
  167.                       : fn.call(that, args[0]);
  168.     case 2: return un ? fn(args[0], args[1])
  169.                       : fn.call(that, args[0], args[1]);
  170.     case 3: return un ? fn(args[0], args[1], args[2])
  171.                       : fn.call(that, args[0], args[1], args[2]);
  172.     case 4: return un ? fn(args[0], args[1], args[2], args[3])
  173.                       : fn.call(that, args[0], args[1], args[2], args[3]);
  174.     case 5: return un ? fn(args[0], args[1], args[2], args[3], args[4])
  175.                       : fn.call(that, args[0], args[1], args[2], args[3], args[4]);
  176.   } return              fn.apply(that, args);
  177. }
  178. function construct(target, argumentsList ){
  179.   var proto    = assertFunction(arguments.length < 3 ? target : arguments[2])[PROTOTYPE]
  180.     , instance = create(isObject(proto) ? proto : ObjectProto)
  181.     , result   = apply.call(target, instance, argumentsList);
  182.   return isObject(result) ? result : instance;
  183. }
  184.  
  185.  
  186. var create           = Object.create
  187.   , getPrototypeOf   = Object.getPrototypeOf
  188.   , setPrototypeOf   = Object.setPrototypeOf
  189.   , defineProperty   = Object.defineProperty
  190.   , defineProperties = Object.defineProperties
  191.   , getOwnDescriptor = Object.getOwnPropertyDescriptor
  192.   , getKeys          = Object.keys
  193.   , getNames         = Object.getOwnPropertyNames
  194.   , getSymbols       = Object.getOwnPropertySymbols
  195.   , isFrozen         = Object.isFrozen
  196.   , has              = ctx(call, ObjectProto[HAS_OWN], 2)
  197.  
  198.   , ES5Object        = Object
  199.   , Dict;
  200. function toObject(it){
  201.   return ES5Object(assertDefined(it));
  202. }
  203. function returnIt(it){
  204.   return it;
  205. }
  206. function returnThis(){
  207.   return this;
  208. }
  209. function get(object, key){
  210.   if(has(object, key))return object[key];
  211. }
  212. function ownKeys(it){
  213.   assertObject(it);
  214.   return getSymbols ? getNames(it).concat(getSymbols(it)) : getNames(it);
  215. }
  216.  
  217. var assign = Object.assign || function(target, source){
  218.   var T = Object(assertDefined(target))
  219.     , l = arguments.length
  220.     , i = 1;
  221.   while(l > i){
  222.     var S      = ES5Object(arguments[i++])
  223.       , keys   = getKeys(S)
  224.       , length = keys.length
  225.       , j      = 0
  226.       , key;
  227.     while(length > j)T[key = keys[j++]] = S[key];
  228.   }
  229.   return T;
  230. }
  231. function keyOf(object, el){
  232.   var O      = toObject(object)
  233.     , keys   = getKeys(O)
  234.     , length = keys.length
  235.     , index  = 0
  236.     , key;
  237.   while(length > index)if(O[key = keys[index++]] === el)return key;
  238. }
  239.  
  240.  
  241.  
  242. function array(it){
  243.   return String(it).split(',');
  244. }
  245. var push    = ArrayProto.push
  246.   , unshift = ArrayProto.unshift
  247.   , slice   = ArrayProto.slice
  248.   , splice  = ArrayProto.splice
  249.   , indexOf = ArrayProto.indexOf
  250.   , forEach = ArrayProto[FOR_EACH];
  251.  
  252. function createArrayMethod(type){
  253.   var isMap       = type == 1
  254.     , isFilter    = type == 2
  255.     , isSome      = type == 3
  256.     , isEvery     = type == 4
  257.     , isFindIndex = type == 6
  258.     , noholes     = type == 5 || isFindIndex;
  259.   return function(callbackfn){
  260.     var O      = Object(assertDefined(this))
  261.       , that   = arguments[1]
  262.       , self   = ES5Object(O)
  263.       , f      = ctx(callbackfn, that, 3)
  264.       , length = toLength(self.length)
  265.       , index  = 0
  266.       , result = isMap ? Array(length) : isFilter ? [] : undefined
  267.       , val, res;
  268.     for(;length > index; index++)if(noholes || index in self){
  269.       val = self[index];
  270.       res = f(val, index, O);
  271.       if(type){
  272.         if(isMap)result[index] = res;            
  273.         else if(res)switch(type){
  274.           case 3: return true;                  
  275.           case 5: return val;                    
  276.           case 6: return index;                  
  277.           case 2: result.push(val);              
  278.         } else if(isEvery)return false;          
  279.       }
  280.     }
  281.     return isFindIndex ? -1 : isSome || isEvery ? isEvery : result;
  282.   }
  283. }
  284. function createArrayContains(isContains){
  285.   return function(el ){
  286.     var O      = toObject(this)
  287.       , length = toLength(O.length)
  288.       , index  = toIndex(arguments[1], length);
  289.     if(isContains && el != el){
  290.       for(;length > index; index++)if(sameNaN(O[index]))return isContains || index;
  291.     } else for(;length > index; index++)if(isContains || index in O){
  292.       if(O[index] === el)return isContains || index;
  293.     } return !isContains && -1;
  294.   }
  295. }
  296. function generic(A, B){
  297.  
  298.   return typeof A == 'function' ? A : B;
  299. }
  300.  
  301.  
  302. var MAX_SAFE_INTEGER = 0x1fffffffffffff
  303.   , pow    = Math.pow
  304.   , abs    = Math.abs
  305.   , ceil   = Math.ceil
  306.   , floor  = Math.floor
  307.   , max    = Math.max
  308.   , min    = Math.min
  309.   , random = Math.random
  310.   , trunc  = Math.trunc || function(it){
  311.       return (it > 0 ? floor : ceil)(it);
  312.     }
  313.  
  314. function sameNaN(number){
  315.   return number != number;
  316. }
  317.  
  318. function toInteger(it){
  319.   return isNaN(it) ? 0 : trunc(it);
  320. }
  321.  
  322. function toLength(it){
  323.   return it > 0 ? min(toInteger(it), MAX_SAFE_INTEGER) : 0;
  324. }
  325. function toIndex(index, length){
  326.   var index = toInteger(index);
  327.   return index < 0 ? max(index + length, 0) : min(index, length);
  328. }
  329. function lz(num){
  330.   return num > 9 ? num : '0' + num;
  331. }
  332.  
  333. function createReplacer(regExp, replace, isStatic){
  334.   var replacer = isObject(replace) ? function(part){
  335.     return replace[part];
  336.   } : replace;
  337.   return function(it){
  338.     return String(isStatic ? it : this).replace(regExp, replacer);
  339.   }
  340. }
  341. function createPointAt(toString){
  342.   return function(pos){
  343.     var s = String(assertDefined(this))
  344.       , i = toInteger(pos)
  345.       , l = s.length
  346.       , a, b;
  347.     if(i < 0 || i >= l)return toString ? '' : undefined;
  348.     a = s.charCodeAt(i);
  349.     return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
  350.       ? toString ? s.charAt(i) : a
  351.       : toString ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  352.   }
  353. }
  354.  
  355.  
  356. var REDUCE_ERROR = 'Reduce of empty object with no initial value';
  357. function assert(condition, msg1, msg2){
  358.   if(!condition)throw TypeError(msg2 ? msg1 + msg2 : msg1);
  359. }
  360. function assertDefined(it){
  361.   if(it == undefined)throw TypeError('Function called on null or undefined');
  362.   return it;
  363. }
  364. function assertFunction(it){
  365.   assert(isFunction(it), it, ' is not a function!');
  366.   return it;
  367. }
  368. function assertObject(it){
  369.   assert(isObject(it), it, ' is not an object!');
  370.   return it;
  371. }
  372. function assertInstance(it, Constructor, name){
  373.   assert(it instanceof Constructor, name, ": use the 'new' operator!");
  374. }
  375.  
  376.  
  377. function descriptor(bitmap, value){
  378.   return {
  379.     enumerable  : !(bitmap & 1),
  380.     configurable: !(bitmap & 2),
  381.     writable    : !(bitmap & 4),
  382.     value       : value
  383.   }
  384. }
  385. function simpleSet(object, key, value){
  386.   object[key] = value;
  387.   return object;
  388. }
  389. function createDefiner(bitmap){
  390.   return DESC ? function(object, key, value){
  391.     return defineProperty(object, key, descriptor(bitmap, value));
  392.   } : simpleSet;
  393. }
  394. function uid(key){
  395.   return SYMBOL + '(' + key + ')_' + (++sid + random())[TO_STRING](36);
  396. }
  397. function getWellKnownSymbol(name, setter){
  398.   return (Symbol && Symbol[name]) || (setter ? Symbol : safeSymbol)(SYMBOL + DOT + name);
  399. }
  400.  
  401. var DESC = !!function(){
  402.       try {
  403.         return defineProperty({}, 'a', {get: function(){ return 2 }}).a == 2;
  404.       } catch(e){}
  405.     }()
  406.   , sid    = 0
  407.   , hidden = createDefiner(1)
  408.   , set    = Symbol ? simpleSet : hidden
  409.   , safeSymbol = Symbol || uid;
  410. function assignHidden(target, src){
  411.   for(var key in src)hidden(target, key, src[key]);
  412.   return target;
  413. }
  414.  
  415. var SYMBOL_UNSCOPABLES = getWellKnownSymbol('unscopables')
  416.   , ArrayUnscopables   = ArrayProto[SYMBOL_UNSCOPABLES] || {}
  417.   , SYMBOL_SPECIES     = getWellKnownSymbol('species');
  418. function setSpecies(C){
  419.   if(framework || !isNative(C))defineProperty(C, SYMBOL_SPECIES, {
  420.     configurable: true,
  421.     get: returnThis
  422.   });
  423. }
  424.  
  425.  
  426. var SYMBOL_ITERATOR = getWellKnownSymbol(ITERATOR)
  427.   , SYMBOL_TAG      = getWellKnownSymbol(TO_STRING_TAG)
  428.   , SUPPORT_FF_ITER = FF_ITERATOR in ArrayProto
  429.   , ITER  = safeSymbol('iter')
  430.   , KEY   = 1
  431.   , VALUE = 2
  432.   , Iterators = {}
  433.   , IteratorPrototype = {}
  434.   , NATIVE_ITERATORS = SYMBOL_ITERATOR in ArrayProto
  435.    
  436.   , BUGGY_ITERATORS = 'keys' in ArrayProto && !('next' in [].keys());
  437.  
  438. setIterator(IteratorPrototype, returnThis);
  439. function setIterator(O, value){
  440.   hidden(O, SYMBOL_ITERATOR, value);
  441.  
  442.   SUPPORT_FF_ITER && hidden(O, FF_ITERATOR, value);
  443. }
  444. function createIterator(Constructor, NAME, next, proto){
  445.   Constructor[PROTOTYPE] = create(proto || IteratorPrototype, {next: descriptor(1, next)});
  446.   setToStringTag(Constructor, NAME + ' Iterator');
  447. }
  448. function defineIterator(Constructor, NAME, value, DEFAULT){
  449.   var proto = Constructor[PROTOTYPE]
  450.     , iter  = get(proto, SYMBOL_ITERATOR) || get(proto, FF_ITERATOR) || (DEFAULT && get(proto, DEFAULT)) || value;
  451.   if(framework){
  452.    
  453.     setIterator(proto, iter);
  454.     if(iter !== value){
  455.       var iterProto = getPrototypeOf(iter.call(new Constructor));
  456.      
  457.       setToStringTag(iterProto, NAME + ' Iterator', true);
  458.      
  459.       has(proto, FF_ITERATOR) && setIterator(iterProto, returnThis);
  460.     }
  461.   }
  462.  
  463.   Iterators[NAME] = iter;
  464.  
  465.   Iterators[NAME + ' Iterator'] = returnThis;
  466.   return iter;
  467. }
  468. function defineStdIterators(Base, NAME, Constructor, next, DEFAULT, IS_SET){
  469.   function createIter(kind){
  470.     return function(){
  471.       return new Constructor(this, kind);
  472.     }
  473.   }
  474.   createIterator(Constructor, NAME, next);
  475.   var entries = createIter(KEY+VALUE)
  476.     , values  = createIter(VALUE);
  477.   if(DEFAULT == VALUE)values = defineIterator(Base, NAME, values, 'values');
  478.   else entries = defineIterator(Base, NAME, entries, 'entries');
  479.   if(DEFAULT){
  480.     $define(PROTO + FORCED * BUGGY_ITERATORS, NAME, {
  481.       entries: entries,
  482.       keys: IS_SET ? values : createIter(KEY),
  483.       values: values
  484.     });
  485.   }
  486. }
  487. function iterResult(done, value){
  488.   return {value: value, done: !!done};
  489. }
  490. function isIterable(it){
  491.   var O      = Object(it)
  492.     , Symbol = global[SYMBOL]
  493.     , hasExt = (Symbol && Symbol[ITERATOR] || FF_ITERATOR) in O;
  494.   return hasExt || SYMBOL_ITERATOR in O || has(Iterators, classof(O));
  495. }
  496. function getIterator(it){
  497.   var Symbol  = global[SYMBOL]
  498.     , ext     = it[Symbol && Symbol[ITERATOR] || FF_ITERATOR]
  499.     , getIter = ext || it[SYMBOL_ITERATOR] || Iterators[classof(it)];
  500.   return assertObject(getIter.call(it));
  501. }
  502. function stepCall(fn, value, entries){
  503.   return entries ? invoke(fn, value) : fn(value);
  504. }
  505. function forOf(iterable, entries, fn, that){
  506.   var iterator = getIterator(iterable)
  507.     , f        = ctx(fn, that, entries ? 2 : 1)
  508.     , step;
  509.   while(!(step = iterator.next()).done)if(stepCall(f, step.value, entries) === false)return;
  510. }
  511.  
  512.  
  513. var NODE = cof(process) == PROCESS
  514.   , core = {}
  515.   , path = framework ? global : core
  516.   , old  = global.core
  517.   , exportGlobal
  518.  
  519.   , FORCED = 1
  520.   , GLOBAL = 2
  521.   , STATIC = 4
  522.   , PROTO  = 8
  523.   , BIND   = 16
  524.   , WRAP   = 32
  525.   , SIMPLE = 64;
  526. function $define(type, name, source){
  527.   var key, own, out, exp
  528.     , isGlobal = type & GLOBAL
  529.     , target   = isGlobal ? global : (type & STATIC)
  530.         ? global[name] : (global[name] || ObjectProto)[PROTOTYPE]
  531.     , exports  = isGlobal ? core : core[name] || (core[name] = {});
  532.   if(isGlobal)source = name;
  533.   for(key in source){
  534.    
  535.     own = !(type & FORCED) && target && key in target
  536.       && (!isFunction(target[key]) || isNative(target[key]));
  537.    
  538.     out = (own ? target : source)[key];
  539.    
  540.     if(!framework && isGlobal && !isFunction(target[key]))exp = source[key];
  541.    
  542.     else if(type & BIND && own)exp = ctx(out, global);
  543.    
  544.     else if(type & WRAP && !framework && target[key] == out){
  545.       exp = function(param){
  546.         return this instanceof out ? new out(param) : out(param);
  547.       }
  548.       exp[PROTOTYPE] = out[PROTOTYPE];
  549.     } else exp = type & PROTO && isFunction(out) ? ctx(call, out) : out;
  550.    
  551.     if(framework && target && !own){
  552.       if(isGlobal || type & SIMPLE)target[key] = out;
  553.       else delete target[key] && hidden(target, key, out);
  554.     }
  555.    
  556.     if(exports[key] != out)hidden(exports, key, exp);
  557.   }
  558. }
  559.  
  560. if(typeof module != 'undefined' && module.exports)module.exports = core;
  561.  
  562. else if(isFunction(define) && define.amd)define(function(){return core});
  563.  
  564. else exportGlobal = true;
  565. if(exportGlobal || framework){
  566.   core.noConflict = function(){
  567.     global.core = old;
  568.     return core;
  569.   }
  570.   global.core = core;
  571. }
  572.  
  573.  
  574.  
  575.  
  576. !function(TAG, SymbolRegistry, AllSymbols, setter){
  577.  
  578.   if(!isNative(Symbol)){
  579.     Symbol = function(description){
  580.       assert(!(this instanceof Symbol), SYMBOL + ' is not a ' + CONSTRUCTOR);
  581.       var tag = uid(description)
  582.         , sym = set(create(Symbol[PROTOTYPE]), TAG, tag);
  583.       AllSymbols[tag] = sym;
  584.       DESC && setter && defineProperty(ObjectProto, tag, {
  585.         configurable: true,
  586.         set: function(value){
  587.           hidden(this, tag, value);
  588.         }
  589.       });
  590.       return sym;
  591.     }
  592.     hidden(Symbol[PROTOTYPE], TO_STRING, function(){
  593.       return this[TAG];
  594.     });
  595.   }
  596.   $define(GLOBAL + WRAP, {Symbol: Symbol});
  597.  
  598.   var symbolStatics = {
  599.    
  600.     'for': function(key){
  601.       return has(SymbolRegistry, key += '')
  602.         ? SymbolRegistry[key]
  603.         : SymbolRegistry[key] = Symbol(key);
  604.     },
  605.    
  606.     iterator: SYMBOL_ITERATOR,
  607.    
  608.     keyFor: part.call(keyOf, SymbolRegistry),
  609.    
  610.     species: SYMBOL_SPECIES,
  611.    
  612.     toStringTag: SYMBOL_TAG = getWellKnownSymbol(TO_STRING_TAG, true),
  613.    
  614.     unscopables: SYMBOL_UNSCOPABLES,
  615.     pure: safeSymbol,
  616.     set: set,
  617.     useSetter: function(){setter = true},
  618.     useSimple: function(){setter = false}
  619.   };
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.   forEach.call(array('hasInstance,isConcatSpreadable,match,replace,search,split,toPrimitive'),
  628.     function(it){
  629.       symbolStatics[it] = getWellKnownSymbol(it);
  630.     }
  631.   );
  632.   $define(STATIC, SYMBOL, symbolStatics);
  633.  
  634.   setToStringTag(Symbol, SYMBOL);
  635.  
  636.   $define(STATIC + FORCED * !isNative(Symbol), OBJECT, {
  637.    
  638.     getOwnPropertyNames: function(it){
  639.       var names = getNames(toObject(it)), result = [], key, i = 0;
  640.       while(names.length > i)has(AllSymbols, key = names[i++]) || result.push(key);
  641.       return result;
  642.     },
  643.    
  644.     getOwnPropertySymbols: function(it){
  645.       var names = getNames(toObject(it)), result = [], key, i = 0;
  646.       while(names.length > i)has(AllSymbols, key = names[i++]) && result.push(AllSymbols[key]);
  647.       return result;
  648.     }
  649.   });
  650. }(safeSymbol('tag'), {}, {}, true);
  651.  
  652.  
  653.  
  654. !function(at){
  655.  
  656.  
  657.  
  658.  
  659.   defineStdIterators(Array, ARRAY, function(iterated, kind){
  660.     set(this, ITER, {o: toObject(iterated), i: 0, k: kind});
  661.  
  662.   }, function(){
  663.     var iter  = this[ITER]
  664.       , O     = iter.o
  665.       , kind  = iter.k
  666.       , index = iter.i++;
  667.     if(!O || index >= O.length){
  668.       iter.o = undefined;
  669.       return iterResult(1);
  670.     }
  671.     if(kind == KEY)  return iterResult(0, index);
  672.     if(kind == VALUE)return iterResult(0, O[index]);
  673.                      return iterResult(0, [index, O[index]]);
  674.   }, VALUE);
  675.  
  676.  
  677.   Iterators[ARGUMENTS] = Iterators[ARRAY];
  678.  
  679.  
  680.   defineStdIterators(String, STRING, function(iterated){
  681.     set(this, ITER, {o: String(iterated), i: 0});
  682.  
  683.   }, function(){
  684.     var iter  = this[ITER]
  685.       , O     = iter.o
  686.       , index = iter.i
  687.       , point;
  688.     if(index >= O.length)return iterResult(1);
  689.     point = at.call(O, index);
  690.     iter.i += point.length;
  691.     return iterResult(0, point);
  692.   });
  693. }(createPointAt(true));
  694.  
  695.  
  696.  
  697.  
  698.  
  699. isFunction(setImmediate) && isFunction(clearImmediate) || function(ONREADYSTATECHANGE){
  700.   var postMessage      = global.postMessage
  701.     , addEventListener = global.addEventListener
  702.     , MessageChannel   = global.MessageChannel
  703.     , counter          = 0
  704.     , queue            = {}
  705.     , defer, channel, port;
  706.   setImmediate = function(fn){
  707.     var args = [], i = 1;
  708.     while(arguments.length > i)args.push(arguments[i++]);
  709.     queue[++counter] = function(){
  710.       invoke(isFunction(fn) ? fn : Function(fn), args);
  711.     }
  712.     defer(counter);
  713.     return counter;
  714.   }
  715.   clearImmediate = function(id){
  716.     delete queue[id];
  717.   }
  718.   function run(id){
  719.     if(has(queue, id)){
  720.       var fn = queue[id];
  721.       delete queue[id];
  722.       fn();
  723.     }
  724.   }
  725.   function listner(event){
  726.     run(event.data);
  727.   }
  728.  
  729.   if(NODE){
  730.     defer = function(id){
  731.       nextTick(part.call(run, id));
  732.     }
  733.  
  734.  
  735.   } else if(global.addEventListener && isFunction(postMessage) && !global.importScripts){
  736.     defer = function(id){
  737.       postMessage(id, '*');
  738.     }
  739.     global.addEventListener('message', listner, false);
  740.  
  741.   } else if(isFunction(MessageChannel)){
  742.     channel = new MessageChannel;
  743.     port    = channel.port2;
  744.     channel.port1.onmessage = listner;
  745.     defer = ctx(port.postMessage, port, 1);
  746.  
  747.   } else if(document && ONREADYSTATECHANGE in document[CREATE_ELEMENT]('script')){
  748.     defer = function(id){
  749.       html.appendChild(document[CREATE_ELEMENT]('script'))[ONREADYSTATECHANGE] = function(){
  750.         html.removeChild(this);
  751.         run(id);
  752.       }
  753.     }
  754.  
  755.   } else {
  756.     defer = function(id){
  757.       setTimeout(run, 0, id);
  758.     }
  759.   }
  760. }('onreadystatechange');
  761. $define(GLOBAL + BIND, {
  762.   setImmediate:   setImmediate,
  763.   clearImmediate: clearImmediate
  764. });
  765.  
  766.  
  767.  
  768.  
  769.  
  770. !function(Promise, test){
  771.   isFunction(Promise) && isFunction(Promise.resolve)
  772.   && Promise.resolve(test = new Promise(function(){})) == test
  773.   || function(asap, DEF){
  774.     function isThenable(o){
  775.       var then;
  776.       if(isObject(o))then = o.then;
  777.       return isFunction(then) ? then : false;
  778.     }
  779.     function notify(def){
  780.       var chain = def.chain;
  781.       chain.length && asap(function(){
  782.         var msg = def.msg
  783.           , ok  = def.state == 1
  784.           , i   = 0;
  785.         while(chain.length > i)!function(react){
  786.           var cb = ok ? react.ok : react.fail
  787.             , ret, then;
  788.           try {
  789.             if(cb){
  790.               ret = cb === true ? msg : cb(msg);
  791.               if(ret === react.P){
  792.                 react.rej(TypeError(PROMISE + '-chain cycle'));
  793.               } else if(then = isThenable(ret)){
  794.                 then.call(ret, react.res, react.rej);
  795.               } else react.res(ret);
  796.             } else react.rej(msg);
  797.           } catch(err){
  798.             react.rej(err);
  799.           }
  800.         }(chain[i++]);
  801.         chain.length = 0;
  802.       });
  803.     }
  804.     function resolve(msg){
  805.       var def = this
  806.         , then, wrapper;
  807.       if(def.done)return;
  808.       def.done = true;
  809.       def = def.def || def;
  810.       try {
  811.         if(then = isThenable(msg)){
  812.           wrapper = {def: def, done: false};
  813.           then.call(msg, ctx(resolve, wrapper, 1), ctx(reject, wrapper, 1));
  814.         } else {
  815.           def.msg = msg;
  816.           def.state = 1;
  817.           notify(def);
  818.         }
  819.       } catch(err){
  820.         reject.call(wrapper || {def: def, done: false}, err);
  821.       }
  822.     }
  823.     function reject(msg){
  824.       var def = this;
  825.       if(def.done)return;
  826.       def.done = true;
  827.       def = def.def || def;
  828.       def.msg = msg;
  829.       def.state = 2;
  830.       notify(def);
  831.     }
  832.     function getConstructor(C){
  833.       var S = assertObject(C)[SYMBOL_SPECIES];
  834.       return S != undefined ? S : C;
  835.     }
  836.    
  837.     Promise = function(executor){
  838.       assertFunction(executor);
  839.       assertInstance(this, Promise, PROMISE);
  840.       var def = {chain: [], state: 0, done: false, msg: undefined};
  841.       hidden(this, DEF, def);
  842.       try {
  843.         executor(ctx(resolve, def, 1), ctx(reject, def, 1));
  844.       } catch(err){
  845.         reject.call(def, err);
  846.       }
  847.     }
  848.     assignHidden(Promise[PROTOTYPE], {
  849.      
  850.       then: function(onFulfilled, onRejected){
  851.         var S = assertObject(assertObject(this)[CONSTRUCTOR])[SYMBOL_SPECIES];
  852.         var react = {
  853.           ok:   isFunction(onFulfilled) ? onFulfilled : true,
  854.           fail: isFunction(onRejected)  ? onRejected  : false
  855.         } , P = react.P = new (S != undefined ? S : Promise)(function(resolve, reject){
  856.           react.res = assertFunction(resolve);
  857.           react.rej = assertFunction(reject);
  858.         }), def = this[DEF];
  859.         def.chain.push(react);
  860.         def.state && notify(def);
  861.         return P;
  862.       },
  863.      
  864.       'catch': function(onRejected){
  865.         return this.then(undefined, onRejected);
  866.       }
  867.     });
  868.     assignHidden(Promise, {
  869.      
  870.       all: function(iterable){
  871.         var Promise = getConstructor(this)
  872.           , values  = [];
  873.         return new Promise(function(resolve, reject){
  874.           forOf(iterable, false, push, values);
  875.           var remaining = values.length
  876.             , results   = Array(remaining);
  877.           if(remaining)forEach.call(values, function(promise, index){
  878.             Promise.resolve(promise).then(function(value){
  879.               results[index] = value;
  880.               --remaining || resolve(results);
  881.             }, reject);
  882.           });
  883.           else resolve(results);
  884.         });
  885.       },
  886.      
  887.       race: function(iterable){
  888.         var Promise = getConstructor(this);
  889.         return new Promise(function(resolve, reject){
  890.           forOf(iterable, false, function(promise){
  891.             Promise.resolve(promise).then(resolve, reject);
  892.           });
  893.         });
  894.       },
  895.      
  896.       reject: function(r){
  897.         return new (getConstructor(this))(function(resolve, reject){
  898.           reject(r);
  899.         });
  900.       },
  901.      
  902.       resolve: function(x){
  903.         return isObject(x) && DEF in x && getPrototypeOf(x) === this[PROTOTYPE]
  904.           ? x : new (getConstructor(this))(function(resolve, reject){
  905.             resolve(x);
  906.           });
  907.       }
  908.     });
  909.   }(nextTick || setImmediate, safeSymbol('def'));
  910.   setToStringTag(Promise, PROMISE);
  911.   setSpecies(Promise);
  912.   $define(GLOBAL + FORCED * !isNative(Promise), {Promise: Promise});
  913. }(global[PROMISE]);
  914.  
  915.  
  916.  
  917.  
  918. !function(){
  919.   var UID   = safeSymbol('uid')
  920.     , O1    = safeSymbol('O1')
  921.     , WEAK  = safeSymbol('weak')
  922.     , LEAK  = safeSymbol('leak')
  923.     , LAST  = safeSymbol('last')
  924.     , FIRST = safeSymbol('first')
  925.     , SIZE  = DESC ? safeSymbol('size') : 'size'
  926.     , uid   = 0
  927.     , tmp   = {};
  928.  
  929.   function getCollection(C, NAME, methods, commonMethods, isMap, isWeak){
  930.     var ADDER = isMap ? 'set' : 'add'
  931.       , proto = C && C[PROTOTYPE]
  932.       , O     = {};
  933.     function initFromIterable(that, iterable){
  934.       if(iterable != undefined)forOf(iterable, isMap, that[ADDER], that);
  935.       return that;
  936.     }
  937.     function fixSVZ(key, chain){
  938.       var method = proto[key];
  939.       if(framework)proto[key] = function(a, b){
  940.         var result = method.call(this, a === 0 ? 0 : a, b);
  941.         return chain ? this : result;
  942.       };
  943.     }
  944.     if(!isNative(C) || !(isWeak || (!BUGGY_ITERATORS && has(proto, FOR_EACH) && has(proto, 'entries')))){
  945.      
  946.       C = isWeak
  947.         ? function(iterable){
  948.             assertInstance(this, C, NAME);
  949.             set(this, UID, uid++);
  950.             initFromIterable(this, iterable);
  951.           }
  952.         : function(iterable){
  953.             var that = this;
  954.             assertInstance(that, C, NAME);
  955.             set(that, O1, create(null));
  956.             set(that, SIZE, 0);
  957.             set(that, LAST, undefined);
  958.             set(that, FIRST, undefined);
  959.             initFromIterable(that, iterable);
  960.           };
  961.       assignHidden(assignHidden(C[PROTOTYPE], methods), commonMethods);
  962.       isWeak || defineProperty(C[PROTOTYPE], 'size', {get: function(){
  963.         return assertDefined(this[SIZE]);
  964.       }});
  965.     } else {
  966.       var Native = C
  967.         , inst   = new C
  968.         , chain  = inst[ADDER](isWeak ? {} : -0, 1)
  969.         , buggyZero;
  970.      
  971.       if(!NATIVE_ITERATORS || !C.length){
  972.         C = function(iterable){
  973.           assertInstance(this, C, NAME);
  974.           return initFromIterable(new Native, iterable);
  975.         }
  976.         C[PROTOTYPE] = proto;
  977.         if(framework)proto[CONSTRUCTOR] = C;
  978.       }
  979.       isWeak || inst[FOR_EACH](function(val, key){
  980.         buggyZero = 1 / key === -Infinity;
  981.       });
  982.      
  983.       if(buggyZero){
  984.         fixSVZ('delete');
  985.         fixSVZ('has');
  986.         isMap && fixSVZ('get');
  987.       }
  988.      
  989.       if(buggyZero || chain !== inst)fixSVZ(ADDER, true);
  990.     }
  991.     setToStringTag(C, NAME);
  992.     setSpecies(C);
  993.    
  994.     O[NAME] = C;
  995.     $define(GLOBAL + WRAP + FORCED * !isNative(C), O);
  996.    
  997.    
  998.    
  999.     isWeak || defineStdIterators(C, NAME, function(iterated, kind){
  1000.       set(this, ITER, {o: iterated, k: kind});
  1001.     }, function(){
  1002.       var iter  = this[ITER]
  1003.         , kind  = iter.k
  1004.         , entry = iter.l;
  1005.      
  1006.       while(entry && entry.r)entry = entry.p;
  1007.      
  1008.       if(!iter.o || !(iter.l = entry = entry ? entry.n : iter.o[FIRST])){
  1009.        
  1010.         iter.o = undefined;
  1011.         return iterResult(1);
  1012.       }
  1013.      
  1014.       if(kind == KEY)  return iterResult(0, entry.k);
  1015.       if(kind == VALUE)return iterResult(0, entry.v);
  1016.                        return iterResult(0, [entry.k, entry.v]);  
  1017.     }, isMap ? KEY+VALUE : VALUE, !isMap);
  1018.    
  1019.     return C;
  1020.   }
  1021.  
  1022.   function fastKey(it, create){
  1023.    
  1024.     if(!isObject(it))return (typeof it == 'string' ? 'S' : 'P') + it;
  1025.    
  1026.     if(isFrozen(it))return 'F';
  1027.     if(!has(it, UID)){
  1028.      
  1029.       if(!create)return 'E';
  1030.      
  1031.       hidden(it, UID, ++uid);
  1032.    
  1033.     } return 'O' + it[UID];
  1034.   }
  1035.   function getEntry(that, key){
  1036.    
  1037.     var index = fastKey(key), entry;
  1038.     if(index != 'F')return that[O1][index];
  1039.    
  1040.     for(entry = that[FIRST]; entry; entry = entry.n){
  1041.       if(entry.k == key)return entry;
  1042.     }
  1043.   }
  1044.   function def(that, key, value){
  1045.     var entry = getEntry(that, key)
  1046.       , prev, index;
  1047.    
  1048.     if(entry)entry.v = value;
  1049.    
  1050.     else {
  1051.       that[LAST] = entry = {
  1052.         i: index = fastKey(key, true),
  1053.         k: key,                      
  1054.         v: value,                    
  1055.         p: prev = that[LAST],        
  1056.         n: undefined,                
  1057.         r: false                      
  1058.       };
  1059.       if(!that[FIRST])that[FIRST] = entry;
  1060.       if(prev)prev.n = entry;
  1061.       that[SIZE]++;
  1062.      
  1063.       if(index != 'F')that[O1][index] = entry;
  1064.     } return that;
  1065.   }
  1066.  
  1067.   var collectionMethods = {
  1068.    
  1069.    
  1070.     clear: function(){
  1071.       for(var that = this, data = that[O1], entry = that[FIRST]; entry; entry = entry.n){
  1072.         entry.r = true;
  1073.         if(entry.p)entry.p = entry.p.n = undefined;
  1074.         delete data[entry.i];
  1075.       }
  1076.       that[FIRST] = that[LAST] = undefined;
  1077.       that[SIZE] = 0;
  1078.     },
  1079.    
  1080.    
  1081.     'delete': function(key){
  1082.       var that  = this
  1083.         , entry = getEntry(that, key);
  1084.       if(entry){
  1085.         var next = entry.n
  1086.           , prev = entry.p;
  1087.         delete that[O1][entry.i];
  1088.         entry.r = true;
  1089.         if(prev)prev.n = next;
  1090.         if(next)next.p = prev;
  1091.         if(that[FIRST] == entry)that[FIRST] = next;
  1092.         if(that[LAST] == entry)that[LAST] = prev;
  1093.         that[SIZE]--;
  1094.       } return !!entry;
  1095.     },
  1096.    
  1097.    
  1098.     forEach: function(callbackfn ){
  1099.       var f = ctx(callbackfn, arguments[1], 3)
  1100.         , entry;
  1101.       while(entry = entry ? entry.n : this[FIRST]){
  1102.         f(entry.v, entry.k, this);
  1103.        
  1104.         while(entry && entry.r)entry = entry.p;
  1105.       }
  1106.     },
  1107.    
  1108.    
  1109.     has: function(key){
  1110.       return !!getEntry(this, key);
  1111.     }
  1112.   }
  1113.  
  1114.  
  1115.   Map = getCollection(Map, MAP, {
  1116.    
  1117.     get: function(key){
  1118.       var entry = getEntry(this, key);
  1119.       return entry && entry.v;
  1120.     },
  1121.    
  1122.     set: function(key, value){
  1123.       return def(this, key === 0 ? 0 : key, value);
  1124.     }
  1125.   }, collectionMethods, true);
  1126.  
  1127.  
  1128.   Set = getCollection(Set, SET, {
  1129.    
  1130.     add: function(value){
  1131.       return def(this, value = value === 0 ? 0 : value, value);
  1132.     }
  1133.   }, collectionMethods);
  1134.  
  1135.   function defWeak(that, key, value){
  1136.     if(isFrozen(assertObject(key)))leakStore(that).set(key, value);
  1137.     else {
  1138.       has(key, WEAK) || hidden(key, WEAK, {});
  1139.       key[WEAK][that[UID]] = value;
  1140.     } return that;
  1141.   }
  1142.   function leakStore(that){
  1143.     return that[LEAK] || hidden(that, LEAK, new Map)[LEAK];
  1144.   }
  1145.  
  1146.   var weakMethods = {
  1147.    
  1148.    
  1149.     'delete': function(key){
  1150.       if(!isObject(key))return false;
  1151.       if(isFrozen(key))return leakStore(this)['delete'](key);
  1152.       return has(key, WEAK) && has(key[WEAK], this[UID]) && delete key[WEAK][this[UID]];
  1153.     },
  1154.    
  1155.    
  1156.     has: function(key){
  1157.       if(!isObject(key))return false;
  1158.       if(isFrozen(key))return leakStore(this).has(key);
  1159.       return has(key, WEAK) && has(key[WEAK], this[UID]);
  1160.     }
  1161.   };
  1162.  
  1163.  
  1164.   WeakMap = getCollection(WeakMap, WEAKMAP, {
  1165.    
  1166.     get: function(key){
  1167.       if(isObject(key)){
  1168.         if(isFrozen(key))return leakStore(this).get(key);
  1169.         if(has(key, WEAK))return key[WEAK][this[UID]];
  1170.       }
  1171.     },
  1172.    
  1173.     set: function(key, value){
  1174.       return defWeak(this, key, value);
  1175.     }
  1176.   }, weakMethods, true, true);
  1177.  
  1178.  
  1179.   if(framework && new WeakMap().set(Object.freeze(tmp), 7).get(tmp) != 7){
  1180.     forEach.call(array('delete,has,get,set'), function(key){
  1181.       var method = WeakMap[PROTOTYPE][key];
  1182.       WeakMap[PROTOTYPE][key] = function(a, b){
  1183.        
  1184.         if(isObject(a) && isFrozen(a)){
  1185.           var result = leakStore(this)[key](a, b);
  1186.           return key == 'set' ? this : result;
  1187.        
  1188.         } return method.call(this, a, b);
  1189.       };
  1190.     });
  1191.   }
  1192.  
  1193.  
  1194.   WeakSet = getCollection(WeakSet, WEAKSET, {
  1195.    
  1196.     add: function(value){
  1197.       return defWeak(this, value, true);
  1198.     }
  1199.   }, weakMethods, false, true);
  1200. }();
  1201. }(typeof self != 'undefined' && self.Math === Math ? self : Function('return this')(), true);
  1202.  
  1203. !(function(global) {
  1204.  
  1205.   var hasOwn = Object.prototype.hasOwnProperty;
  1206.   var undefined;
  1207.   var iteratorSymbol =
  1208.     typeof Symbol === "function" && Symbol.iterator || "@@iterator";
  1209.  
  1210.   var inModule = typeof module === "object";
  1211.   var runtime = global.regeneratorRuntime;
  1212.   if (runtime) {
  1213.     if (inModule) {
  1214.      
  1215.      
  1216.       module.exports = runtime;
  1217.     }
  1218.    
  1219.    
  1220.     return;
  1221.   }
  1222.  
  1223.  
  1224.  
  1225.   runtime = global.regeneratorRuntime = inModule ? module.exports : {};
  1226.  
  1227.   function wrap(innerFn, outerFn, self, tryLocsList) {
  1228.     return new Generator(innerFn, outerFn, self || null, tryLocsList || []);
  1229.   }
  1230.   runtime.wrap = wrap;
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.   function tryCatch(fn, obj, arg) {
  1243.     try {
  1244.       return { type: "normal", arg: fn.call(obj, arg) };
  1245.     } catch (err) {
  1246.       return { type: "throw", arg: err };
  1247.     }
  1248.   }
  1249.  
  1250.   var GenStateSuspendedStart = "suspendedStart";
  1251.   var GenStateSuspendedYield = "suspendedYield";
  1252.   var GenStateExecuting = "executing";
  1253.   var GenStateCompleted = "completed";
  1254.  
  1255.  
  1256.  
  1257.   var ContinueSentinel = {};
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.   function GeneratorFunction() {}
  1264.   function GeneratorFunctionPrototype() {}
  1265.  
  1266.   var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;
  1267.   GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  1268.   GeneratorFunctionPrototype.constructor = GeneratorFunction;
  1269.   GeneratorFunction.displayName = "GeneratorFunction";
  1270.  
  1271.   runtime.isGeneratorFunction = function(genFun) {
  1272.     var ctor = typeof genFun === "function" && genFun.constructor;
  1273.     return ctor
  1274.       ? ctor === GeneratorFunction ||
  1275.        
  1276.        
  1277.         (ctor.displayName || ctor.name) === "GeneratorFunction"
  1278.       : false;
  1279.   };
  1280.  
  1281.   runtime.mark = function(genFun) {
  1282.     genFun.__proto__ = GeneratorFunctionPrototype;
  1283.     genFun.prototype = Object.create(Gp);
  1284.     return genFun;
  1285.   };
  1286.  
  1287.   runtime.async = function(innerFn, outerFn, self, tryLocsList) {
  1288.     return new Promise(function(resolve, reject) {
  1289.       var generator = wrap(innerFn, outerFn, self, tryLocsList);
  1290.       var callNext = step.bind(generator.next);
  1291.       var callThrow = step.bind(generator["throw"]);
  1292.  
  1293.       function step(arg) {
  1294.         var record = tryCatch(this, null, arg);
  1295.         if (record.type === "throw") {
  1296.           reject(record.arg);
  1297.           return;
  1298.         }
  1299.  
  1300.         var info = record.arg;
  1301.         if (info.done) {
  1302.           resolve(info.value);
  1303.         } else {
  1304.           Promise.resolve(info.value).then(callNext, callThrow);
  1305.         }
  1306.       }
  1307.  
  1308.       callNext();
  1309.     });
  1310.   };
  1311.  
  1312.   function Generator(innerFn, outerFn, self, tryLocsList) {
  1313.     var generator = outerFn ? Object.create(outerFn.prototype) : this;
  1314.     var context = new Context(tryLocsList);
  1315.     var state = GenStateSuspendedStart;
  1316.  
  1317.     function invoke(method, arg) {
  1318.       if (state === GenStateExecuting) {
  1319.         throw new Error("Generator is already running");
  1320.       }
  1321.  
  1322.       if (state === GenStateCompleted) {
  1323.        
  1324.        
  1325.         return doneResult();
  1326.       }
  1327.  
  1328.       while (true) {
  1329.         var delegate = context.delegate;
  1330.         if (delegate) {
  1331.           var record = tryCatch(
  1332.             delegate.iterator[method],
  1333.             delegate.iterator,
  1334.             arg
  1335.           );
  1336.  
  1337.           if (record.type === "throw") {
  1338.             context.delegate = null;
  1339.  
  1340.            
  1341.            
  1342.             method = "throw";
  1343.             arg = record.arg;
  1344.  
  1345.             continue;
  1346.           }
  1347.  
  1348.          
  1349.          
  1350.          
  1351.           method = "next";
  1352.           arg = undefined;
  1353.  
  1354.           var info = record.arg;
  1355.           if (info.done) {
  1356.             context[delegate.resultName] = info.value;
  1357.             context.next = delegate.nextLoc;
  1358.           } else {
  1359.             state = GenStateSuspendedYield;
  1360.             return info;
  1361.           }
  1362.  
  1363.           context.delegate = null;
  1364.         }
  1365.  
  1366.         if (method === "next") {
  1367.           if (state === GenStateSuspendedStart &&
  1368.               typeof arg !== "undefined") {
  1369.            
  1370.             throw new TypeError(
  1371.               "attempt to send " + JSON.stringify(arg) + " to newborn generator"
  1372.             );
  1373.           }
  1374.  
  1375.           if (state === GenStateSuspendedYield) {
  1376.             context.sent = arg;
  1377.           } else {
  1378.             delete context.sent;
  1379.           }
  1380.  
  1381.         } else if (method === "throw") {
  1382.           if (state === GenStateSuspendedStart) {
  1383.             state = GenStateCompleted;
  1384.             throw arg;
  1385.           }
  1386.  
  1387.           if (context.dispatchException(arg)) {
  1388.            
  1389.            
  1390.             method = "next";
  1391.             arg = undefined;
  1392.           }
  1393.  
  1394.         } else if (method === "return") {
  1395.           context.abrupt("return", arg);
  1396.         }
  1397.  
  1398.         state = GenStateExecuting;
  1399.  
  1400.         var record = tryCatch(innerFn, self, context);
  1401.         if (record.type === "normal") {
  1402.          
  1403.          
  1404.           state = context.done
  1405.             ? GenStateCompleted
  1406.             : GenStateSuspendedYield;
  1407.  
  1408.           var info = {
  1409.             value: record.arg,
  1410.             done: context.done
  1411.           };
  1412.  
  1413.           if (record.arg === ContinueSentinel) {
  1414.             if (context.delegate && method === "next") {
  1415.              
  1416.              
  1417.               arg = undefined;
  1418.             }
  1419.           } else {
  1420.             return info;
  1421.           }
  1422.  
  1423.         } else if (record.type === "throw") {
  1424.           state = GenStateCompleted;
  1425.  
  1426.           if (method === "next") {
  1427.             context.dispatchException(record.arg);
  1428.           } else {
  1429.             arg = record.arg;
  1430.           }
  1431.         }
  1432.       }
  1433.     }
  1434.  
  1435.     generator.next = invoke.bind(generator, "next");
  1436.     generator["throw"] = invoke.bind(generator, "throw");
  1437.     generator["return"] = invoke.bind(generator, "return");
  1438.  
  1439.     return generator;
  1440.   }
  1441.  
  1442.   Gp[iteratorSymbol] = function() {
  1443.     return this;
  1444.   };
  1445.  
  1446.   Gp.toString = function() {
  1447.     return "[object Generator]";
  1448.   };
  1449.  
  1450.   function pushTryEntry(locs) {
  1451.     var entry = { tryLoc: locs[0] };
  1452.  
  1453.     if (1 in locs) {
  1454.       entry.catchLoc = locs[1];
  1455.     }
  1456.  
  1457.     if (2 in locs) {
  1458.       entry.finallyLoc = locs[2];
  1459.       entry.afterLoc = locs[3];
  1460.     }
  1461.  
  1462.     this.tryEntries.push(entry);
  1463.   }
  1464.  
  1465.   function resetTryEntry(entry) {
  1466.     var record = entry.completion || {};
  1467.     record.type = "normal";
  1468.     delete record.arg;
  1469.     entry.completion = record;
  1470.   }
  1471.  
  1472.   function Context(tryLocsList) {
  1473.    
  1474.    
  1475.    
  1476.     this.tryEntries = [{ tryLoc: "root" }];
  1477.     tryLocsList.forEach(pushTryEntry, this);
  1478.     this.reset();
  1479.   }
  1480.  
  1481.   runtime.keys = function(object) {
  1482.     var keys = [];
  1483.     for (var key in object) {
  1484.       keys.push(key);
  1485.     }
  1486.     keys.reverse();
  1487.  
  1488.    
  1489.    
  1490.     return function next() {
  1491.       while (keys.length) {
  1492.         var key = keys.pop();
  1493.         if (key in object) {
  1494.           next.value = key;
  1495.           next.done = false;
  1496.           return next;
  1497.         }
  1498.       }
  1499.  
  1500.      
  1501.      
  1502.      
  1503.       next.done = true;
  1504.       return next;
  1505.     };
  1506.   };
  1507.  
  1508.   function values(iterable) {
  1509.     if (iterable) {
  1510.       var iteratorMethod = iterable[iteratorSymbol];
  1511.       if (iteratorMethod) {
  1512.         return iteratorMethod.call(iterable);
  1513.       }
  1514.  
  1515.       if (typeof iterable.next === "function") {
  1516.         return iterable;
  1517.       }
  1518.  
  1519.       if (!isNaN(iterable.length)) {
  1520.         var i = -1, next = function next() {
  1521.           while (++i < iterable.length) {
  1522.             if (hasOwn.call(iterable, i)) {
  1523.               next.value = iterable[i];
  1524.               next.done = false;
  1525.               return next;
  1526.             }
  1527.           }
  1528.  
  1529.           next.value = undefined;
  1530.           next.done = true;
  1531.  
  1532.           return next;
  1533.         };
  1534.  
  1535.         return next.next = next;
  1536.       }
  1537.     }
  1538.  
  1539.    
  1540.     return { next: doneResult };
  1541.   }
  1542.   runtime.values = values;
  1543.  
  1544.   function doneResult() {
  1545.     return { value: undefined, done: true };
  1546.   }
  1547.  
  1548.   Context.prototype = {
  1549.     constructor: Context,
  1550.  
  1551.     reset: function() {
  1552.       this.prev = 0;
  1553.       this.next = 0;
  1554.       this.sent = undefined;
  1555.       this.done = false;
  1556.       this.delegate = null;
  1557.  
  1558.       this.tryEntries.forEach(resetTryEntry);
  1559.  
  1560.      
  1561.      
  1562.       for (var tempIndex = 0, tempName;
  1563.            hasOwn.call(this, tempName = "t" + tempIndex) || tempIndex < 20;
  1564.            ++tempIndex) {
  1565.         this[tempName] = null;
  1566.       }
  1567.     },
  1568.  
  1569.     stop: function() {
  1570.       this.done = true;
  1571.  
  1572.       var rootEntry = this.tryEntries[0];
  1573.       var rootRecord = rootEntry.completion;
  1574.       if (rootRecord.type === "throw") {
  1575.         throw rootRecord.arg;
  1576.       }
  1577.  
  1578.       return this.rval;
  1579.     },
  1580.  
  1581.     dispatchException: function(exception) {
  1582.       if (this.done) {
  1583.         throw exception;
  1584.       }
  1585.  
  1586.       var context = this;
  1587.       function handle(loc, caught) {
  1588.         record.type = "throw";
  1589.         record.arg = exception;
  1590.         context.next = loc;
  1591.         return !!caught;
  1592.       }
  1593.  
  1594.       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  1595.         var entry = this.tryEntries[i];
  1596.         var record = entry.completion;
  1597.  
  1598.         if (entry.tryLoc === "root") {
  1599.          
  1600.          
  1601.          
  1602.           return handle("end");
  1603.         }
  1604.  
  1605.         if (entry.tryLoc <= this.prev) {
  1606.           var hasCatch = hasOwn.call(entry, "catchLoc");
  1607.           var hasFinally = hasOwn.call(entry, "finallyLoc");
  1608.  
  1609.           if (hasCatch && hasFinally) {
  1610.             if (this.prev < entry.catchLoc) {
  1611.               return handle(entry.catchLoc, true);
  1612.             } else if (this.prev < entry.finallyLoc) {
  1613.               return handle(entry.finallyLoc);
  1614.             }
  1615.  
  1616.           } else if (hasCatch) {
  1617.             if (this.prev < entry.catchLoc) {
  1618.               return handle(entry.catchLoc, true);
  1619.             }
  1620.  
  1621.           } else if (hasFinally) {
  1622.             if (this.prev < entry.finallyLoc) {
  1623.               return handle(entry.finallyLoc);
  1624.             }
  1625.  
  1626.           } else {
  1627.             throw new Error("try statement without catch or finally");
  1628.           }
  1629.         }
  1630.       }
  1631.     },
  1632.  
  1633.     _findFinallyEntry: function(finallyLoc) {
  1634.       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  1635.         var entry = this.tryEntries[i];
  1636.         if (entry.tryLoc <= this.prev &&
  1637.             hasOwn.call(entry, "finallyLoc") && (
  1638.               entry.finallyLoc === finallyLoc ||
  1639.               this.prev < entry.finallyLoc)) {
  1640.           return entry;
  1641.         }
  1642.       }
  1643.     },
  1644.  
  1645.     abrupt: function(type, arg) {
  1646.       var entry = this._findFinallyEntry();
  1647.       var record = entry ? entry.completion : {};
  1648.  
  1649.       record.type = type;
  1650.       record.arg = arg;
  1651.  
  1652.       if (entry) {
  1653.         this.next = entry.finallyLoc;
  1654.       } else {
  1655.         this.complete(record);
  1656.       }
  1657.  
  1658.       return ContinueSentinel;
  1659.     },
  1660.  
  1661.     complete: function(record, afterLoc) {
  1662.       if (record.type === "throw") {
  1663.         throw record.arg;
  1664.       }
  1665.  
  1666.       if (record.type === "break" ||
  1667.           record.type === "continue") {
  1668.         this.next = record.arg;
  1669.       } else if (record.type === "return") {
  1670.         this.rval = record.arg;
  1671.         this.next = "end";
  1672.       } else if (record.type === "normal" && afterLoc) {
  1673.         this.next = afterLoc;
  1674.       }
  1675.  
  1676.       return ContinueSentinel;
  1677.     },
  1678.  
  1679.     finish: function(finallyLoc) {
  1680.       var entry = this._findFinallyEntry(finallyLoc);
  1681.       return this.complete(entry.completion, entry.afterLoc);
  1682.     },
  1683.  
  1684.     "catch": function(tryLoc) {
  1685.       for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  1686.         var entry = this.tryEntries[i];
  1687.         if (entry.tryLoc === tryLoc) {
  1688.           var record = entry.completion;
  1689.           if (record.type === "throw") {
  1690.             var thrown = record.arg;
  1691.             resetTryEntry(entry);
  1692.           }
  1693.           return thrown;
  1694.         }
  1695.       }
  1696.  
  1697.      
  1698.      
  1699.       throw new Error("illegal catch attempt");
  1700.     },
  1701.  
  1702.     delegateYield: function(iterable, resultName, nextLoc) {
  1703.       this.delegate = {
  1704.         iterator: values(iterable),
  1705.         resultName: resultName,
  1706.         nextLoc: nextLoc
  1707.       };
  1708.  
  1709.       return ContinueSentinel;
  1710.     }
  1711.   };
  1712. })(
  1713.  
  1714.  
  1715.  
  1716.   typeof global === "object" ? global :
  1717.   typeof window === "object" ? window : this
  1718. );
  1719.  
  1720.  
  1721. var _slicedToArray = function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { var _arr = []; for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { _arr.push(_step.value); if (i && _arr.length === i) break; } return _arr; } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } };
  1722.  
  1723. var _defineProperty = function (obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); };
  1724.  
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.  
  1740.  
  1741.  
  1742.  
  1743.  
  1744. (function de_main_func_inner(scriptStorage, FormData) {
  1745.  
  1746.         var getFormElements = regeneratorRuntime.mark(
  1747.  
  1748.  
  1749.         function getFormElements(form) {
  1750.                 var controls, fixName, i, len, field, tagName, type, name, options, _i, _len, option, files, dirname, dir;
  1751.  
  1752.                 return regeneratorRuntime.wrap(function getFormElements$(context$2$0) {
  1753.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  1754.                                 case 0:
  1755.                                         controls = $Q("button, input, keygen, object, select, textarea", form), fixName = function (name) {
  1756.                                                 return name ? name.replace(/([^\r])\n|\r([^\n])/g, "$1\r\n$2") : "";
  1757.                                         };
  1758.                                         i = 0, len = controls.length;
  1759.  
  1760.                                 case 2:
  1761.                                         if (!(i < len)) {
  1762.                                                 context$2$0.next = 58;
  1763.                                                 break;
  1764.                                         }
  1765.  
  1766.                                         field = controls[i], tagName = field.tagName.toLowerCase(), type = field.getAttribute("type"), name = field.getAttribute("name");
  1767.  
  1768.                                         if (!($parent(field, "datalist", form) || isFormElDisabled(field) || tagName === "button" && type !== "submit" || tagName === "input" && (type === "checkbox" && !field.checked || type === "radio" && !field.checked || type === "image" && !name) || tagName === "object" && !(type in navigator.mimeTypes))) {
  1769.                                                 context$2$0.next = 6;
  1770.                                                 break;
  1771.                                         }
  1772.  
  1773.                                         return context$2$0.abrupt("continue", 55);
  1774.  
  1775.                                 case 6:
  1776.                                         if (!(tagName === "object")) {
  1777.                                                 context$2$0.next = 8;
  1778.                                                 break;
  1779.                                         }
  1780.  
  1781.                                         throw new Error("Not supported");
  1782.  
  1783.                                 case 8:
  1784.                                         if (!(tagName === "select")) {
  1785.                                                 context$2$0.next = 21;
  1786.                                                 break;
  1787.                                         }
  1788.  
  1789.                                         options = $Q("select > option, select > optgrout > option", field);
  1790.                                         _i = 0, _len = options.length;
  1791.  
  1792.                                 case 11:
  1793.                                         if (!(_i < _len)) {
  1794.                                                 context$2$0.next = 19;
  1795.                                                 break;
  1796.                                         }
  1797.  
  1798.                                         option = options[_i];
  1799.  
  1800.                                         if (!(option.selected && !isFormElDisabled(option))) {
  1801.                                                 context$2$0.next = 16;
  1802.                                                 break;
  1803.                                         }
  1804.  
  1805.                                         context$2$0.next = 16;
  1806.                                         return {
  1807.                                                 el: field,
  1808.                                                 name: fixName(name),
  1809.                                                 value: option.value,
  1810.                                                 type: type
  1811.                                         };
  1812.  
  1813.                                 case 16:
  1814.                                         ++_i;
  1815.                                         context$2$0.next = 11;
  1816.                                         break;
  1817.  
  1818.                                 case 19:
  1819.                                         context$2$0.next = 43;
  1820.                                         break;
  1821.  
  1822.                                 case 21:
  1823.                                         if (!(tagName === "input")) {
  1824.                                                 context$2$0.next = 43;
  1825.                                                 break;
  1826.                                         }
  1827.  
  1828.                                         context$2$0.t0 = type;
  1829.                                         context$2$0.next = context$2$0.t0 === "image" ? 25 : context$2$0.t0 === "checkbox" ? 26 : context$2$0.t0 === "radio" ? 26 : context$2$0.t0 === "file" ? 29 : 43;
  1830.                                         break;
  1831.  
  1832.                                 case 25:
  1833.                                         throw new Error("Not supported");
  1834.  
  1835.                                 case 26:
  1836.                                         context$2$0.next = 28;
  1837.                                         return {
  1838.                                                 el: field,
  1839.                                                 name: fixName(name),
  1840.                                                 value: field.value || "on",
  1841.                                                 type: type
  1842.                                         };
  1843.  
  1844.                                 case 28:
  1845.                                         return context$2$0.abrupt("continue", 55);
  1846.  
  1847.                                 case 29:
  1848.                                         if (!(field.files.length > 0)) {
  1849.                                                 context$2$0.next = 40;
  1850.                                                 break;
  1851.                                         }
  1852.  
  1853.                                         files = field.files;
  1854.                                         _i = 0, _len = files.length;
  1855.  
  1856.                                 case 32:
  1857.                                         if (!(_i < _len)) {
  1858.                                                 context$2$0.next = 38;
  1859.                                                 break;
  1860.                                         }
  1861.  
  1862.                                         context$2$0.next = 35;
  1863.                                         return {
  1864.                                                 el: field,
  1865.                                                 name: name,
  1866.                                                 value: files[_i],
  1867.                                                 type: type
  1868.                                         };
  1869.  
  1870.                                 case 35:
  1871.                                         ++_i;
  1872.                                         context$2$0.next = 32;
  1873.                                         break;
  1874.  
  1875.                                 case 38:
  1876.                                         context$2$0.next = 42;
  1877.                                         break;
  1878.  
  1879.                                 case 40:
  1880.                                         context$2$0.next = 42;
  1881.                                         return {
  1882.                                                 el: field,
  1883.                                                 name: fixName(name),
  1884.                                                 value: "",
  1885.                                                 type: "application/octet-stream"
  1886.                                         };
  1887.  
  1888.                                 case 42:
  1889.                                         return context$2$0.abrupt("continue", 55);
  1890.  
  1891.                                 case 43:
  1892.                                         if (!(type === "textarea")) {
  1893.                                                 context$2$0.next = 48;
  1894.                                                 break;
  1895.                                         }
  1896.  
  1897.                                         context$2$0.next = 46;
  1898.                                         return {
  1899.                                                 el: field,
  1900.                                                 name: name || "",
  1901.                                                 value: field.value,
  1902.                                                 type: type
  1903.                                         };
  1904.  
  1905.                                 case 46:
  1906.                                         context$2$0.next = 50;
  1907.                                         break;
  1908.  
  1909.                                 case 48:
  1910.                                         context$2$0.next = 50;
  1911.                                         return {
  1912.                                                 el: field,
  1913.                                                 name: fixName(name),
  1914.                                                 value: field.value,
  1915.                                                 type: type
  1916.                                         };
  1917.  
  1918.                                 case 50:
  1919.                                         dirname = field.getAttribute("dirname");
  1920.  
  1921.                                         if (!dirname) {
  1922.                                                 context$2$0.next = 55;
  1923.                                                 break;
  1924.                                         }
  1925.  
  1926.                                         dir = nav.matchesSelector(field, ":dir(rtl)") ? "rtl" : "ltr";
  1927.                                         context$2$0.next = 55;
  1928.                                         return {
  1929.                                                 el: field,
  1930.                                                 name: fixName(dirname),
  1931.                                                 value: dir,
  1932.                                                 type: "direction"
  1933.                                         };
  1934.  
  1935.                                 case 55:
  1936.                                         ++i;
  1937.                                         context$2$0.next = 2;
  1938.                                         break;
  1939.  
  1940.                                 case 58:
  1941.                                 case "end":
  1942.                                         return context$2$0.stop();
  1943.                         }
  1944.                 }, getFormElements, this);
  1945.         });
  1946.         var getStored = regeneratorRuntime.mark(
  1947.  
  1948.  
  1949.  
  1950.  
  1951.         function getStored(id) {
  1952.                 return regeneratorRuntime.wrap(function getStored$(context$2$0) {
  1953.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  1954.                                 case 0:
  1955.                                         if (!nav.isGM) {
  1956.                                                 context$2$0.next = 4;
  1957.                                                 break;
  1958.                                         }
  1959.  
  1960.                                         return context$2$0.abrupt("return", GM_getValue(id));
  1961.  
  1962.                                 case 4:
  1963.                                         if (!nav.isChromeStorage) {
  1964.                                                 context$2$0.next = 10;
  1965.                                                 break;
  1966.                                         }
  1967.  
  1968.                                         context$2$0.next = 7;
  1969.                                         return new Promise(function (resolve, reject) {
  1970.                                                 chrome.storage.local.get(id, function (obj) {
  1971.                                                         if (Object.keys(obj).length) {
  1972.                                                                 resolve(obj[id]);
  1973.                                                         } else {
  1974.                                                                 chrome.storage.sync.get(id, function (obj) {
  1975.                                                                         resolve(obj[id]);
  1976.                                                                 });
  1977.                                                         }
  1978.                                                 });
  1979.                                         });
  1980.  
  1981.                                 case 7:
  1982.                                         return context$2$0.abrupt("return", context$2$0.sent);
  1983.  
  1984.                                 case 10:
  1985.                                         if (!nav.isScriptStorage) {
  1986.                                                 context$2$0.next = 12;
  1987.                                                 break;
  1988.                                         }
  1989.  
  1990.                                         return context$2$0.abrupt("return", scriptStorage.getItem(id));
  1991.  
  1992.                                 case 12:
  1993.                                         return context$2$0.abrupt("return", locStorage[id]);
  1994.  
  1995.                                 case 13:
  1996.                                 case "end":
  1997.                                         return context$2$0.stop();
  1998.                         }
  1999.                 }, getStored, this);
  2000.         });
  2001.         var getStoredObj = regeneratorRuntime.mark(function getStoredObj(id) {
  2002.                 return regeneratorRuntime.wrap(function getStoredObj$(context$2$0) {
  2003.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2004.                                 case 0:
  2005.                                         return context$2$0.delegateYield(getStored(id), "t3", 1);
  2006.  
  2007.                                 case 1:
  2008.                                         context$2$0.t2 = context$2$0.t3;
  2009.  
  2010.                                         if (context$2$0.t2) {
  2011.                                                 context$2$0.next = 4;
  2012.                                                 break;
  2013.                                         }
  2014.  
  2015.                                         context$2$0.t2 = "{}";
  2016.  
  2017.                                 case 4:
  2018.                                         context$2$0.t1 = JSON.parse(context$2$0.t2);
  2019.  
  2020.                                         if (context$2$0.t1) {
  2021.                                                 context$2$0.next = 7;
  2022.                                                 break;
  2023.                                         }
  2024.  
  2025.                                         context$2$0.t1 = {};
  2026.  
  2027.                                 case 7:
  2028.                                         return context$2$0.abrupt("return", context$2$0.t1);
  2029.  
  2030.                                 case 8:
  2031.                                 case "end":
  2032.                                         return context$2$0.stop();
  2033.                         }
  2034.                 }, getStoredObj, this);
  2035.         });
  2036.         var readCfg = regeneratorRuntime.mark(function readCfg() {
  2037.                 var obj, val;
  2038.                 return regeneratorRuntime.wrap(function readCfg$(context$2$0) {
  2039.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2040.                                 case 0:
  2041.                                         return context$2$0.delegateYield(getStoredObj("Rainbow_Config"), "t4", 1);
  2042.  
  2043.                                 case 1:
  2044.                                         val = context$2$0.t4;
  2045.  
  2046.                                         if (!(aib.dm in val) || $isEmpty(obj = val[aib.dm])) {
  2047.                                                 obj = nav.isGlobal ? val.global || {} : {};
  2048.                                                 obj.captchaLang = aib.ru ? 2 : 1;
  2049.                                                 obj.correctTime = 1;
  2050.                                         }
  2051.                                         Cfg = Object.assign(Object.create(defaultCfg), obj);
  2052.                                         if (!Cfg.timeOffset) {
  2053.                                                 Cfg.timeOffset = "+0";
  2054.                                         }
  2055.                                         if (!Cfg.timePattern) {
  2056.                                                 Cfg.timePattern = aib.timePattern;
  2057.                                         }
  2058.                                         if ((nav.Opera11 || aib.fch || aib.ponya) && Cfg.ajaxReply === 2) {
  2059.                                                 Lng.cfg.ajaxReply.sel.forEach(function (a) {
  2060.                                                         return a.splice(-1);
  2061.                                                 });
  2062.                                                 Cfg.ajaxReply = 1;
  2063.                                         }
  2064.                                         if (aib.tiny && !aib._8ch) {
  2065.                                                 Cfg.fileThumb = 0;
  2066.                                         }
  2067.                                         if (aib.prot !== "http:") {
  2068.                                                 Cfg.addVocaroo = 0;
  2069.                                         }
  2070.                                         if (!("Notification" in window)) {
  2071.                                                 Cfg.desktNotif = 0;
  2072.                                         }
  2073.                                         if (nav.Presto) {
  2074.                                                 if (nav.Opera11) {
  2075.                                                         if (!nav.isGM) {
  2076.                                                                 Cfg.YTubeTitles = 0;
  2077.                                                         }
  2078.                                                         Cfg.animation = 0;
  2079.                                                 }
  2080.                                                 if (Cfg.YTubeType === 2) {
  2081.                                                         Cfg.YTubeType = 1;
  2082.                                                 }
  2083.                                                 Cfg.preLoadImgs = 0;
  2084.                                                 Cfg.findImgFile = 0;
  2085.                                                 if (!nav.isGM) {
  2086.                                                         Cfg.updScript = 0;
  2087.                                                 }
  2088.                                                 Cfg.fileThumb = 0;
  2089.                                         }
  2090.                                         if (nav.isChromeStorage) {
  2091.                                                 Cfg.updScript = 0;
  2092.                                         }
  2093.                                        
  2094.                                        
  2095.                                        
  2096.                                         //synchfix
  2097.                                         if (Cfg.updThrDelay < 1) {
  2098.                                                 Cfg.updThrDelay = 1;
  2099.                                         }
  2100.                                         if (Cfg.imgSrcBtns == 1) {
  2101.                                                 Cfg.imgSrcBtns = 0;
  2102.                                         }
  2103.                                         if (Cfg.updScript == 1) {
  2104.                                                 Cfg.updScript = 0;
  2105.                                         }
  2106.                                        
  2107.                                        
  2108.                                        
  2109.                                         if (Cfg.openImgs === 1 && Cfg.openGIFs === 1) {
  2110.                                                         Cfg.preLoadImgs = 1;
  2111.                                                 }
  2112.                                         if (!Cfg.saveSage) {
  2113.                                                 Cfg.sageReply = 0;
  2114.                                         }
  2115.                                         if (!Cfg.passwValue) {
  2116.                                                 Cfg.passwValue = Math.round(Math.random() * 1000000000000000).toString(32);
  2117.                                                 locStorage.Rainbow_Pass = Cfg.passwValue;
  2118.                                                 locStorage.password = Cfg.passwValue;
  2119.                                         }
  2120.                                         if (!Cfg.stats) {
  2121.                                                 Cfg.stats = { view: 0, op: 0, reply: 0 };
  2122.                                         }
  2123.                                         if (TNum) {
  2124.                                                 Cfg.stats.view++;
  2125.                                         }
  2126.                                         if (aib.fch) {
  2127.                                                 Cfg.findImgFile = 0;
  2128.                                         }
  2129.                                         if (aib.synch) {
  2130.                                                 Cfg.timePattern = "w+dd+m+yyyy+hh+ii+ss";
  2131.                                                 Cfg.timeOffset = 3;
  2132.                                                 Cfg.correctTime = 1;
  2133.                                         }
  2134.                                         setStored("Rainbow_Config", JSON.stringify(val));
  2135.                                         lang = Cfg.language;
  2136.                                         if (Cfg.correctTime) {
  2137.                                                 dTime = new DateTime(Cfg.timePattern, Cfg.timeRPattern, Cfg.timeOffset, lang, function (rp) {
  2138.                                                         saveCfg("timeRPattern", rp);
  2139.                                                 });
  2140.                                         }
  2141.                                         if (Cfg.updScript) {
  2142.                                                 checkForUpdates(false, val.lastUpd).then(function (html) {
  2143.                                                         return $alert(html, "updavail", false);
  2144.                                                 }, emptyFn);
  2145.                                         }
  2146.  
  2147.                                 case 23:
  2148.                                 case "end":
  2149.                                         return context$2$0.stop();
  2150.                         }
  2151.                 }, readCfg, this);
  2152.         });
  2153.         var readUserPosts = regeneratorRuntime.mark(function readUserPosts() {
  2154.                 var date, spellsHide, update, globalUserVis, post, num, hidePost, hideThread, vis;
  2155.                 return regeneratorRuntime.wrap(function readUserPosts$(context$2$0) {
  2156.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2157.                                 case 0:
  2158.                                         date = Date.now();
  2159.                                         spellsHide = Cfg.hideBySpell;
  2160.                                         update = false;
  2161.                                         return context$2$0.delegateYield(getStoredObj("DESU_Posts_" + aib.dm), "t5", 4);
  2162.  
  2163.                                 case 4:
  2164.                                         globalUserVis = context$2$0.t5;
  2165.                                         return context$2$0.delegateYield(getStoredObj("DESU_Threads_" + aib.dm), "t6", 6);
  2166.  
  2167.                                 case 6:
  2168.                                         hThr = context$2$0.t6;
  2169.  
  2170.                                         uVis = globalUserVis[brd] || {};
  2171.                                         if (!(brd in hThr)) {
  2172.                                                 hThr[brd] = {};
  2173.                                         }
  2174.  
  2175.                                         if (dForm.firstThr) {
  2176.                                                 context$2$0.next = 11;
  2177.                                                 break;
  2178.                                         }
  2179.  
  2180.                                         return context$2$0.abrupt("return");
  2181.  
  2182.                                 case 11:
  2183.                                         post = dForm.firstThr.op;
  2184.  
  2185.                                 case 12:
  2186.                                         if (!post) {
  2187.                                                 context$2$0.next = 32;
  2188.                                                 break;
  2189.                                         }
  2190.  
  2191.                                         num = post.num;
  2192.  
  2193.                                         if (!(num in uVis)) {
  2194.                                                 context$2$0.next = 19;
  2195.                                                 break;
  2196.                                         }
  2197.  
  2198.                                         hidePost = uVis[num][0] === 0;
  2199.  
  2200.                                         if (post.isOp) {
  2201.                                                 hideThread = !!(num in hThr[brd]);
  2202.  
  2203.                                                 if (hidePost !== hideThread) {
  2204.                                                         update = true;
  2205.                                                         hidePost = hideThread;
  2206.                                                 }
  2207.                                         }
  2208.                                         if (hidePost) {
  2209.                                                 post.setUserVisib(true, date, false);
  2210.                                         } else {
  2211.                                                 uVis[num][1] = date;
  2212.                                                 post.btns.firstChild.className = "de-btn-hide-user";
  2213.                                                 post.userToggled = true;
  2214.                                         }
  2215.                                         return context$2$0.abrupt("continue", 29);
  2216.  
  2217.                                 case 19:
  2218.                                         if (!post.isOp) {
  2219.                                                 context$2$0.next = 23;
  2220.                                                 break;
  2221.                                         }
  2222.  
  2223.                                         if (num in hThr[brd]) {
  2224.                                                 vis = "0";
  2225.                                         } else if (vis === "0") {
  2226.                                                 vis = null;
  2227.                                         }
  2228.                                         context$2$0.next = 28;
  2229.                                         break;
  2230.  
  2231.                                 case 23:
  2232.                                         if (!spellsHide) {
  2233.                                                 context$2$0.next = 27;
  2234.                                                 break;
  2235.                                         }
  2236.  
  2237.                                         vis = sVis[post.count];
  2238.                                         context$2$0.next = 28;
  2239.                                         break;
  2240.  
  2241.                                 case 27:
  2242.                                         return context$2$0.abrupt("continue", 29);
  2243.  
  2244.                                 case 28:
  2245.                                         if (vis === "0") {
  2246.                                                 if (!post.hidden) {
  2247.                                                         post.setVisib(true);
  2248.                                                         post.hideRefs();
  2249.                                                 }
  2250.                                                 post.spellHidden = true;
  2251.                                         } else if (vis !== "1") {
  2252.                                                 spells.check(post);
  2253.                                         }
  2254.  
  2255.                                 case 29:
  2256.                                         post = post.next;
  2257.                                         context$2$0.next = 12;
  2258.                                         break;
  2259.  
  2260.                                 case 32:
  2261.                                         if (update) {
  2262.                                                 globalUserVis[brd] = uVis;
  2263.                                                 setStored("DESU_Posts_" + aib.dm, JSON.stringify(globalUserVis));
  2264.                                         }
  2265.                                         spells.end(savePosts);
  2266.  
  2267.                                 case 34:
  2268.                                 case "end":
  2269.                                         return context$2$0.stop();
  2270.                         }
  2271.                 }, readUserPosts, this);
  2272.         });
  2273.         var readFavoritesPosts = regeneratorRuntime.mark(function readFavoritesPosts() {
  2274.                 var temp, update, fav, thr, num;
  2275.                 return regeneratorRuntime.wrap(function readFavoritesPosts$(context$2$0) {
  2276.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2277.                                 case 0:
  2278.                                         update = false;
  2279.                                         return context$2$0.delegateYield(getStoredObj("DESU_Favorites"), "t7", 2);
  2280.  
  2281.                                 case 2:
  2282.                                         fav = context$2$0.t7;
  2283.  
  2284.                                         if (aib.host in fav) {
  2285.                                                 context$2$0.next = 5;
  2286.                                                 break;
  2287.                                         }
  2288.  
  2289.                                         return context$2$0.abrupt("return");
  2290.  
  2291.                                 case 5:
  2292.                                         temp = fav[aib.host];
  2293.  
  2294.                                         if (brd in temp) {
  2295.                                                 context$2$0.next = 8;
  2296.                                                 break;
  2297.                                         }
  2298.  
  2299.                                         return context$2$0.abrupt("return");
  2300.  
  2301.                                 case 8:
  2302.                                         temp = temp[brd];
  2303.                                         for (thr = dForm.firstThr; thr; thr = thr.next) {
  2304.                                                 num = thr.num;
  2305.  
  2306.                                                 if (num in temp) {
  2307.                                                         thr.setFavBtn(true);
  2308.                                                         if (TNum) {
  2309.                                                                 temp[num].cnt = thr.pcount;
  2310.                                                                 temp[num]["new"] = 0;
  2311.                                                         } else {
  2312.                                                                 temp[num]["new"] = thr.pcount - temp[num].cnt;
  2313.                                                         }
  2314.                                                         update = true;
  2315.                                                 }
  2316.                                         }
  2317.                                         if (update) {
  2318.                                                 saveFavorites(fav);
  2319.                                         }
  2320.  
  2321.                                 case 11:
  2322.                                 case "end":
  2323.                                         return context$2$0.stop();
  2324.                         }
  2325.                 }, readFavoritesPosts, this);
  2326.         });
  2327.         var downloadImgData = regeneratorRuntime.mark(function downloadImgData(url) {
  2328.                 var repeatOnError = arguments[1] === undefined ? true : arguments[1];
  2329.                 var xhr, isAb, txt, rv, i, len;
  2330.                 return regeneratorRuntime.wrap(function downloadImgData$(context$2$0) {
  2331.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2332.                                 case 0:
  2333.                                         if (!(aib.fch && nav.Firefox && !url.startsWith("blob"))) {
  2334.                                                 context$2$0.next = 6;
  2335.                                                 break;
  2336.                                         }
  2337.  
  2338.                                         context$2$0.next = 3;
  2339.                                         return $ajax(url, { overrideMimeType: "text/plain; charset=x-user-defined" }, false);
  2340.  
  2341.                                 case 3:
  2342.                                         xhr = context$2$0.sent;
  2343.                                         context$2$0.next = 15;
  2344.                                         break;
  2345.  
  2346.                                 case 6:
  2347.                                         context$2$0.prev = 6;
  2348.                                         context$2$0.next = 9;
  2349.                                         return $ajax(url, { responseType: "arraybuffer" });
  2350.  
  2351.                                 case 9:
  2352.                                         xhr = context$2$0.sent;
  2353.                                         context$2$0.next = 15;
  2354.                                         break;
  2355.  
  2356.                                 case 12:
  2357.                                         context$2$0.prev = 12;
  2358.                                         context$2$0.t14 = context$2$0["catch"](6);
  2359.                                         return context$2$0.abrupt("return", null);
  2360.  
  2361.                                 case 15:
  2362.                                         isAb = xhr.responseType === "arraybuffer";
  2363.  
  2364.                                         if (!(xhr.status === 0 && isAb)) {
  2365.                                                 context$2$0.next = 20;
  2366.                                                 break;
  2367.                                         }
  2368.  
  2369.                                         return context$2$0.abrupt("return", new Uint8Array(xhr.response));
  2370.  
  2371.                                 case 20:
  2372.                                         if (!(xhr.status !== 200)) {
  2373.                                                 context$2$0.next = 29;
  2374.                                                 break;
  2375.                                         }
  2376.  
  2377.                                         if (!(xhr.status === 404 || !repeatOnError)) {
  2378.                                                 context$2$0.next = 25;
  2379.                                                 break;
  2380.                                         }
  2381.  
  2382.                                         return context$2$0.abrupt("return", null);
  2383.  
  2384.                                 case 25:
  2385.                                         return context$2$0.delegateYield(downloadImgData(url, false), "t15", 26);
  2386.  
  2387.                                 case 26:
  2388.                                         return context$2$0.abrupt("return", context$2$0.t15);
  2389.  
  2390.                                 case 27:
  2391.                                         context$2$0.next = 36;
  2392.                                         break;
  2393.  
  2394.                                 case 29:
  2395.                                         if (!isAb) {
  2396.                                                 context$2$0.next = 33;
  2397.                                                 break;
  2398.                                         }
  2399.  
  2400.                                         return context$2$0.abrupt("return", new Uint8Array(xhr.response));
  2401.  
  2402.                                 case 33:
  2403.                                         txt = xhr.responseText, rv = new Uint8Array(txt.length);
  2404.  
  2405.                                         for (i = 0, len = txt.length; i < len; ++i) {
  2406.                                                 rv[i] = txt.charCodeAt(i) & 255;
  2407.                                         }
  2408.                                         return context$2$0.abrupt("return", rv);
  2409.  
  2410.                                 case 36:
  2411.                                 case "end":
  2412.                                         return context$2$0.stop();
  2413.                         }
  2414.                 }, downloadImgData, this, [[6, 12]]);
  2415.         });
  2416.         var html5Submit = regeneratorRuntime.mark(function html5Submit(form) {
  2417.                 var needProgress = arguments[1] === undefined ? false : arguments[1];
  2418.  
  2419.                 var formData, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step$value, name, value, type, el, fileName, newFileName, data, lastFuncs, promises, xhr;
  2420.  
  2421.                 return regeneratorRuntime.wrap(function html5Submit$(context$2$0) {
  2422.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2423.                                 case 0:
  2424.                                         formData = new FormData();
  2425.                                         _iteratorNormalCompletion = true;
  2426.                                         _didIteratorError = false;
  2427.                                         _iteratorError = undefined;
  2428.                                         context$2$0.prev = 4;
  2429.                                         _iterator = getFormElements(form)[Symbol.iterator]();
  2430.  
  2431.                                 case 6:
  2432.                                         if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
  2433.                                                 context$2$0.next = 29;
  2434.                                                 break;
  2435.                                         }
  2436.  
  2437.                                         _step$value = _step.value;
  2438.                                         name = _step$value.name;
  2439.                                         value = _step$value.value;
  2440.                                         type = _step$value.type;
  2441.                                         el = _step$value.el;
  2442.  
  2443.                                         if (!(type === "file")) {
  2444.                                                 context$2$0.next = 25;
  2445.                                                 break;
  2446.                                         }
  2447.  
  2448.                                         fileName = value.name, newFileName = Cfg.removeFName ? fileName.substring(fileName.lastIndexOf(".")) : fileName;
  2449.  
  2450.                                         if (!(/^image\/(?:png|jpeg)$|^video\/webm$/.test(value.type) && (Cfg.postSameImg || Cfg.removeEXIF))) {
  2451.                                                 context$2$0.next = 24;
  2452.                                                 break;
  2453.                                         }
  2454.  
  2455.                                         context$2$0.next = 17;
  2456.                                         return readFileArrayBuffer(value);
  2457.  
  2458.                                 case 17:
  2459.                                         context$2$0.t26 = context$2$0.sent;
  2460.                                         data = cleanFile(context$2$0.t26, el.obj.imgFile);
  2461.  
  2462.                                         if (data) {
  2463.                                                 context$2$0.next = 21;
  2464.                                                 break;
  2465.                                         }
  2466.  
  2467.                                         return context$2$0.abrupt("return", Promise.reject(Lng.fileCorrupt[lang] + fileName));
  2468.  
  2469.                                 case 21:
  2470.                                         value = new File(data, newFileName);
  2471.                                         context$2$0.next = 25;
  2472.                                         break;
  2473.  
  2474.                                 case 24:
  2475.                                         if (Cfg.removeFName) {
  2476.                                                 value = new File([value], newFileName);
  2477.                                         }
  2478.  
  2479.                                 case 25:
  2480.                                         formData.append(name, value);
  2481.  
  2482.                                 case 26:
  2483.                                         _iteratorNormalCompletion = true;
  2484.                                         context$2$0.next = 6;
  2485.                                         break;
  2486.  
  2487.                                 case 29:
  2488.                                         context$2$0.next = 35;
  2489.                                         break;
  2490.  
  2491.                                 case 31:
  2492.                                         context$2$0.prev = 31;
  2493.                                         context$2$0.t27 = context$2$0["catch"](4);
  2494.                                         _didIteratorError = true;
  2495.                                         _iteratorError = context$2$0.t27;
  2496.  
  2497.                                 case 35:
  2498.                                         context$2$0.prev = 35;
  2499.                                         context$2$0.prev = 36;
  2500.  
  2501.                                         if (!_iteratorNormalCompletion && _iterator["return"]) {
  2502.                                                 _iterator["return"]();
  2503.                                         }
  2504.  
  2505.                                 case 38:
  2506.                                         context$2$0.prev = 38;
  2507.  
  2508.                                         if (!_didIteratorError) {
  2509.                                                 context$2$0.next = 41;
  2510.                                                 break;
  2511.                                         }
  2512.  
  2513.                                         throw _iteratorError;
  2514.  
  2515.                                 case 41:
  2516.                                         return context$2$0.finish(38);
  2517.  
  2518.                                 case 42:
  2519.                                         return context$2$0.finish(35);
  2520.  
  2521.                                 case 43:
  2522.                                         if (!needProgress) {
  2523.                                                 context$2$0.next = 49;
  2524.                                                 break;
  2525.                                         }
  2526.  
  2527.                                         lastFuncs = null, promises = [new Promise(function (resolve, reject) {
  2528.                                                 return lastFuncs = { resolve: resolve, reject: reject };
  2529.                                         })];
  2530.  
  2531.                                         $ajax(form.action, { method: "POST", data: formData, onprogress: function (e) {
  2532.                                                         lastFuncs.resolve({ done: false, data: { loaded: e.loaded, total: e.total } });
  2533.                                                         promises.push(new Promise(function (resolve, reject) {
  2534.                                                                 return lastFuncs = { resolve: resolve, reject: reject };
  2535.                                                         }));
  2536.                                                 } }).then(function (xhr) {
  2537.                                                 if (xhr.status === 200) {
  2538.                                                         lastFuncs.resolve({ done: true, data: $DOM(xhr.responseText) });
  2539.                                                 } else {
  2540.                                                         lastFuncs.reject(new AjaxError(xhr.status, xhr.statusText));
  2541.                                                 }
  2542.                                         });
  2543.                                         return context$2$0.abrupt("return", function () {
  2544.                                                 return promises.splice(0, 1)[0];
  2545.                                         });
  2546.  
  2547.                                 case 49:
  2548.                                         context$2$0.next = 51;
  2549.                                         return $ajax(form.action, { method: "POST", data: formData });
  2550.  
  2551.                                 case 51:
  2552.                                         xhr = context$2$0.sent;
  2553.  
  2554.                                         if (!(xhr.status === 200)) {
  2555.                                                 context$2$0.next = 54;
  2556.                                                 break;
  2557.                                         }
  2558.  
  2559.                                         return context$2$0.abrupt("return", $DOM(xhr.responseText));
  2560.  
  2561.                                 case 54:
  2562.                                         return context$2$0.abrupt("return", Promise.reject(new AjaxError(xhr.status, xhr.statusText)));
  2563.  
  2564.                                 case 55:
  2565.                                 case "end":
  2566.                                         return context$2$0.stop();
  2567.                         }
  2568.                 }, html5Submit, this, [[4, 31, 35, 43], [36,, 38, 42]]);
  2569.         });
  2570.         var initScript = regeneratorRuntime.mark(function initScript(checkDomains) {
  2571.                 var formEl, str;
  2572.                 return regeneratorRuntime.wrap(function initScript$(context$2$0) {
  2573.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  2574.                                 case 0:
  2575.                                         new Logger().init();
  2576.                                         formEl = Initialization(checkDomains);
  2577.  
  2578.                                         if (formEl) {
  2579.                                                 context$2$0.next = 4;
  2580.                                                 break;
  2581.                                         }
  2582.  
  2583.                                         return context$2$0.abrupt("return");
  2584.  
  2585.                                 case 4:
  2586.                                         new Logger().log("Init");
  2587.                                         return context$2$0.delegateYield(getStored("DESU_Exclude"), "t33", 6);
  2588.  
  2589.                                 case 6:
  2590.                                         str = context$2$0.t33;
  2591.  
  2592.                                         if (!(str && str.contains(aib.dm))) {
  2593.                                                 context$2$0.next = 9;
  2594.                                                 break;
  2595.                                         }
  2596.  
  2597.                                         return context$2$0.abrupt("return");
  2598.  
  2599.                                 case 9:
  2600.                                         excludeList = str || "";
  2601.                                         return context$2$0.delegateYield(readCfg(), "t34", 11);
  2602.  
  2603.                                 case 11:
  2604.                                         new Logger().log("Config loading");
  2605.  
  2606.                                         if (!Cfg.disabled) {
  2607.                                                 context$2$0.next = 16;
  2608.                                                 break;
  2609.                                         }
  2610.  
  2611.                                         addPanel(formEl);
  2612.                                         scriptCSS();
  2613.                                         return context$2$0.abrupt("return");
  2614.  
  2615.                                 case 16:
  2616.                                         spells = new Spells(!!Cfg.hideBySpell);
  2617.                                         new Logger().log("Parsing spells");
  2618.                                         doc.body.style.display = "none";
  2619.                                         formEl = DelForm.doReplace(formEl);
  2620.                                         new Logger().log("Replace delform");
  2621.                                         pByNum = Object.create(null);
  2622.                                         context$2$0.prev = 22;
  2623.  
  2624.                                         dForm = new DelForm(formEl, false);
  2625.                                         context$2$0.next = 31;
  2626.                                         break;
  2627.  
  2628.                                 case 26:
  2629.                                         context$2$0.prev = 26;
  2630.                                         context$2$0.t35 = context$2$0["catch"](22);
  2631.  
  2632.                                         console.log("DELFORM ERROR:\n" + getPrettyErrorMessage(context$2$0.t35));
  2633.                                         doc.body.style.display = "";
  2634.                                         return context$2$0.abrupt("return");
  2635.  
  2636.                                 case 31:
  2637.                                         if (!localRun) {
  2638.                                                 dForm.initAjax();
  2639.                                         }
  2640.                                         new Logger().log("Parse delform");
  2641.                                         pr = new PostForm($q(aib.qPostForm, doc), false, !liteMode, doc);
  2642.                                         new Logger().log("Parse postform");
  2643.                                         if (Cfg.hotKeys) {
  2644.                                                 hKeys = new HotKeys();
  2645.                                                 new Logger().log("Init keybinds");
  2646.                                         }
  2647.                                         if (!liteMode) {
  2648.                                                 initPage();
  2649.                                                 new Logger().log("Init page");
  2650.                                                 addPanel(formEl);
  2651.                                                 new Logger().log("Add panel");
  2652.                                         }
  2653.                                         initMessageFunctions();
  2654.                                         addDelformStuff();
  2655.                                         readViewedPosts();
  2656.                                         scriptCSS();
  2657.                                         new Logger().log("Apply CSS");
  2658.                                         doc.body.style.display = "";
  2659.                                         new Logger().log("Display page");
  2660.                                         if (needScroll) {
  2661.                                                 scrollPage();
  2662.                                         }
  2663.                                         new Logger().log("Scroll page");
  2664.                                         readPosts();
  2665.                                         return context$2$0.delegateYield(readUserPosts(), "t36", 48);
  2666.  
  2667.                                 case 48:
  2668.                                         return context$2$0.delegateYield(readFavoritesPosts(), "t37", 49);
  2669.  
  2670.                                 case 49:
  2671.                                         setTimeout(PostContent.purge, 0);
  2672.                                         new Logger().log("Apply spells");
  2673.                                         new Logger().finish();
  2674.  
  2675.                                 case 52:
  2676.                                 case "end":
  2677.                                         return context$2$0.stop();
  2678.                         }
  2679.                 }, initScript, this, [[22, 26]]);
  2680.         });
  2681.         var version = "15.1.28.0",
  2682.             defaultCfg = {
  2683.                 disabled: 0,
  2684.                 language: 0,
  2685.                 hideBySpell: 0,
  2686.                 spells: "[1446661837091,[[0,\"someword\",null],[6,\"somename\",null]],[[\"\",\"\",\"/(post reply row)([\\\\s\\\\S]{10,250}\\\"name\\\">Какойнибудьнейм)/g\",\"$1 nsfwp $2\"],[\"\",\"\",\"/(<span class=\\\"postfilename\\\" title=\\\"[^>]*?(?:какойнибудьтег1|какойнибудьтег2)[^<]*?</span>.*?<img class=\\\"post-image)/ig\",\"$1 nsfw\"]],false]",
  2687.                 sortSpells: 0,
  2688.                 menuHiddBtn: 1,
  2689.                 hideRefPsts: 0,
  2690.                 delHiddPost: 0,
  2691.                 ajaxUpdThr: 1,
  2692.                 updThrDelay: 5,
  2693.                 noErrInTitle: 1,
  2694.                 favIcoBlink: 0,
  2695.                 markNewPosts: 1,
  2696.                 desktNotif: 0,
  2697.                 updCount: 1,
  2698.                 expandTrunc: 1,
  2699.                 postBtnsCSS: 2,
  2700.                 showHideBtn: 1,
  2701.                 showRepBtn: 1,
  2702.                 noSpoilers: 0,
  2703.                 noPostNames: 0,
  2704.                 widePosts: 0,
  2705.                 correctTime: 1,
  2706.                 timeOffset: "+3",
  2707.                 timePattern: "w+dd+m+yyyy+hh+ii+ss",
  2708.                 timeRPattern: "(_w _d _m _Y, _h:_i:_s)",
  2709.                 expandImgs: 2,
  2710.                 imgNavBtns: 0,
  2711.                 resizeDPI: 0,
  2712.                 resizeImgs: 1,
  2713.                 minImgSize: 100,
  2714.                 zoomFactor: 25,
  2715.                 webmControl: 1,
  2716.                 webmVolume: 100,
  2717.                 maskImgs: 0,
  2718.                 preLoadImgs: 0,
  2719.                 findImgFile: 0,
  2720.                 openImgs: 0,
  2721.                 openGIFs: 0,
  2722.                 imgSrcBtns: 0,
  2723.                 linksNavig: 2,
  2724.                 linksOver: 30,
  2725.                 linksOut: 300,
  2726.                 markViewed: 0,
  2727.                 strikeHidd: 0,
  2728.                 removeHidd: 0,
  2729.                 noNavigHidd: 0,
  2730.                 crossLinks: 0,
  2731.                 insertNum: 1,
  2732.                 addOPLink: 0,
  2733.                 addImgs: 0,
  2734.                 addMP3: 0,
  2735.                 addVocaroo: 0,
  2736.                 addYouTube: 3,
  2737.                 YTubeType: 0,
  2738.                 YTubeWidth: 280,
  2739.                 YTubeHeigh: 210,
  2740.                 YTubeTitles: 1,
  2741.                 addVimeo: 0,
  2742.                 ajaxReply: 2,
  2743.                 postSameImg: 0,
  2744.                 removeEXIF: 0,
  2745.                 removeFName: 1,
  2746.                 sendErrNotif: 1,
  2747.                 scrAfterRep: 0,
  2748.                 addPostForm: 1,
  2749.                 hangQReply: 0,
  2750.                 favOnReply: 0,
  2751.                 warnSubjTrip: 1,
  2752.                 fileThumb: 1,
  2753.                 addSageBtn: 0,
  2754.                 saveSage: 0,
  2755.                 sageReply: 0,
  2756.                 captchaLang: 1,
  2757.                 addTextBtns: 0,
  2758.                 txtBtnsLoc: 1,
  2759.                 passwValue: "",
  2760.                 userName: 0,
  2761.                 nameValue: "",
  2762.                 noBoardRule: 1,
  2763.                 noGoto: 1,
  2764.                 noPassword: 1,
  2765.                 noName: 0,
  2766.                 scriptStyle: 0,
  2767.                 userCSS: 1,
  2768.                 userCSSTxt: "/* это чтобы видео отображалось красивенько рядом с картинкой */\n.de-video-obj {\n display: inline;\n}\n.de-video-resizer:after {\n font-weight: bold;\n font-size: 18px;\n}\n.de-video-obj > a {\n display: inline;\n}\n#de-qarea-toggle {\n font-size: 14px;\n}\n#de-qarea-close {\n font-size: 14px;\n}\n\n/* убираем панель навигации */\n#navigation {\n display: none;\n}\n\n/* и встроенный счетчик постов в треде */\np.intro time:after {\n display: none;\n}\n\n/* встроенные значки сажи и рандома нам тоже не нужны */\na[href=\"mailto:sage\"]:after,\na[href=\"mailto:Sage\"]:after,\na[href=\"mailto:SAGE\"]:after,\na[href=\"mailto:#random\"]:after,\na[href=\"mailto:#Random\"]:after,\na[href=\"mailto:#RANDOM\"]:after {\n content: \"\" !important;\n}\n\n/* хз почему, но от этого перестают разъезжаться информационные сообщения в кукле */\ndiv.post {\n max-width: 120% !important;\n}\n\n/* кусок css для \"мягкого\" скрытие картинок, также можно использовать как спойлеры */\ndiv.post img.post-image.nsfw:hover {\n transition: -webkit-filter, opacity 1s;\n transition-delay: 0.2s;\n outline: 2px dashed rgba(0, 0, 0, 0.0);\n opacity: 0.5;\n -webkit-filter: grayscale(00%);\n}\ndiv.post img.post-image.nsfw {\n outline: 2px dashed rgba(0, 0, 0, 1.5);\n outline-offset: 2px;\n opacity: 0.04;\n -webkit-filter: grayscale(100%);\n}\n\n/* то же самое, но для постов */\n.nsfwp:hover {\n transition: -webkit-filter, opacity 1s;\n transition-delay: 0.2s;\n outline: 2px dashed rgba(0, 0, 0, 0.0);\n opacity: 0.5;\n -webkit-filter: grayscale(00%);\n}\n.nsfwp {\n outline: 2px dashed rgba(0, 0, 0, 1.5);\n outline-offset: 2px;\n opacity: 0.07;\n -webkit-filter: grayscale(100%);\n}\n\n/* фикс формы и ресайзера */\ndiv.charleft.originalDisplayInfo {\n width: 99% !important;\n}\n#de-txta-resizer {\n margin: 0 0 5px -12px !important;\n}\n#de-txt-panel {\n clear: both;\n}\n.de-cfg-body {\n width: auto;\n}\n.de-qarea-hanging #de-resizer-right {\n display: inline-flex !important;\n}\n#de-pform {\n min-width: 100% !important;\n}\n#body {\n min-width: 450px !important;\n}\n\n/* фикс формы в фуррифоксе */\ntextarea[name=\"body\"],\nx:-moz-any-link {\n display: block;\n}\n\n/* бутафорская кнопка аудиоплеера, ничего не делает, но без нее плеер в новых постах не видно */\naudio {\n background-image: url(http://cdn.syn-ch.com/src/144/42/37/1444237893-36c89.png);\n background-size: auto 130%;\n background-position: 1% center;\n background-repeat: no-repeat;\n}\n\n/* некоторые посты распидорашивали страницу в ширину из за чего появлялся горизонтальный скролл */\ndiv.post.reply {\n max-width: 100% !important;\n}",
  2769.                 expandPanel: 0,
  2770.                 attachPanel: 1,
  2771.                 panelCounter: 0,
  2772.                 rePageTitle: 1,
  2773.                 animation: 0,
  2774.                 closePopups: 1,
  2775.                 hotKeys: 0,
  2776.                 loadPages: 1,
  2777.                 updScript: 0,
  2778.                 scrUpdIntrv: 1,
  2779.                 turnOff: 0,
  2780.                 qReplyX: "right: 0",
  2781.                 qReplyY: "bottom: 25px"
  2782.         },
  2783.             Lng = {
  2784.                 cfg: {
  2785.                         hideBySpell: ["Заклинания: ", "Magic spells: "],
  2786.                         sortSpells: ["Сортировать спеллы и удалять дубликаты", "Sort spells and delete duplicates"],
  2787.                         menuHiddBtn: ["Дополнительное меню кнопок скрытия ", "Additional menu of hide buttons"],
  2788.                         hideRefPsts: ["Скрывать ответы на скрытые посты*", "Hide replies to hidden posts*"],
  2789.                         delHiddPost: ["Удалять скрытые посты", "Delete hidden posts"],
  2790.  
  2791.                         ajaxUpdThr: ["AJAX обновление треда ", "AJAX thread update "],
  2792.                         updThrDelay: [" (сек)", " (sec)"],
  2793.                         noErrInTitle: ["Не показывать номер ошибки в заголовке", "Don't show error number in title"],
  2794.                         favIcoBlink: ["Мигать фавиконом при новых постах", "Favicon blinking on new posts"],
  2795.                         markNewPosts: ["Выделять новые посты при смене вкладки", "Mark new posts when tab changes"],
  2796.                         desktNotif: ["Уведомления на рабочем столе", "Desktop notifications"],
  2797.                         updCount: ["Обратный счетчик секунд до обновления", "Show countdown to thread update"],
  2798.                         expandTrunc: ["Разворачивать сокращенные посты*", "Auto expanding of truncated posts*"],
  2799.                         postBtnsCSS: {
  2800.                                 sel: [["Text", "Classic", "Solid grey"], ["Text", "Classic", "Solid grey"]],
  2801.                                 txt: ["Кнопки постов* ", "Post buttons* "]
  2802.                         },
  2803.                         showHideBtn: ["Скрытие ", "Post hide "],
  2804.                         showRepBtn: ["Ответ", "Post reply"],
  2805.                         noSpoilers: ["Открывать текстовые спойлеры", "Open text spoilers"],
  2806.                         noPostNames: ["Скрывать имена в постах", "Hide names in posts"],
  2807.                         widePosts: ["Растягивать посты по ширине экрана", "Stretch posts to the screen width"],
  2808.                         hotKeys: ["Горячие клавиши ", "Keyboard hotkeys "],
  2809.                         loadPages: [" Количество страниц, загружаемых по F5", " Number of pages that are loaded on F5 "],
  2810.                         correctTime: ["Коррекция времени в постах* ", "Correct time in posts* "],
  2811.                         timeOffset: [" (ч) разница ", " (h) difference "],
  2812.                         timePattern: [" Шаблон поиска", " Find pattern"],
  2813.                         timeRPattern: [" Шаблон замены", " Replace pattern"],
  2814.  
  2815.                         expandImgs: {
  2816.                                 sel: [["Откл.", "В посте", "По центру"], ["Disable", "In post", "By center"]],
  2817.                                 txt: ["Раскрывать картинки по клику", "Expand images on click"]
  2818.                         },
  2819.                         imgNavBtns: ["Добавлять кнопки навигации по картинкам", "Add buttons for images navigation"],
  2820.                         resizeDPI: ["Отображать картинки пиксель в пиксель", "Don't upscale images on retina displays"],
  2821.                         resizeImgs: ["Уменьшать в экран большие картинки", "Resize large images to fit screen"],
  2822.                         minImgSize: [" Минимальный размер картинок (px)", " Minimal image's size (px)"],
  2823.                         zoomFactor: [" Чувствительность зума картинок [1-100]", " Sensibility of the images zoom [1-100]"],
  2824.                         webmControl: ["Показывать контрол-бар для webm-файлов", "Show control bar for webm files"],
  2825.                         webmVolume: [" Громкость webm-файлов [0-100]", " Default volume for webm files [0-100]"],
  2826.                         preLoadImgs: ["Предварительно загружать картинки*", "Pre-load images*"],
  2827.                         findImgFile: ["Распознавать встроенные файлы в картинках*", "Detect built-in files in images*"],
  2828.                         openImgs: ["Скачивать полные версии картинок*", "Download full version of images*"],
  2829.                         openGIFs: ["Скачивать только GIFы*", "Download GIFs only*"],
  2830.                         imgSrcBtns: ["Добавлять кнопки для поиска картинок*", "Add image search buttons*"],
  2831.  
  2832.                         linksNavig: {
  2833.                                 sel: [["Откл.", "Без карты", "С картой"], ["Disable", "No map", "With map"]],
  2834.                                 txt: ["Навигация по >>ссылкам* ", "Navigation by >>links* "]
  2835.                         },
  2836.                         linksOver: [" Появление ", " Appearance "],
  2837.                         linksOut: [" Пропадание (мс)", " Disappearance (ms)"],
  2838.                         markViewed: ["Отмечать просмотренные посты*", "Mark viewed posts*"],
  2839.                         strikeHidd: ["Зачеркивать >>ссылки на скрытые посты", "Strike >>links to hidden posts"],
  2840.                         removeHidd: ["Удалять из карты ответов", "Remove from replies map"],
  2841.                         noNavigHidd: ["Не отображать превью для скрытых постов", "Don't show previews for hidden posts"],
  2842.                         crossLinks: ["Преобразовывать http:// в >>/b/ссылки*", "Replace http:// with >>/b/links*"],
  2843.                         insertNum: ["Вставлять >>ссылку по клику на №поста*", "Insert >>link on №postnumber click*"],
  2844.                         addOPLink: ["Вставлять >>ссылку при ответе на оп-пост на доске", "Insert >>link for reply to op-posts on board"],
  2845.                         addMP3: ["Плеер к mp3 ссылкам* ", "Player to mp3 links* "],
  2846.                         addImgs: ["Загружать картинки к jpg, png, gif ссылкам*", "Load images to jpg, png, gif links*"],
  2847.                         addVocaroo: ["Плеер к Vocaroo ссылкам*", "Player to Vocaroo links*"],
  2848.                         addVimeo: ["Добавлять плеер к Vimeo ссылкам*", "Add player to Vimeo links*"],
  2849.                         addYouTube: {
  2850.                                 sel: [["Ничего", "Плеер по клику", "Авто плеер", "Превью+плеер", "Только превью"], ["Nothing", "On click player", "Auto player", "Preview+player", "Only preview"]],
  2851.                                 txt: ["к YouTube-ссылкам* ", "to YouTube-links* "]
  2852.                         },
  2853.                         YTubeType: {
  2854.                                 sel: [["Flash", "HTML5"], ["Flash", "HTML5"]],
  2855.                                 txt: ["", ""]
  2856.                         },
  2857.                         YTubeTitles: ["Загружать названия к YouTube-ссылкам*", "Load titles into YouTube-links*"],
  2858.  
  2859.                         ajaxReply: {
  2860.                                 sel: [["Откл.", "Iframe", "HTML5"], ["Disable", "Iframe", "HTML5"]],
  2861.                                 txt: ["AJAX отправка постов*", "posting with AJAX*"]
  2862.                         },
  2863.                         postSameImg: ["Возможность отправки одинаковых картинок", "Ability to post same images"],
  2864.                         removeEXIF: ["Удалять EXIF из JPEG ", "Remove EXIF from JPEG "],
  2865.                         removeFName: ["Удалять имя файлов", "Clear file names"],
  2866.                         sendErrNotif: ["Оповещать в заголовке об ошибке отправки", "Inform in title about post send error"],
  2867.                         scrAfterRep: ["Перемещаться в конец треда после отправки", "Scroll to the bottom after reply"],
  2868.                         addPostForm: {
  2869.                                 sel: [["Сверху", "Внизу", "Скрытая"], ["At top", "At bottom", "Hidden"]],
  2870.                                 txt: ["Форма ответа в треде", "Reply form in thread"]
  2871.                         },
  2872.                         favOnReply: ["Добавлять тред в избранное при ответе", "Add thread to favorites on reply"],
  2873.                         warnSubjTrip: ["Оповещать при наличии трип-кода в поле \"Тема\"", "Warn if \"Subject\" field contains trip-code"],
  2874.                         fileThumb: ["Область превью картинок вместо кнопки \"Файл\"", "File thumbnail area instead of \"File\" button"],
  2875.                         addSageBtn: ["Кнопка Sage вместо \"E-mail\"* ", "Sage button instead of \"E-mail\"* "],
  2876.                         saveSage: ["Запоминать сажу", "Remember sage"],
  2877.                         captchaLang: {
  2878.                                 sel: [["Откл.", "Eng", "Rus"], ["Disable", "Eng", "Rus"]],
  2879.                                 txt: ["Язык ввода капчи", "Language input in captcha"]
  2880.                         },
  2881.                         addTextBtns: {
  2882.                                 sel: [["Откл.", "Графич.", "Упрощ.", "Стандарт."], ["Disable", "As images", "As text", "Standard"]],
  2883.                                 txt: ["Кнопки разметки текста ", "Text format buttons "]
  2884.                         },
  2885.                         txtBtnsLoc: ["Внизу", "At bottom"],
  2886.                         userPassw: [" Постоянный пароль ", " Fixed password "],
  2887.                         userName: ["Постоянное имя", "Fixed name"],
  2888.                         noBoardRule: ["правила ", "rules "],
  2889.                         noGoto: ["поле goto ", "goto field "],
  2890.                         noPassword: ["пароль ", "password "],
  2891.                         noName: ["имя", "name"],
  2892.  
  2893.                         scriptStyle: {
  2894.                                 sel: [["Glass black", "Glass blue", "Solid grey"], ["Glass black", "Glass blue", "Solid grey"]],
  2895.                                 txt: ["Стиль скрипта", "Script style"]
  2896.                         },
  2897.                         userCSS: ["Пользовательский CSS ", "User CSS "],
  2898.                         attachPanel: ["Прикрепить главную панель", "Attach main panel"],
  2899.                         panelCounter: ["Счетчик постов/картинок на главной панели", "Counter of posts/images on main panel"],
  2900.                         rePageTitle: ["Название треда в заголовке вкладки*", "Thread title in page tab*"],
  2901.                         animation: ["CSS3 анимация в скрипте", "CSS3 animation in script"],
  2902.                         closePopups: ["Автоматически закрывать уведомления", "Close popups automatically"],
  2903.                         updScript: ["Автоматически проверять обновления скрипта", "Check for script update automatically"],
  2904.                         scrUpdIntrv: {
  2905.                                 sel: [["Каждый день", "Каждые 2 дня", "Каждую неделю", "Каждые 2 недели", "Каждый месяц"], ["Every day", "Every 2 days", "Every week", "Every 2 week", "Every month"]],
  2906.                                 txt: ["", ""]
  2907.                         },
  2908.                         excludeList: ["Список доменов, запрещающих запуск скрипта:", "Domains list for preventing script launch:"],
  2909.                         turnOff: ["Включать скрипт только на этом сайте", "Enable script only on this site"],
  2910.  
  2911.                         language: {
  2912.                                 sel: [["Ru", "En"], ["Ru", "En"]],
  2913.                                 txt: ["", ""]
  2914.                         }
  2915.                 },
  2916.  
  2917.                 txtBtn: [["Жирный", "Bold"], ["Наклонный", "Italic"], ["Подчеркнутый", "Underlined"], ["Зачеркнутый", "Strike"], ["Спойлер", "Spoiler"], ["Код", "Code"], ["Верхний индекс", "Superscript"], ["Нижний индекс", "Subscript"], ["Цитировать выделенное", "Quote selected"]],
  2918.  
  2919.                 cfgTab: {
  2920.                         filters: ["Фильтры", "Filters"],
  2921.                         posts: ["Посты", "Posts"],
  2922.                         images: ["Картинки", "Images"],
  2923.                         links: ["Ссылки", "Links"],
  2924.                         form: ["Форма", "Form"],
  2925.                         common: ["Общее", "Common"],
  2926.                         info: ["Инфо", "Info"]
  2927.                 },
  2928.  
  2929.                 panelBtn: {
  2930.                         attach: ["Прикрепить/Открепить", "Attach/Detach"],
  2931.                         settings: ["Настройки", "Settings"],
  2932.                         hidden: ["Скрытое", "Hidden"],
  2933.                         favor: ["Избранное", "Favorites"],
  2934.                         video: ["Видео-ссылки", "Video links"],
  2935.                         refresh: ["Обновить", "Refresh"],
  2936.                         goback: ["Назад", "Go back"],
  2937.                         gonext: ["Следующая", "Next"],
  2938.                         goup: ["Наверх", "To the top"],
  2939.                         godown: ["В конец", "To the bottom"],
  2940.                         expimg: ["Раскрыть картинки", "Expand images"],
  2941.                         preimg: ["Предзагрузка картинок ([Ctrl+Click] только для новых постов)", "Preload images ([Ctrl+Click] for new posts only)"],
  2942.                         maskimg: ["Маскировать картинки", "Mask images"],
  2943.                         "upd-on": ["Выключить автообновление треда", "Disable thread autoupdate"],
  2944.                         "upd-off": ["Включить автообновление треда", "Enable thread autoupdate"],
  2945.                         "audio-off": ["Звуковое оповещение о новых постах", "Sound notification about new posts"],
  2946.                         catalog: ["Каталог", "Catalog"],
  2947.                         counter: ["Постов/картинок в треде", "Posts/Images in thread"],
  2948.                         savethr: ["Сохранить на диск", "Save to disk"],
  2949.                         enable: ["Включить/выключить скрипт", "Turn on/off the script"]
  2950.                 },
  2951.  
  2952.                 selHiderMenu: {
  2953.                         sel: ["Скрывать выделенное", "Hide selected text"],
  2954.                         name: ["Скрывать имя", "Hide name"],
  2955.                         trip: ["Скрывать трип-код", "Hide with trip-code"],
  2956.                         img: ["Скрывать картинку", "Hide with image"],
  2957.                         ihash: ["Скрывать схожие картинки", "Hide similar images"],
  2958.                         text: ["Скрыть схожий текст", "Hide similar text"],
  2959.                         noimg: ["Скрывать без картинок", "Hide without images"],
  2960.                         notext: ["Скрывать без текста", "Hide without text"]
  2961.                 },
  2962.                 selExpandThr: [["5 постов", "15 постов", "30 постов", "50 постов", "100 постов"], ["5 posts", "15 posts", "30 posts", "50 posts", "100 posts"]],
  2963.                 selAjaxPages: [["1 страница", "2 страницы", "3 страницы", "4 страницы", "5 страниц"], ["1 page", "2 pages", "3 pages", "4 pages", "5 pages"]],
  2964.                 selSaveThr: [["Скачать весь тред", "Скачать картинки"], ["Download thread", "Download images"]],
  2965.                 selAudioNotif: [["Каждые 30 сек.", "Каждую минуту", "Каждые 2 мин.", "Каждые 5 мин."], ["Every 30 sec.", "Every minute", "Every 2 min.", "Every 5 min."]],
  2966.  
  2967.                 hotKeyEdit: [["%l%i24 – предыдущая страница/картинка%/l", "%l%i217 – следующая страница/картинка%/l", "%l%i23 – скрыть текущий пост/тред%/l", "%l%i33 – раскрыть текущий тред%/l", "%l%i22 – быстрый ответ%/l", "%l%i25t – отправить пост%/l", "%l%i21 – тред (на доске)/пост (в треде) ниже%/l", "%l%i20 – тред (на доске)/пост (в треде) выше%/l", "%l%i31 – пост (на доске) ниже%/l", "%l%i30 – пост (на доске) выше%/l", "%l%i32 – открыть тред%/l", "%l%i210 – открыть/закрыть настройки%/l", "%l%i26 – открыть/закрыть избранное%/l", "%l%i27 – открыть/закрыть скрытые посты%/l", "%l%i28 – открыть/закрыть панель%/l", "%l%i29 – включить/выключить маскировку картинок%/l", "%l%i40 – обновить тред%/l", "%l%i211 – раскрыть картинку в текущем посте%/l", "%l%i212t – жирный%/l", "%l%i213t – курсив%/l", "%l%i214t – зачеркнутый%/l", "%l%i215t – спойлер%/l", "%l%i216t – код%/l"], ["%l%i24 – previous page/image%/l", "%l%i217 – next page/image%/l", "%l%i23 – hide current post/thread%/l", "%l%i33 – expand current thread%/l", "%l%i22 – quick reply%/l", "%l%i25t – send post%/l", "%l%i21 – thread (on board)/post (in thread) below%/l", "%l%i20 – thread (on board)/post (in thread) above%/l", "%l%i31 – on board post below%/l", "%l%i30 – on board post above%/l", "%l%i32 – open thread%/l", "%l%i210 – open/close Settings%/l", "%l%i26 – open/close Favorites%/l", "%l%i27 – open/close Hidden Posts Table%/l", "%l%i28 – open/close the main panel%/l", "%l%i29 – turn on/off masking images%/l", "%l%i40 – update thread%/l", "%l%i211 – expand current post's images%/l", "%l%i212t – bold%/l", "%l%i213t – italic%/l", "%l%i214t – strike%/l", "%l%i215t – spoiler%/l", "%l%i216t – code%/l"]],
  2968.  
  2969.                 month: [["янв", "фев", "мар", "апр", "мая", "июн", "июл", "авг", "сен", "окт", "ноя", "дек"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]],
  2970.                 fullMonth: [["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]],
  2971.                 week: [["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]],
  2972.  
  2973.                 editor: {
  2974.                         cfg: ["Редактирование настроек:", "Edit settings:"],
  2975.                         hidden: ["Редактирование скрытых тредов:", "Edit hidden threads:"],
  2976.                         favor: ["Редактирование избранного:", "Edit favorites:"],
  2977.                         css: ["Редактирование CSS", "Edit CSS"]
  2978.                 },
  2979.  
  2980.                 newPost: [[" новый пост", " новых поста", " новых постов", ". Последний:"], [" new post", " new posts", " new posts", ". Latest: "]],
  2981.  
  2982.                 name: ["Имя", "Name"],
  2983.                 subj: ["Тема", "Subject"],
  2984.                 mail: ["E-mail", "E-mail"],
  2985.                 cap: ["Капча", "Captcha"],
  2986.                 video: ["Видео", "Video"],
  2987.                 add: ["Добавить", "Add"],
  2988.                 apply: ["Применить", "Apply"],
  2989.                 clear: ["Очистить", "Clear"],
  2990.                 refresh: ["Обновить", "Refresh"],
  2991.                 load: ["Загрузить", "Load"],
  2992.                 save: ["Сохранить", "Save"],
  2993.                 edit: ["Правка", "Edit"],
  2994.                 reset: ["Сброс", "Reset"],
  2995.                 remove: ["Удалить", "Remove"],
  2996.                 info: ["Инфо", "Info"],
  2997.                 undo: ["Отмена", "Undo"],
  2998.                 change: ["Сменить", "Change"],
  2999.                 reply: ["Ответ", "Reply"],
  3000.                 loading: ["Загрузка...", "Loading..."],
  3001.                 checking: ["Проверка...", "Checking..."],
  3002.                 deleting: ["Удаление...", "Deleting..."],
  3003.                 error: ["Ошибка", "Error"],
  3004.                 noConnect: ["Ошибка подключения", "Connection failed"],
  3005.                 internalError: ["Ошибка скрипта:\n", "Script error:\n"],
  3006.                 thrNotFound: ["Тред недоступен (№", "Thread is unavailable (№"],
  3007.                 succDeleted: ["Успешно удалено!", "Succesfully deleted!"],
  3008.                 errDelete: ["Не могу удалить:\n", "Can't delete:\n"],
  3009.                 cTimeError: ["Неправильные настройки времени", "Invalid time settings"],
  3010.                 noGlobalCfg: ["Глобальные настройки не найдены", "Global config not found"],
  3011.                 postNotFound: ["Пост не найден", "Post not found"],
  3012.                 dontShow: ["Скрыть: ", "Hide: "],
  3013.                 checkNow: ["Проверить сейчас", "Check now"],
  3014.                 updAvail: ["Доступно обновление!", "Update available!"],
  3015.                 haveLatest: ["У вас стоит самая последняя версия!", "You have latest version!"],
  3016.                 storage: ["Хранение: ", "Storage: "],
  3017.                 thrViewed: ["Тредов посещено", "Threads visited"],
  3018.                 thrCreated: ["Тредов создано", "Threads created"],
  3019.                 thrHidden: ["Тредов скрыто", "Threads hidden"],
  3020.                 postsSent: ["Постов отправлено", "Posts sent"],
  3021.                 total: ["Всего", "Total"],
  3022.                 debug: ["Отладка", "Debug"],
  3023.                 infoDebug: ["Информация для отладки", "Information for debugging"],
  3024.                 loadGlobal: ["Загрузить глобальные настройки", "Load global settings"],
  3025.                 saveGlobal: ["Сохранить настройки как глобальные", "Save settings as global"],
  3026.                 editInTxt: ["Правка в текстовом формате", "Edit in text format"],
  3027.                 resetCfg: ["Сбросить в настройки по умолчанию", "Reset settings to defaults"],
  3028.                 conReset: ["Данное действие удалит все ваши настройки и закладки. Продолжить?", "This will delete all your preferences and favourites. Continue?"],
  3029.                 clrSelected: ["Удалить выделенные записи", "Remove selected notes"],
  3030.                 saveChanges: ["Сохранить внесенные изменения", "Save your changes"],
  3031.                 infoCount: ["Обновить счетчики постов", "Refresh posts counters"],
  3032.                 infoPage: ["Проверить актуальность тредов (до 5 страницы)", "Check for threads actuality (up to 5 page)"],
  3033.                 clrDeleted: ["Очистить недоступные (404) треды", "Clear inaccessible (404) threads"],
  3034.                 oldPosts: ["Постов при последнем посещении", "Posts at the last visit"],
  3035.                 newPosts: ["Количество новых постов", "Number of new posts"],
  3036.                 thrPage: ["Тред на @странице", "Thread on @page"],
  3037.                 findThrd: ["Найти/Загрузить тред", "Find/Load thread"],
  3038.                 hiddenPosts: ["Скрытые посты на странице", "Hidden posts on the page"],
  3039.                 hiddenThrds: ["Скрытые треды", "Hidden threads"],
  3040.                 noHidPosts: ["На этой странице нет скрытых постов...", "No hidden posts on this page..."],
  3041.                 noHidThrds: ["Нет скрытых тредов...", "No hidden threads..."],
  3042.                 expandAll: ["Раскрыть все", "Expand all"],
  3043.                 invalidData: ["Некорректный формат данных", "Incorrect data format"],
  3044.                 favThrds: ["Избранные треды:", "Favorite threads:"],
  3045.                 noFavThrds: ["Нет избранных тредов...", "Favorites is empty..."],
  3046.                 noVideoLinks: ["Нет ссылок на видео...", "No video links..."],
  3047.                 hideLnkList: ["Скрыть/Показать список ссылок", "Hide/Unhide list of links"],
  3048.                 prevVideo: ["Предыдущее видео", "Previous video"],
  3049.                 nextVideo: ["Следующее видео", "Next video"],
  3050.                 toggleQReply: ["Поместить под пост / Открепить", "Move under post / Unattach"],
  3051.                 closeQReply: ["Закрыть форму", "Close form"],
  3052.                 replies: ["Ответы:", "Replies:"],
  3053.                 postsOmitted: ["Пропущено ответов: ", "Posts omitted: "],
  3054.                 collapseThrd: ["Свернуть тред", "Collapse thread"],
  3055.                 deleted: ["удалён", "deleted"],
  3056.                 getNewPosts: ["Получить новые посты", "Get new posts"],
  3057.                 page: ["Страница", "Page"],
  3058.                 hiddenThrd: ["Скрытый тред:", "Hidden thread:"],
  3059.                 makeThrd: ["Создать тред", "Create thread"],
  3060.                 makeReply: ["Ответить", "Make reply"],
  3061.                 noSage: ["Без сажи", "No sage"],
  3062.                 hideForm: ["Скрыть форму", "Hide form"],
  3063.                 search: ["Искать в ", "Search in "],
  3064.                 wait: ["Ждите", "Wait"],
  3065.                 noFile: ["Нет файла", "No file"],
  3066.                 clickToAdd: ["Выберите, либо перетащите файл", "Select or drag and drop file"],
  3067.                 removeFile: ["Удалить файл", "Remove file"],
  3068.                 spoilFile: ["Спойлер", "Spoiler"],
  3069.                 helpAddFile: ["Встроить .ogg, .rar, .zip или .7z в картинку", "Pack .ogg, .rar, .zip or .7z into image"],
  3070.                 downloadFile: ["Скачать содержащийся в картинке файл", "Download existing file from image"],
  3071.                 fileCorrupt: ["Файл повреждён: ", "File is corrupted: "],
  3072.                 subjHasTrip: ["Поле \"Тема\" содержит трипкод", "\"Subject\" field contains a tripcode"],
  3073.                 loadImage: ["Загружаются картинки: ", "Loading images: "],
  3074.                 loadFile: ["Загружаются файлы: ", "Loading files: "],
  3075.                 cantLoad: ["Не могу загрузить ", "Can't load "],
  3076.                 willSavePview: ["Будет сохранено превью", "Thumbnail will be saved"],
  3077.                 loadErrors: ["Во время загрузки произошли ошибки:", "An error occurred during the loading:"],
  3078.                 errCorruptData: ["Ошибка: сервер отправил повреждённые данные", "Error: server sent corrupted data"],
  3079.                 expImgInline: ["[Click] открыть в посте, [Ctrl+Click] в центре", "[Click] expand in post, [Ctrl+Click] by center"],
  3080.                 expImgFull: ["", "[Click] expand by center, [Ctrl+Click] in post"],
  3081.                 nextImg: ["Следующая картинка", "Next image"],
  3082.                 prevImg: ["Предыдущая картинка", "Previous image"],
  3083.                 togglePost: ["Скрыть/Раскрыть пост", "Hide/Unhide post"],
  3084.                 replyToPost: ["Ответить на пост", "Reply to post"],
  3085.                 expandThrd: ["Раскрыть весь тред", "Expand all thread"],
  3086.                 addFav: ["Добавить тред в Избранное", "Add thread to Favorites"],
  3087.                 delFav: ["Убрать тред из Избранного", "Remove thread from Favorites"],
  3088.                 attachPview: ["Закрепить превью", "Attach preview"],
  3089.                 expandVideo: ["Развернуть/Свернуть видео", "Expand/Collapse video"],
  3090.                 author: ["автор: ", "author: "],
  3091.                 views: ["просмотров: ", "views: "],
  3092.                 published: ["опубликовано: ", "published: "],
  3093.  
  3094.                 seSyntaxErr: ["синтаксическая ошибка в аргументе спелла: %s", "syntax error in argument of spell: %s"],
  3095.                 seUnknown: ["неизвестный спелл: %s", "unknown spell: %s"],
  3096.                 seMissOp: ["пропущен оператор", "missing operator"],
  3097.                 seMissArg: ["пропущен аргумент спелла: %s", "missing argument of spell: %s"],
  3098.                 seMissSpell: ["пропущен спелл", "missing spell"],
  3099.                 seErrRegex: ["синтаксическая ошибка в регулярном выражении: %s", "syntax error in regular expression: %s"],
  3100.                 seUnexpChar: ["неожиданный символ: %s", "unexpected character: %s"],
  3101.                 seMissClBkt: ["пропущена закрывающаяся скобка", "missing ) in parenthetical"],
  3102.                 seRepsInParens: ["спелл $s не должен располагаться в скобках", "spell %s shouldn't be in parens"],
  3103.                 seOpInReps: ["недопустимо использовать оператор %s со спеллами #rep и #outrep", "don't use operator %s with spells #rep & #outrep"],
  3104.                 seRow: [" (строка ", " (row "],
  3105.                 seCol: [", столбец ", ", column "],
  3106.                 sendingPost: ["Отправка поста...", "Sending post..."],
  3107.                 sizeByte: [" Байт", " Byte"],
  3108.                 sizeKByte: [" КБ", " KB"],
  3109.                 sizeMByte: [" МБ", " MB"],
  3110.                 sizeGByte: [" ГБ", " GB"],
  3111.                 second: ["с", "s"]
  3112.         },
  3113.             doc = window.document,
  3114.             aProto = Array.prototype,
  3115.             locStorage,
  3116.             sesStorage,
  3117.             Cfg,
  3118.             hThr,
  3119.             pByNum,
  3120.             sVis,
  3121.             uVis,
  3122.             needScroll,
  3123.             aib,
  3124.             nav,
  3125.             brd,
  3126.             TNum,
  3127.             pageNum,
  3128.             updater,
  3129.             hKeys,
  3130.             visPosts = 2,
  3131.             dTime,
  3132.             WebmParser,
  3133.             Logger,
  3134.             pr,
  3135.             dForm,
  3136.             dummy,
  3137.             spells,
  3138.             Images_ = { preloading: false, afterpreload: null, progressId: null, canvas: null },
  3139.             lang,
  3140.             quotetxt = "",
  3141.             liteMode,
  3142.             localRun,
  3143.             isExpImg,
  3144.             isPreImg,
  3145.             chromeCssUpd,
  3146.             excludeList,
  3147.             $each = Function.prototype.call.bind(aProto.forEach),
  3148.             emptyFn = Function.prototype;
  3149.  
  3150.  
  3151.  
  3152.  
  3153.         function $Q(path, root) {
  3154.                 return root.querySelectorAll(path);
  3155.         }
  3156.  
  3157.         function $q(path, root) {
  3158.                 return root.querySelector(path);
  3159.         }
  3160.  
  3161.         function $C(id, root) {
  3162.                 return root.getElementsByClassName(id);
  3163.         }
  3164.  
  3165.         function $c(id, root) {
  3166.                 return root.getElementsByClassName(id)[0];
  3167.         }
  3168.  
  3169.         function $id(id) {
  3170.                 return doc.getElementById(id);
  3171.         }
  3172.  
  3173.         function $T(id, root) {
  3174.                 return root.getElementsByTagName(id);
  3175.         }
  3176.  
  3177.         function $t(id, root) {
  3178.                 return root.getElementsByTagName(id)[0];
  3179.         }
  3180.  
  3181.         function $parent(el, tagName) {
  3182.                 do {
  3183.                         el = el.parentElement;
  3184.                 } while (el && el.tagName !== tagName);
  3185.                 return el;
  3186.         }
  3187.  
  3188.         function $before(el, node) {
  3189.                 el.parentNode.insertBefore(node, el);
  3190.         }
  3191.  
  3192.         function $after(el, node) {
  3193.                 el.parentNode.insertBefore(node, el.nextSibling);
  3194.         }
  3195.  
  3196.         function $add(html) {
  3197.                 dummy.innerHTML = html;
  3198.                 return dummy.firstChild;
  3199.         }
  3200.  
  3201.         function $new(tag, attr, events) {
  3202.                 var el = doc.createElement(tag);
  3203.                 if (attr) {
  3204.                         for (var key in attr) {
  3205.                                 if (key === "text") {
  3206.                                         el.textContent = attr[key];
  3207.                                 } else if (key === "value") {
  3208.                                         el.value = attr[key];
  3209.                                 } else if (attr.hasOwnProperty(key)) {
  3210.                                         el.setAttribute(key, attr[key]);
  3211.                                 }
  3212.                         }
  3213.                 }
  3214.                 if (events) {
  3215.                         for (var key in events) {
  3216.                                 if (events.hasOwnProperty(key)) {
  3217.                                         el.addEventListener(key, events[key], false);
  3218.                                 }
  3219.                         }
  3220.                 }
  3221.                 return el;
  3222.         }
  3223.  
  3224.         function $New(tag, attr, nodes) {
  3225.                 for (var i = 0, len = nodes.length, el = $new(tag, attr, null); i < len; i++) {
  3226.                         if (nodes[i]) {
  3227.                                 el.appendChild(nodes[i]);
  3228.                         }
  3229.                 }
  3230.                 return el;
  3231.         }
  3232.  
  3233.         function $txt(el) {
  3234.                 return doc.createTextNode(el);
  3235.         }
  3236.  
  3237.         function $btn(val, ttl, Fn) {
  3238.                 return $new("input", { type: "button", value: val, title: ttl }, { click: Fn });
  3239.         }
  3240.  
  3241.         function $script(text) {
  3242.                 $del(doc.head.appendChild($new("script", { type: "text/javascript", text: text }, null)));
  3243.         }
  3244.  
  3245.         function $css(text) {
  3246.                 return doc.head.appendChild($new("style", { type: "text/css", text: text }, null));
  3247.         }
  3248.  
  3249.         function $if(cond, el) {
  3250.                 return cond ? el : null;
  3251.         }
  3252.  
  3253.         function $disp(el) {
  3254.                 el.style.display = el.style.display === "none" ? "" : "none";
  3255.         }
  3256.  
  3257.         function $del(el) {
  3258.                 if (el) {
  3259.                         el.parentNode.removeChild(el);
  3260.                 }
  3261.         }
  3262.  
  3263.         function $DOM(html) {
  3264.                 var myDoc = doc.implementation.createHTMLDocument("");
  3265.                 myDoc.documentElement.innerHTML = html;
  3266.                 return myDoc;
  3267.         }
  3268.  
  3269.         function $pd(e) {
  3270.                 e.preventDefault();
  3271.         }
  3272.  
  3273.         function $txtInsert(el, txt) {
  3274.                 var scrtop = el.scrollTop,
  3275.                     start = el.selectionStart;
  3276.                 el.value = el.value.substr(0, start) + txt + el.value.substr(el.selectionEnd);
  3277.                 el.setSelectionRange(start + txt.length, start + txt.length);
  3278.                 el.focus();
  3279.                 el.scrollTop = scrtop;
  3280.         }
  3281.  
  3282.         function $txtSelect() {
  3283.                 return (nav.Presto ? doc.getSelection() : window.getSelection()).toString();
  3284.         }
  3285.  
  3286.         function $isEmpty(obj) {
  3287.                 for (var i in obj) {
  3288.                         if (obj.hasOwnProperty(i)) {
  3289.                                 return false;
  3290.                         }
  3291.                 }
  3292.                 return true;
  3293.         }
  3294.  
  3295.         Logger = new function () {
  3296.                 var instance,
  3297.                     marks = [],
  3298.                     finished = false;
  3299.                 function LoggerSingleton() {
  3300.                         if (instance) {
  3301.                                 return instance;
  3302.                         }
  3303.                         instance = this;
  3304.                 }
  3305.                 LoggerSingleton.prototype = {
  3306.                         finish: function finish() {
  3307.                                 finished = true;
  3308.                                 marks.push(["LoggerFinish", Date.now()]);
  3309.                         },
  3310.                         getData: function getData(full) {
  3311.                                 var duration,
  3312.                                     timeLog = [],
  3313.                                     i = 1;
  3314.                                 for (var len = marks.length - 1, lastExtra = 0; i < len; ++i) {
  3315.                                         duration = marks[i][1] - marks[i - 1][1] + lastExtra;
  3316.                                         if (full || duration > 1) {
  3317.                                                 lastExtra = 0;
  3318.                                                 timeLog.push([marks[i][0], duration]);
  3319.                                         } else {
  3320.                                                 lastExtra = duration;
  3321.                                         }
  3322.                                 }
  3323.                                 duration = marks[i][1] - marks[0][1];
  3324.                                 timeLog.push([Lng.total[lang], duration]);
  3325.                                 return timeLog;
  3326.                         },
  3327.                         getTable: function getTable() {
  3328.                                 var html = "<tbody>",
  3329.                                     data = this.getData(false);
  3330.                                 for (var i = 0, len = data.length; i < len; ++i) {
  3331.                                         html += "<tr><td>" + data[i][0] + "</td><td>" + data[i][1] + "ms</td></tr>";
  3332.                                 }
  3333.                                 return html + "</tbody>";
  3334.                         },
  3335.                         init: function init() {
  3336.                                 marks.push(["LoggerInit", Date.now()]);
  3337.                         },
  3338.                         log: function log(text) {
  3339.                                 if (!finished) {
  3340.                                         marks.push([text, Date.now()]);
  3341.                                 }
  3342.                         }
  3343.                 };
  3344.                 return LoggerSingleton;
  3345.         }();
  3346.  
  3347.         function async(generatorFunc) {
  3348.                 return function () {
  3349.                         for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  3350.                                 args[_key] = arguments[_key];
  3351.                         }
  3352.  
  3353.                         function continuer(verb, arg) {
  3354.                                 var result;
  3355.                                 try {
  3356.                                         result = generator[verb](arg);
  3357.                                 } catch (err) {
  3358.                                         console.log("Generator throw: ", err);
  3359.                                         return Promise.reject(err);
  3360.                                 }
  3361.                                 return result.done ? result.value : Promise.resolve(result.value).then(onFulfilled, onRejected);
  3362.                         }
  3363.                         var generator = generatorFunc.apply(this, args),
  3364.                             onFulfilled = continuer.bind(continuer, "next"),
  3365.                             onRejected = continuer.bind(continuer, "throw");
  3366.                         return onFulfilled();
  3367.                 };
  3368.         }
  3369.  
  3370.         function spawn(generatorFunc) {
  3371.                 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  3372.                         args[_key - 1] = arguments[_key];
  3373.                 }
  3374.  
  3375.                 return Promise.resolve(async(generatorFunc).apply(undefined, args));
  3376.         }
  3377.  
  3378.         function sleep(ms) {
  3379.                 return new Promise(function (resolve, reject) {
  3380.                         return setTimeout(function () {
  3381.                                 return resolve();
  3382.                         }, ms);
  3383.                 });
  3384.         }
  3385.  
  3386.         function $ajax(url) {
  3387.                 var params = arguments[1] === undefined ? null : arguments[1];
  3388.                 var useNative = arguments[2] === undefined ? true : arguments[2];
  3389.  
  3390.                 return new Promise(function (resolve, reject) {
  3391.                         if (!useNative && typeof GM_xmlhttpRequest === "function") {
  3392.                                 var obj = {
  3393.                                         method: params && params.method || "GET",
  3394.                                         url: nav.fixLink(url),
  3395.                                         onload: function (e) {
  3396.                                                 resolve(e);
  3397.                                         }
  3398.                                 };
  3399.                                 if (params) {
  3400.                                         delete params.method;
  3401.                                         Object.assign(obj, params);
  3402.                                 }
  3403.                                 GM_xmlhttpRequest(obj);
  3404.                                 return;
  3405.                         }
  3406.                         var xhr = new XMLHttpRequest();
  3407.                         if (params && params.onprogress) {
  3408.                                 xhr.upload.onprogress = params.onprogress;
  3409.                         }
  3410.                         xhr.onloadend = function (e) {
  3411.                                 return resolve(e.target);
  3412.                         };
  3413.                         xhr.open(params && params.method || "GET", url, true);
  3414.                         if (params) {
  3415.                                 if (params.responseType) {
  3416.                                         xhr.responseType = params.responseType;
  3417.                                 }
  3418.                                 var headers = params.headers;
  3419.                                 if (headers) {
  3420.                                         for (var h in headers) {
  3421.                                                 if (headers.hasOwnProperty(h)) {
  3422.                                                         xhr.setRequestHeader(h, headers[h]);
  3423.                                                 }
  3424.                                         }
  3425.                                 }
  3426.                         }
  3427.                         xhr.send(params && params.data || null);
  3428.                 });
  3429.         }
  3430.  
  3431.         function TasksPool(tasksCount, taskFunc, endFn) {
  3432.                 this.array = [];
  3433.                 this.length = this.index = this.running = 0;
  3434.                 this.num = 1;
  3435.                 this.func = taskFunc;
  3436.                 this.endFn = endFn;
  3437.                 this.max = tasksCount;
  3438.                 this.completed = this.paused = this.stopped = false;
  3439.         }
  3440.         TasksPool.PauseError = function (duration) {
  3441.                 this.name = "TasksPool.PauseError";
  3442.                 this.duration = duration;
  3443.         };
  3444.         TasksPool.prototype = {
  3445.                 complete: function complete() {
  3446.                         if (!this.stopped) {
  3447.                                 if (this.index >= this.length && this.running === 0) {
  3448.                                         this.endFn();
  3449.                                 } else {
  3450.                                         this.completed = true;
  3451.                                 }
  3452.                         }
  3453.                 },
  3454.                 "continue": function () {
  3455.                         if (!this.stopped) {
  3456.                                 this.paused = false;
  3457.                                 if (this.index >= this.length) {
  3458.                                         if (this.completed) {
  3459.                                                 this.endFn();
  3460.                                         }
  3461.                                         return;
  3462.                                 }
  3463.                                 while (this.index < this.length && this.running !== this.max) {
  3464.                                         this._run(this.array[this.index++]);
  3465.                                         this.running++;
  3466.                                 }
  3467.                         }
  3468.                 },
  3469.                 pause: function pause() {
  3470.                         //this.paused = true;
  3471.                 },
  3472.                 run: function run(data) {
  3473.                         if (!this.stopped) {
  3474.                                 if (this.paused || this.running === this.max) {
  3475.                                         this.array.push(data);
  3476.                                         this.length++;
  3477.                                 } else {
  3478.                                         this._run(data);
  3479.                                         this.running++;
  3480.                                 }
  3481.                         }
  3482.                 },
  3483.                 stop: function stop() {
  3484.                         this.stopped = true;
  3485.                         this.endFn();
  3486.                 },
  3487.  
  3488.                 _end: function _end() {
  3489.                         if (!this.stopped) {
  3490.                                 if (!this.paused && this.index < this.length) {
  3491.                                         this._run(this.array[this.index++]);
  3492.                                         return;
  3493.                                 }
  3494.                                 this.running--;
  3495.                                 if (!this.paused && this.completed && this.running === 0) {
  3496.                                         this.endFn();
  3497.                                 }
  3498.                         }
  3499.                 },
  3500.                 _run: function _run(data) {
  3501.                         var _this = this;
  3502.  
  3503.                         Promise.resolve(this.func(this.num++, data)).then(function () {
  3504.                                 return _this._end();
  3505.                         }, function (e) {
  3506.                                 if (e instanceof TasksPool.PauseError) {
  3507.                                         _this.pause();
  3508.                                         if (e.duration !== -1) {
  3509.                                                 setTimeout(function () {
  3510.                                                         return _this["continue"]();
  3511.                                                 }, e.duration);
  3512.                                         }
  3513.                                 } else {
  3514.                                         _this._end();
  3515.                                         throw e;
  3516.                                 }
  3517.                         });
  3518.                 }
  3519.         };
  3520.  
  3521.         function TarBuilder() {
  3522.                 this._data = [];
  3523.         }
  3524.         TarBuilder.prototype = {
  3525.                 addFile: function addFile(filepath, input) {
  3526.                         var i = 0,
  3527.                             checksum = 0,
  3528.                             fileSize = input.length,
  3529.                             header = new Uint8Array(512);
  3530.                         for (var nameLen = Math.min(filepath.length, 100); i < nameLen; ++i) {
  3531.                                 header[i] = filepath.charCodeAt(i) & 255;
  3532.                         }
  3533.                
  3534.                         this._padSet(header, 100, "100777", 8);
  3535.                
  3536.                         this._padSet(header, 108, "0", 8);
  3537.                
  3538.                         this._padSet(header, 116, "0", 8);
  3539.                
  3540.                         this._padSet(header, 124, fileSize.toString(8), 13);
  3541.                
  3542.                         this._padSet(header, 136, Math.floor(Date.now() / 1000).toString(8), 12);
  3543.                
  3544.                         this._padSet(header, 148, "        ", 8);
  3545.                
  3546.                         header[156] = 48;
  3547.                         for (i = 0; i < 157; i++) {
  3548.                                 checksum += header[i];
  3549.                         }
  3550.                
  3551.                         this._padSet(header, 148, checksum.toString(8), 8);
  3552.                         this._data.push(header);
  3553.                         this._data.push(input);
  3554.                         if ((i = Math.ceil(fileSize / 512) * 512 - fileSize) !== 0) {
  3555.                                 this._data.push(new Uint8Array(i));
  3556.                         }
  3557.                 },
  3558.                 addString: function addString(filepath, str) {
  3559.                         var i,
  3560.                             len,
  3561.                             data,
  3562.                             sDat = unescape(encodeURIComponent(str));
  3563.                         for (i = 0, len = sDat.length, data = new Uint8Array(len); i < len; ++i) {
  3564.                                 data[i] = sDat.charCodeAt(i) & 255;
  3565.                         }
  3566.                         this.addFile(filepath, data);
  3567.                 },
  3568.                 get: function get() {
  3569.                         this._data.push(new Uint8Array(1024));
  3570.                         return new Blob(this._data, { type: "application/x-tar" });
  3571.                 },
  3572.  
  3573.                 _padSet: function _padSet(data, offset, num, len) {
  3574.                         var i = 0,
  3575.                             nLen = num.length;
  3576.                         len -= 2;
  3577.                         while (nLen < len) {
  3578.                                 data[offset++] = 32;
  3579.                                 len--;
  3580.                         }
  3581.                         while (i < nLen) {
  3582.                                 data[offset++] = num.charCodeAt(i++);
  3583.                         }
  3584.                         data[offset] = 32;
  3585.                 }
  3586.         };
  3587.  
  3588.         function regQuote(str) {
  3589.                 return (str + "").replace(/([.?*+^$[\]\\(){}|\-])/g, "\\$1");
  3590.         }
  3591.  
  3592.         function fixBrd(b) {
  3593.                 return "/" + b + (b ? "/" : "");
  3594.         }
  3595.  
  3596.         function getAbsLink(url) {
  3597.                 return url[1] === "/" ? aib.prot + url : url[0] === "/" ? aib.prot + "//" + aib.host + url : url;
  3598.         }
  3599.  
  3600.         function getErrorMessage(e) {
  3601.                 if (e instanceof AjaxError) {
  3602.                         return e.code === 0 ? e.message || Lng.noConnect[lang] : "HTTP [" + e.code + "] " + e.message;
  3603.                 }
  3604.                 return typeof e === "string" ? e : Lng.internalError[lang] + getPrettyErrorMessage(e);
  3605.         }
  3606.  
  3607.         function getPrettyErrorMessage(e) {
  3608.                 return e.stack ? nav.WebKit ? e.stack : e.name + ": " + e.message + "\n" + (nav.Firefox ? e.stack.replace(/^([^@]*).*\/(.+)$/gm, function (str, fName, line) {
  3609.                         return "    at " + (fName ? fName + " (" + line + ")" : line);
  3610.                 }) : e.stack) : e.name + ": " + e.message;
  3611.         }
  3612.  
  3613.         function toRegExp(str, noG) {
  3614.                 var l = str.lastIndexOf("/"),
  3615.                     flags = str.substr(l + 1);
  3616.                 return new RegExp(str.substr(1, l - 1), noG ? flags.replace("g", "") : flags);
  3617.         }
  3618.  
  3619.         function setImageSize(size, idx, nVal) {
  3620.                 size[idx] = nVal;
  3621.                 if (idx === 0) {
  3622.                         size[1] = nVal / size[2];
  3623.                 } else {
  3624.                         size[0] = nVal * size[2];
  3625.                 }
  3626.         }
  3627.  
  3628.         function resizeImage(size, minSize, maxSize) {
  3629.                 var idx = size[2] > 1 ? 1 : 0;
  3630.                 if (+size[idx] < +minSize) {
  3631.                         setImageSize(size, idx, minSize);
  3632.                 }
  3633.                 if (maxSize) {
  3634.                         idx = size[2] > maxSize[2] ? 0 : 1;
  3635.                         if (+size[idx] > +maxSize[idx]) {
  3636.                                 setImageSize(size, idx, +maxSize[idx]);
  3637.                         }
  3638.                 }
  3639.                 return size;
  3640.         }
  3641.  
  3642.         function isFormElDisabled(el) {
  3643.        
  3644.                 switch (el.tagName.toLowerCase()) {
  3645.                         case "button":
  3646.                         case "input":
  3647.                         case "select":
  3648.                         case "textarea":
  3649.                                 if (el.hasAttribute("disabled")) {
  3650.                                         return true;
  3651.                                 }
  3652.                                                 default:
  3653.                                 if (nav.matchesSelector(el, "fieldset[disabled] > :not(legend):not(:first-of-type) *")) {
  3654.                                         return true;
  3655.                                 }
  3656.                 }
  3657.                 return false;
  3658.         }
  3659.  
  3660.         function prettifySize(val) {
  3661.                 if (val > 512 * 1024 * 1024) {
  3662.                         return (val / (1024 * 1024 * 1024)).toFixed(2) + Lng.sizeGByte[lang];
  3663.                 }
  3664.                 if (val > 512 * 1024) {
  3665.                         return (val / (1024 * 1024)).toFixed(2) + Lng.sizeMByte[lang];
  3666.                 }
  3667.                 if (val > 512) {
  3668.                         return (val / 1024).toFixed(2) + Lng.sizeKByte[lang];
  3669.                 }
  3670.                 return val + Lng.sizeByte[lang];
  3671.         }
  3672.  
  3673.         function setStored(id, value) {
  3674.                 if (nav.isGM) {
  3675.                         GM_setValue(id, value);
  3676.                 } else if (nav.isChromeStorage) {
  3677.                         var obj = {};
  3678.                         obj[id] = value;
  3679.                         if (value.toString().length < 4095) {
  3680.                                 chrome.storage.sync.set(obj, emptyFn);
  3681.                                 chrome.storage.local.remove(id, emptyFn);
  3682.                         } else {
  3683.                                 chrome.storage.local.set(obj, emptyFn);
  3684.                                 chrome.storage.sync.remove(id, emptyFn);
  3685.                         }
  3686.                 } else if (nav.isScriptStorage) {
  3687.                         scriptStorage.setItem(id, value);
  3688.                 } else {
  3689.                         locStorage[id] = value;
  3690.                 }
  3691.         }
  3692.  
  3693.         function delStored(id) {
  3694.                 if (nav.isGM) {
  3695.                         GM_deleteValue(id);
  3696.                 } else if (nav.isChromeStorage) {
  3697.                         chrome.storage.sync.remove(id, emptyFn);
  3698.                 } else if (nav.isScriptStorage) {
  3699.                         scriptStorage.removeItem(id);
  3700.                 } else {
  3701.                         locStorage.removeItem(id);
  3702.                 }
  3703.         }
  3704.  
  3705.         function saveComCfg(dm, obj) {
  3706.                 spawn(getStoredObj, "Rainbow_Config").then(function (val) {
  3707.                         if (obj) {
  3708.                                 val[dm] = obj;
  3709.                         } else {
  3710.                                 delete val[dm];
  3711.                         }
  3712.                         setStored("Rainbow_Config", JSON.stringify(val));
  3713.                 });
  3714.         }
  3715.  
  3716.         function saveCfg(id, val) {
  3717.                 if (Cfg[id] !== val) {
  3718.                         Cfg[id] = val;
  3719.                         saveComCfg(aib.dm, Cfg);
  3720.                 }
  3721.         }
  3722.  
  3723.         function toggleCfg(id) {
  3724.                 saveCfg(id, +!Cfg[id]);
  3725.         }
  3726.  
  3727.         function readFav() {
  3728.                 return spawn(getStoredObj, "DESU_Favorites");
  3729.         }
  3730.  
  3731.         function readPosts() {
  3732.                 var str = TNum ? sesStorage["de-hidden-" + brd + TNum] : null;
  3733.                 if (typeof str === "string") {
  3734.                         var data = str.split(",");
  3735.                         if (data.length === 4 && +data[0] === (Cfg.hideBySpell ? spells.hash : 0) && data[1] in pByNum && pByNum[data[1]].count === +data[2]) {
  3736.                                 sVis = data[3].split("");
  3737.                                 return;
  3738.                         }
  3739.                 }
  3740.                 sVis = [];
  3741.         }
  3742.  
  3743.         function savePosts() {
  3744.                 if (TNum) {
  3745.                         var lPost = dForm.firstThr.lastNotDeleted;
  3746.                         sesStorage["de-hidden-" + brd + TNum] = (Cfg.hideBySpell ? spells.hash : "0") + "," + lPost.num + "," + lPost.count + "," + sVis.join("");
  3747.                 }
  3748.                 saveHiddenThreads(false);
  3749.                 toggleContent("hid", true);
  3750.         }
  3751.  
  3752.         function saveUserPosts() {
  3753.                 spawn(getStored, "DESU_Posts_" + aib.dm).then(function (str) {
  3754.                         var obj;
  3755.                         try {
  3756.                                 obj = JSON.parse(str || "{}") || {};
  3757.                         } catch (e) {
  3758.                                 obj = {};
  3759.                         }
  3760.                         if (str && str.length > 1000000) {
  3761.                                 var minDate = Date.now() - 5 * 24 * 3600 * 1000;
  3762.                                 for (var b in obj) {
  3763.                                         if (obj.hasOwnProperty(b)) {
  3764.                                                 var vis = obj[b];
  3765.                                                 for (var key in vis) {
  3766.                                                         if (vis.hasOwnProperty(key) && vis[key][1] < minDate) {
  3767.                                                                 delete vis[key];
  3768.                                                         }
  3769.                                                 }
  3770.                                         }
  3771.                                 }
  3772.                         }
  3773.                         obj[brd] = uVis;
  3774.                         setStored("DESU_Posts_" + aib.dm, JSON.stringify(obj));
  3775.                         toggleContent("hid", true);
  3776.                 });
  3777.         }
  3778.  
  3779.         function saveHiddenThreads(updContent) {
  3780.                 setStored("DESU_Threads_" + aib.dm, JSON.stringify(hThr));
  3781.                 if (updContent) {
  3782.                         toggleContent("hid", true);
  3783.                 }
  3784.         }
  3785.  
  3786.         function saveFavorites(fav) {
  3787.                 setStored("DESU_Favorites", JSON.stringify(fav));
  3788.                 toggleContent("fav", true, fav);
  3789.         }
  3790.  
  3791.         function removeFavoriteEntry(fav, h, b, num, clearPage) {
  3792.                 function _isEmpty(f) {
  3793.                         for (var i in f) {
  3794.                                 if (i !== "url" && f.hasOwnProperty(i)) {
  3795.                                         return false;
  3796.                                 }
  3797.                         }
  3798.                         return true;
  3799.                 }
  3800.                 if (h in fav && b in fav[h] && num in fav[h][b]) {
  3801.                         delete fav[h][b][num];
  3802.                         if (_isEmpty(fav[h][b])) {
  3803.                                 delete fav[h][b];
  3804.                                 if ($isEmpty(fav[h])) {
  3805.                                         delete fav[h];
  3806.                                 }
  3807.                         }
  3808.                 }
  3809.                 if (clearPage && h === aib.host && b === brd && num in pByNum) {
  3810.                         pByNum[num].thr.setFavBtn(false);
  3811.                 }
  3812.         }
  3813.  
  3814.         function readViewedPosts() {
  3815.                 if (!Cfg.markViewed) {
  3816.                         return;
  3817.                 }
  3818.                 var data = sesStorage["de-viewed"];
  3819.                 if (data) {
  3820.                         data.split(",").forEach(function (pNum) {
  3821.                                 var post = pByNum[pNum];
  3822.                                 if (post) {
  3823.                                         post.el.classList.add("de-viewed");
  3824.                                         post.viewed = true;
  3825.                                 }
  3826.                         });
  3827.                 }
  3828.         }
  3829.  
  3830.  
  3831.  
  3832.  
  3833.         function pButton(id, href, hasHotkey) {
  3834.                 return "<li><a id=\"de-btn-" + id + "\" class=\"de-abtn\" " + (hasHotkey ? "de-" : "") + "title=\"" + Lng.panelBtn[id][lang] + "\" href=\"" + href + "\"></a></li>";
  3835.         }
  3836.  
  3837.         function addPanel(formEl) {
  3838.                 var panel,
  3839.                     evtObject,
  3840.                     imgLen = $Q(aib.qThumbImages, formEl).length;
  3841.                 (pr && pr.pArea[0] || formEl).insertAdjacentHTML("beforebegin", "<div id=\"de-main\" lang=\"" + getThemeLang() + "\">" + "<div id=\"de-panel\">" + "<span id=\"de-btn-logo\" title=\"" + Lng.panelBtn.attach[lang] + "\"></span>" + "<ul id=\"de-panel-btns\"" + (Cfg.expandPanel ? ">" : " style=\"display: none\">") + (Cfg.disabled ? pButton("enable", "#", false) : pButton("settings", "#", true) + pButton("hidden", "#", true) + pButton("favor", "#", true) + (!Cfg.addYouTube ? "" : pButton("video", "#", false)) + (localRun ? "" : pButton("refresh", "#", false) + (!TNum && pageNum === aib.firstPage ? "" : pButton("goback", aib.getPageUrl(brd, pageNum - 1), true)) + (TNum || pageNum === aib.lastPage ? "" : pButton("gonext", aib.getPageUrl(brd, pageNum + 1), true))) + pButton("goup", "#", false) + pButton("godown", "#", false) + (imgLen === 0 ? "" : pButton("expimg", "#", false) + pButton("maskimg", "#", true) + (nav.Presto || localRun ? "" : (Cfg.preLoadImgs ? "" : pButton("preimg", "#", false)) + (!TNum ? "" : pButton("savethr", "#", false)))) + (!TNum || localRun ? "" : pButton(Cfg.ajaxUpdThr ? "upd-on" : "upd-off", "#", false) + (nav.Safari ? "" : pButton("audio-off", "#", false))) + (!aib.mak && !aib.tiny && !aib.fch ? "" : pButton("catalog", aib.prot + "//" + aib.host + "/" + (aib.mak ? "makaba/makaba.fcgi?task=catalog&board=" + brd : brd + "/catalog.html"), false)) + pButton("enable", "#", false) + (!TNum ? "" : "<span id=\"de-panel-info\" title=\"" + Lng.panelBtn.counter[lang] + "\">" + dForm.firstThr.pcount + "/" + imgLen + "</span>")) + "</ul>" + "</div><div class=\"de-content\"></div>" + (Cfg.disabled ? "" : "<div id=\"de-alert\"></div><hr style=\"clear: both;\">") + "</div>");
  3842.                 panel = $id("de-panel");
  3843.                 evtObject = {
  3844.                         attach: false,
  3845.                         odelay: 0,
  3846.                         panel: panel,
  3847.                         handleEvent: function handleEvent(e) {
  3848.                                 switch (e.type) {
  3849.                                         case "click":
  3850.                                                 switch (e.target.id) {
  3851.                                                         case "de-btn-logo":
  3852.                                                                 if (Cfg.expandPanel) {
  3853.                                                                         this.panel.lastChild.style.display = "none";
  3854.                                                                         this.attach = false;
  3855.                                                                 } else {
  3856.                                                                         this.attach = true;
  3857.                                                                 }
  3858.                                                                 toggleCfg("expandPanel");
  3859.                                                                 return;
  3860.                                                         case "de-btn-settings":
  3861.                                                                 this.attach = toggleContent("cfg", false);break;
  3862.                                                         case "de-btn-hidden":
  3863.                                                                 this.attach = toggleContent("hid", false);break;
  3864.                                                         case "de-btn-favor":
  3865.                                                                 this.attach = toggleContent("fav", false);break;
  3866.                                                         case "de-btn-video":
  3867.                                                                 this.attach = toggleContent("vid", false);break;
  3868.                                                         case "de-btn-refresh":
  3869.                                                                 window.location.reload();break;
  3870.                                                         case "de-btn-goup":
  3871.                                                                 scrollTo(0, 0);break;
  3872.                                                         case "de-btn-godown":
  3873.                                                                 scrollTo(0, doc.body.scrollHeight || doc.body.offsetHeight);break;
  3874.                                                         case "de-btn-expimg":
  3875.                                                                 isExpImg = !isExpImg;
  3876.                                                                 $del($c("de-img-center", doc));
  3877.                                                                 for (var post = dForm.firstThr.op; post; post = post.next) {
  3878.                                                                         post.toggleImages(isExpImg);
  3879.                                                                 }
  3880.                                                                 break;
  3881.                                                         case "de-btn-preimg":
  3882.                                                                 isPreImg = !isPreImg;
  3883.                                                                 if (!e.ctrlKey) {
  3884.                                                                         preloadImages(null);
  3885.                                                                 }
  3886.                                                                 break;
  3887.                                                         case "de-btn-maskimg":
  3888.                                                                 toggleCfg("maskImgs");
  3889.                                                                 updateCSS();
  3890.                                                                 break;
  3891.                                                         case "de-btn-upd-on":
  3892.                                                         case "de-btn-upd-off":
  3893.                                                         case "de-btn-upd-warn":
  3894.                                                                 if (updater.enabled) {
  3895.                                                                         updater.disable();
  3896.                                                                 } else {
  3897.                                                                         updater.enable();
  3898.                                                                 }
  3899.                                                                 break;
  3900.                                                         case "de-btn-audio-on":
  3901.                                                         case "de-btn-audio-off":
  3902.                                                                 if (updater.toggleAudio(0)) {
  3903.                                                                         updater.enable();
  3904.                                                                         e.target.id = "de-btn-audio-on";
  3905.                                                                 } else {
  3906.                                                                         e.target.id = "de-btn-audio-off";
  3907.                                                                 }
  3908.                                                                 $del($c("de-menu", doc));
  3909.                                                                 break;
  3910.                                                         case "de-btn-savethr":
  3911.                                                                 break;
  3912.                                                         case "de-btn-enable":
  3913.                                                                 toggleCfg("disabled");
  3914.                                                                 window.location.reload();
  3915.                                                                 break;
  3916.                                                         default:
  3917.                                                                 return;
  3918.                                                 }
  3919.                                                 $pd(e);
  3920.                                                 return;
  3921.                                         case "mouseover":
  3922.                                                 if (!Cfg.expandPanel) {
  3923.                                                         clearTimeout(this.odelay);
  3924.                                                         this.panel.lastChild.style.display = "";
  3925.                                                 }
  3926.                                                 switch (e.target.id) {
  3927.                                                         case "de-btn-settings":
  3928.                                                                 KeyEditListener.setTitle(e.target, 10);break;
  3929.                                                         case "de-btn-hidden":
  3930.                                                                 KeyEditListener.setTitle(e.target, 7);break;
  3931.                                                         case "de-btn-favor":
  3932.                                                                 KeyEditListener.setTitle(e.target, 6);break;
  3933.                                                         case "de-btn-goback":
  3934.                                                                 KeyEditListener.setTitle(e.target, 4);break;
  3935.                                                         case "de-btn-gonext":
  3936.                                                                 KeyEditListener.setTitle(e.target, 17);break;
  3937.                                                         case "de-btn-maskimg":
  3938.                                                                 KeyEditListener.setTitle(e.target, 9);break;
  3939.                                                         case "de-btn-refresh":
  3940.                                                                 if (TNum) {
  3941.                                                                         return;
  3942.                                                                 }
  3943.                                                                                                                 case "de-btn-savethr":
  3944.                                                         case "de-btn-audio-off":
  3945.                                                                 addMenu(e);
  3946.                                                 }
  3947.                                                 return;
  3948.                                         default:
  3949.                                        
  3950.                                                 if (!Cfg.expandPanel && !this.attach) {
  3951.                                                         this.odelay = setTimeout(function (obj) {
  3952.                                                                 obj.panel.lastChild.style.display = "none";
  3953.                                                                 obj.attach = false;
  3954.                                                         }, 500, this);
  3955.                                                 }
  3956.                                                 switch (e.target.id) {
  3957.                                                         case "de-btn-refresh":
  3958.                                                         case "de-btn-savethr":
  3959.                                                         case "de-btn-audio-off":
  3960.                                                                 removeMenu(e);
  3961.                                                 }
  3962.                                 }
  3963.                         }
  3964.                 };
  3965.                 panel.addEventListener("click", evtObject, true);
  3966.                 panel.addEventListener("mouseover", evtObject, false);
  3967.                 panel.addEventListener("mouseout", evtObject, false);
  3968.         }
  3969.  
  3970.         function toggleContent(name, isUpd, data) {
  3971.                 if (liteMode) {
  3972.                         return false;
  3973.                 }
  3974.                 var remove,
  3975.                     el = $c("de-content", doc),
  3976.                     id = "de-content-" + name;
  3977.                 if (!el) {
  3978.                         return false;
  3979.                 }
  3980.                 if (isUpd && el.id !== id) {
  3981.                         return true;
  3982.                 }
  3983.                 remove = !isUpd && el.id === id;
  3984.                 if (el.hasChildNodes() && Cfg.animation) {
  3985.                         nav.animEvent(el, function (node) {
  3986.                                 showContent(node, id, name, remove, data);
  3987.                                 id = name = remove = data = null;
  3988.                         });
  3989.                         el.className = "de-content de-cfg-close";
  3990.                 } else {
  3991.                         showContent(el, id, name, remove, data);
  3992.                 }
  3993.                 return !remove;
  3994.         }
  3995.  
  3996.         function addContentBlock(parent, title) {
  3997.                 return parent.appendChild($New("div", { "class": "de-content-block" }, [$new("input", { type: "checkbox" }, { click: function () {
  3998.                                 var _this = this;
  3999.  
  4000.                                 $each($Q(".de-entry > input", this.parentNode), function (el) {
  4001.                                         return el.checked = _this.checked;
  4002.                                 });
  4003.                         } }), title]));
  4004.         }
  4005.  
  4006.         function showContent(cont, id, name, remove, data) {
  4007.                 var temp, cfgTabId;
  4008.                 if (name === "cfg" && !remove && (temp = $q(".de-cfg-tab-back[selected=\"true\"] > .de-cfg-tab", cont))) {
  4009.                         cfgTabId = temp.getAttribute("info");
  4010.                 }
  4011.                 cont.innerHTML = cont.style.backgroundColor = "";
  4012.                 if (remove) {
  4013.                         cont.removeAttribute("id");
  4014.                         return;
  4015.                 }
  4016.                 cont.id = id;
  4017.                 if (Cfg.attachPanel && name !== "cfg") {
  4018.                         cont.style.backgroundColor = getComputedStyle(doc.body).getPropertyValue("background-color");
  4019.                 }
  4020.                 switch (name) {
  4021.                         case "fav":
  4022.                                 if (data) {
  4023.                                         showFavoriteTable(cont, data);
  4024.                                 } else {
  4025.                                
  4026.                                         readFav().then(function (fav) {
  4027.                                                 showFavoriteTable(cont, fav);
  4028.                                         });
  4029.                                 }
  4030.                                 return;
  4031.                         case "cfg":
  4032.                                 addSettings(cont, cfgTabId);break;
  4033.                         case "hid":
  4034.                                 showHiddenTable(cont);break;
  4035.                         case "vid":
  4036.                                 showVideosTable(cont);
  4037.                 }
  4038.                 if (Cfg.animation) {
  4039.                         cont.className = "de-content de-cfg-open";
  4040.                 }
  4041.         }
  4042.  
  4043.         function showVideosTable(cont) {
  4044.                 var els = $C("de-video-link", dForm.el);
  4045.                 if (!els.length) {
  4046.                         cont.innerHTML = "<b>" + Lng.noVideoLinks[lang] + "</b>";
  4047.                         return;
  4048.                 }
  4049.                 if (!$id("de-ytube-api")) {
  4050.                         doc.head.appendChild($new("script", {
  4051.                                 id: "de-ytube-api",
  4052.                                 type: "text/javascript",
  4053.                                 src: aib.prot + "//www.youtube.com/player_api"
  4054.                         }, null));
  4055.                 }
  4056.                 cont.innerHTML = "<div de-disableautoplay class=\"de-video-obj\"></div>" + "<center>" + "<a class=\"de-abtn\" id=\"de-video-btn-prev\" href=\"#\" title=\"" + Lng.prevVideo[lang] + "\">" + "&#x25C0;" + "</a> " + "<a class=\"de-abtn\" id=\"de-video-btn-hide\" href=\"#\" title=\"" + Lng.hideLnkList[lang] + "\">" + "&#x25B2;" + "</a> " + "<a class=\"de-abtn\" id=\"de-video-btn-next\" href=\"#\" title=\"" + Lng.nextVideo[lang] + "\">" + "&#x25B6;" + "</a>" + "</center>" + "<div id=\"de-video-list\" style=\"max-width: " + (+Cfg.YTubeWidth + 40) + "px; max-height: " + (doc.documentElement.clientHeight - +Cfg.YTubeHeigh - 110) + "px;\"></div>";
  4057.                 var linkList = cont.lastChild;
  4058.                 $before(linkList, $new("script", { type: "text/javascript", text: "\n\t\t(function() {\n\t\t\tif('YT' in window && 'Player' in window.YT) {\n\t\t\t\tonYouTubePlayerAPIReady();\n\t\t\t} else {\n\t\t\t\twindow.onYouTubePlayerAPIReady = onYouTubePlayerAPIReady;\n\t\t\t}\n\t\t\tfunction onYouTubePlayerAPIReady() {\n\t\t\t\twindow.de_addVideoEvents =\n\t\t\t\t\taddEvents.bind(document.querySelector('#de-content-vid > .de-video-obj'));\n\t\t\t\twindow.de_addVideoEvents();\n\t\t\t}\n\t\t\tfunction addEvents() {\n\t\t\t\tvar autoplay = true;\n\t\t\t\tif(this.hasAttribute('de-disableautoplay')) {\n\t\t\t\t\tautoplay = false;\n\t\t\t\t\tthis.removeAttribute('de-disableautoplay');\n\t\t\t\t}\n\t\t\t\tnew YT.Player(this.firstChild, { events: {\n\t\t\t\t\t'onError': gotoNextVideo,\n\t\t\t\t\t'onReady': autoplay ? function(e) {\n\t\t\t\t\t\te.target.playVideo();\n\t\t\t\t\t} : Function.prototype,\n\t\t\t\t\t'onStateChange': function(e) {\n\t\t\t\t\t\tif(e.data === 0) {\n\t\t\t\t\t\t\tgotoNextVideo();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}});\n\t\t\t}\n\t\t\tfunction gotoNextVideo() {\n\t\t\t\tdocument.getElementById(\"de-video-btn-next\").click();\n\t\t\t}\n\t\t})();\n\t" }));
  4059.                 cont.addEventListener("click", {
  4060.                         linkList: linkList,
  4061.                         listHidden: false,
  4062.                         player: cont.firstChild,
  4063.                         playerInfo: null,
  4064.                         currentLink: null,
  4065.                         handleEvent: function handleEvent(e) {
  4066.                                 var el = e.target;
  4067.                                 if (el.classList.contains("de-abtn")) {
  4068.                                         var node;
  4069.                                         switch (e.target.id) {
  4070.                                                 case "de-video-btn-hide":
  4071.                                                         if (this.listHidden) {
  4072.                                                                 this.linkList.style.display = "";
  4073.                                                                 e.target.textContent = "▲";
  4074.                                                         } else {
  4075.                                                                 this.linkList.style.display = "none";
  4076.                                                                 e.target.textContent = "▼";
  4077.                                                         }
  4078.                                                         this.listHidden = !this.listHidden;
  4079.                                                         $pd(e);
  4080.                                                         return;
  4081.                                                 case "de-video-btn-prev":
  4082.                                                         node = this.currentLink.parentNode;
  4083.                                                         node = node.previousSibling || node.parentNode.lastChild;
  4084.                                                         break;
  4085.                                                 case "de-video-btn-next":
  4086.                                                         node = this.currentLink.parentNode;
  4087.                                                         node = node.nextSibling || node.parentNode.firstChild;
  4088.                                         }
  4089.                                         node.firstChild.click();
  4090.                                         $pd(e);
  4091.                                         return;
  4092.                                 } else if (!el.classList.contains("de-video-link")) {
  4093.                                         return;
  4094.                                 }
  4095.                                 var m = el.videoInfo;
  4096.                                 if (this.playerInfo !== m) {
  4097.                                         if (this.currentLink) {
  4098.                                                 this.currentLink.classList.remove("de-current");
  4099.                                         }
  4100.                                         this.currentLink = el;
  4101.                                         el.classList.add("de-current");
  4102.                                         this.playerInfo = m;
  4103.                                         Videos.addPlayer(this.player, m, el.classList.contains("de-ytube"), true);
  4104.                                 }
  4105.                                 $pd(e);
  4106.                         }
  4107.                 }, true);
  4108.                 for (var i = 0, len = els.length; i < len; ++i) {
  4109.                         var el = els[i].cloneNode(true);
  4110.                         el.videoInfo = els[i].videoInfo;
  4111.                         linkList.insertAdjacentHTML("beforeend", "<div class=\"de-entry " + aib.cReply + "\"></div>");
  4112.                         linkList.lastChild.appendChild(el);
  4113.                         el.classList.remove("de-current");
  4114.                         if (i === 0) {
  4115.                                 el.click();
  4116.                         }
  4117.                         el.setAttribute("onclick", "window.de_addVideoEvents && window.de_addVideoEvents();");
  4118.                 }
  4119.         }
  4120.  
  4121.         function showHiddenTable(cont) {
  4122.                 var block,
  4123.                     els = $C("de-post-hide", dForm.el);
  4124.                 for (var i = 0, len = els.length; i < len; ++i) {
  4125.                         var post = els[i];
  4126.                         if (post.isOp) {
  4127.                                 continue;
  4128.                         }
  4129.                         var cln = post.cloneNode(true);
  4130.                         cln.removeAttribute("id");
  4131.                         cln.style.display = "";
  4132.                         if (cln.classList.contains(aib.cRPost)) {
  4133.                                 cln.classList.add("de-cloned-post");
  4134.                         } else {
  4135.                                 cln.className = aib.cReply + " de-cloned-post";
  4136.                         }
  4137.                         cln.post = Object.create(cln.clone = post.post);
  4138.                         cln.post.el = cln;
  4139.                         cln.btn = $q(".de-btn-hide, .de-btn-hide-user", cln);
  4140.                         cln.btn.parentNode.className = "de-post-btns";
  4141.                         cln.btn.onclick = (function () {
  4142.                        
  4143.                                 this.hideContent(this.hidden = !this.hidden);
  4144.                         }).bind(cln);
  4145.                         if (!block) {
  4146.                                 block = cont.appendChild($add("<div class=\"de-content-block\"><b>" + Lng.hiddenPosts[lang] + ":</b></div>"));
  4147.                         }
  4148.                         block.appendChild($New("div", { "class": "de-entry" }, [cln]));
  4149.                 }
  4150.                 if (block) {
  4151.                         cont.appendChild($btn(Lng.expandAll[lang], "", function () {
  4152.                                 $each($Q(".de-cloned-post", this.parentNode), function (el) {
  4153.                                         var post = el.post;
  4154.                                         post.hideContent(post.hidden = !post.hidden);
  4155.                                 });
  4156.                                 this.value = this.value === Lng.undo[lang] ? Lng.expandAll[lang] : Lng.undo[lang];
  4157.                         }));
  4158.                         cont.appendChild($btn(Lng.save[lang], "", function () {
  4159.                                 $each($Q(".de-cloned-post", this.parentNode), (function (date, el) {
  4160.                                         if (!el.post.hidden) {
  4161.                                                 el.clone.setUserVisib(false, date, true);
  4162.                                         }
  4163.                                 }).bind(null, Date.now()));
  4164.                                 saveUserPosts();
  4165.                         }));
  4166.                 } else {
  4167.                         cont.insertAdjacentHTML("beforeend", "<b>" + Lng.noHidPosts[lang] + "</b>");
  4168.                 }
  4169.                 cont.insertAdjacentHTML("beforeend", "<hr><b>" + ($isEmpty(hThr) ? Lng.noHidThrds[lang] : Lng.hiddenThrds[lang] + ":") + "</b>");
  4170.                 for (var b in hThr) {
  4171.                         if (!$isEmpty(hThr[b])) {
  4172.                                 block = addContentBlock(cont, $new("b", { text: "/" + b }, null));
  4173.                                 for (var tNum in hThr[b]) {
  4174.                                         block.insertAdjacentHTML("beforeend", "<div class=\"de-entry " + aib.cReply + "\" info=\"" + b + ";" + tNum + "\"><input type=\"checkbox\"><a href=\"" + aib.getThrdUrl(b, tNum) + "\" target=\"_blank\">" + tNum + "</a> - " + hThr[b][tNum] + "</div>");
  4175.                                 }
  4176.                         }
  4177.                 }
  4178.                 cont.insertAdjacentHTML("beforeend", "<hr>");
  4179.                 cont.appendChild(addEditButton("hidden", function (fn) {
  4180.                         fn(hThr, true, function (data) {
  4181.                                 hThr = data;
  4182.                                 if (!(brd in hThr)) {
  4183.                                         hThr[brd] = {};
  4184.                                 }
  4185.                                 dForm.firstThr.updateHidden(hThr[brd]);
  4186.                                 saveHiddenThreads(true);
  4187.                                 locStorage["__de-threads"] = JSON.stringify(hThr);
  4188.                                 locStorage.removeItem("__de-threads");
  4189.                         });
  4190.                 }));
  4191.                 cont.appendChild($btn(Lng.clear[lang], Lng.clrDeleted[lang], async(regeneratorRuntime.mark(function callee$2$0() {
  4192.                         var _this = this;
  4193.  
  4194.                         var i, els, len, _els$i$getAttribute$split, _els$i$getAttribute$split2, board, tNum, xhr;
  4195.  
  4196.                         return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) {
  4197.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  4198.                                         case 0:
  4199.                                                 i = 0, els = $Q(".de-entry[info]", _this.parentNode), len = els.length;
  4200.  
  4201.                                         case 1:
  4202.                                                 if (!(i < len)) {
  4203.                                                         context$3$0.next = 13;
  4204.                                                         break;
  4205.                                                 }
  4206.  
  4207.                                                 _els$i$getAttribute$split = els[i].getAttribute("info").split(";");
  4208.                                                 _els$i$getAttribute$split2 = _slicedToArray(_els$i$getAttribute$split, 2);
  4209.                                                 board = _els$i$getAttribute$split2[0];
  4210.                                                 tNum = _els$i$getAttribute$split2[1];
  4211.                                                 context$3$0.next = 8;
  4212.                                                 return $ajax(aib.getThrdUrl(board, tNum));
  4213.  
  4214.                                         case 8:
  4215.                                                 xhr = context$3$0.sent;
  4216.  
  4217.                                                 if (xhr.status === 404) {
  4218.                                                         delete hThr[board][tNum];
  4219.                                                         saveHiddenThreads(true);
  4220.                                                 }
  4221.  
  4222.                                         case 10:
  4223.                                                 ++i;
  4224.                                                 context$3$0.next = 1;
  4225.                                                 break;
  4226.  
  4227.                                         case 13:
  4228.                                         case "end":
  4229.                                                 return context$3$0.stop();
  4230.                                 }
  4231.                         }, callee$2$0, this);
  4232.                 }))));
  4233.                 cont.appendChild($btn(Lng.remove[lang], Lng.clrSelected[lang], function () {
  4234.                         $each($Q(".de-entry[info]", this.parentNode), (function (date, el) {
  4235.                                 if ($t("input", el).checked) {
  4236.                                         var arr = el.getAttribute("info").split(";");
  4237.                                         if (arr[1] in pByNum) {
  4238.                                                 pByNum[arr[1]].setUserVisib(false, date, true);
  4239.                                         } else {
  4240.                                                 locStorage["__de-post"] = JSON.stringify({
  4241.                                                         brd: arr[0],
  4242.                                                         date: date,
  4243.                                                         isOp: true,
  4244.                                                         num: arr[1],
  4245.                                                         hide: false
  4246.                                                 });
  4247.                                                 locStorage.removeItem("__de-post");
  4248.                                         }
  4249.                                         delete hThr[arr[0]][arr[1]];
  4250.                                 }
  4251.                         }).bind(null, Date.now()));
  4252.                         saveHiddenThreads(true);
  4253.                 }));
  4254.         }
  4255.  
  4256.         function clearFavoriteTable() {
  4257.                 var els = $Q(".de-entry[de-removed]", doc),
  4258.                     len = els.length;
  4259.                 if (len > 0) {
  4260.                         readFav().then(function (fav) {
  4261.                                 for (var i = 0; i < len; ++i) {
  4262.                                         var el = els[i];
  4263.                                         removeFavoriteEntry(fav, el.getAttribute("de-host"), el.getAttribute("de-board"), el.getAttribute("de-num"), true);
  4264.                                 }
  4265.                                 saveFavorites(fav);
  4266.                         });
  4267.                 }
  4268.         }
  4269.  
  4270.         function showFavoriteTable(cont, data) {
  4271.                 for (var h in data) {
  4272.                         for (var b in data[h]) {
  4273.                                 var d = data[h][b],
  4274.                                     block = addContentBlock(cont, d.url ? $new("a", { href: d.url, text: h + "/" + b }, null) : $new("b", { text: h + "/" + b }, null));
  4275.                                 if (h === aib.host && b === brd) {
  4276.                                         block.classList.add("de-fav-current");
  4277.                                 }
  4278.                                 for (var tNum in d) {
  4279.                                         if (tNum === "url") {
  4280.                                                 continue;
  4281.                                         }
  4282.                                         var t = d[tNum];
  4283.                                         if (!t.url.startsWith("http")) {
  4284.                                                 t.url = (h === aib.host ? aib.prot + "//" : "http://") + h + t.url;
  4285.                                         }
  4286.                                         block.insertAdjacentHTML("beforeend", "<div class=\"de-entry " + aib.cReply + "\" de-host=\"" + h + "\" de-board=\"" + b + "\" de-num=\"" + tNum + "\" de-url=\"" + t.url + "\"><input type=\"checkbox\"><span class=\"de-btn-expthr\" title=\"" + Lng.findThrd[lang] + "\"></span><a href=\"" + t.url + "\">" + tNum + "</a><span class=\"de-fav-title\"> - " + t.txt + "</span><span class=\"de-fav-inf-posts\"><span class=\"de-fav-inf-err\">" + (t.err || "") + "</span> <span class=\"de-fav-inf-new\" title=\"" + Lng.newPosts[lang] + "\"" + (t["new"] ? ">" : " style=\"display: none;\">") + (t["new"] || 0) + "</span> [" + "<span class=\"de-fav-inf-old\" title=\"" + Lng.oldPosts[lang] + "\">" + t.cnt + "</span>] " + "<span class=\"de-fav-inf-page\" title=\"" + Lng.thrPage[lang] + "\"></span></span></div>");
  4287.                                         block.lastChild.firstChild.nextSibling.onclick = function (e) {
  4288.                                                 return loadFavorThread(e.target);
  4289.                                         };
  4290.                                 }
  4291.                         }
  4292.                 }
  4293.                 cont.insertAdjacentHTML("afterbegin", "<b>" + Lng[cont.hasChildNodes() ? "favThrds" : "noFavThrds"][lang] + "</b>");
  4294.                 cont.insertAdjacentHTML("beforeend", "<hr>");
  4295.                 cont.appendChild(addEditButton("favor", function (fn) {
  4296.                         readFav().then(function (val) {
  4297.                                 return fn(val, true, saveFavorites);
  4298.                         });
  4299.                 }));
  4300.                 cont.appendChild($btn(Lng.refresh[lang], Lng.infoCount[lang], async(regeneratorRuntime.mark(function callee$2$0() {
  4301.                         var update, els, fav, i, len, form, el, host, b, num, f, cnt;
  4302.                         return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) {
  4303.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  4304.                                         case 0:
  4305.                                                 update = false;
  4306.                                                 els = $C("de-entry", doc);
  4307.                                                 return context$3$0.delegateYield(getStoredObj("DESU_Favorites"), "t8", 3);
  4308.  
  4309.                                         case 3:
  4310.                                                 fav = context$3$0.t8;
  4311.                                                 i = 0, len = els.length;
  4312.  
  4313.                                         case 5:
  4314.                                                 if (!(i < len)) {
  4315.                                                         context$3$0.next = 33;
  4316.                                                         break;
  4317.                                                 }
  4318.  
  4319.                                                 el = els[i], host = el.getAttribute("de-host"), b = el.getAttribute("de-board"), num = el.getAttribute("de-num"), f = fav[host][b][num];
  4320.  
  4321.                                                 if (!(host !== aib.host || f.err === "Closed")) {
  4322.                                                         context$3$0.next = 9;
  4323.                                                         break;
  4324.                                                 }
  4325.  
  4326.                                                 return context$3$0.abrupt("continue", 30);
  4327.  
  4328.                                         case 9:
  4329.                                                 el = $c("de-fav-inf-new", el);
  4330.                                                 el.style.display = "";
  4331.                                                 el.textContent = "";
  4332.                                                 el.className = "de-wait";
  4333.                                                 context$3$0.prev = 13;
  4334.                                                 context$3$0.next = 16;
  4335.                                                 return ajaxLoad(aib.getThrdUrl(b, num));
  4336.  
  4337.                                         case 16:
  4338.                                                 form = context$3$0.sent;
  4339.                                                 context$3$0.next = 25;
  4340.                                                 break;
  4341.  
  4342.                                         case 19:
  4343.                                                 context$3$0.prev = 19;
  4344.                                                 context$3$0.t9 = context$3$0["catch"](13);
  4345.  
  4346.                                                 el.classList.remove("de-wait");
  4347.                                                 f.err = el.previousElementSibling.textContent = getErrorMessage(context$3$0.t9);
  4348.                                                 update = true;
  4349.                                                 return context$3$0.abrupt("continue", 30);
  4350.  
  4351.                                         case 25:
  4352.                                                 cnt = aib.getPosts(form).length + 1 - el.nextElementSibling.textContent;
  4353.  
  4354.                                                 el.textContent = cnt;
  4355.                                                 el.className = "de-fav-inf-new";
  4356.                                                 if (cnt === 0) {
  4357.                                                         el.style.display = "none";
  4358.                                                 } else {
  4359.                                                         f["new"] = cnt;
  4360.                                                         update = true;
  4361.                                                 }
  4362.                                                 if ($q(aib.qClosed, form)) {
  4363.                                                         f.err = el.previousElementSibling.textContent = "Closed";
  4364.                                                         update = true;
  4365.                                                 }
  4366.  
  4367.                                         case 30:
  4368.                                                 ++i;
  4369.                                                 context$3$0.next = 5;
  4370.                                                 break;
  4371.  
  4372.                                         case 33:
  4373.                                                 if (update) {
  4374.                                                         setStored("DESU_Favorites", JSON.stringify(fav));
  4375.                                                 }
  4376.  
  4377.                                         case 34:
  4378.                                         case "end":
  4379.                                                 return context$3$0.stop();
  4380.                                 }
  4381.                         }, callee$2$0, this, [[13, 19]]);
  4382.                 }))));
  4383.                 cont.appendChild($btn(Lng.page[lang], Lng.infoPage[lang], async(regeneratorRuntime.mark(function callee$2$1() {
  4384.                         var els, infoCount, postsInfo, i, el, page, infoLoaded, endPage, form, tNums, pInfo, _postsInfo$i, node, isFound;
  4385.  
  4386.                         return regeneratorRuntime.wrap(function callee$2$1$(context$3$0) {
  4387.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  4388.                                         case 0:
  4389.                                                 els = $Q(".de-fav-current > .de-entry", doc), infoCount = els.length, postsInfo = [];
  4390.  
  4391.                                                 if (infoCount) {
  4392.                                                         context$3$0.next = 3;
  4393.                                                         break;
  4394.                                                 }
  4395.  
  4396.                                                 return context$3$0.abrupt("return");
  4397.  
  4398.                                         case 3:
  4399.                                                 $alert(Lng.loading[lang], "load-pages", true);
  4400.                                                 for (i = 0; i < infoCount; ++i) {
  4401.                                                         el = els[i];
  4402.  
  4403.                                                         postsInfo.push([+el.getAttribute("de-num"), el = $c("de-fav-inf-page", el), false]);
  4404.                                                         el.classList.add("de-wait");
  4405.                                                 }
  4406.                                                 page = 0, infoLoaded = 0, endPage = (aib.lastPage || 10) + 1;
  4407.  
  4408.                                         case 6:
  4409.                                                 if (!(page < endPage)) {
  4410.                                                         context$3$0.next = 23;
  4411.                                                         break;
  4412.                                                 }
  4413.  
  4414.                                                 context$3$0.prev = 7;
  4415.                                                 context$3$0.next = 10;
  4416.                                                 return ajaxLoad(aib.getPageUrl(brd, page));
  4417.  
  4418.                                         case 10:
  4419.                                                 context$3$0.t10 = context$3$0.sent;
  4420.                                                 form = new DelForm(context$3$0.t10, true);
  4421.                                                 context$3$0.next = 17;
  4422.                                                 break;
  4423.  
  4424.                                         case 14:
  4425.                                                 context$3$0.prev = 14;
  4426.                                                 context$3$0.t11 = context$3$0["catch"](7);
  4427.                                                 return context$3$0.abrupt("continue", 20);
  4428.  
  4429.                                         case 17:
  4430.                                                 for (i = 0, tNums = form.tNums; i < infoCount; ++i) {
  4431.                                                         pInfo = postsInfo[i];
  4432.  
  4433.                                                         if (tNums.indexOf(pInfo[0]) !== -1) {
  4434.                                                                 pInfo[1].classList.remove("de-wait");
  4435.                                                                 pInfo[1].textContent = "@" + page;
  4436.                                                                 pInfo[2] = true;
  4437.                                                                 infoLoaded++;
  4438.                                                         }
  4439.                                                 }
  4440.  
  4441.                                                 if (!(infoLoaded === infoCount)) {
  4442.                                                         context$3$0.next = 20;
  4443.                                                         break;
  4444.                                                 }
  4445.  
  4446.                                                 return context$3$0.abrupt("break", 23);
  4447.  
  4448.                                         case 20:
  4449.                                                 ++page;
  4450.                                                 context$3$0.next = 6;
  4451.                                                 break;
  4452.  
  4453.                                         case 23:
  4454.                                                 for (i = 0; i < infoCount; ++i) {
  4455.                                                         _postsInfo$i = _slicedToArray(postsInfo[i], 3);
  4456.                                                         node = _postsInfo$i[1];
  4457.                                                         isFound = _postsInfo$i[2];
  4458.  
  4459.                                                         if (!isFound) {
  4460.                                                                 node.classList.remove("de-wait");
  4461.                                                                 node.textContent = "@?";
  4462.                                                         }
  4463.                                                 }
  4464.                                                 closeAlert($id("de-alert-load-pages"));
  4465.  
  4466.                                         case 25:
  4467.                                         case "end":
  4468.                                                 return context$3$0.stop();
  4469.                                 }
  4470.                         }, callee$2$1, this, [[7, 14]]);
  4471.                 }))));
  4472.                 cont.appendChild($btn(Lng.clear[lang], Lng.clrDeleted[lang], async(regeneratorRuntime.mark(function callee$2$2() {
  4473.                         var i, els, len, el, node, xhr;
  4474.                         return regeneratorRuntime.wrap(function callee$2$2$(context$3$0) {
  4475.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  4476.                                         case 0:
  4477.                                                 i = 0, els = $C("de-entry", doc), len = els.length;
  4478.  
  4479.                                         case 1:
  4480.                                                 if (!(i < len)) {
  4481.                                                         context$3$0.next = 17;
  4482.                                                         break;
  4483.                                                 }
  4484.  
  4485.                                                 el = els[i], node = $c("de-fav-inf-err", el);
  4486.  
  4487.                                                 node.classList.add("de-wait");
  4488.                                                 context$3$0.next = 6;
  4489.                                                 return $ajax(el.getAttribute("de-url"), null, false);
  4490.  
  4491.                                         case 6:
  4492.                                                 xhr = context$3$0.sent;
  4493.                                                 context$3$0.t12 = xhr.status;
  4494.                                                 context$3$0.next = context$3$0.t12 === 200 ? 10 : context$3$0.t12 === 404 ? 11 : 12;
  4495.                                                 break;
  4496.  
  4497.                                         case 10:
  4498.                                                 return context$3$0.abrupt("break", 13);
  4499.  
  4500.                                         case 11:
  4501.                                                 el.setAttribute("de-removed", "");
  4502.  
  4503.                                         case 12:
  4504.                                                 node.textContent = getErrorMessage(new AjaxError(xhr.status, xhr.statusText));
  4505.  
  4506.                                         case 13:
  4507.                                                 node.classList.remove("de-wait");
  4508.  
  4509.                                         case 14:
  4510.                                                 ++i;
  4511.                                                 context$3$0.next = 1;
  4512.                                                 break;
  4513.  
  4514.                                         case 17:
  4515.                                                 clearFavoriteTable();
  4516.  
  4517.                                         case 18:
  4518.                                         case "end":
  4519.                                                 return context$3$0.stop();
  4520.                                 }
  4521.                         }, callee$2$2, this);
  4522.                 }))));
  4523.                 cont.appendChild($btn(Lng.remove[lang], Lng.clrSelected[lang], function () {
  4524.                         $each($C("de-entry", doc), function (el) {
  4525.                                 if ($t("input", el).checked) {
  4526.                                         el.setAttribute("de-removed", "");
  4527.                                 }
  4528.                         });
  4529.                         clearFavoriteTable();
  4530.                 }));
  4531.                 if (Cfg.animation) {
  4532.                         cont.className = "de-content de-cfg-open";
  4533.                 }
  4534.         }
  4535.  
  4536.  
  4537.  
  4538.  
  4539.         function fixSettings() {
  4540.                 function toggleBox(state, arr) {
  4541.                         var i = arr.length,
  4542.                             nState = !state;
  4543.                         while (i--) {
  4544.                                 ($q(arr[i], doc) || {}).disabled = nState;
  4545.                         }
  4546.                 }
  4547.                 toggleBox(Cfg.ajaxUpdThr, ["input[info=\"updThrDelay\"]", "input[info=\"noErrInTitle\"]", "input[info=\"favIcoBlink\"]", "input[info=\"markNewPosts\"]", "input[info=\"desktNotif\"]", "input[info=\"updCount\"]"]);
  4548.                 toggleBox(Cfg.expandImgs, ["input[info=\"imgNavBtns\"]", "input[info=\"resizeDPI\"]", "input[info=\"resizeImgs\"]", "input[info=\"minImgSize\"]", "input[info=\"zoomFactor\"]", "input[info=\"webmControl\"]", "input[info=\"webmVolume\"]"]);
  4549.                 toggleBox(Cfg.preLoadImgs, ["input[info=\"findImgFile\"]"]);
  4550.                 toggleBox(Cfg.openImgs, ["input[info=\"openGIFs\"]"]);
  4551.                 toggleBox(Cfg.linksNavig, ["input[info=\"linksOver\"]", "input[info=\"linksOut\"]", "input[info=\"markViewed\"]", "input[info=\"strikeHidd\"]", "input[info=\"noNavigHidd\"]"]);
  4552.                 toggleBox(Cfg.strikeHidd && Cfg.linksNavig === 2, ["input[info=\"removeHidd\"]"]);
  4553.                 toggleBox(Cfg.addYouTube && Cfg.addYouTube !== 4, ["select[info=\"YTubeType\"]", "input[info=\"addVimeo\"]"]);
  4554.                 toggleBox(Cfg.addYouTube, ["input[info=\"YTubeWidth\"]", "input[info=\"YTubeHeigh\"]", "input[info=\"YTubeTitles\"]"]);
  4555.                 toggleBox(Cfg.ajaxReply, ["input[info=\"sendErrNotif\"]", "input[info=\"scrAfterRep\"]"]);
  4556.                 toggleBox(Cfg.ajaxReply === 2, ["input[info=\"postSameImg\"]", "input[info=\"removeEXIF\"]", "input[info=\"removeFName\"]"]);
  4557.                 toggleBox(Cfg.addTextBtns, ["input[info=\"txtBtnsLoc\"]"]);
  4558.                 toggleBox(Cfg.updScript, ["select[info=\"scrUpdIntrv\"]"]);
  4559.                 toggleBox(Cfg.hotKeys, ["input[info=\"loadPages\"]"]);
  4560.         }
  4561.  
  4562.         function lBox(id, isBlock, fn) {
  4563.                 var el = $new("input", { info: id, type: "checkbox" }, { click: function () {
  4564.                                 toggleCfg(this.getAttribute("info"));
  4565.                                 fixSettings();
  4566.                                 if (fn) {
  4567.                                         fn(this);
  4568.                                 }
  4569.                         } });
  4570.                 el.checked = Cfg[id];
  4571.                 return $New("label", isBlock ? { "class": "de-block" } : null, [el, $txt(" " + Lng.cfg[id][lang])]);
  4572.         }
  4573.  
  4574.         function inpTxt(id, size, Fn) {
  4575.                 return $new("input", { info: id, type: "text", size: size, value: Cfg[id] }, {
  4576.                         keyup: Fn ? Fn : function () {
  4577.                                 saveCfg(this.getAttribute("info"), this.value);
  4578.                         }
  4579.                 });
  4580.         }
  4581.  
  4582.         function optSel(id, isBlock, Fn) {
  4583.                 var el,
  4584.                     opt = "",
  4585.                     x = Lng.cfg[id];
  4586.                 for (var i = 0, len = x.sel[lang].length; i < len; i++) {
  4587.                         opt += "<option value=\"" + i + "\">" + x.sel[lang][i] + "</option>";
  4588.                 }
  4589.                 el = $add("<select info=\"" + id + "\">" + opt + "</select>");
  4590.                 el.addEventListener("change", Fn || function () {
  4591.                         saveCfg(this.getAttribute("info"), this.selectedIndex);
  4592.                         fixSettings();
  4593.                 }, false);
  4594.                 el.selectedIndex = Cfg[id];
  4595.                 return $New("label", isBlock ? { "class": "de-block" } : null, [el, $txt(" " + x.txt[lang])]);
  4596.         }
  4597.  
  4598.         function cfgTab(name) {
  4599.                 return $New("div", { "class": aib.cReply + " de-cfg-tab-back", selected: false }, [$new("div", {
  4600.                         "class": "de-cfg-tab",
  4601.                         text: Lng.cfgTab[name][lang],
  4602.                         info: name }, {
  4603.                         click: function () {
  4604.                                 var el = this.parentNode;
  4605.                                 if (el.getAttribute("selected") === "true") {
  4606.                                         return;
  4607.                                 }
  4608.                                 var prefTab = $c("de-cfg-body", doc);
  4609.                                 if (prefTab) {
  4610.                                         prefTab.className = "de-cfg-unvis";
  4611.                                         $q(".de-cfg-tab-back[selected=\"true\"]", doc).setAttribute("selected", false);
  4612.                                 }
  4613.                                 el.setAttribute("selected", true);
  4614.                                 var id = this.getAttribute("info"),
  4615.                                     newTab = $id("de-cfg-" + id);
  4616.                                 if (!newTab) {
  4617.                                         $after($id("de-cfg-bar"), newTab = id === "filters" ? getCfgFilters() : id === "posts" ? getCfgPosts() : id === "images" ? getCfgImages() : id === "links" ? getCfgLinks() : id === "form" ? getCfgForm() : id === "common" ? getCfgCommon() : getCfgInfo());
  4618.                                         if (id === "filters") {
  4619.                                                 updRowMeter($id("de-spell-edit"));
  4620.                                         }
  4621.                                 }
  4622.                                 newTab.className = "de-cfg-body";
  4623.                                 if (id === "filters") {
  4624.                                         $id("de-spell-edit").value = spells.list;
  4625.                                 }
  4626.                                 fixSettings();
  4627.                         }
  4628.                 })]);
  4629.         }
  4630.  
  4631.         function updRowMeter(node) {
  4632.                 var top = node.scrollTop,
  4633.                     el = node.parentNode.previousSibling.firstChild,
  4634.                     num = el.numLines || 1,
  4635.                     i = 15;
  4636.                 if (num - i < (top / 12 | 0 + 1)) {
  4637.                         var str = "";
  4638.                         while (i--) {
  4639.                                 str += num++ + "<br>";
  4640.                         }
  4641.                         el.insertAdjacentHTML("beforeend", str);
  4642.                         el.numLines = num;
  4643.                 }
  4644.                 el.scrollTop = top;
  4645.         }
  4646.  
  4647.         function getCfgFilters() {
  4648.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-filters" }, [lBox("hideBySpell", false, toggleSpells), $New("div", { id: "de-spell-panel" }, [$new("a", {
  4649.                         id: "de-btn-addspell",
  4650.                         text: Lng.add[lang],
  4651.                         href: "#",
  4652.                         "class": "de-abtn" }, {
  4653.                         click: $pd,
  4654.                         mouseover: addMenu,
  4655.                         mouseout: removeMenu
  4656.                 }), $new("a", { text: Lng.apply[lang], href: "#", "class": "de-abtn" }, { click: function (e) {
  4657.                                 $pd(e);
  4658.                                 saveCfg("hideBySpell", 1);
  4659.                                 $q("input[info=\"hideBySpell\"]", doc).checked = true;
  4660.                                 toggleSpells();
  4661.                         } }), $new("a", { text: Lng.clear[lang], href: "#", "class": "de-abtn" }, { click: function (e) {
  4662.                                 $pd(e);
  4663.                                 $id("de-spell-edit").value = "";
  4664.                                 toggleSpells();
  4665.                         } }), $add("<a href=\"https://github.com/SthephanShinkufag/Dollchan-Extension-Tools/wiki/Spells-" + (lang ? "en" : "ru") + "\" class=\"de-abtn\" target=\"_blank\">[?]</a>")]), $New("div", { id: "de-spell-div" }, [$add("<div><div id=\"de-spell-rowmeter\"></div></div>"), $New("div", null, [$new("textarea", { id: "de-spell-edit", wrap: "off" }, {
  4666.                         keydown: function () {
  4667.                                 updRowMeter(this);
  4668.                         },
  4669.                         scroll: function () {
  4670.                                 updRowMeter(this);
  4671.                         }
  4672.                 })])]), lBox("sortSpells", true, function () {
  4673.                         if (Cfg.sortSpells) {
  4674.                                 toggleSpells();
  4675.                         }
  4676.                 }), lBox("menuHiddBtn", true, null), lBox("hideRefPsts", true, null), lBox("delHiddPost", true, function () {
  4677.                         $each($C("de-post-hide", dForm.el), function (el) {
  4678.                                 el.post.wrap.classList.toggle("de-hidden");
  4679.                         });
  4680.                         updateCSS();
  4681.                 })]);
  4682.         }
  4683.  
  4684.         function getCfgPosts() {
  4685.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-posts" }, [$if(!localRun, $New("div", null, [lBox("ajaxUpdThr", false, TNum ? function () {
  4686.                         if (Cfg.ajaxUpdThr) {
  4687.                                 updater.enable();
  4688.                         } else {
  4689.                                 updater.disable();
  4690.                         }
  4691.                 } : null), $New("label", null, [inpTxt("updThrDelay", 2, null), $txt(Lng.cfg.updThrDelay[lang])]), $New("div", { "class": "de-cfg-depend" }, [lBox("noErrInTitle", true, null), lBox("favIcoBlink", true, null), lBox("markNewPosts", true, function () {
  4692.                         dForm.firstThr.clearPostsMarks();
  4693.                 }), $if("Notification" in window, lBox("desktNotif", true, function () {
  4694.                         if (Cfg.desktNotif) {
  4695.                                 Notification.requestPermission();
  4696.                         }
  4697.                 })), lBox("updCount", true, function () {
  4698.                         updater.toggleCounter(Cfg.updCount);
  4699.                 })])])), lBox("expandTrunc", true, updateCSS), optSel("postBtnsCSS", false, null), lBox("showHideBtn", false, updateCSS), lBox("showRepBtn", false, updateCSS), lBox("noSpoilers", true, updateCSS), lBox("noPostNames", true, updateCSS), lBox("widePosts", true, updateCSS), $New("div", null, [lBox("correctTime", false, DateTime.toggleSettings), inpTxt("timeOffset", 2, null), $txt(Lng.cfg.timeOffset[lang]), $add("<a href=\"https://github.com/SthephanShinkufag/Dollchan-Extension-Tools/wiki/Settings-time-" + (lang ? "en" : "ru") + "\" class=\"de-abtn\" target=\"_blank\">[?]</a>")]), $New("div", { "class": "de-cfg-depend" }, [$New("div", null, [inpTxt("timePattern", 25, null), $txt(Lng.cfg.timePattern[lang])]), $New("div", null, [inpTxt("timeRPattern", 25, null), $txt(Lng.cfg.timeRPattern[lang])])])]);
  4700.         }
  4701.  
  4702.         function getCfgImages() {
  4703.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-images" }, [optSel("expandImgs", true, null), $New("div", { "class": "de-cfg-depend" }, [lBox("imgNavBtns", true, updateCSS), lBox("resizeImgs", true, null), $if(Post.sizing.dPxRatio > 1, lBox("resizeDPI", true, null)), $New("div", null, [inpTxt("minImgSize", 4, function () {
  4704.                         saveCfg("minImgSize", Math.max(+this.value, 1));
  4705.                 }), $txt(Lng.cfg.minImgSize[lang])]), inpTxt("zoomFactor", 4, function () {
  4706.                         saveCfg("zoomFactor", Math.min(Math.max(+this.value, 1), 100));
  4707.                 }), $txt(Lng.cfg.zoomFactor[lang]), lBox("webmControl", true, null), $if(nav.canPlayWebm, $New("div", null, [inpTxt("webmVolume", 4, function () {
  4708.                         saveCfg("webmVolume", Math.min(+this.value, 100));
  4709.                 }), $txt(Lng.cfg.webmVolume[lang])]))]), $if(!nav.Presto, lBox("preLoadImgs", true, null)), $if(!nav.Presto && !aib.fch, $New("div", { "class": "de-cfg-depend" }, [lBox("findImgFile", true, null)])), lBox("openImgs", true, null), $New("div", { "class": "de-cfg-depend" }, [lBox("openGIFs", false, null)]), lBox("imgSrcBtns", true, null)]);
  4710.         }
  4711.  
  4712.         function getCfgLinks() {
  4713.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-links" }, [optSel("linksNavig", true, null), $New("div", { "class": "de-cfg-depend" }, [$New("div", null, [inpTxt("linksOver", 4, function () {
  4714.                         saveCfg("linksOver", +this.value | 0);
  4715.                 }), $txt(Lng.cfg.linksOver[lang]), inpTxt("linksOut", 4, function () {
  4716.                         saveCfg("linksOut", +this.value | 0);
  4717.                 }), $txt(Lng.cfg.linksOut[lang])]), lBox("markViewed", true, null), lBox("strikeHidd", true, null), $New("div", { "class": "de-cfg-depend" }, [lBox("removeHidd", false, updateCSS)]), lBox("noNavigHidd", true, null)]), lBox("crossLinks", true, null), lBox("insertNum", true, null), lBox("addOPLink", true, null), lBox("addImgs", true, null), lBox("addMP3", false, null), $if(aib.prot === "http:", lBox("addVocaroo", false, null)), optSel("addYouTube", true, null), $New("div", { "class": "de-cfg-depend" }, [$New("div", null, [optSel("YTubeType", false, null), inpTxt("YTubeWidth", 4, null), $txt("×"), inpTxt("YTubeHeigh", 4, null)]), $if(!nav.Opera11 || nav.isGM, lBox("YTubeTitles", false, null)), lBox("addVimeo", true, null)])]);
  4718.         }
  4719.  
  4720.         function getCfgForm() {
  4721.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-form" }, [optSel("ajaxReply", true, null), $if(pr.form, $New("div", { "class": "de-cfg-depend" }, [$if(!nav.Opera11, $New("div", null, [lBox("postSameImg", true, null), lBox("removeEXIF", false, null), lBox("removeFName", false, null), lBox("sendErrNotif", true, null)])), lBox("scrAfterRep", true, null)])), $if(pr.form, optSel("addPostForm", true, function () {
  4722.                         saveCfg("addPostForm", this.selectedIndex);
  4723.                         pr.isBottom = Cfg.addPostForm === 1;
  4724.                         pr.setReply(false, !TNum || Cfg.addPostForm > 1);
  4725.                 })), lBox("favOnReply", true, null), $if(pr.subj, lBox("warnSubjTrip", false, null)), $if(pr.file && !nav.Presto, lBox("fileThumb", true, function () {
  4726.                         for (var inp = pr.fileObj; true; inp = inp.next) {
  4727.                                 inp.updateUtils();
  4728.                                 if (!inp.next) {
  4729.                                         break;
  4730.                                 }
  4731.                         }
  4732.                         if (inp.empty) {
  4733.                                 inp.hideInputs();
  4734.                         }
  4735.                         if (!aib.kus && !aib.multiFile) {
  4736.                                 pr.setPlaceholders();
  4737.                         }
  4738.                         updateCSS();
  4739.                 })), $if(!aib.iich && pr.mail, $New("div", null, [lBox("addSageBtn", false, null), lBox("saveSage", false, null)])), $if(pr.capTr, optSel("captchaLang", true, null)), $if(pr.txta, $New("div", null, [optSel("addTextBtns", false, function () {
  4740.                         saveCfg("addTextBtns", this.selectedIndex);
  4741.                         pr.addTextPanel();
  4742.                 }), lBox("txtBtnsLoc", false, pr.addTextPanel.bind(pr))])), $if(pr.passw, $New("div", null, [inpTxt("passwValue", 15, PostForm.setUserPassw), $txt(Lng.cfg.userPassw[lang]), $btn(Lng.change[lang], "", function () {
  4743.                         $q("input[info=\"passwValue\"]", doc).value = Math.round(Math.random() * 1000000000000000).toString(32);
  4744.                         PostForm.setUserPassw();
  4745.                 })])), $if(pr.name, $New("div", null, [inpTxt("nameValue", 15, PostForm.setUserName), $txt(" "), lBox("userName", false, PostForm.setUserName)])), $New("div", null, [$txt(Lng.dontShow[lang]), lBox("noBoardRule", false, updateCSS), $if(pr.gothr, lBox("noGoto", false, function () {
  4746.                         $disp(pr.gothr);
  4747.                 })), $if(pr.passw, lBox("noPassword", false, function () {
  4748.                         $disp(pr.passw.parentNode.parentNode);
  4749.                 })), $if(pr.name, lBox("noName", false, function () {
  4750.                         $disp(pr.name.parentNode.parentNode);
  4751.                 }))])]);
  4752.         }
  4753.  
  4754.         function getCfgCommon() {
  4755.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-common" }, [optSel("scriptStyle", true, function () {
  4756.                         saveCfg("scriptStyle", this.selectedIndex);
  4757.                         $id("de-main").lang = $id("de-qarea").firstChild.nextSibling.lang = getThemeLang();
  4758.                 }), $New("div", null, [lBox("userCSS", false, updateCSS), addEditButton("css", function (fn) {
  4759.                         fn(Cfg.userCSSTxt, false, function () {
  4760.                                 saveCfg("userCSSTxt", this.value);
  4761.                                 updateCSS();
  4762.                                 toggleContent("cfg", true);
  4763.                         });
  4764.                 })]), lBox("attachPanel", true, function () {
  4765.                         toggleContent("cfg", false);
  4766.                         updateCSS();
  4767.                 }), lBox("panelCounter", true, updateCSS), lBox("rePageTitle", true, null), $if(nav.Anim, lBox("animation", true, null)), lBox("closePopups", true, null), $New("div", null, [lBox("hotKeys", false, function () {
  4768.                         if (Cfg.hotKeys) {
  4769.                                 if (hKeys) {
  4770.                                         hKeys.enable();
  4771.                                 } else {
  4772.                                         hKeys = new HotKeys();
  4773.                                 }
  4774.                         } else if (hKeys) {
  4775.                                 hKeys.disable();
  4776.                         }
  4777.                 }), $btn(Lng.edit[lang], "", function (e) {
  4778.                         $pd(e);
  4779.                         if ($id("de-alert-edit-hotkeys")) {
  4780.                                 return;
  4781.                         }
  4782.                         spawn(HotKeys.readKeys).then(function (keys) {
  4783.                                 var el,
  4784.                                     fn,
  4785.                                     temp = KeyEditListener.getEditMarkup(keys);
  4786.                                 $alert(temp[1], "edit-hotkeys", false);
  4787.                                 el = $id("de-alert-edit-hotkeys");
  4788.                                 fn = new KeyEditListener(el, keys, temp[0]);
  4789.                                 el.addEventListener("focus", fn, true);
  4790.                                 el.addEventListener("blur", fn, true);
  4791.                                 el.addEventListener("click", fn, true);
  4792.                                 el.addEventListener("keydown", fn, true);
  4793.                                 el.addEventListener("keyup", fn, true);
  4794.                         });
  4795.                 })]), $New("div", { "class": "de-cfg-depend" }, [inpTxt("loadPages", 2, null), $txt(Lng.cfg.loadPages[lang])]), $if(!nav.isChromeStorage && !nav.Presto || nav.isGM, $New("div", null, [lBox("updScript", true, null), $New("div", { "class": "de-cfg-depend" }, [optSel("scrUpdIntrv", false, null), $btn(Lng.checkNow[lang], "", function () {
  4796.                         $alert(Lng.loading[lang], "updavail", true);
  4797.                         spawn(getStoredObj, "Rainbow_Config").then(function (val) {
  4798.                                 return checkForUpdates(true, val.lastUpd);
  4799.                         }).then(function (html) {
  4800.                                 return $alert(html, "updavail", false);
  4801.                         }, emptyFn);
  4802.                 })])])), $if(nav.isGlobal, $New("div", null, [$txt(Lng.cfg.excludeList[lang]), $new("input", { type: "text", id: "de-exclude-edit", size: 45, style: "display: block;",
  4803.                         value: excludeList }, {
  4804.                         keyup: function () {
  4805.                                 setStored("DESU_Exclude", this.value);
  4806.                         }
  4807.                 }), lBox("turnOff", true, function () {
  4808.                         spawn(getStoredObj, "Rainbow_Config").then(function (val) {
  4809.                                 for (var dm in val) {
  4810.                                         if (dm !== aib.dm && dm !== "global" && dm !== "lastUpd") {
  4811.                                                 val[dm].disabled = Cfg.turnOff;
  4812.                                         }
  4813.                                 }
  4814.                                 setStored("Rainbow_Config", JSON.stringify(val));
  4815.                         });
  4816.                 })]))]);
  4817.         }
  4818.  
  4819.         function getCfgInfo() {
  4820.                 function getHiddenThrCount() {
  4821.                         var count = 0;
  4822.                         for (var b in hThr) {
  4823.                                 for (var tNum in hThr[b]) {
  4824.                                         count++;
  4825.                                 }
  4826.                         }
  4827.                         return count;
  4828.                 }
  4829.                 return $New("div", { "class": "de-cfg-unvis", id: "de-cfg-info" }, [$add("<div style=\"padding-bottom: 10px;\">" + "<a href=\"https://github.com/SthephanShinkufag/Dollchan-Extension-Tools/wiki/versions\" " + "target=\"_blank\">v" + version + "</a>&nbsp;|&nbsp;" + "<a href=\"http://www.freedollchan.org/scripts/\" target=\"_blank\">Freedollchan</a>&nbsp;|&nbsp;" + "<a href=\"https://github.com/SthephanShinkufag/Dollchan-Extension-Tools/wiki/" + (lang ? "home-en/" : "") + "\" target=\"_blank\">Github</a></div>"), $add("<div><table class=\"de-cfg-info-data\"><tbody>" + "<tr><td>" + Lng.thrViewed[lang] + "</td><td>" + Cfg.stats.view + "</td></tr>" + "<tr><td>" + Lng.thrCreated[lang] + "</td><td>" + Cfg.stats.op + "</td></tr>" + "<tr><td>" + Lng.thrHidden[lang] + "</td><td>" + getHiddenThrCount() + "</td></tr>" + "<tr><td>" + Lng.postsSent[lang] + "</td><td>" + Cfg.stats.reply + "</td></tr></tbody></table>" + "<table class=\"de-cfg-info-data\" style=\"border-left: 1px solid grey;\">" + new Logger().getTable() + "</table></div>"), $btn(Lng.debug[lang], Lng.infoDebug[lang], function () {
  4830.                         $alert(Lng.infoDebug[lang] + ":<textarea readonly id=\"de-debug-info\" class=\"de-editor\"></textarea>", "help-debug", false);
  4831.                         $id("de-debug-info").value = JSON.stringify({
  4832.                                 version: version,
  4833.                                 location: String(window.location),
  4834.                                 nav: nav,
  4835.                                 cfg: Cfg,
  4836.                                 sSpells: spells.list.split("\n"),
  4837.                                 oSpells: sesStorage["de-spells-" + brd + (TNum || "")],
  4838.                                 perf: new Logger().getData(true)
  4839.                         }, function (key, value) {
  4840.                                 if (key in defaultCfg) {
  4841.                                         if (value === defaultCfg[key] || key === "nameValue" || key === "passwValue") {
  4842.                                                 return void 0;
  4843.                                         }
  4844.                                 }
  4845.                                 return key === "stats" ? void 0 : value;
  4846.                         }, "\t");
  4847.                 })]);
  4848.         }
  4849.  
  4850.         function addEditButton(name, getDataFn) {
  4851.                 return $btn(Lng.edit[lang], Lng.editInTxt[lang], (function (getData) {
  4852.                         getData(function (val, isJSON, saveFn) {
  4853.                                 var el,
  4854.                                     ta = $new("textarea", {
  4855.                                         "class": "de-editor",
  4856.                                         value: isJSON ? JSON.stringify(val, null, "\t") : val
  4857.                                 }, null);
  4858.                                 $alert("", "edit-" + name, false);
  4859.                                 el = $c("de-alert-msg", $id("de-alert-edit-" + name));
  4860.                                 el.appendChild($txt(Lng.editor[name][lang]));
  4861.                                 el.appendChild(ta);
  4862.                                 el.appendChild($btn(Lng.save[lang], Lng.saveChanges[lang], isJSON ? (function (fun) {
  4863.                                         var data;
  4864.                                         try {
  4865.                                                 data = JSON.parse(this.value.trim().replace(/[\n\r\t]/g, "") || "{}");
  4866.                                         } finally {
  4867.                                                 if (data) {
  4868.                                                         fun(data);
  4869.                                                         closeAlert($id("de-alert-edit-" + name));
  4870.                                                         closeAlert($id("de-alert-err-invaliddata"));
  4871.                                                 } else {
  4872.                                                         $alert(Lng.invalidData[lang], "err-invaliddata", false);
  4873.                                                 }
  4874.                                         }
  4875.                                 }).bind(ta, saveFn) : saveFn.bind(ta)));
  4876.                         });
  4877.                 }).bind(null, getDataFn));
  4878.         }
  4879.  
  4880.         function addSettings(Set, id) {
  4881.                 Set.appendChild($New("div", { "class": aib.cReply }, [$new("div", { "class": "de-cfg-head", text: "Dollchan Extension Tools" }, null), $New("div", { id: "de-cfg-bar" }, [cfgTab("filters"), cfgTab("posts"), cfgTab("images"), cfgTab("links"), $if(pr.form || pr.oeForm, cfgTab("form")), cfgTab("common"), cfgTab("info")]), $New("div", { id: "de-cfg-btns" }, [optSel("language", false, function () {
  4882.                         saveCfg("language", lang = this.selectedIndex);
  4883.                         $del($id("de-main"));
  4884.                         $del($id("de-css"));
  4885.                         $del($id("de-css-dynamic"));
  4886.                         scriptCSS();
  4887.                         addPanel(dForm.el);
  4888.                         toggleContent("cfg", false);
  4889.                 }), $New("div", { style: "float: right;" }, [addEditButton("cfg", function (fn) {
  4890.                         fn(Cfg, true, function (data) {
  4891.                                 saveComCfg(aib.dm, data);
  4892.                                 window.location.reload();
  4893.                         });
  4894.                 }), $if(nav.isGlobal, $btn(Lng.load[lang], Lng.loadGlobal[lang], function () {
  4895.                         spawn(getStoredObj, "Rainbow_Config").then(function (val) {
  4896.                                 if (val && "global" in val && !$isEmpty(val.global)) {
  4897.                                         delete val[aib.dm];
  4898.                                         setStored("Rainbow_Config", JSON.stringify(val));
  4899.                                         window.location.reload();
  4900.                                 } else {
  4901.                                         $alert(Lng.noGlobalCfg[lang], "err-noglobalcfg", false);
  4902.                                 }
  4903.                         });
  4904.                 })), $if(nav.isGlobal, $btn(Lng.save[lang], Lng.saveGlobal[lang], function () {
  4905.                         spawn(getStoredObj, "Rainbow_Config").then(function (val) {
  4906.                                 var obj = {},
  4907.                                     com = val[aib.dm];
  4908.                                 for (var i in com) {
  4909.                                         if (i !== "correctTime" && i !== "timePattern" && i !== "userCSS" && i !== "userCSSTxt" && com[i] !== defaultCfg[i] && i !== "stats") {
  4910.                                                 obj[i] = com[i];
  4911.                                         }
  4912.                                 }
  4913.                                 val.global = obj;
  4914.                                 setStored("Rainbow_Config", JSON.stringify(val));
  4915.                                 toggleContent("cfg", true);
  4916.                         });
  4917.                 })), $btn(Lng.reset[lang], Lng.resetCfg[lang], function () {
  4918.                         if (confirm(Lng.conReset[lang])) {
  4919.                                 delStored("Rainbow_Config");
  4920.                                 delStored("DESU_Favorites");
  4921.                                 delStored("DESU_Posts_" + aib.dm);
  4922.                                 delStored("DESU_Threads_" + aib.dm);
  4923.                                 delStored("DESU_keys");
  4924.                                 window.location.reload();
  4925.                         }
  4926.                 })]), $new("div", { style: "clear: both;" }, null)])]));
  4927.                 $q(".de-cfg-tab[info=\"" + (id || "filters") + "\"]", Set).click();
  4928.         }
  4929.  
  4930.  
  4931.  
  4932.  
  4933.         function closeAlert(el) {
  4934.                 if (el) {
  4935.                         el.closeTimeout = null;
  4936.                         if (!Cfg.animation) {
  4937.                                 $del(el);
  4938.                                 return;
  4939.                         }
  4940.                         nav.animEvent(el, function (node) {
  4941.                                 var p = node && node.parentNode;
  4942.                                 if (p) {
  4943.                                         p.removeChild(node);
  4944.                                 }
  4945.                         });
  4946.                         el.classList.add("de-close");
  4947.                 }
  4948.         }
  4949.  
  4950.         function $alert(txt, id, wait) {
  4951.                 var node,
  4952.                     el = $id("de-alert-" + id),
  4953.                     cBtn = "de-alert-btn" + (wait ? " de-wait" : ""),
  4954.                     tBtn = wait ? "" : "✖ ";
  4955.                 if (el) {
  4956.                         $t("div", el).innerHTML = txt.trim();
  4957.                         node = $t("span", el);
  4958.                         node.className = cBtn;
  4959.                         node.textContent = tBtn;
  4960.                         clearTimeout(el.closeTimeout);
  4961.                         if (!wait && Cfg.animation) {
  4962.                                 nav.animEvent(el, function (node) {
  4963.                                         node.classList.remove("de-blink");
  4964.                                 });
  4965.                                 el.classList.add("de-blink");
  4966.                         }
  4967.                 } else {
  4968.                         el = $id("de-alert").appendChild($New("div", { "class": aib.cReply, id: "de-alert-" + id }, [$new("span", { "class": cBtn, text: tBtn }, { click: function () {
  4969.                                         closeAlert(this.parentNode);
  4970.                                 } }), $add("<div class=\"de-alert-msg\">" + txt.trim() + "</div>")]));
  4971.                         if (Cfg.animation) {
  4972.                                 nav.animEvent(el, function (node) {
  4973.                                         node.classList.remove("de-open");
  4974.                                 });
  4975.                                 el.classList.add("de-open");
  4976.                         }
  4977.                 }
  4978.                 if (Cfg.closePopups && !wait && !id.contains("help") && !id.contains("edit")) {
  4979.                         el.closeTimeout = setTimeout(closeAlert, 4000, el);
  4980.                 }
  4981.         }
  4982.  
  4983.         function showMenu(el, html, inPanel, onclick) {
  4984.                 var y,
  4985.                     pos,
  4986.                     menu,
  4987.                     cr = el.getBoundingClientRect();
  4988.                 if (Cfg.attachPanel && inPanel) {
  4989.                         pos = "fixed";
  4990.                         y = "bottom: 25";
  4991.                 } else {
  4992.                         pos = "absolute";
  4993.                         y = "top: " + (window.pageYOffset + cr.bottom);
  4994.                 }
  4995.                 doc.body.insertAdjacentHTML("beforeend", "<div class=\"" + aib.cReply + " de-menu\" style=\"position: " + pos + "; right: " + (doc.documentElement.clientWidth - cr.right - window.pageXOffset) + "px; " + y + "px;\">" + html + "</div>");
  4996.                 menu = doc.body.lastChild;
  4997.                 menu.addEventListener("mouseover", function (e) {
  4998.                         clearTimeout(e.currentTarget.odelay);
  4999.                 }, true);
  5000.                 menu.addEventListener("mouseout", removeMenu, true);
  5001.                 menu.addEventListener("click", (function (e) {
  5002.                         var el = e.target;
  5003.                         if (el.className === "de-menu-item") {
  5004.                                 setTimeout(this, 10, el);
  5005.                                 do {
  5006.                                         el = el.parentElement;
  5007.                                 } while (!el.classList.contains("de-menu"));
  5008.                                 $del(el);
  5009.                         }
  5010.                 }).bind(onclick), false);
  5011.         }
  5012.  
  5013.         function addMenu(e) {
  5014.                 e.target.odelay = setTimeout(function (el) {
  5015.                         switch (el.id) {
  5016.                                 case "de-btn-addspell":
  5017.                                         showMenu(el, "<div style=\"display: inline-block; border-right: 1px solid grey;\">" + "<span class=\"de-menu-item\">" + "#words,#exp,#exph,#imgn,#ihash,#subj,#name,#trip,#img,<br>".split(",").join("</span><span class=\"de-menu-item\">") + "</span></div><div style=\"display: inline-block;\"><span class=\"de-menu-item\">" + "#sage,#op,#tlen,#all,#video,#vauthor,#num,#wipe,#rep,#outrep".split(",").join("</span><span class=\"de-menu-item\">") + "</span></div>", false, function (el) {
  5018.                                                 var exp = el.textContent;
  5019.                                                 $txtInsert($id("de-spell-edit"), exp + (!TNum || exp === "#op" || exp === "#rep" || exp === "#outrep" ? "" : "[" + brd + "," + TNum + "]") + (Spells.needArg[Spells.names.indexOf(exp.substr(1))] ? "(" : ""));
  5020.                                         });
  5021.                                         return;
  5022.                                 case "de-btn-refresh":
  5023.                                         showMenu(el, "<span class=\"de-menu-item\">" + Lng.selAjaxPages[lang].join("</span><span class=\"de-menu-item\">") + "</span>", true, function (el) {
  5024.                                                 loadPages(aProto.indexOf.call(el.parentNode.children, el) + 1);
  5025.                                         });
  5026.                                         return;
  5027.                                 case "de-btn-savethr":
  5028.                                         showMenu(el, "<span class=\"de-menu-item\">" + Lng.selSaveThr[lang].join("</span><span class=\"de-menu-item\">") + "</span>", true, function (el) {
  5029.                                                 if (!$id("de-alert-savethr")) {
  5030.                                                         var imgOnly = !!aProto.indexOf.call(el.parentNode.children, el);
  5031.                                                         if (Images_.preloading) {
  5032.                                                                 $alert(Lng.loading[lang], "savethr", true);
  5033.                                                                 Images_.afterpreload = loadDocFiles.bind(null, imgOnly);
  5034.                                                                 Images_.progressId = "savethr";
  5035.                                                         } else {
  5036.                                                                 loadDocFiles(imgOnly);
  5037.                                                         }
  5038.                                                 }
  5039.                                         });
  5040.                                         return;
  5041.                                 case "de-btn-audio-off":
  5042.                                         showMenu(el, "<span class=\"de-menu-item\">" + Lng.selAudioNotif[lang].join("</span><span class=\"de-menu-item\">") + "</span>", true, function (el) {
  5043.                                                 var i = aProto.indexOf.call(el.parentNode.children, el);
  5044.                                                 updater.enable();
  5045.                                                 updater.toggleAudio(i === 0 ? 30000 : i === 1 ? 60000 : i === 2 ? 120000 : 300000);
  5046.                                                 $id("de-btn-audio-off").id = "de-btn-audio-on";
  5047.                                         });
  5048.                         }
  5049.                 }, Cfg.linksOver, e.target);
  5050.         }
  5051.  
  5052.         function removeMenu(e) {
  5053.                 var el = $c("de-menu", doc),
  5054.                     rt = e.relatedTarget;
  5055.                 clearTimeout(e.target.odelay);
  5056.                 if (el && (!rt || rt !== el && !el.contains(rt))) {
  5057.                         el.odelay = setTimeout($del, 75, el);
  5058.                 }
  5059.         }
  5060.  
  5061.  
  5062.  
  5063.  
  5064.         function HotKeys() {
  5065.                 var _this = this;
  5066.  
  5067.                 spawn(HotKeys.readKeys).then(function (keys) {
  5068.                         return _this._init(keys);
  5069.                 });
  5070.         }
  5071.         HotKeys.version = 6;
  5072.         HotKeys.readKeys = regeneratorRuntime.mark(function callee$1$0() {
  5073.                 var keys, str, tKeys, mapFunc;
  5074.                 return regeneratorRuntime.wrap(function callee$1$0$(context$2$0) {
  5075.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  5076.                                 case 0:
  5077.                                         return context$2$0.delegateYield(getStored("DESU_keys"), "t13", 1);
  5078.  
  5079.                                 case 1:
  5080.                                         str = context$2$0.t13;
  5081.  
  5082.                                         if (str) {
  5083.                                                 context$2$0.next = 4;
  5084.                                                 break;
  5085.                                         }
  5086.  
  5087.                                         return context$2$0.abrupt("return", HotKeys.getDefaultKeys());
  5088.  
  5089.                                 case 4:
  5090.                                         context$2$0.prev = 4;
  5091.  
  5092.                                         keys = JSON.parse(str);
  5093.  
  5094.                                 case 6:
  5095.                                         context$2$0.prev = 6;
  5096.  
  5097.                                         if (keys) {
  5098.                                                 context$2$0.next = 9;
  5099.                                                 break;
  5100.                                         }
  5101.  
  5102.                                         return context$2$0.abrupt("return", HotKeys.getDefaultKeys());
  5103.  
  5104.                                 case 9:
  5105.                                         if (keys[0] !== HotKeys.version) {
  5106.                                                 tKeys = HotKeys.getDefaultKeys();
  5107.  
  5108.                                                 switch (keys[0]) {
  5109.                                                         case 1:
  5110.                                                                 keys[2][11] = tKeys[2][11];
  5111.                                                                 keys[4] = tKeys[4];
  5112.                                                                                                                 case 2:
  5113.                                                                 keys[2][12] = tKeys[2][12];
  5114.                                                                 keys[2][13] = tKeys[2][13];
  5115.                                                                 keys[2][14] = tKeys[2][14];
  5116.                                                                 keys[2][15] = tKeys[2][15];
  5117.                                                                 keys[2][16] = tKeys[2][16];
  5118.                                                                                                                 case 3:
  5119.                                                                 keys[2][17] = keys[3][3];
  5120.                                                                 keys[3][3] = keys[3].splice(4, 1)[0];
  5121.                                                                                                                 case 4:
  5122.                                                         case 5:
  5123.                                                                 if (keys[2][18]) {
  5124.                                                                         delete keys[2][18];
  5125.                                                                 }
  5126.                                                 }
  5127.                                                 keys[0] = HotKeys.version;
  5128.                                                 setStored("DESU_keys", JSON.stringify(keys));
  5129.                                         }
  5130.                                         if (keys[1] ^ !!nav.Firefox) {
  5131.                                                 mapFunc = nav.Firefox ? function mapFuncFF(key) {
  5132.                                                         switch (key) {
  5133.                                                                 case 189:
  5134.                                                                         return 173;
  5135.                                                                 case 187:
  5136.                                                                         return 61;
  5137.                                                                 case 186:
  5138.                                                                         return 59;
  5139.                                                                 default:
  5140.                                                                         return key;
  5141.                                                         }
  5142.                                                 } : function mapFuncNonFF(key) {
  5143.                                                         switch (key) {
  5144.                                                                 case 173:
  5145.                                                                         return 189;
  5146.                                                                 case 61:
  5147.                                                                         return 187;
  5148.                                                                 case 59:
  5149.                                                                         return 186;
  5150.                                                                 default:
  5151.                                                                         return key;
  5152.                                                         }
  5153.                                                 };
  5154.  
  5155.                                                 keys[1] = !!nav.Firefox;
  5156.                                                 keys[2] = keys[2].map(mapFunc);
  5157.                                                 keys[3] = keys[3].map(mapFunc);
  5158.                                                 setStored("DESU_keys", JSON.stringify(keys));
  5159.                                         }
  5160.                                         return context$2$0.abrupt("return", keys);
  5161.  
  5162.                                 case 13:
  5163.                                 case "end":
  5164.                                         return context$2$0.stop();
  5165.                         }
  5166.                 }, callee$1$0, this, [[4,, 6, 13]]);
  5167.         });
  5168.         HotKeys.getDefaultKeys = function () {
  5169.                 var globKeys = [
  5170.                 75 ,
  5171.                 74 ,
  5172.                 82 ,
  5173.                 72 ,
  5174.                 4133 ,
  5175.                 49165 ,
  5176.                 16454 ,
  5177.                 16456 ,
  5178.                 80 ,
  5179.                 66 ,
  5180.                 16467 ,
  5181.                 73 ,
  5182.                 49218 ,
  5183.                 49225 ,
  5184.                 49236 ,
  5185.                 49232 ,
  5186.                 49219 ,
  5187.                 4135            ];
  5188.                 var nonThrKeys = [
  5189.                 77 ,
  5190.                 78 ,
  5191.                 86 ,
  5192.                 69              ];
  5193.                 var thrKeys = [
  5194.                 85              ];
  5195.                 return [HotKeys.version, !!nav.Firefox, globKeys, nonThrKeys, thrKeys];
  5196.         };
  5197.         HotKeys.prototype = {
  5198.                 cPost: null,
  5199.                 enabled: false,
  5200.                 gKeys: null,
  5201.                 lastPage: 0,
  5202.                 lastPageOffset: 0,
  5203.                 ntKeys: null,
  5204.                 paused: false,
  5205.                 tKeys: null,
  5206.                 clear: function clear(lastPage) {
  5207.                         this.cPost = null;
  5208.                         this.lastPage = lastPage;
  5209.                         this.lastPageOffset = 0;
  5210.                 },
  5211.                 disable: function disable() {
  5212.                         if (this.enabled) {
  5213.                                 if (this.cPost) {
  5214.                                         this.cPost.unselect();
  5215.                                 }
  5216.                                 doc.removeEventListener("keydown", this, true);
  5217.                                 this.enabled = false;
  5218.                         }
  5219.                 },
  5220.                 enable: function enable() {
  5221.                         if (!this.enabled) {
  5222.                                 this.clear(pageNum);
  5223.                                 doc.addEventListener("keydown", this, true);
  5224.                                 this.enabled = true;
  5225.                         }
  5226.                 },
  5227.                 handleEvent: function handleEvent(e) {
  5228.                         /* if (this.paused) {
  5229.                                 return;
  5230.                         } */
  5231.                         var curTh = e.target.tagName,
  5232.                             kc = e.keyCode | (e.ctrlKey ? 4096 : 0) | (e.shiftKey ? 8192 : 0) | (e.altKey ? 16384 : 0) | (curTh === "TEXTAREA" || curTh === "INPUT" && e.target.type === "text" ? 32768 : 0);
  5233.                         if (kc === 116 || kc === 32884) {
  5234.                        
  5235.                                 if (TNum || $id("de-alert-load-pages")) {
  5236.                                         return;
  5237.                                 }
  5238.                                 if (Attachment.viewer) {
  5239.                                         Attachment.viewer.close(null);
  5240.                                         Attachment.viewer = null;
  5241.                                 }
  5242.                                 loadPages(+Cfg.loadPages);
  5243.                         } else if (kc === 27) {
  5244.                        
  5245.                                 if (Attachment.viewer) {
  5246.                                         Attachment.viewer.close(null);
  5247.                                         Attachment.viewer = null;
  5248.                                         return;
  5249.                                 }
  5250.                                 if (this.cPost) {
  5251.                                         this.cPost.unselect();
  5252.                                         this.cPost = null;
  5253.                                 }
  5254.                                 if (TNum) {
  5255.                                         dForm.firstThr.clearPostsMarks();
  5256.                                 }
  5257.                                 this.lastPageOffset = 0;
  5258.                         } else if (kc === 32795) {
  5259.                        
  5260.                                 e.target.blur();
  5261.                         } else {
  5262.                                 var post,
  5263.                                     idx,
  5264.                                     globIdx = this.gKeys.indexOf(kc);
  5265.                                 switch (globIdx) {
  5266.                                         case 2:
  5267.                                        
  5268.                                                 if (pr.form) {
  5269.                                                         post = this.cPost || this._getFirstVisPost(false, true) || dForm.firstThr.op;
  5270.                                                         this.cPost = post;
  5271.                                                         pr.showQuickReply(post, post.num, true, false);
  5272.                                                         post.select();
  5273.                                                 }
  5274.                                                 break;
  5275.                                         case 3:
  5276.                                        
  5277.                                                 post = this._getFirstVisPost(false, true) || this._getNextVisPost(null, true, false);
  5278.                                                 if (post) {
  5279.                                                         post.toggleUserVisib();
  5280.                                                         this._scroll(post, false, post.isOp);
  5281.                                                 }
  5282.                                                 break;
  5283.                                         case 4:
  5284.                                        
  5285.                                                 if (Attachment.viewer) {
  5286.                                                         Attachment.viewer.navigate(false);
  5287.                                                 } else if (TNum || pageNum !== aib.firstPage) {
  5288.                                                         window.location.pathname = aib.getPageUrl(brd, TNum ? 0 : pageNum - 1);
  5289.                                                 }
  5290.                                                 break;
  5291.                                         case 5:
  5292.                                        
  5293.                                                 if (e.target !== pr.txta && e.target !== pr.cap) {
  5294.                                                         return;
  5295.                                                 }
  5296.                                                 pr.subm.click();
  5297.                                                 break;
  5298.                                         case 6:
  5299.                                        
  5300.                                                 toggleContent("fav", false);
  5301.                                                 break;
  5302.                                         case 7:
  5303.                                        
  5304.                                                 toggleContent("hid", false);
  5305.                                                 break;
  5306.                                         case 8:
  5307.                                        
  5308.                                                 $disp($id("de-panel").lastChild);
  5309.                                                 break;
  5310.                                         case 9:
  5311.                                        
  5312.                                                 toggleCfg("maskImgs");
  5313.                                                 updateCSS();
  5314.                                                 break;
  5315.                                         case 10:
  5316.                                        
  5317.                                                 toggleContent("cfg", false);
  5318.                                                 break;
  5319.                                         case 11:
  5320.                                        
  5321.                                                 post = this._getFirstVisPost(false, true) || this._getNextVisPost(null, true, false);
  5322.                                                 if (post) {
  5323.                                                         post.toggleImages(!post.imagesExpanded);
  5324.                                                 }
  5325.                                                 break;
  5326.                                         case 12:
  5327.                                        
  5328.                                                 if (e.target !== pr.txta) {
  5329.                                                         return;
  5330.                                                 }
  5331.                                                 $id("de-btn-bold").click();
  5332.                                                 break;
  5333.                                         case 13:
  5334.                                        
  5335.                                                 if (e.target !== pr.txta) {
  5336.                                                         return;
  5337.                                                 }
  5338.                                                 $id("de-btn-italic").click();
  5339.                                                 break;
  5340.                                         case 14:
  5341.                                        
  5342.                                                 if (e.target !== pr.txta) {
  5343.                                                         return;
  5344.                                                 }
  5345.                                                 $id("de-btn-strike").click();
  5346.                                                 break;
  5347.                                         case 15:
  5348.                                        
  5349.                                                 if (e.target !== pr.txta) {
  5350.                                                         return;
  5351.                                                 }
  5352.                                                 $id("de-btn-spoil").click();
  5353.                                                 break;
  5354.                                         case 16:
  5355.                                        
  5356.                                                 if (e.target !== pr.txta) {
  5357.                                                         return;
  5358.                                                 }
  5359.                                                 $id("de-btn-code").click();
  5360.                                                 break;
  5361.                                         case 17:
  5362.                                        
  5363.                                                 if (Attachment.viewer) {
  5364.                                                         Attachment.viewer.navigate(true);
  5365.                                                 } else if (!TNum && this.lastPage !== aib.lastPage) {
  5366.                                                         window.location.pathname = aib.getPageUrl(brd, this.lastPage + 1);
  5367.                                                 }
  5368.                                                 break;
  5369.                                         case -1:
  5370.                                                 if (TNum) {
  5371.                                                         idx = this.tKeys.indexOf(kc);
  5372.                                                         if (idx === 0) {
  5373.                                                                 updater.forceLoad(null);
  5374.                                                                 break;
  5375.                                                         }
  5376.                                                         return;
  5377.                                                 }
  5378.                                                 idx = this.ntKeys.indexOf(kc);
  5379.                                                 if (idx === -1) {
  5380.                                                         return;
  5381.                                                 } else if (idx === 2) {
  5382.                                                
  5383.                                                         post = this._getFirstVisPost(false, true) || this._getNextVisPost(null, true, false);
  5384.                                                         if (post) {
  5385.                                                                 if (nav.Firefox) {
  5386.                                                                         GM_openInTab(aib.getThrdUrl(brd, post.tNum), false, true);
  5387.                                                                 } else {
  5388.                                                                         window.open(aib.getThrdUrl(brd, post.tNum), "_blank");
  5389.                                                                 }
  5390.                                                         }
  5391.                                                         break;
  5392.                                                 } else if (idx === 3) {
  5393.                                                
  5394.                                                         post = this._getFirstVisPost(false, true) || this._getNextVisPost(null, true, false);
  5395.                                                         if (post) {
  5396.                                                                 if (post.thr.loadedOnce && post.thr.op.next.count === 1) {
  5397.                                                                         var nextThr = post.thr.nextNotHidden;
  5398.                                                                         post.thr.load(visPosts, !!nextThr);
  5399.                                                                         post = (nextThr || post.thr).op;
  5400.                                                                 } else {
  5401.                                                                         post.thr.load(1, false);
  5402.                                                                         post = post.thr.op;
  5403.                                                                 }
  5404.                                                                 scrollTo(0, window.pageYOffset + post.topCoord);
  5405.                                                                 if (this.cPost && this.cPost !== post) {
  5406.                                                                         this.cPost.unselect();
  5407.                                                                         this.cPost = post;
  5408.                                                                 }
  5409.                                                         }
  5410.                                                         break;
  5411.                                                 }
  5412.                                                                                 default:
  5413.                                                 var scrollToThr = !TNum && (globIdx === 0 || globIdx === 1);
  5414.                                                 this._scroll(this._getFirstVisPost(scrollToThr, false), globIdx === 0 || idx === 0, scrollToThr);
  5415.                                 }
  5416.                         }
  5417.                         e.stopPropagation();
  5418.                         $pd(e);
  5419.                 },
  5420.                 pause: function pause() {
  5421.                         //this.paused = true;
  5422.                 },
  5423.                 resume: function resume(keys) {
  5424.                         this.gKeys = keys[2];
  5425.                         this.ntKeys = keys[3];
  5426.                         this.tKeys = keys[4];
  5427.                         this.paused = false;
  5428.                 },
  5429.  
  5430.                 _getFirstVisPost: function _getFirstVisPost(getThread, getFull) {
  5431.                         if (this.lastPageOffset !== window.pageYOffset) {
  5432.                                 var post = getThread ? dForm.firstThr : dForm.firstThr.op;
  5433.                                 while (post.topCoord < 1) {
  5434.                                         var tPost = post.next;
  5435.                                         if (!tPost) {
  5436.                                                 break;
  5437.                                         }
  5438.                                         post = tPost;
  5439.                                 }
  5440.                                 if (this.cPost) {
  5441.                                         this.cPost.unselect();
  5442.                                 }
  5443.                                 this.cPost = getThread ? getFull ? post.op : post.op.prev : getFull ? post : post.prev;
  5444.                                 this.lastPageOffset = window.pageYOffset;
  5445.                         }
  5446.                         return this.cPost;
  5447.                 },
  5448.                 _getNextVisPost: function _getNextVisPost(cPost, isOp, toUp) {
  5449.                         if (isOp) {
  5450.                                 var thr = cPost ? toUp ? cPost.thr.prevNotHidden : cPost.thr.nextNotHidden : dForm.firstThr.hidden ? dForm.firstThr.nextNotHidden : dForm.firstThr;
  5451.                                 return thr ? thr.op : null;
  5452.                         }
  5453.                         return cPost ? cPost.getAdjacentVisPost(toUp) : dForm.firstThr.hidden || dForm.firstThr.op.hidden ? dForm.firstThr.op.getAdjacentVisPost(toUp) : dForm.firstThr.op;
  5454.                 },
  5455.                 _init: function _init(keys) {
  5456.                         this.enabled = true;
  5457.                         this.lastPage = pageNum;
  5458.                         this.gKeys = keys[2];
  5459.                         this.ntKeys = keys[3];
  5460.                         this.tKeys = keys[4];
  5461.                         doc.addEventListener("keydown", this, true);
  5462.                 },
  5463.                 _scroll: function _scroll(post, toUp, toThread) {
  5464.                         var next = this._getNextVisPost(post, toThread, toUp);
  5465.                         if (!next) {
  5466.                                 if (!TNum && (toUp ? pageNum > aib.firstPage : this.lastPage < aib.lastPage)) {
  5467.                                         window.location.pathname = aib.getPageUrl(brd, toUp ? pageNum - 1 : this.lastPage + 1);
  5468.                                 }
  5469.                                 return;
  5470.                         }
  5471.                         if (post) {
  5472.                                 post.unselect();
  5473.                         }
  5474.                         if (toThread) {
  5475.                                 next.el.scrollIntoView();
  5476.                         } else {
  5477.                                 scrollTo(0, window.pageYOffset + next.el.getBoundingClientRect().top - Post.sizing.wHeight / 2 + next.el.clientHeight / 2);
  5478.                         }
  5479.                         this.lastPageOffset = window.pageYOffset;
  5480.                         next.select();
  5481.                         this.cPost = next;
  5482.                 }
  5483.         };
  5484.  
  5485.         function KeyEditListener(alertEl, keys, allKeys) {
  5486.                 var aInputs = aProto.slice.call($C("de-input-key", alertEl));
  5487.                 for (var i = 0, len = allKeys.length; i < len; ++i) {
  5488.                         var k = allKeys[i];
  5489.                         if (k !== 0) {
  5490.                                 for (var j = i + 1; j < len; ++j) {
  5491.                                         if (k === allKeys[j]) {
  5492.                                                 aInputs[i].classList.add("de-error-key");
  5493.                                                 aInputs[j].classList.add("de-error-key");
  5494.                                                 break;
  5495.                                         }
  5496.                                 }
  5497.                         }
  5498.                 }
  5499.                 this.aEl = alertEl;
  5500.                 this.keys = keys;
  5501.                 this.initKeys = JSON.parse(JSON.stringify(keys));
  5502.                 this.allKeys = allKeys;
  5503.                 this.allInputs = aInputs;
  5504.                 this.errCount = $C("de-error-key", alertEl).length;
  5505.                 if (this.errCount !== 0) {
  5506.                         this.saveButton.disabled = true;
  5507.                 }
  5508.         }
  5509.  
  5510.  
  5511.  
  5512.         KeyEditListener.keyCodes = ["",,,,,,,, "Backspace", "Tab",,,, "Enter",,, "Shift", "Ctrl", "Alt",,,,,,,,,,,,,, "Space",,,,, "<", "^", ">", "v",,,,,,,, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",, ";",, "=",,,, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",,,,,, "Numpad 0", "Numpad 1", "Numpad 2", "Numpad 3", "Numpad 4", "Numpad 5", "Numpad 6", "Numpad 7", "Numpad 8", "Numpad 9", "Numpad *", "Numpad +",, "Numpad -", "Numpad .", "Numpad /",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, "-",,,,,,,,,,,,, ";", "=", ",", "-", ".", "/", "`",,,,,,,,,,,,,,,,,,,,,,,,,,, "[", "\\", "]", "'"];
  5513.         KeyEditListener.getStrKey = function (key) {
  5514.                 var str = "";
  5515.                 if (key & 4096) {
  5516.                         str += "Ctrl+";
  5517.                 }
  5518.                 if (key & 8192) {
  5519.                         str += "Shift+";
  5520.                 }
  5521.                 if (key & 16384) {
  5522.                         str += "Alt+";
  5523.                 }
  5524.                 str += KeyEditListener.keyCodes[key & 4095];
  5525.                 return str;
  5526.         };
  5527.         KeyEditListener.getEditMarkup = function (keys) {
  5528.                 var allKeys = [];
  5529.                 var html = Lng.hotKeyEdit[lang].join("").replace(/%l/g, "<label class=\"de-block\">").replace(/%\/l/g, "</label>").replace(/%i([2-4])([0-9]+)(t)?/g, (function (aKeys, all, id1, id2, isText) {
  5530.                         var key = this[+id1][+id2];
  5531.                         aKeys.push(key);
  5532.                         return "<input class=\"de-input-key\" type=\"text\" de-id1=\"" + id1 + "\" de-id2=\"" + id2 + "\" size=\"26\" value=\"" + KeyEditListener.getStrKey(key) + (isText ? "\" de-text" : "\"") + " readonly></input>";
  5533.                 }).bind(keys, allKeys)) + "<input type=\"button\" id=\"de-keys-save\" value=\"" + Lng.save[lang] + "\"></input>" + "<input type=\"button\" id=\"de-keys-reset\" value=\"" + Lng.reset[lang] + "\"></input>";
  5534.                 return [allKeys, html];
  5535.         };
  5536.         KeyEditListener.setTitle = function (el, idx) {
  5537.                 var title = el.getAttribute("de-title");
  5538.                 if (hKeys && idx !== -1) {
  5539.                         title += " [" + KeyEditListener.getStrKey(hKeys.gKeys[idx]) + "]";
  5540.                 }
  5541.                 el.title = title;
  5542.         };
  5543.         KeyEditListener.prototype = Object.defineProperties({
  5544.                 cEl: null,
  5545.                 cKey: -1,
  5546.                 errorInput: false,
  5547.                 handleEvent: function handleEvent(e) {
  5548.                         var key,
  5549.                             el = e.target;
  5550.                         switch (e.type) {
  5551.                                 case "blur":
  5552.                                         if (hKeys && this.errCount === 0) {
  5553.                                                 hKeys.resume(this.keys);
  5554.                                         }
  5555.                                         this.cEl = null;
  5556.                                         return;
  5557.                                 case "focus":
  5558.                                         if (hKeys) {
  5559.                                                 hKeys.pause();
  5560.                                         }
  5561.                                         this.cEl = el;
  5562.                                         return;
  5563.                                 case "click":
  5564.                                         var keys;
  5565.                                         if (el.id === "de-keys-reset") {
  5566.                                                 this.keys = HotKeys.getDefaultKeys();
  5567.                                                 this.initKeys = HotKeys.getDefaultKeys();
  5568.                                                 if (hKeys) {
  5569.                                                         hKeys.resume(this.keys);
  5570.                                                 }
  5571.                                                 var temp = KeyEditListener.getEditMarkup(this.keys);
  5572.                                                 this.allKeys = temp[0];
  5573.                                                 $c("de-alert-msg", this.aEl).innerHTML = temp[1];
  5574.                                                 this.allInputs = aProto.slice.call($C("de-input-key", this.aEl));
  5575.                                                 this.errCount = 0;
  5576.                                                 delete this.saveButton;
  5577.                                                 break;
  5578.                                         } else if (el.id === "de-keys-save") {
  5579.                                                 keys = this.keys;
  5580.                                                 setStored("DESU_keys", JSON.stringify(keys));
  5581.                                         } else if (el.className === "de-alert-btn") {
  5582.                                                 keys = this.initKeys;
  5583.                                         } else {
  5584.                                                 return;
  5585.                                         }
  5586.                                         if (hKeys) {
  5587.                                                 hKeys.resume(keys);
  5588.                                         }
  5589.                                         closeAlert($id("de-alert-edit-hotkeys"));
  5590.                                         break;
  5591.                                 case "keydown":
  5592.                                         if (!this.cEl) {
  5593.                                                 return;
  5594.                                         }
  5595.                                         key = e.keyCode;
  5596.                                         if (key === 27 || key === 46) {
  5597.                                        
  5598.                                                 this.cEl.value = "";
  5599.                                                 this.cKey = 0;
  5600.                                                 this.errorInput = false;
  5601.                                                 break;
  5602.                                         }
  5603.                                         var keyStr = KeyEditListener.keyCodes[key];
  5604.                                         if (keyStr === undefined) {
  5605.                                                 this.cKey = -1;
  5606.                                                 return;
  5607.                                         }
  5608.                                         var str = "";
  5609.                                         if (e.ctrlKey) {
  5610.                                                 str += "Ctrl+";
  5611.                                         }
  5612.                                         if (e.shiftKey) {
  5613.                                                 str += "Shift+";
  5614.                                         }
  5615.                                         if (e.altKey) {
  5616.                                                 str += "Alt+";
  5617.                                         }
  5618.                                         if (key === 16 || key === 17 || key === 18) {
  5619.                                                 this.errorInput = true;
  5620.                                         } else {
  5621.                                                 this.cKey = key | (e.ctrlKey ? 4096 : 0) | (e.shiftKey ? 8192 : 0) | (e.altKey ? 16384 : 0) | (this.cEl.hasAttribute("de-text") ? 32768 : 0);
  5622.                                                 this.errorInput = false;
  5623.                                                 str += keyStr;
  5624.                                         }
  5625.                                         this.cEl.value = str;
  5626.                                         break;
  5627.                                 case "keyup":
  5628.                                         el = this.cEl;
  5629.                                         key = this.cKey;
  5630.                                         if (!el || key === -1) {
  5631.                                                 return;
  5632.                                         }
  5633.                                         var rEl,
  5634.                                             isError = el.classList.contains("de-error-key");
  5635.                                         if (!this.errorInput && key !== -1) {
  5636.                                                 var idx = this.allInputs.indexOf(el),
  5637.                                                     oKey = this.allKeys[idx];
  5638.                                                 if (oKey === key) {
  5639.                                                         this.errorInput = false;
  5640.                                                         break;
  5641.                                                 }
  5642.                                                 var rIdx = key === 0 ? -1 : this.allKeys.indexOf(key);
  5643.                                                 this.allKeys[idx] = key;
  5644.                                                 if (isError) {
  5645.                                                         idx = this.allKeys.indexOf(oKey);
  5646.                                                         if (idx !== -1 && this.allKeys.indexOf(oKey, idx + 1) === -1) {
  5647.                                                                 rEl = this.allInputs[idx];
  5648.                                                                 if (rEl.classList.contains("de-error-key")) {
  5649.                                                                         this.errCount--;
  5650.                                                                         rEl.classList.remove("de-error-key");
  5651.                                                                 }
  5652.                                                         }
  5653.                                                         if (rIdx === -1) {
  5654.                                                                 this.errCount--;
  5655.                                                                 el.classList.remove("de-error-key");
  5656.                                                         }
  5657.                                                 }
  5658.                                                 if (rIdx === -1) {
  5659.                                                         this.keys[+el.getAttribute("de-id1")][+el.getAttribute("de-id2")] = key;
  5660.                                                         if (this.errCount === 0) {
  5661.                                                                 this.saveButton.disabled = false;
  5662.                                                         }
  5663.                                                         this.errorInput = false;
  5664.                                                         break;
  5665.                                                 }
  5666.                                                 rEl = this.allInputs[rIdx];
  5667.                                                 if (!rEl.classList.contains("de-error-key")) {
  5668.                                                         this.errCount++;
  5669.                                                         rEl.classList.add("de-error-key");
  5670.                                                 }
  5671.                                         }
  5672.                                         if (!isError) {
  5673.                                                 this.errCount++;
  5674.                                                 el.classList.add("de-error-key");
  5675.                                         }
  5676.                                         if (this.errCount !== 0) {
  5677.                                                 this.saveButton.disabled = true;
  5678.                                         }
  5679.                         }
  5680.                         $pd(e);
  5681.                 }
  5682.         }, {
  5683.                 saveButton: {
  5684.                         get: function () {
  5685.                                 var val = $id("de-keys-save");
  5686.                                 Object.defineProperty(this, "saveButton", { value: val, configurable: true });
  5687.                                 return val;
  5688.                         },
  5689.                         configurable: true,
  5690.                         enumerable: true
  5691.                 }
  5692.         });
  5693.  
  5694.  
  5695.  
  5696.  
  5697.         function initMessageFunctions() {
  5698.                 doc.defaultView.addEventListener("message", function (e) {
  5699.                         if (typeof e.data !== "string") {
  5700.                                 return;
  5701.                         }
  5702.                         var data = e.data.substring(1);
  5703.                         switch (e.data[0]) {
  5704.                                 case "A":
  5705.                                         if (data.substr(10, 5) === "pform") {
  5706.                                                 checkUpload($DOM(data.substr(15)));
  5707.                                                 $q("iframe[name=\"de-iframe-pform\"]", doc).src = "about:blank";
  5708.                                         } else {
  5709.                                                 checkDelete($DOM(data.substr(15)));
  5710.                                                 $q("iframe[name=\"de-iframe-dform\"]", doc).src = "about:blank";
  5711.                                         }
  5712.                                         return;
  5713.                                 case "B":
  5714.                                         $id("de-iframe-fav").style.height = data + "px";
  5715.                                         closeAlert($id("de-alert-load-favthr"));
  5716.                         }
  5717.                 }, false);
  5718.         }
  5719.  
  5720.         function detectImgFile(ab) {
  5721.                 var i,
  5722.                     j,
  5723.                     dat = new Uint8Array(ab),
  5724.                     len = dat.length;
  5725.                                 if (dat[0] === 255 && dat[1] === 216) {
  5726.                         for (i = 0, j = 0; i < len - 1; i++) {
  5727.                                 if (dat[i] === 255) {
  5728.                                                                                 if (dat[i + 1] === 216) {
  5729.                                                 j++;
  5730.                                                                                         } else if (dat[i + 1] === 217 && --j === 0) {
  5731.                                                 i += 2;
  5732.                                                 break;
  5733.                                         }
  5734.                                 }
  5735.                         }
  5736.                                         } else if (dat[0] === 137 && dat[1] === 80) {
  5737.                         for (i = 0; i < len - 7; i++) {
  5738.                                                                 if (dat[i] === 73 && dat[i + 1] === 69 && dat[i + 2] === 78 && dat[i + 3] === 68) {
  5739.                                         i += 8;
  5740.                                         break;
  5741.                                 }
  5742.                         }
  5743.                 } else {
  5744.                         return {};
  5745.                 }
  5746.                                 if (i !== len && len - i > 60) {
  5747.                         for (len = i + 90; i < len; i++) {
  5748.                                                                 if (dat[i] === 55 && dat[i + 1] === 122 && dat[i + 2] === 188) {
  5749.                                         return { type: 0, idx: i, data: ab };
  5750.                                                                         } else if (dat[i] === 80 && dat[i + 1] === 75 && dat[i + 2] === 3) {
  5751.                                         return { type: 1, idx: i, data: ab };
  5752.                                                                         } else if (dat[i] === 82 && dat[i + 1] === 97 && dat[i + 2] === 114) {
  5753.                                         return { type: 2, idx: i, data: ab };
  5754.                                                                         } else if (dat[i] === 79 && dat[i + 1] === 103 && dat[i + 2] === 103) {
  5755.                                         return { type: 3, idx: i, data: ab };
  5756.                                                                         } else if (dat[i] === 73 && dat[i + 1] === 68 && dat[i + 2] === 51) {
  5757.                                         return { type: 4, idx: i, data: ab };
  5758.                                 }
  5759.                         }
  5760.                 }
  5761.                 return {};
  5762.         }
  5763.  
  5764.         function WorkerPool(mReqs, wrkFn, errFn) {
  5765.                 if (!nav.hasWorker) {
  5766.                         this.run = function (data, transferObjs, fn) {
  5767.                                 return fn(wrkFn(data));
  5768.                         };
  5769.                         return;
  5770.                 }
  5771.                 var url = window.URL.createObjectURL(new Blob(["self.onmessage = function(e) {\n\t\tvar info = (" + String(wrkFn) + ")(e.data);\n\t\tif(info.data) {\n\t\t\tself.postMessage(info, [info.data]);\n\t\t} else {\n\t\t\tself.postMessage(info);\n\t\t}\n\t}"], { type: "text/javascript" }));
  5772.                 this._pool = new TasksPool(mReqs, this._createWorker.bind(this), null);
  5773.                 this._freeWorkers = [];
  5774.                 this._url = url;
  5775.                 this._errFn = errFn;
  5776.                 while (mReqs--) {
  5777.                         this._freeWorkers.push(new Worker(url));
  5778.                 }
  5779.         }
  5780.         WorkerPool.prototype = {
  5781.                 run: function run(data, transferObjs, fn) {
  5782.                         this._pool.run([data, transferObjs, fn]);
  5783.                 },
  5784.                 _createWorker: function _createWorker(num, data) {
  5785.                         var _this = this;
  5786.  
  5787.                         return new Promise(function (resolve, reject) {
  5788.                                 var w = _this._freeWorkers.pop();
  5789.                                 var _data = _slicedToArray(data, 3);
  5790.  
  5791.                                 var sendData = _data[0];
  5792.                                 var transferObjs = _data[1];
  5793.                                 var fn = _data[2];
  5794.  
  5795.                                 w.onmessage = function (e) {
  5796.                                         fn(e.data);
  5797.                                         _this._freeWorkers.push(w);
  5798.                                         resolve();
  5799.                                 };
  5800.                                 w.onerror = function (err) {
  5801.                                         resolve();
  5802.                                         _this._freeWorkers.push(w);
  5803.                                         _this._errFn(err);
  5804.                                 };
  5805.                                 w.postMessage(sendData, transferObjs);
  5806.                         });
  5807.                 },
  5808.                 clear: function clear() {
  5809.                         window.URL.revokeObjectURL(this._url);
  5810.                         this._freeWorkers = [];
  5811.                 }
  5812.         };
  5813.  
  5814.         function addImgFileIcon(aEl, fName, info) {
  5815.                 var app,
  5816.                     ext,
  5817.                     type = info.type;
  5818.                 if (typeof type === "undefined") {
  5819.                         return;
  5820.                 }
  5821.                 if (type === 2) {
  5822.                         app = "application/x-rar-compressed";
  5823.                         ext = "rar";
  5824.                 } else if (type === 1) {
  5825.                         app = "application/zip";
  5826.                         ext = "zip";
  5827.                 } else if (type === 0) {
  5828.                         app = "application/x-7z-compressed";
  5829.                         ext = "7z";
  5830.                 } else if (type === 3) {
  5831.                         app = "audio/ogg";
  5832.                         ext = "ogg";
  5833.                 } else {
  5834.                         app = "audio/mpeg";
  5835.                         ext = "mp3";
  5836.                 }
  5837.                 aEl.insertAdjacentHTML("afterend", "<a href=\"" + window.URL.createObjectURL(new Blob([new Uint8Array(info.data, info.idx)], { type: app })) + "\" class=\"de-img-" + (type > 2 ? "audio" : "arch") + "\" title=\"" + Lng.downloadFile[lang] + "\" download=\"" + fName.substring(0, fName.lastIndexOf(".")) + "." + ext + "\">." + ext + "</a>");
  5838.         }
  5839.  
  5840.         function preloadImages(post) {
  5841.                 if (!Cfg.preLoadImgs && !Cfg.openImgs && !isPreImg) {
  5842.                         return;
  5843.                 }
  5844.                 var pool;
  5845.                 if (isPreImg || Cfg.preLoadImgs) {
  5846.                         var cImg = 1,
  5847.                             mReqs = post ? 1 : 4,
  5848.                             rjf = (isPreImg || Cfg.findImgFile) && new WorkerPool(mReqs, detectImgFile, function (e) {
  5849.                                 console.error("FILE DETECTOR ERROR, line: " + e.lineno + " - " + e.message);
  5850.                         });
  5851.                         pool = new TasksPool(mReqs, async(regeneratorRuntime.mark(function callee$2$0(num, data) {
  5852.                                 var _data, url, lnk, iType, nExp, el, imageData, fName, aEl;
  5853.  
  5854.                                 return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) {
  5855.                                         while (1) switch (context$3$0.prev = context$3$0.next) {
  5856.                                                 case 0:
  5857.                                                         _data = _slicedToArray(data, 5);
  5858.                                                         url = _data[0];
  5859.                                                         lnk = _data[1];
  5860.                                                         iType = _data[2];
  5861.                                                         nExp = _data[3];
  5862.                                                         el = _data[4];
  5863.                                                         return context$3$0.delegateYield(downloadImgData(url), "t16", 7);
  5864.  
  5865.                                                 case 7:
  5866.                                                         imageData = context$3$0.t16;
  5867.  
  5868.                                                         if (imageData) {
  5869.                                                                 fName = url.substring(url.lastIndexOf("/") + 1), aEl = $q(aib.qImgLink, aib.getImgWrap(lnk));
  5870.  
  5871.                                                                 aEl.setAttribute("download", fName);
  5872.                                                                 lnk.href = window.URL.createObjectURL(new Blob([imageData], { type: iType }));
  5873.                                                                 lnk.setAttribute("de-name", fName);
  5874.                                                                 if (iType === "video/webm") {
  5875.                                                                         el.setAttribute("de-video", "");
  5876.                                                                 }
  5877.                                                                 if (nExp) {
  5878.                                                                         el.src = lnk.href;
  5879.                                                                 }
  5880.                                                                 if (rjf) {
  5881.                                                                         rjf.run(imageData.buffer, [imageData.buffer], addImgFileIcon.bind(null, aEl, fName));
  5882.                                                                 }
  5883.                                                         }
  5884.                                                         if (Images_.progressId) {
  5885.                                                                 $alert(Lng.loadImage[lang] + cImg + "/" + len, Images_.progressId, true);
  5886.                                                         }
  5887.                                                         cImg++;
  5888.  
  5889.                                                 case 11:
  5890.                                                 case "end":
  5891.                                                         return context$3$0.stop();
  5892.                                         }
  5893.                                 }, callee$2$0, this);
  5894.                         })), function () {
  5895.                                 Images_.preloading = false;
  5896.                                 if (Images_.afterpreload) {
  5897.                                         Images_.afterpreload();
  5898.                                         Images_.afterpreload = Images_.progressId = null;
  5899.                                 }
  5900.                                 if (rjf) {
  5901.                                         rjf.clear();
  5902.                                 }
  5903.                         });
  5904.                         Images_.preloading = true;
  5905.                 }
  5906.                 var els = $Q(aib.qThumbImages, post || dForm.el);
  5907.                 for (var i = 0, len = els.length; i < len; ++i) {
  5908.                         var el = els[i],
  5909.                             lnk = $parent(el = els[i], "A");
  5910.                         if (!lnk) {
  5911.                                 continue;
  5912.                         }
  5913.                         var iType,
  5914.                             url = lnk.href,
  5915.                             nExp = !!Cfg.openImgs;
  5916.                         if (/\.gif$/i.test(url)) {
  5917.                                 iType = "image/gif";
  5918.                         } else {
  5919.                                 if (/\.jpe?g$/i.test(url)) {
  5920.                                         iType = "image/jpeg";
  5921.                                 } else if (/\.png$/i.test(url)) {
  5922.                                         iType = "image/png";
  5923.                                 } else if (/\.webm$/i.test(url)) {
  5924.                                         iType = "video/webm";
  5925.                                         nExp = false;
  5926.                                 } else {
  5927.                                         continue;
  5928.                                 }
  5929.                                 nExp &= !Cfg.openGIFs;
  5930.                         }
  5931.                         if (pool) {
  5932.                                 pool.run([url, lnk, iType, nExp, el]);
  5933.                         } else if (nExp) {
  5934.                                 el.src = url;
  5935.                         }
  5936.                 }
  5937.                 if (pool) {
  5938.                         pool.complete();
  5939.                 }
  5940.         }
  5941.  
  5942.         function getDataFromImg(img) {
  5943.                 var cnv = Images_.canvas || (Images_.canvas = doc.createElement("canvas"));
  5944.                 cnv.width = img.width;
  5945.                 cnv.height = img.height;
  5946.                 cnv.getContext("2d").drawImage(img, 0, 0);
  5947.                 return new Uint8Array(atob(cnv.toDataURL("image/png").split(",")[1]).split("").map(function (a) {
  5948.                         return a.charCodeAt();
  5949.                 }));
  5950.         }
  5951.  
  5952.         function loadDocFiles(imgOnly) {
  5953.                 var els,
  5954.                     progress,
  5955.                     counter,
  5956.                     count = 0,
  5957.                     current = 1,
  5958.                     warnings = "",
  5959.                     tar = new TarBuilder(),
  5960.                     dc = imgOnly ? doc : doc.documentElement.cloneNode(true);
  5961.                 Images_.pool = new TasksPool(4, async(regeneratorRuntime.mark(function callee$2$0(num, data) {
  5962.                         var _data, url, name, el, link, safeName, imgData;
  5963.  
  5964.                         return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) {
  5965.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  5966.                                         case 0:
  5967.                                                 _data = _slicedToArray(data, 4);
  5968.                                                 url = _data[0];
  5969.                                                 name = _data[1];
  5970.                                                 el = _data[2];
  5971.                                                 link = _data[3];
  5972.                                                 safeName = name.replace(/[\\\/:*?"<>|]/g, "_");
  5973.                                                 return context$3$0.delegateYield(downloadImgData(url), "t17", 7);
  5974.  
  5975.                                         case 7:
  5976.                                                 imgData = context$3$0.t17;
  5977.  
  5978.                                                 progress.value = current;
  5979.                                                 counter.innerHTML = current;
  5980.                                                 current++;
  5981.                                                 if (link) {
  5982.                                                         if (!imgData) {
  5983.                                                                 warnings += "<br>" + Lng.cantLoad[lang] + "<a href=\"" + url + "\">" + url + "</a><br>" + Lng.willSavePview[lang];
  5984.                                                                 $alert(Lng.loadErrors[lang] + warnings, "floadwarn", false);
  5985.                                                                 safeName = "thumb-" + safeName.replace(/\.[a-z]+$/, ".png");
  5986.                                                                 imgData = getDataFromImg(el);
  5987.                                                         }
  5988.                                                         if (!imgOnly) {
  5989.                                                                 el.classList.add("de-thumb");
  5990.                                                                 el.src = link.href = $q(aib.qImgLink, aib.getImgWrap(link)).href = safeName = "images/" + safeName;
  5991.                                                         }
  5992.                                                         tar.addFile(safeName, imgData);
  5993.                                                 } else if (imgData && imgData.length > 0) {
  5994.                                                         tar.addFile(el.href = el.src = "data/" + safeName, imgData);
  5995.                                                 } else {
  5996.                                                         $del(el);
  5997.                                                 }
  5998.  
  5999.                                         case 12:
  6000.                                         case "end":
  6001.                                                 return context$3$0.stop();
  6002.                                 }
  6003.                         }, callee$2$0, this);
  6004.                 })), function () {
  6005.                         var u,
  6006.                             a,
  6007.                             name = aib.dm + "-" + brd.replace(/[\\\/:*?"<>|]/g, "") + "-" + TNum;
  6008.                         if (!imgOnly) {
  6009.                                 var dt = doc.doctype;
  6010.                                 $t("head", dc).insertAdjacentHTML("beforeend", "<script type=\"text/javascript\" src=\"data/dollscript.js\"></script>");
  6011.                                 tar.addString("data/dollscript.js", "(" + String(typeof de_main_func_outer === "undefined" ? de_main_func_inner : de_main_func_outer) + ")(null, true);");
  6012.                                 tar.addString(name + ".html", "<!DOCTYPE " + dt.name + (dt.publicId ? " PUBLIC \"" + dt.publicId + "\"" : dt.systemId ? " SYSTEM" : "") + (dt.systemId ? " \"" + dt.systemId + "\"" : "") + ">" + dc.outerHTML);
  6013.                         }
  6014.                         u = window.URL.createObjectURL(tar.get());
  6015.                         a = $new("a", { href: u, download: name + (imgOnly ? "-images.tar" : ".tar") }, null);
  6016.                         doc.body.appendChild(a);
  6017.                         a.click();
  6018.                         setTimeout(function (el, url) {
  6019.                                 window.URL.revokeObjectURL(url);
  6020.                                 $del(el);
  6021.                         }, 0, a, u);
  6022.                         $del($id("de-alert-filesload"));
  6023.                         Images_.pool = tar = warnings = count = current = imgOnly = progress = counter = null;
  6024.                 });
  6025.                 els = aProto.slice.call($Q(aib.qThumbImages, $q("[de-form]", dc)));
  6026.                 count += els.length;
  6027.                 els.forEach(function (el) {
  6028.                         var lnk = $parent(el, "A");
  6029.                         if (lnk) {
  6030.                                 var url = lnk.href;
  6031.                                 if (aib.tiny) {
  6032.                                         url = url.replace(/^.*?\?v=|&.*?$/g, "");
  6033.                                 }
  6034.                                 Images_.pool.run([url, lnk.getAttribute("de-name") || url.substring(url.lastIndexOf("/") + 1), el, lnk]);
  6035.                         }
  6036.                 });
  6037.                 if (!imgOnly) {
  6038.                         $each($Q("#de-main, .de-parea, .de-post-btns, #de-qarea, .de-refmap, #de-updater-div, .de-video-obj," + " link[rel=\"alternate stylesheet\"], script, " + aib.qPostForm, dc), $del);
  6039.                         $each($T("a", dc), function (el) {
  6040.                                 var num,
  6041.                                     tc = el.textContent;
  6042.                                 if (tc[0] === ">" && tc[1] === ">" && (num = +tc.substr(2)) && num in pByNum) {
  6043.                                         el.href = aib.anchor + num;
  6044.                                 } else {
  6045.                                         el.href = getAbsLink(el.href);
  6046.                                 }
  6047.                                 if (!el.classList.contains("de-link-pref")) {
  6048.                                         el.className = "de-link-pref " + el.className;
  6049.                                 }
  6050.                         });
  6051.                         $each($Q("." + aib.cRPost, dc), function (post, i) {
  6052.                                 post.setAttribute("de-num", i === 0 ? TNum : aib.getPNum(post));
  6053.                         });
  6054.                         var files = [];
  6055.                         $each($Q("link, *[src]", dc), (function (el) {
  6056.                                 if (els.indexOf(el) !== -1) {
  6057.                                         return;
  6058.                                 }
  6059.                                 var name,
  6060.                                     url = el.tagName === "LINK" ? el.href : el.src;
  6061.                                 if (!this.test(url)) {
  6062.                                         $del(el);
  6063.                                         return;
  6064.                                 }
  6065.                                 name = url.substring(url.lastIndexOf("/") + 1).replace(/[\\\/:*?"<>|]/g, "_").toLowerCase();
  6066.                                 if (files.indexOf(name) !== -1) {
  6067.                                         var temp = url.lastIndexOf("."),
  6068.                                             ext = url.substring(temp);
  6069.                                         url = url.substring(0, temp);
  6070.                                         name = name.substring(0, name.lastIndexOf("."));
  6071.                                         for (var i = 0;; ++i) {
  6072.                                                 temp = name + "(" + i + ")" + ext;
  6073.                                                 if (files.indexOf(temp) === -1) {
  6074.                                                         break;
  6075.                                                 }
  6076.                                         }
  6077.                                         name = temp;
  6078.                                 }
  6079.                                 files.push(name);
  6080.                                 Images_.pool.run([url, name, el, null]);
  6081.                                 count++;
  6082.                         }).bind(new RegExp("^\\/\\/?|^https?:\\/\\/([^\\/]*.)?" + regQuote(aib.dm) + "\\/", "i")));
  6083.                 }
  6084.                 $alert((imgOnly ? Lng.loadImage[lang] : Lng.loadFile[lang]) + "<br><progress id=\"de-loadprogress\" value=\"0\" max=\"" + count + "\"></progress> <span>1</span>/" + count, "filesload", true);
  6085.                 progress = $id("de-loadprogress");
  6086.                 counter = progress.nextElementSibling;
  6087.                 Images_.pool.complete();
  6088.                 els = null;
  6089.         }
  6090.  
  6091.  
  6092.  
  6093.  
  6094.         function DateTime(pattern, rPattern, diff, dtLang, onRPat) {
  6095.                 if (DateTime.checkPattern(pattern)) {
  6096.                         this.disabled = true;
  6097.                         return;
  6098.                 }
  6099.                 this.regex = pattern.replace(/(?:[sihdny]\?){2,}/g, function (str) {
  6100.                         return "(?:" + str.replace(/\?/g, "") + ")?";
  6101.                 }).replace(/\-/g, "[^<]").replace(/\+/g, "[^0-9]").replace(/([sihdny]+)/g, "($1)").replace(/[sihdny]/g, "\\d").replace(/m|w/g, "([a-zA-Zа-яА-Я]+)");
  6102.                 this.pattern = pattern.replace(/[\?\-\+]+/g, "").replace(/([a-z])\1+/g, "$1");
  6103.                 this.diff = parseInt(diff, 10);
  6104.                 this.sDiff = (this.diff < 0 ? "" : "+") + this.diff;
  6105.                 this.arrW = Lng.week[dtLang];
  6106.                 this.arrM = Lng.month[dtLang];
  6107.                 this.arrFM = Lng.fullMonth[dtLang];
  6108.                 this.rPattern = rPattern;
  6109.                 this.onRPat = onRPat;
  6110.         }
  6111.         DateTime.toggleSettings = function (el) {
  6112.                 if (el.checked && (!/^[+-]\d{1,2}$/.test(Cfg.timeOffset) || DateTime.checkPattern(Cfg.timePattern))) {
  6113.                         $alert(Lng.cTimeError[lang], "err-correcttime", false);
  6114.                         saveCfg("correctTime", 0);
  6115.                         el.checked = false;
  6116.                 }
  6117.         };
  6118.         DateTime.checkPattern = function (val) {
  6119.                 return !val.contains("i") || !val.contains("h") || !val.contains("d") || !val.contains("y") || !(val.contains("n") || val.contains("m")) || /[^\?\-\+sihdmwny]|mm|ww|\?\?|([ihdny]\?)\1+/.test(val);
  6120.         };
  6121.         DateTime.prototype = {
  6122.                 getRPattern: function getRPattern(txt) {
  6123.                         var m = txt.match(new RegExp(this.regex));
  6124.                         if (!m) {
  6125.                                 this.disabled = true;
  6126.                                 return false;
  6127.                         }
  6128.                         this.rPattern = "";
  6129.                         for (var i = 1, len = m.length, j = 0, str = m[0]; i < len;) {
  6130.                                 var a = m[i++],
  6131.                                     p = this.pattern[i - 2];
  6132.                                 if ((p === "m" || p === "y") && a.length > 3) {
  6133.                                         p = p.toUpperCase();
  6134.                                 }
  6135.                                 var k = str.indexOf(a, j);
  6136.                                 this.rPattern += str.substring(j, k) + "_" + p;
  6137.                                 j = k + a.length;
  6138.                         }
  6139.                         if (this.onRPat) {
  6140.                                 this.onRPat(this.rPattern);
  6141.                         }
  6142.                         return true;
  6143.                 },
  6144.                 pad2: function pad2(num) {
  6145.                         return num < 10 ? "0" + num : num;
  6146.                 },
  6147.                 fix: function fix(txt) {
  6148.                         var _this = this;
  6149.  
  6150.                         if (this.disabled || !this.rPattern && !this.getRPattern(txt)) {
  6151.                                 return txt;
  6152.                         }
  6153.                         return txt.replace(new RegExp(this.regex, "g"), function () {
  6154.                                 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  6155.                                         args[_key] = arguments[_key];
  6156.                                 }
  6157.  
  6158.                                 var second, minute, hour, day, month, year, dtime;
  6159.                                 for (var i = 1; i < 8; i++) {
  6160.                                         var a = args[i];
  6161.                                         switch (_this.pattern[i - 1]) {
  6162.                                                 case "s":
  6163.                                                         second = a;break;
  6164.                                                 case "i":
  6165.                                                         minute = a;break;
  6166.                                                 case "h":
  6167.                                                         hour = a;break;
  6168.                                                 case "d":
  6169.                                                         day = a;break;
  6170.                                                 case "n":
  6171.                                                         month = a - 1;break;
  6172.                                                 case "y":
  6173.                                                         year = a;break;
  6174.                                                 case "m":
  6175.                                                         month = /^янв|^jan/i.test(a) ? 0 : /^фев|^feb/i.test(a) ? 1 : /^мар|^mar/i.test(a) ? 2 : /^апр|^apr/i.test(a) ? 3 : /^май|^may/i.test(a) ? 4 : /^июн|^jun/i.test(a) ? 5 : /^июл|^jul/i.test(a) ? 6 : /^авг|^aug/i.test(a) ? 7 : /^сен|^sep/i.test(a) ? 8 : /^окт|^oct/i.test(a) ? 9 : /^ноя|^nov/i.test(a) ? 10 : /^дек|^dec/i.test(a) && 11;
  6176.                                         }
  6177.                                 }
  6178.                                 dtime = new Date(year.length === 2 ? "20" + year : year, month, day, hour, minute, second || 0);
  6179.                                 dtime.setHours(dtime.getHours() + _this.diff);
  6180.                                 return _this.rPattern.replace("_o", _this.sDiff).replace("_s", _this.pad2(dtime.getSeconds())).replace("_i", _this.pad2(dtime.getMinutes())).replace("_h", _this.pad2(dtime.getHours())).replace("_d", _this.pad2(dtime.getDate())).replace("_w", _this.arrW[dtime.getDay()]).replace("_n", _this.pad2(dtime.getMonth() + 1)).replace("_m", _this.arrM[dtime.getMonth()]).replace("_M", _this.arrFM[dtime.getMonth()]).replace("_y", ("" + dtime.getFullYear()).substring(2)).replace("_Y", dtime.getFullYear());
  6181.                         });
  6182.                 }
  6183.         };
  6184.  
  6185.  
  6186.  
  6187.  
  6188.         function Videos(post) {
  6189.                 var player = arguments[1] === undefined ? null : arguments[1];
  6190.                 var playerInfo = arguments[2] === undefined ? null : arguments[2];
  6191.  
  6192.                 this.post = post;
  6193.                 this.vData = [[], []];
  6194.                 if (player && playerInfo) {
  6195.                         Object.defineProperties(this, {
  6196.                                 player: { value: player },
  6197.                                 playerInfo: { writable: true, value: playerInfo }
  6198.                         });
  6199.                 }
  6200.         }
  6201.         Videos._global = Object.defineProperties({}, {
  6202.                 vData: {
  6203.                         get: function () {
  6204.                                 var val;
  6205.                                 try {
  6206.                                         val = Cfg.YTubeTitles ? JSON.parse(sesStorage["de-videos-data"] || "[{}, {}]") : [{}, {}];
  6207.                                 } catch (e) {
  6208.                                         val = [{}, {}];
  6209.                                 }
  6210.                                 Object.defineProperty(this, "vData", { value: val });
  6211.                                 return val;
  6212.                         },
  6213.                         configurable: true,
  6214.                         enumerable: true
  6215.                 }
  6216.         });
  6217.         Videos.ytReg = /^https?:\/\/(?:www\.|m\.)?youtu(?:be\.com\/(?:watch\?.*?v=|v\/|embed\/)|\.be\/)([a-zA-Z0-9-_]+).*?(?:t(?:ime)?=(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s?)?)?$/;
  6218.         Videos.vimReg = /^https?:\/\/(?:www\.)?vimeo\.com\/(?:[^\?]+\?clip_id=|.*?\/)?(\d+).*?(#t=\d+)?$/;
  6219.         Videos.addPlayer = function (el, m, isYtube) {
  6220.                 var enableJsapi = arguments[3] === undefined ? false : arguments[3];
  6221.  
  6222.                 var txt,
  6223.                     wh = " width=\"" + Cfg.YTubeWidth + "\" height=\"" + Cfg.YTubeHeigh + "\">";
  6224.                 if (isYtube) {
  6225.                         var list = m[0].match(/list=[^&#]+/);
  6226.                         txt = "<iframe frameborder=\"0\" allowfullscreen=\"1\" src=\"https://www.youtube.com/embed/" + m[1] + "?start=" + (m[2] ? m[2] * 3600 : 0) + (m[3] ? m[3] * 60 : 0) + (m[4] ? +m[4] : 0) + (enableJsapi ? "&enablejsapi=1" : Cfg.addYouTube === 3 ? "&autoplay=1" : "") + (list ? "&" + list[0] : "") + (Cfg.YTubeType === 1 ? "&html5=1\" type=\"text/html\"" : "\" type=\"application/x-shockwave-flash\"") + wh + "</iframe>";
  6227.                 } else {
  6228.                         var id = m[1] + (m[2] ? m[2] : "");
  6229.                         txt = Cfg.YTubeType === 1 ? "<iframe src=\"" + aib.prot + "//player.vimeo.com/video/" + id + (Cfg.addYouTube === 3 ? "?autoplay=1" : "") + "\" frameborder=\"0\" " + "webkitallowfullscreen mozallowfullscreen allowfullscreen" + wh + "</iframe>" : "<embed type=\"application/x-shockwave-flash\" src=\"" + aib.prot + "//vimeo.com/moogaloop.swf" + "?clip_id=" + id + (Cfg.addYouTube === 3 ? "&autoplay=1" : "") + "&server=vimeo.com&color=00adef&fullscreen=1\" " + "allowscriptaccess=\"always\" allowfullscreen=\"true\"" + wh + "</embed>";
  6230.                 }
  6231.                 el.innerHTML = txt + "<span class=\"de-video-resizer\" title=\"" + Lng.expandVideo[lang] + "\"></span>";
  6232.                 el.lastChild.onclick = function () {
  6233.                         var node = this.parentNode,
  6234.                             exp = node.className === "de-video-obj";
  6235.                         node.className = exp ? "de-video-obj de-video-expanded" : "de-video-obj";
  6236.                         if (node.parentNode.id === "de-content-vid") {
  6237.                                 node = node.nextSibling.nextSibling.nextSibling;
  6238.                                 node.style.maxWidth = (exp ? 888 : +Cfg.YTubeWidth + 40) + "px";
  6239.                                 node.style.maxHeight = doc.documentElement.clientHeight - (exp ? 590 : +Cfg.YTubeHeigh + 110) + "px";
  6240.                         }
  6241.                 };
  6242.         };
  6243.         Videos._getTitlesLoader = function () {
  6244.                 return Cfg.YTubeTitles && new TasksPool(4, async(regeneratorRuntime.mark(function callee$2$0(num, info) {
  6245.                         var title, author, views, publ, _info, link, isYtube, videoObj, id, xhr, entry, data;
  6246.  
  6247.                         return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) {
  6248.                                 while (1) switch (context$3$0.prev = context$3$0.next) {
  6249.                                         case 0:
  6250.                                                 _info = _slicedToArray(info, 4);
  6251.                                                 link = _info[0];
  6252.                                                 isYtube = _info[1];
  6253.                                                 videoObj = _info[2];
  6254.                                                 id = _info[3];
  6255.  
  6256.                                                 if (!isYtube) {
  6257.                                                         context$3$0.next = 12;
  6258.                                                         break;
  6259.                                                 }
  6260.  
  6261.                                                 context$3$0.next = 8;
  6262.                                                 return $ajax(aib.prot + "//gdata.youtube.com/feeds/api/videos/" + id + "?alt=json&fields=title/text(),author/name,yt:statistics/@viewCount,published", null, false);
  6263.  
  6264.                                         case 8:
  6265.                                                 xhr = context$3$0.sent;
  6266.  
  6267.                                                 if (xhr.status === 200) {
  6268.                                                         try {
  6269.                                                                 entry = JSON.parse(xhr.responseText).entry;
  6270.  
  6271.                                                                 title = entry.title.$t;
  6272.                                                                 author = entry.author[0].name.$t;
  6273.                                                                 views = entry.yt$statistics.viewCount;
  6274.                                                                 publ = entry.published.$t.substr(0, 10);
  6275.                                                         } catch (e) {}
  6276.                                                 }
  6277.                                                 context$3$0.next = 16;
  6278.                                                 break;
  6279.  
  6280.                                         case 12:
  6281.                                                 context$3$0.next = 14;
  6282.                                                 return $ajax(aib.prot + "//vimeo.com/api/v2/video/" + id + ".json", null, false);
  6283.  
  6284.                                         case 14:
  6285.                                                 xhr = context$3$0.sent;
  6286.  
  6287.                                                 if (xhr.status === 200) {
  6288.                                                         try {
  6289.                                                                 entry = JSON.parse(xhr.responseText)[0];
  6290.  
  6291.                                                                 title = entry.title;
  6292.                                                                 author = entry.user_name;
  6293.                                                                 views = entry.stats_number_of_plays;
  6294.                                                                 publ = new RegExp(/(.*)\s(.*)?/).exec(entry.upload_date)[1];
  6295.                                                         } catch (e) {}
  6296.                                                 }
  6297.  
  6298.                                         case 16:
  6299.                                                 if (title) {
  6300.                                                         link.textContent = title;
  6301.                                                         link.setAttribute("de-author", author);
  6302.                                                         link.classList.add("de-video-title");
  6303.                                                         link.title = Lng.author[lang] + author + ", " + Lng.views[lang] + views + ", " + Lng.published[lang] + publ;
  6304.                                                         data = [title, author, views, publ];
  6305.  
  6306.                                                         Videos._global.vData[isYtube ? 0 : 1][id] = data;
  6307.                                                         videoObj.vData[isYtube ? 0 : 1].push(data);
  6308.                                                         if (videoObj.titleLoadFn) {
  6309.                                                                 videoObj.titleLoadFn(data);
  6310.                                                         }
  6311.                                                 }
  6312.                                                 videoObj.loadedLinksCount++;
  6313.  
  6314.                                                 if (!(num % 30 === 0)) {
  6315.                                                         context$3$0.next = 20;
  6316.                                                         break;
  6317.                                                 }
  6318.  
  6319.                                                 return context$3$0.abrupt("return", Promise.reject(new TasksPool.PauseError(3000)));
  6320.  
  6321.                                         case 20:
  6322.                                                 context$3$0.next = 22;
  6323.                                                 return sleep(250);
  6324.  
  6325.                                         case 22:
  6326.                                         case "end":
  6327.                                                 return context$3$0.stop();
  6328.                                 }
  6329.                         }, callee$2$0, this);
  6330.                 })), function () {
  6331.                         sesStorage["de-videos-data"] = JSON.stringify(Videos._global.vData);
  6332.                 });
  6333.         };
  6334.         Videos.prototype = Object.defineProperties({
  6335.                 currentLink: null,
  6336.                 hasLinks: false,
  6337.                 playerInfo: null,
  6338.                 titleLoadFn: null,
  6339.                 linksCount: 0,
  6340.                 loadedLinksCount: 0,
  6341.                 addLink: function addLink(m, loader, link, isYtube) {
  6342.                         var time, dataObj;
  6343.                         this.hasLinks = true;
  6344.                         this.linksCount++;
  6345.                         if (this.playerInfo === null) {
  6346.                                 if (Cfg.addYouTube === 2) {
  6347.                                         this.addPlayer(m, isYtube);
  6348.                                 } else if (Cfg.addYouTube > 2) {
  6349.                                         this._addThumb(m, isYtube);
  6350.                                 }
  6351.                         } else if (!link && $q(".de-video-link[href*=\"" + m[1] + "\"]", this.post.msg)) {
  6352.                                 return;
  6353.                         }
  6354.                         if (loader && (dataObj = Videos._global.vData[isYtube ? 0 : 1][m[1]])) {
  6355.                                 this.vData[isYtube ? 0 : 1].push(dataObj);
  6356.                         }
  6357.                         if (m[4] || m[3] || m[2]) {
  6358.                                 if (m[4] >= 60) {
  6359.                                         m[3] = (m[3] || 0) + Math.floor(m[4] / 60);
  6360.                                         m[4] %= 60;
  6361.                                 }
  6362.                                 if (m[3] >= 60) {
  6363.                                         m[2] = (m[2] || 0) + Math.floor(m[3] / 60);
  6364.                                         m[3] %= 60;
  6365.                                 }
  6366.                                 time = (m[2] ? m[2] + "h" : "") + (m[3] ? m[3] + "m" : "") + (m[4] ? m[4] + "s" : "");
  6367.                         }
  6368.                         if (link) {
  6369.                                 link.href = link.href.replace(/^http:/, "https:");
  6370.                                 if (time) {
  6371.                                         link.setAttribute("de-time", time);
  6372.                                 }
  6373.                                 link.className = "de-video-link " + (isYtube ? "de-ytube" : "de-vimeo");
  6374.                                 if (dataObj) {
  6375.                                         link.textContent = dataObj[0];
  6376.                                         link.classList.add("de-video-title");
  6377.                                         link.setAttribute("de-author", dataObj[1]);
  6378.                                         link.title = Lng.author[lang] + dataObj[1] + ", " + Lng.views[lang] + dataObj[2] + ", " + Lng.published[lang] + dataObj[3];
  6379.                                 }
  6380.                         } else {
  6381.                                 var src = isYtube ? aib.prot + "//www.youtube.com/watch?v=" + m[1] + (time ? "#t=" + time : "") : aib.prot + "//vimeo.com/" + m[1];
  6382.                                 this.post.msg.insertAdjacentHTML("beforeend", "<p class=\"de-video-ext\"><a class=\"de-video-link " + (isYtube ? "de-ytube" : "de-vimeo") + (dataObj ? " de-video-title\" title=\"" + Lng.author[lang] + dataObj[1] + ", " + Lng.views[lang] + dataObj[2] + ", " + Lng.published[lang] + dataObj[3] + "\" de-author=\"" + dataObj[1] : "") + (time ? "\" de-time=\"" + time : "") + "\" href=\"" + src + "\">" + (dataObj ? dataObj[0] : src) + "</a></p>");
  6383.                                 link = this.post.msg.lastChild.firstChild;
  6384.                         }
  6385.                         if (this.playerInfo === null || this.playerInfo === m) {
  6386.                                 this.currentLink = link;
  6387.                         }
  6388.                         link.videoInfo = m;
  6389.                         if (loader && !dataObj) {
  6390.                                 loader.run([link, isYtube, this, m[1]]);
  6391.                         }
  6392.                 },
  6393.                 addPlayer: function addPlayer(m, isYtube) {
  6394.                         this.playerInfo = m;
  6395.                         Videos.addPlayer(this.player, m, isYtube);
  6396.                 },
  6397.                 clickLink: function clickLink(el, mode) {
  6398.                         var m = el.videoInfo;
  6399.                         if (this.playerInfo !== m) {
  6400.                                 this.currentLink.classList.remove("de-current");
  6401.                                 this.currentLink = el;
  6402.                                 if (mode > 2) {
  6403.                                         this._addThumb(m, el.classList.contains("de-ytube"));
  6404.                                 } else {
  6405.                                         el.classList.add("de-current");
  6406.                                         this.addPlayer(m, el.classList.contains("de-ytube"));
  6407.                                 }
  6408.                                 return;
  6409.                         }
  6410.                         if (mode === 3) {
  6411.                                 if ($c("de-video-thumb", this.player)) {
  6412.                                         el.classList.add("de-current");
  6413.                                         this.addPlayer(m, el.classList.contains("de-ytube"));
  6414.                                 } else {
  6415.                                         el.classList.remove("de-current");
  6416.                                         this._addThumb(m, el.classList.contains("de-ytube"));
  6417.                                 }
  6418.                         } else {
  6419.                                 el.classList.remove("de-current");
  6420.                                 this.player.innerHTML = "";
  6421.                                 this.playerInfo = null;
  6422.                         }
  6423.                 },
  6424.                 updatePost: function updatePost(oldLinks, newLinks, cloned) {
  6425.                         var loader = !cloned && Videos._getTitlesLoader();
  6426.                         for (var i = 0, j = 0, len = newLinks.length; i < len; ++i) {
  6427.                                 var el = newLinks[i],
  6428.                                     link = oldLinks[j];
  6429.                                 if (link && link.classList.contains("de-current")) {
  6430.                                         this.currentLink = el;
  6431.                                 }
  6432.                                 if (cloned) {
  6433.                                         el.videoInfo = link.videoInfo;
  6434.                                         j++;
  6435.                                 } else {
  6436.                                         var m = el.href.match(Videos.ytReg);
  6437.                                         if (m) {
  6438.                                                 this.addLink(m, loader, el, true);
  6439.                                                 j++;
  6440.                                         }
  6441.                                 }
  6442.                         }
  6443.                         this.currentLink = this.currentLink || newLinks[0];
  6444.                         if (loader) {
  6445.                                 loader.complete();
  6446.                         }
  6447.                 },
  6448.  
  6449.                 _addThumb: function _addThumb(m, isYtube) {
  6450.                         var el = this.player,
  6451.                             wh = " width=\"" + Cfg.YTubeWidth + "\" height=\"" + Cfg.YTubeHeigh + "\"></a>";
  6452.                         this.playerInfo = m;
  6453.                         if (isYtube) {
  6454.                                 el.innerHTML = "<a href=\"" + aib.prot + "//www.youtube.com/watch?v=" + m[1] + "\" target=\"_blank\">" + "<img class=\"de-video-thumb de-ytube\" src=\"https://i.ytimg.com/vi/" + m[1] + "/0.jpg\"" + wh;
  6455.                                 return;
  6456.                         }
  6457.                         el.innerHTML = "<a href=\"" + aib.prot + "//vimeo.com/" + m[1] + "\" target=\"_blank\">" + "<img class=\"de-video-thumb de-vimeo\" src=\"\"" + wh;
  6458.                         $ajax(aib.prot + "//vimeo.com/api/v2/video/" + m[1] + ".json", null, false).then(function (xhr) {
  6459.                                 try {
  6460.                                         el.firstChild.firstChild.setAttribute("src", JSON.parse(xhr.responseText)[0].thumbnail_large);
  6461.                                 } catch (e) {}
  6462.                         });
  6463.                 }
  6464.         }, {
  6465.                 player: {
  6466.                         get: function () {
  6467.                                 var val = aib.insertYtPlayer(this.post.msg, "<div class=\"de-video-obj\"></div>");
  6468.                                 Object.defineProperty(this, "player", { value: val });
  6469.                                 return val;
  6470.                         },
  6471.                         configurable: true,
  6472.                         enumerable: true
  6473.                 }
  6474.         });
  6475.  
  6476.         function VideosParser() {
  6477.                 this._loader = Videos._getTitlesLoader();
  6478.         }
  6479.         VideosParser.prototype = {
  6480.                 end: function end() {
  6481.                         if (this._loader) {
  6482.                                 this._loader.complete();
  6483.                         }
  6484.                 },
  6485.                 parse: function parse() {
  6486.                         var post = arguments[0] === undefined ? null : arguments[0];
  6487.  
  6488.                         var loader = this._loader,
  6489.                             vids = aib.fixVideo(post),
  6490.                             links = $Q("a[href*=\"youtu\"]", post ? post.el : dForm.el);
  6491.                         for (var i = 0, len = links.length; i < len; ++i) {
  6492.                                 var link = links[i],
  6493.                                     m = link.href.match(Videos.ytReg);
  6494.                                 if (m) {
  6495.                                         var mPost = post || (aib.getPostEl(link) || {}).post;
  6496.                                         if (mPost) {
  6497.                                                 mPost.videos.addLink(m, loader, link, true);
  6498.                                         }
  6499.                                 }
  6500.                         }
  6501.                         if (Cfg.addVimeo) {
  6502.                                 links = $Q("a[href*=\"vimeo.com\"]", post ? post.el : dForm.el);
  6503.                                 for (var i = 0, len = links.length; i < len; ++i) {
  6504.                                         var link = links[i],
  6505.                                             m = link.href.match(Videos.vimReg);
  6506.                                         if (m) {
  6507.                                                 var mPost = post || (aib.getPostEl(link) || {}).post;
  6508.                                                 if (mPost) {
  6509.                                                         mPost.videos.addLink(m, loader, link, false);
  6510.                                                 }
  6511.                                         }
  6512.                                 }
  6513.                         }
  6514.                         for (var i = 0, len = vids.length; i < len; ++i) {
  6515.                                 var _vids$i = _slicedToArray(vids[i], 3);
  6516.  
  6517.                                 var pst = _vids$i[0];
  6518.                                 var m = _vids$i[1];
  6519.                                 var isYtube = _vids$i[2];
  6520.  
  6521.                                 if (pst) {
  6522.                                         pst.videos.addLink(m, loader, null, isYtube);
  6523.                                 }
  6524.                         }
  6525.                         return this;
  6526.                 }
  6527.         };
  6528.  
  6529.         function embedMediaLinks(post) {
  6530.                 if (Cfg.addMP3) {
  6531.                         var els = $Q("a[href*=\".mp3\"]", post ? post.el : dForm.el);
  6532.                         for (var i = 0, len = els.length; i < len; ++i) {
  6533.                                 var link = els[i];
  6534.                                 if (link.target !== "_blank" && link.rel !== "nofollow") {
  6535.                                         continue;
  6536.                                 }
  6537.                                 var src = link.href,
  6538.                                     el = (post || aib.getPostEl(link).post).mp3Obj;
  6539.                                 if (nav.canPlayMP3) {
  6540.                                         if (!$q("audio[src=\"" + src + "\"]", el)) {
  6541.                                                 el.insertAdjacentHTML("beforeend", "<p><audio src=\"" + src + "\" preload=\"none\" controls></audio></p>");
  6542.                                                 link = el.lastChild.firstChild;
  6543.                                                 link.addEventListener("play", updater.addPlayingTag, false);
  6544.                                                 link.addEventListener("pause", updater.removePlayingTag, false);
  6545.                                         }
  6546.                                 } else if (!$q("object[FlashVars*=\"" + src + "\"]", el)) {
  6547.                                         el.insertAdjacentHTML("beforeend", "<object data=\"http://junglebook2007.narod.ru/audio/player.swf\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"220\" height=\"16\" FlashVars=\"playerID=1&amp;bg=0x808080&amp;leftbg=0xB3B3B3&amp;lefticon=0x000000&amp;rightbg=0x808080&amp;rightbghover=0x999999&amp;rightcon=0x000000&amp;righticonhover=0xffffff&amp;text=0xffffff&amp;slider=0x222222&amp;track=0xf5f5dc&amp;border=0x666666&amp;loader=0x7fc7ff&amp;loop=yes&amp;autostart=no&amp;soundFile=" + src + "\"><br>");
  6548.                                 }
  6549.                         }
  6550.                 }
  6551.                 if (Cfg.addVocaroo) {
  6552.                         var els = $Q("a[href*=\"vocaroo.com\"]", post ? post.el : dForm.el);
  6553.                         for (var i = 0, len = els.length; i < len; ++i) {
  6554.                                 var link = els[i],
  6555.                                     src = link.href.split("/").pop(),
  6556.                                     el = link.previousSibling;
  6557.                                 if (!el || el.className !== "de-vocaroo") {
  6558.                                         link.insertAdjacentHTML("beforebegin", "<div class=\"de-vocaroo\"><embed" + " width=\"148\" height=\"44\" wmode=\"transparent\" type=\"application/x-shockwave-flash\"" + " src=\"http://vocaroo.com/player.swf?playMediaID=" + src + "\"></div>");
  6559.                                 }
  6560.                         }
  6561.                 }
  6562.         }
  6563.  
  6564.  
  6565.  
  6566.  
  6567.         function AjaxError(code, message) {
  6568.                 this.name = "AjaxError";
  6569.                 this.code = code;
  6570.                 this.message = message;
  6571.         }
  6572.         AjaxError.Success = new AjaxError(200, "");
  6573.  
  6574.         function ajaxLoad(url) {
  6575.                 var returnForm = arguments[1] === undefined ? true : arguments[1];
  6576.  
  6577.                 return $ajax(url).then(function (xhr) {
  6578.                         if (xhr.status !== 200) {
  6579.                                 return Promise.reject(new AjaxError(xhr.status, xhr.statusText));
  6580.                         }
  6581.                         var el,
  6582.                             text = xhr.responseText;
  6583.                         if ((aib.futa ? /<!--gz-->$/ : /<\/html?>[\s\n\r]*$/).test(text)) {
  6584.                                 el = returnForm ? $q(aib.qDForm, $DOM(text)) : $DOM(text);
  6585.                         }
  6586.                         return el ? el : Promise.reject(new AjaxError(0, Lng.errCorruptData[lang]));
  6587.                 });
  6588.         }
  6589.  
  6590.         function getJsonPosts(url) {
  6591.                 return $ajax(url).then(function (xhr) {
  6592.                         switch (xhr.status) {
  6593.                                 case 200:
  6594.                                         return JSON.parse(xhr.responseText);
  6595.                                 case 304:
  6596.                                         return null;
  6597.                                 default:
  6598.                                         return Promise.reject(AjaxError(xht.status, xhr.message));
  6599.                         }
  6600.                 });
  6601.         }
  6602.  
  6603.         function loadFavorThread(node) {
  6604.                 var post,
  6605.                     el = node.parentNode,
  6606.                     ifrm = $t("iframe", el),
  6607.                     cont = $c("de-content", doc);
  6608.                 if (ifrm) {
  6609.                         $del(ifrm);
  6610.                         cont.style.overflowY = "auto";
  6611.                         return;
  6612.                 }
  6613.                 if ((post = pByNum[el.getAttribute("de-num")]) && !post.hidden) {
  6614.                         scrollTo(0, window.pageYOffset + post.el.getBoundingClientRect().top);
  6615.                         return;
  6616.                 }
  6617.                 $del($id("de-iframe-fav"));
  6618.                 $c("de-content", doc).style.overflowY = "scroll";
  6619.                 $alert(Lng.loading[lang], "load-favthr", true);
  6620.                 el.insertAdjacentHTML("beforeend", "<iframe name=\"de-iframe-fav\" id=\"de-iframe-fav\" src=\"" + $t("a", el).href + "\" scrolling=\"no\" style=\"display: block; border: none; width: " + (doc.documentElement.clientWidth - 55) + "px; height: 1px;\"></iframe>");
  6621.         }
  6622.  
  6623.         var loadPages = async(regeneratorRuntime.mark(function callee$1$1(count) {
  6624.                 var hasError, i, len, content;
  6625.                 return regeneratorRuntime.wrap(function callee$1$1$(context$2$0) {
  6626.                         while (1) switch (context$2$0.prev = context$2$0.next) {
  6627.                                 case 0:
  6628.                                         hasError = false;
  6629.  
  6630.                                         $alert(Lng.loading[lang], "load-pages", true);
  6631.                                         Pview.clearCache();
  6632.                                         isExpImg = false;
  6633.                                         pByNum = Object.create(null);
  6634.                                         Post.hiddenNums = [];<