User:Jack who built the house/convenientDiscussions.js

From mediawiki.org

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
!function(modules) {
    var installedModules = {};
    function __webpack_require__(moduleId) {
        if (installedModules[moduleId]) return installedModules[moduleId].exports;
        var module = installedModules[moduleId] = {
            i: moduleId,
            l: !1,
            exports: {}
        };
        return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), 
        module.l = !0, module.exports;
    }
    __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {
        __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {
            enumerable: !0,
            get: getter
        });
    }, __webpack_require__.r = function(exports) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, {
            value: "Module"
        }), Object.defineProperty(exports, "__esModule", {
            value: !0
        });
    }, __webpack_require__.t = function(value, mode) {
        if (1 & mode && (value = __webpack_require__(value)), 8 & mode) return value;
        if (4 & mode && "object" == typeof value && value && value.__esModule) return value;
        var ns = Object.create(null);
        if (__webpack_require__.r(ns), Object.defineProperty(ns, "default", {
            enumerable: !0,
            value: value
        }), 2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) {
            return value[key];
        }.bind(null, key));
        return ns;
    }, __webpack_require__.n = function(module) {
        var getter = module && module.__esModule ? function() {
            return module.default;
        } : function() {
            return module;
        };
        return __webpack_require__.d(getter, "a", getter), getter;
    }, __webpack_require__.o = function(object, property) {
        return Object.prototype.hasOwnProperty.call(object, property);
    }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 29);
}([ function(module, exports) {
    module.exports = function(receiver, privateMap) {
        var descriptor = privateMap.get(receiver);
        if (!descriptor) throw new TypeError("attempted to get private field on non-instance");
        return descriptor.get ? descriptor.get.call(receiver) : descriptor.value;
    };
}, function(module, exports) {
    function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
        try {
            var info = gen[key](arg), value = info.value;
        } catch (error) {
            return void reject(error);
        }
        info.done ? resolve(value) : Promise.resolve(value).then(_next, _throw);
    }
    module.exports = function(fn) {
        return function() {
            var self = this, args = arguments;
            return new Promise((function(resolve, reject) {
                var gen = fn.apply(self, args);
                function _next(value) {
                    asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
                }
                function _throw(err) {
                    asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
                }
                _next(void 0);
            }));
        };
    };
}, function(module, exports) {
    module.exports = function(receiver, privateMap, value) {
        var descriptor = privateMap.get(receiver);
        if (!descriptor) throw new TypeError("attempted to set private field on non-instance");
        if (descriptor.set) descriptor.set.call(receiver, value); else {
            if (!descriptor.writable) throw new TypeError("attempted to set read only private field");
            descriptor.value = value;
        }
        return value;
    };
}, function(module, exports, __webpack_require__) {
    "use strict";
    var memo, isOldIE = function() {
        return void 0 === memo && (memo = Boolean(window && document && document.all && !window.atob)), 
        memo;
    }, getTarget = function() {
        var memo = {};
        return function(target) {
            if (void 0 === memo[target]) {
                var styleTarget = document.querySelector(target);
                if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) try {
                    styleTarget = styleTarget.contentDocument.head;
                } catch (e) {
                    styleTarget = null;
                }
                memo[target] = styleTarget;
            }
            return memo[target];
        };
    }(), stylesInDom = [];
    function getIndexByIdentifier(identifier) {
        for (var result = -1, i = 0; i < stylesInDom.length; i++) if (stylesInDom[i].identifier === identifier) {
            result = i;
            break;
        }
        return result;
    }
    function modulesToDom(list, options) {
        for (var idCountMap = {}, identifiers = [], i = 0; i < list.length; i++) {
            var item = list[i], id = options.base ? item[0] + options.base : item[0], count = idCountMap[id] || 0, identifier = "".concat(id, " ").concat(count);
            idCountMap[id] = count + 1;
            var index = getIndexByIdentifier(identifier), obj = {
                css: item[1],
                media: item[2],
                sourceMap: item[3]
            };
            -1 !== index ? (stylesInDom[index].references++, stylesInDom[index].updater(obj)) : stylesInDom.push({
                identifier: identifier,
                updater: addStyle(obj, options),
                references: 1
            }), identifiers.push(identifier);
        }
        return identifiers;
    }
    function insertStyleElement(options) {
        var style = document.createElement("style"), attributes = options.attributes || {};
        if (void 0 === attributes.nonce) {
            var nonce = __webpack_require__.nc;
            nonce && (attributes.nonce = nonce);
        }
        if (Object.keys(attributes).forEach((function(key) {
            style.setAttribute(key, attributes[key]);
        })), "function" == typeof options.insert) options.insert(style); else {
            var target = getTarget(options.insert || "head");
            if (!target) throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
            target.appendChild(style);
        }
        return style;
    }
    var textStore, replaceText = (textStore = [], function(index, replacement) {
        return textStore[index] = replacement, textStore.filter(Boolean).join("\n");
    });
    function applyToSingletonTag(style, index, remove, obj) {
        var css = remove ? "" : obj.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : obj.css;
        if (style.styleSheet) style.styleSheet.cssText = replaceText(index, css); else {
            var cssNode = document.createTextNode(css), childNodes = style.childNodes;
            childNodes[index] && style.removeChild(childNodes[index]), childNodes.length ? style.insertBefore(cssNode, childNodes[index]) : style.appendChild(cssNode);
        }
    }
    function applyToTag(style, options, obj) {
        var css = obj.css, media = obj.media, sourceMap = obj.sourceMap;
        if (media ? style.setAttribute("media", media) : style.removeAttribute("media"), 
        sourceMap && btoa && (css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */")), 
        style.styleSheet) style.styleSheet.cssText = css; else {
            for (;style.firstChild; ) style.removeChild(style.firstChild);
            style.appendChild(document.createTextNode(css));
        }
    }
    var singleton = null, singletonCounter = 0;
    function addStyle(obj, options) {
        var style, update, remove;
        if (options.singleton) {
            var styleIndex = singletonCounter++;
            style = singleton || (singleton = insertStyleElement(options)), update = applyToSingletonTag.bind(null, style, styleIndex, !1), 
            remove = applyToSingletonTag.bind(null, style, styleIndex, !0);
        } else style = insertStyleElement(options), update = applyToTag.bind(null, style, options), 
        remove = function() {
            !function(style) {
                if (null === style.parentNode) return !1;
                style.parentNode.removeChild(style);
            }(style);
        };
        return update(obj), function(newObj) {
            if (newObj) {
                if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) return;
                update(obj = newObj);
            } else remove();
        };
    }
    module.exports = function(list, options) {
        (options = options || {}).singleton || "boolean" == typeof options.singleton || (options.singleton = isOldIE());
        var lastIdentifiers = modulesToDom(list = list || [], options);
        return function(newList) {
            if (newList = newList || [], "[object Array]" === Object.prototype.toString.call(newList)) {
                for (var i = 0; i < lastIdentifiers.length; i++) {
                    var index = getIndexByIdentifier(lastIdentifiers[i]);
                    stylesInDom[index].references--;
                }
                for (var newLastIdentifiers = modulesToDom(newList, options), _i = 0; _i < lastIdentifiers.length; _i++) {
                    var _index = getIndexByIdentifier(lastIdentifiers[_i]);
                    0 === stylesInDom[_index].references && (stylesInDom[_index].updater(), stylesInDom.splice(_index, 1));
                }
                lastIdentifiers = newLastIdentifiers;
            }
        };
    };
}, function(module, exports, __webpack_require__) {
    "use strict";
    module.exports = function(useSourceMap) {
        var list = [];
        return list.toString = function() {
            return this.map((function(item) {
                var content = function(item, useSourceMap) {
                    var content = item[1] || "", cssMapping = item[3];
                    if (!cssMapping) return content;
                    if (useSourceMap && "function" == typeof btoa) {
                        var sourceMapping = (sourceMap = cssMapping, base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), 
                        data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64), 
                        "/*# ".concat(data, " */")), sourceURLs = cssMapping.sources.map((function(source) {
                            return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");
                        }));
                        return [ content ].concat(sourceURLs).concat([ sourceMapping ]).join("\n");
                    }
                    var sourceMap, base64, data;
                    return [ content ].join("\n");
                }(item, useSourceMap);
                return item[2] ? "@media ".concat(item[2], " {").concat(content, "}") : content;
            })).join("");
        }, list.i = function(modules, mediaQuery, dedupe) {
            "string" == typeof modules && (modules = [ [ null, modules, "" ] ]);
            var alreadyImportedModules = {};
            if (dedupe) for (var i = 0; i < this.length; i++) {
                var id = this[i][0];
                null != id && (alreadyImportedModules[id] = !0);
            }
            for (var _i = 0; _i < modules.length; _i++) {
                var item = [].concat(modules[_i]);
                dedupe && alreadyImportedModules[item[0]] || (mediaQuery && (item[2] ? item[2] = "".concat(mediaQuery, " and ").concat(item[2]) : item[2] = mediaQuery), 
                list.push(item));
            }
        }, list;
    };
}, function(module, exports, __webpack_require__) {
    var __WEBPACK_AMD_DEFINE_RESULT__, LZString = function() {
        var f = String.fromCharCode, keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$", baseReverseDic = {};
        function getBaseValue(alphabet, character) {
            if (!baseReverseDic[alphabet]) {
                baseReverseDic[alphabet] = {};
                for (var i = 0; i < alphabet.length; i++) baseReverseDic[alphabet][alphabet.charAt(i)] = i;
            }
            return baseReverseDic[alphabet][character];
        }
        var LZString = {
            compressToBase64: function(input) {
                if (null == input) return "";
                var res = LZString._compress(input, 6, (function(a) {
                    return keyStrBase64.charAt(a);
                }));
                switch (res.length % 4) {
                  default:
                  case 0:
                    return res;

                  case 1:
                    return res + "===";

                  case 2:
                    return res + "==";

                  case 3:
                    return res + "=";
                }
            },
            decompressFromBase64: function(input) {
                return null == input ? "" : "" == input ? null : LZString._decompress(input.length, 32, (function(index) {
                    return getBaseValue(keyStrBase64, input.charAt(index));
                }));
            },
            compressToUTF16: function(input) {
                return null == input ? "" : LZString._compress(input, 15, (function(a) {
                    return f(a + 32);
                })) + " ";
            },
            decompressFromUTF16: function(compressed) {
                return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 16384, (function(index) {
                    return compressed.charCodeAt(index) - 32;
                }));
            },
            compressToUint8Array: function(uncompressed) {
                for (var compressed = LZString.compress(uncompressed), buf = new Uint8Array(2 * compressed.length), i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
                    var current_value = compressed.charCodeAt(i);
                    buf[2 * i] = current_value >>> 8, buf[2 * i + 1] = current_value % 256;
                }
                return buf;
            },
            decompressFromUint8Array: function(compressed) {
                if (null == compressed) return LZString.decompress(compressed);
                for (var buf = new Array(compressed.length / 2), i = 0, TotalLen = buf.length; i < TotalLen; i++) buf[i] = 256 * compressed[2 * i] + compressed[2 * i + 1];
                var result = [];
                return buf.forEach((function(c) {
                    result.push(f(c));
                })), LZString.decompress(result.join(""));
            },
            compressToEncodedURIComponent: function(input) {
                return null == input ? "" : LZString._compress(input, 6, (function(a) {
                    return keyStrUriSafe.charAt(a);
                }));
            },
            decompressFromEncodedURIComponent: function(input) {
                return null == input ? "" : "" == input ? null : (input = input.replace(/ /g, "+"), 
                LZString._decompress(input.length, 32, (function(index) {
                    return getBaseValue(keyStrUriSafe, input.charAt(index));
                })));
            },
            compress: function(uncompressed) {
                return LZString._compress(uncompressed, 16, (function(a) {
                    return f(a);
                }));
            },
            _compress: function(uncompressed, bitsPerChar, getCharFromInt) {
                if (null == uncompressed) return "";
                var i, value, ii, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0;
                for (ii = 0; ii < uncompressed.length; ii += 1) if (context_c = uncompressed.charAt(ii), 
                Object.prototype.hasOwnProperty.call(context_dictionary, context_c) || (context_dictionary[context_c] = context_dictSize++, 
                context_dictionaryToCreate[context_c] = !0), context_wc = context_w + context_c, 
                Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) context_w = context_wc; else {
                    if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
                        if (context_w.charCodeAt(0) < 256) {
                            for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0, 
                            context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
                            for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value >>= 1;
                        } else {
                            for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value = 0;
                            for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value >>= 1;
                        }
                        0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++), 
                        delete context_dictionaryToCreate[context_w];
                    } else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value, 
                    context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                    context_data_val = 0) : context_data_position++, value >>= 1;
                    0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++), 
                    context_dictionary[context_wc] = context_dictSize++, context_w = String(context_c);
                }
                if ("" !== context_w) {
                    if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
                        if (context_w.charCodeAt(0) < 256) {
                            for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0, 
                            context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
                            for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value >>= 1;
                        } else {
                            for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value = 0;
                            for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value, 
                            context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                            context_data_val = 0) : context_data_position++, value >>= 1;
                        }
                        0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++), 
                        delete context_dictionaryToCreate[context_w];
                    } else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value, 
                    context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                    context_data_val = 0) : context_data_position++, value >>= 1;
                    0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++);
                }
                for (value = 2, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value, 
                context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)), 
                context_data_val = 0) : context_data_position++, value >>= 1;
                for (;;) {
                    if (context_data_val <<= 1, context_data_position == bitsPerChar - 1) {
                        context_data.push(getCharFromInt(context_data_val));
                        break;
                    }
                    context_data_position++;
                }
                return context_data.join("");
            },
            decompress: function(compressed) {
                return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 32768, (function(index) {
                    return compressed.charCodeAt(index);
                }));
            },
            _decompress: function(length, resetValue, getNextValue) {
                var i, w, bits, resb, maxpower, power, c, dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], data = {
                    val: getNextValue(0),
                    position: resetValue,
                    index: 1
                };
                for (i = 0; i < 3; i += 1) dictionary[i] = i;
                for (bits = 0, maxpower = Math.pow(2, 2), power = 1; power != maxpower; ) resb = data.val & data.position, 
                data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                switch (bits) {
                  case 0:
                    for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position, 
                    data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                    bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                    c = f(bits);
                    break;

                  case 1:
                    for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position, 
                    data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                    bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                    c = f(bits);
                    break;

                  case 2:
                    return "";
                }
                for (dictionary[3] = c, w = c, result.push(c); ;) {
                    if (data.index > length) return "";
                    for (bits = 0, maxpower = Math.pow(2, numBits), power = 1; power != maxpower; ) resb = data.val & data.position, 
                    data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                    bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                    switch (c = bits) {
                      case 0:
                        for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position, 
                        data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                        bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                        dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
                        break;

                      case 1:
                        for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position, 
                        data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)), 
                        bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
                        dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
                        break;

                      case 2:
                        return result.join("");
                    }
                    if (0 == enlargeIn && (enlargeIn = Math.pow(2, numBits), numBits++), dictionary[c]) entry = dictionary[c]; else {
                        if (c !== dictSize) return null;
                        entry = w + w.charAt(0);
                    }
                    result.push(entry), dictionary[dictSize++] = w + entry.charAt(0), w = entry, 0 == --enlargeIn && (enlargeIn = Math.pow(2, numBits), 
                    numBits++);
                }
            }
        };
        return LZString;
    }();
    void 0 === (__WEBPACK_AMD_DEFINE_RESULT__ = function() {
        return LZString;
    }.call(exports, __webpack_require__, exports, module)) || (module.exports = __WEBPACK_AMD_DEFINE_RESULT__);
}, function(module, exports, __webpack_require__) {
    "use strict";
    var KEBAB_REGEX = /[A-Z]/g;
    exports.create = function(config) {
        var assign = (config = config || {}).assign || Object.assign;
        var renderer = assign({
            raw: "",
            pfx: "_",
            client: "object" == typeof window,
            assign: assign,
            stringify: JSON.stringify,
            kebab: function(prop) {
                return prop.replace(KEBAB_REGEX, "-$&").toLowerCase();
            },
            decl: function(key, value) {
                return (key = renderer.kebab(key)) + ":" + value + ";";
            },
            hash: function(obj) {
                return function(str) {
                    for (var hash = 5381, i = str.length; i; ) hash = 33 * hash ^ str.charCodeAt(--i);
                    return "_" + (hash >>> 0).toString(36);
                }(renderer.stringify(obj));
            },
            selector: function(parent, selector) {
                return parent + (":" === selector[0] ? "" : " ") + selector;
            },
            putRaw: function(rawCssRule) {
                renderer.raw += rawCssRule;
            }
        }, config);
        return renderer.client && (renderer.sh || document.head.appendChild(renderer.sh = document.createElement("style")), 
        renderer.putRaw = function(rawCssRule) {
            var sheet = renderer.sh.sheet;
            try {
                sheet.insertRule(rawCssRule, sheet.cssRules.length);
            } catch (error) {}
        }), renderer.put = function(selector, decls, atrule) {
            var prop, value, str = "", postponed = [];
            for (prop in decls) (value = decls[prop]) instanceof Object && !(value instanceof Array) ? postponed.push(prop) : str += renderer.decl(prop, value, selector, atrule);
            str && (str = selector + "{" + str + "}", renderer.putRaw(atrule ? atrule + "{" + str + "}" : str));
            for (var i = 0; i < postponed.length; i++) "@" === (prop = postponed[i])[0] && "@font-face" !== prop ? renderer.putAt(selector, decls[prop], prop) : renderer.put(renderer.selector(selector, prop), decls[prop], atrule);
        }, renderer.putAt = renderer.put, renderer;
    };
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(12);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    "use strict";
    module.exports = function(string, quoteStyle) {
        var getHtmlTranslationTable = __webpack_require__(10), tmpStr = "", entity = "", symbol = "";
        tmpStr = string.toString();
        var hashMap = getHtmlTranslationTable("HTML_ENTITIES", quoteStyle);
        if (!1 === hashMap) return !1;
        for (symbol in delete hashMap["&"], hashMap["&"] = "&amp;", hashMap) entity = hashMap[symbol], 
        tmpStr = tmpStr.split(entity).join(symbol);
        return tmpStr = tmpStr.split("&#039;").join("'");
    };
}, function(module, exports, __webpack_require__) {
    module.exports = function() {
        return __webpack_require__(11)('!function(modules) {\n    var installedModules = {};\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return installedModules[moduleId].exports;\n        var module = installedModules[moduleId] = {\n            i: moduleId,\n            l: !1,\n            exports: {}\n        };\n        return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), \n        module.l = !0, module.exports;\n    }\n    __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {\n        __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {\n            enumerable: !0,\n            get: getter\n        });\n    }, __webpack_require__.r = function(exports) {\n        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, {\n            value: "Module"\n        }), Object.defineProperty(exports, "__esModule", {\n            value: !0\n        });\n    }, __webpack_require__.t = function(value, mode) {\n        if (1 & mode && (value = __webpack_require__(value)), 8 & mode) return value;\n        if (4 & mode && "object" == typeof value && value && value.__esModule) return value;\n        var ns = Object.create(null);\n        if (__webpack_require__.r(ns), Object.defineProperty(ns, "default", {\n            enumerable: !0,\n            value: value\n        }), 2 & mode && "string" != typeof value) for (var key in value) __webpack_require__.d(ns, key, function(key) {\n            return value[key];\n        }.bind(null, key));\n        return ns;\n    }, __webpack_require__.n = function(module) {\n        var getter = module && module.__esModule ? function() {\n            return module.default;\n        } : function() {\n            return module;\n        };\n        return __webpack_require__.d(getter, "a", getter), getter;\n    }, __webpack_require__.o = function(object, property) {\n        return Object.prototype.hasOwnProperty.call(object, property);\n    }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 29);\n}([ function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    const context = "undefined" == typeof window ? self : window;\n    context.convenientDiscussions = context.convenientDiscussions || {}, "object" != typeof context.convenientDiscussions && (context.convenientDiscussions = {}), \n    __webpack_exports__.a = context.convenientDiscussions;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "e", (function() {\n        return isInline;\n    })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return defined;\n    })), __webpack_require__.d(__webpack_exports__, "c", (function() {\n        return flat;\n    })), __webpack_require__.d(__webpack_exports__, "g", (function() {\n        return underlinesToSpaces;\n    })), __webpack_require__.d(__webpack_exports__, "f", (function() {\n        return spacesToUnderlines;\n    })), __webpack_require__.d(__webpack_exports__, "b", (function() {\n        return firstCharToUpperCase;\n    })), __webpack_require__.d(__webpack_exports__, "d", (function() {\n        return getMessages;\n    }));\n    __webpack_require__(3);\n    var _cd__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n    function isInline(node, countTextNodesAsInline) {\n        return !(!countTextNodesAsInline || node.nodeType !== Node.TEXT_NODE) || (node.nodeType !== Node.ELEMENT_NODE ? null : !!_cd__WEBPACK_IMPORTED_MODULE_1__.a.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName) || !_cd__WEBPACK_IMPORTED_MODULE_1__.a.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName) && ("undefined" != typeof window ? (console.warn("Expensive operation: isInline() called for the element:", node), \n        "inline" === window.getComputedStyle(node).display) : null));\n    }\n    function defined(el) {\n        return void 0 !== el;\n    }\n    function flat(arr) {\n        return [].concat(...arr);\n    }\n    function underlinesToSpaces(s) {\n        return s.replace(/_/g, " ");\n    }\n    function spacesToUnderlines(s) {\n        return s.replace(/ /g, "_");\n    }\n    function firstCharToUpperCase(s) {\n        return s.length ? s[0].toUpperCase() + s.slice(1) : "";\n    }\n    function getMessages(messages) {\n        return messages.map(mw.msg);\n    }\n}, function(module, exports) {\n    module.exports = function(receiver, privateMap) {\n        var descriptor = privateMap.get(receiver);\n        if (!descriptor) throw new TypeError("attempted to get private field on non-instance");\n        return descriptor.get ? descriptor.get.call(receiver) : descriptor.value;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return CdError;\n    }));\n    class CdError extends Error {\n        constructor(data) {\n            let message;\n            data ? (message = data.type, data.code && (message += "/".concat(data.code)), data.apiData && data.apiData.error && data.apiData.error.code && (message += "/".concat(data.apiData.error.code))) : message = "", \n            super(message), this.name = "CdError", this.data = data;\n        }\n    }\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "b", (function() {\n        return parseTimestamp;\n    })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return generateCommentAnchor;\n    })), __webpack_require__.d(__webpack_exports__, "c", (function() {\n        return registerCommentAnchor;\n    })), __webpack_require__.d(__webpack_exports__, "d", (function() {\n        return resetCommentAnchors;\n    }));\n    var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0), _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n    let parseTimestampRegexp, parseTimestampRegexpNoTimezone;\n    function parseTimestamp(timestamp, timezoneOffset) {\n        parseTimestampRegexp || (parseTimestampRegexp = new RegExp("^([^]*)(".concat(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_REGEXP.source, ")"))), \n        parseTimestampRegexpNoTimezone || (parseTimestampRegexpNoTimezone = new RegExp("^([^]*)(".concat(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source, ")")));\n        const regexp = void 0 === timezoneOffset ? parseTimestampRegexp : parseTimestampRegexpNoTimezone, match = timestamp.match(regexp);\n        if (!match) return null;\n        let date = _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_PARSER(match, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMESTAMP_MATCHING_GROUPS, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.DIGITS, _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.LOCAL_TIMEZONE_OFFSET);\n        return timezoneOffset && (date = new Date(date.getTime() - timezoneOffset * _cd__WEBPACK_IMPORTED_MODULE_0__.a.g.MILLISECONDS_IN_A_MINUTE)), \n        {\n            date: date,\n            match: match\n        };\n    }\n    function zeroPad(number, length) {\n        return ("0000" + number).slice(-length);\n    }\n    function generateCommentAnchor(date, author, resolveCollisions = !1) {\n        let year = date.getUTCFullYear(), month = date.getUTCMonth(), day = date.getUTCDate(), hours = date.getUTCHours(), minutes = date.getUTCMinutes(), anchor = zeroPad(year, 4) + zeroPad(month + 1, 2) + zeroPad(day, 2) + zeroPad(hours, 2) + zeroPad(minutes, 2) + (author ? "_" + Object(_util__WEBPACK_IMPORTED_MODULE_1__.f)(author) : "");\n        if (resolveCollisions && commentAnchors.includes(anchor)) {\n            let anchorNum = 2;\n            const base = anchor;\n            do {\n                anchor = "".concat(base, "_").concat(anchorNum), anchorNum++;\n            } while (commentAnchors.includes(anchor));\n        }\n        return anchor;\n    }\n    let commentAnchors = [];\n    function registerCommentAnchor(anchor) {\n        anchor && commentAnchors.push(anchor);\n    }\n    function resetCommentAnchors() {\n        commentAnchors = [];\n    }\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    function __export(m) {\n        for (var p in m) exports.hasOwnProperty(p) || (exports[p] = m[p]);\n    }\n    var __importStar = this && this.__importStar || function(mod) {\n        if (mod && mod.__esModule) return mod;\n        var result = {};\n        if (null != mod) for (var k in mod) Object.hasOwnProperty.call(mod, k) && (result[k] = mod[k]);\n        return result.default = mod, result;\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var Parser_1 = __webpack_require__(12);\n    exports.Parser = Parser_1.Parser;\n    var domhandler_1 = __webpack_require__(16);\n    exports.DomHandler = domhandler_1.DomHandler, exports.DefaultHandler = domhandler_1.DomHandler, \n    exports.parseDOM = function(data, options) {\n        var handler = new domhandler_1.DomHandler(void 0, options);\n        return new Parser_1.Parser(handler, options).end(data), handler.dom;\n    }, exports.createDomStream = function(cb, options, elementCb) {\n        var handler = new domhandler_1.DomHandler(cb, options, elementCb);\n        return new Parser_1.Parser(handler, options);\n    };\n    var Tokenizer_1 = __webpack_require__(13);\n    exports.Tokenizer = Tokenizer_1.default;\n    var ElementType = __importStar(__webpack_require__(11));\n    exports.ElementType = ElementType, exports.EVENTS = {\n        attribute: 2,\n        cdatastart: 0,\n        cdataend: 0,\n        text: 1,\n        processinginstruction: 2,\n        comment: 1,\n        commentend: 0,\n        closetag: 1,\n        opentag: 2,\n        opentagname: 1,\n        error: 1,\n        end: 0\n    }, __export(__webpack_require__(17)), __export(__webpack_require__(41)), __export(__webpack_require__(42));\n    var DomUtils = __importStar(__webpack_require__(18));\n    exports.DomUtils = DomUtils;\n    var FeedHandler_1 = __webpack_require__(17);\n    exports.RssHandler = FeedHandler_1.FeedHandler;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "c", (function() {\n        return TreeWalker;\n    })), __webpack_require__.d(__webpack_exports__, "b", (function() {\n        return ElementsTreeWalker;\n    })), __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return ElementsAndTextTreeWalker;\n    }));\n    var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n    class TreeWalker {\n        constructor(root, acceptNode, onlyElementNodes = !1, startNode = root) {\n            this.acceptNode = acceptNode, this.root = root, this.currentNode = startNode, onlyElementNodes ? (this.firstChildProperty = "firstElementChild", \n            this.lastChildProperty = "lastElementChild", this.previousSiblingProperty = "previousElementSibling", \n            this.nextSiblingProperty = "nextElementSibling") : (this.firstChildProperty = "firstChild", \n            this.lastChildProperty = "lastChild", this.previousSiblingProperty = "previousSibling", \n            this.nextSiblingProperty = "nextSibling");\n        }\n        tryMove(property) {\n            let node = this.currentNode;\n            if (node === this.root && !property.includes("Child")) return null;\n            do {\n                node = node[property];\n            } while (node && this.acceptNode && !this.acceptNode(node));\n            return node && (this.currentNode = node), node || null;\n        }\n        parentNode() {\n            return this.tryMove("parentNode");\n        }\n        firstChild() {\n            return this.tryMove(this.firstChildProperty);\n        }\n        lastChild() {\n            return this.tryMove(this.lastChildProperty);\n        }\n        previousSibling() {\n            return this.tryMove(this.previousSiblingProperty);\n        }\n        nextSibling() {\n            return this.tryMove(this.nextSiblingProperty);\n        }\n        nextNode() {\n            let node = this.currentNode;\n            do {\n                if (node[this.firstChildProperty]) node = node[this.firstChildProperty]; else {\n                    for (;node && !node[this.nextSiblingProperty] && node.parentNode !== this.root; ) node = node.parentNode;\n                    node && (node = node[this.nextSiblingProperty]);\n                }\n            } while (node && this.acceptNode && !this.acceptNode(node));\n            return node && (this.currentNode = node), node;\n        }\n        previousNode() {\n            let node = this.currentNode;\n            if (node !== this.root) {\n                do {\n                    if (node[this.previousSiblingProperty]) for (node = node[this.previousSiblingProperty]; node[this.lastChildProperty]; ) node = node[this.lastChildProperty]; else node = node.parentNode;\n                } while (node && this.acceptNode && !this.acceptNode(node));\n                return node && (this.currentNode = node), node;\n            }\n        }\n    }\n    class ElementsTreeWalker extends TreeWalker {\n        constructor(startNode) {\n            super(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName), !0), \n            startNode && (this.currentNode = startNode);\n        }\n    }\n    class ElementsAndTextTreeWalker extends TreeWalker {\n        constructor(startNode) {\n            super(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement, node => node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE && ![ "STYLE", "LINK" ].includes(node.tagName)), \n            startNode && (this.currentNode = startNode);\n        }\n    }\n}, function(module, exports) {\n    module.exports = function(receiver, privateMap, value) {\n        var descriptor = privateMap.get(receiver);\n        if (!descriptor) throw new TypeError("attempted to set private field on non-instance");\n        if (descriptor.set) descriptor.set.call(receiver, value); else {\n            if (!descriptor.writable) throw new TypeError("attempted to set read only private field");\n            descriptor.value = value;\n        }\n        return value;\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var domelementtype_1 = __webpack_require__(11);\n    exports.isTag = function(node) {\n        return domelementtype_1.isTag(node);\n    }, exports.isCDATA = function(node) {\n        return "cdata" === node.type;\n    }, exports.isText = function(node) {\n        return "text" === node.type;\n    }, exports.isComment = function(node) {\n        return "comment" === node.type;\n    }, exports.hasChildren = function(node) {\n        return Object.prototype.hasOwnProperty.call(node, "children");\n    };\n}, function(module) {\n    module.exports = JSON.parse(\'{"Aacute":"\\xc1","aacute":"\\xe1","Abreve":"\\u0102","abreve":"\\u0103","ac":"\\u223e","acd":"\\u223f","acE":"\\u223e\\u0333","Acirc":"\\xc2","acirc":"\\xe2","acute":"\\xb4","Acy":"\\u0410","acy":"\\u0430","AElig":"\\xc6","aelig":"\\xe6","af":"\\u2061","Afr":"\\ud835\\udd04","afr":"\\ud835\\udd1e","Agrave":"\\xc0","agrave":"\\xe0","alefsym":"\\u2135","aleph":"\\u2135","Alpha":"\\u0391","alpha":"\\u03b1","Amacr":"\\u0100","amacr":"\\u0101","amalg":"\\u2a3f","amp":"&","AMP":"&","andand":"\\u2a55","And":"\\u2a53","and":"\\u2227","andd":"\\u2a5c","andslope":"\\u2a58","andv":"\\u2a5a","ang":"\\u2220","ange":"\\u29a4","angle":"\\u2220","angmsdaa":"\\u29a8","angmsdab":"\\u29a9","angmsdac":"\\u29aa","angmsdad":"\\u29ab","angmsdae":"\\u29ac","angmsdaf":"\\u29ad","angmsdag":"\\u29ae","angmsdah":"\\u29af","angmsd":"\\u2221","angrt":"\\u221f","angrtvb":"\\u22be","angrtvbd":"\\u299d","angsph":"\\u2222","angst":"\\xc5","angzarr":"\\u237c","Aogon":"\\u0104","aogon":"\\u0105","Aopf":"\\ud835\\udd38","aopf":"\\ud835\\udd52","apacir":"\\u2a6f","ap":"\\u2248","apE":"\\u2a70","ape":"\\u224a","apid":"\\u224b","apos":"\\\'","ApplyFunction":"\\u2061","approx":"\\u2248","approxeq":"\\u224a","Aring":"\\xc5","aring":"\\xe5","Ascr":"\\ud835\\udc9c","ascr":"\\ud835\\udcb6","Assign":"\\u2254","ast":"*","asymp":"\\u2248","asympeq":"\\u224d","Atilde":"\\xc3","atilde":"\\xe3","Auml":"\\xc4","auml":"\\xe4","awconint":"\\u2233","awint":"\\u2a11","backcong":"\\u224c","backepsilon":"\\u03f6","backprime":"\\u2035","backsim":"\\u223d","backsimeq":"\\u22cd","Backslash":"\\u2216","Barv":"\\u2ae7","barvee":"\\u22bd","barwed":"\\u2305","Barwed":"\\u2306","barwedge":"\\u2305","bbrk":"\\u23b5","bbrktbrk":"\\u23b6","bcong":"\\u224c","Bcy":"\\u0411","bcy":"\\u0431","bdquo":"\\u201e","becaus":"\\u2235","because":"\\u2235","Because":"\\u2235","bemptyv":"\\u29b0","bepsi":"\\u03f6","bernou":"\\u212c","Bernoullis":"\\u212c","Beta":"\\u0392","beta":"\\u03b2","beth":"\\u2136","between":"\\u226c","Bfr":"\\ud835\\udd05","bfr":"\\ud835\\udd1f","bigcap":"\\u22c2","bigcirc":"\\u25ef","bigcup":"\\u22c3","bigodot":"\\u2a00","bigoplus":"\\u2a01","bigotimes":"\\u2a02","bigsqcup":"\\u2a06","bigstar":"\\u2605","bigtriangledown":"\\u25bd","bigtriangleup":"\\u25b3","biguplus":"\\u2a04","bigvee":"\\u22c1","bigwedge":"\\u22c0","bkarow":"\\u290d","blacklozenge":"\\u29eb","blacksquare":"\\u25aa","blacktriangle":"\\u25b4","blacktriangledown":"\\u25be","blacktriangleleft":"\\u25c2","blacktriangleright":"\\u25b8","blank":"\\u2423","blk12":"\\u2592","blk14":"\\u2591","blk34":"\\u2593","block":"\\u2588","bne":"=\\u20e5","bnequiv":"\\u2261\\u20e5","bNot":"\\u2aed","bnot":"\\u2310","Bopf":"\\ud835\\udd39","bopf":"\\ud835\\udd53","bot":"\\u22a5","bottom":"\\u22a5","bowtie":"\\u22c8","boxbox":"\\u29c9","boxdl":"\\u2510","boxdL":"\\u2555","boxDl":"\\u2556","boxDL":"\\u2557","boxdr":"\\u250c","boxdR":"\\u2552","boxDr":"\\u2553","boxDR":"\\u2554","boxh":"\\u2500","boxH":"\\u2550","boxhd":"\\u252c","boxHd":"\\u2564","boxhD":"\\u2565","boxHD":"\\u2566","boxhu":"\\u2534","boxHu":"\\u2567","boxhU":"\\u2568","boxHU":"\\u2569","boxminus":"\\u229f","boxplus":"\\u229e","boxtimes":"\\u22a0","boxul":"\\u2518","boxuL":"\\u255b","boxUl":"\\u255c","boxUL":"\\u255d","boxur":"\\u2514","boxuR":"\\u2558","boxUr":"\\u2559","boxUR":"\\u255a","boxv":"\\u2502","boxV":"\\u2551","boxvh":"\\u253c","boxvH":"\\u256a","boxVh":"\\u256b","boxVH":"\\u256c","boxvl":"\\u2524","boxvL":"\\u2561","boxVl":"\\u2562","boxVL":"\\u2563","boxvr":"\\u251c","boxvR":"\\u255e","boxVr":"\\u255f","boxVR":"\\u2560","bprime":"\\u2035","breve":"\\u02d8","Breve":"\\u02d8","brvbar":"\\xa6","bscr":"\\ud835\\udcb7","Bscr":"\\u212c","bsemi":"\\u204f","bsim":"\\u223d","bsime":"\\u22cd","bsolb":"\\u29c5","bsol":"\\\\\\\\","bsolhsub":"\\u27c8","bull":"\\u2022","bullet":"\\u2022","bump":"\\u224e","bumpE":"\\u2aae","bumpe":"\\u224f","Bumpeq":"\\u224e","bumpeq":"\\u224f","Cacute":"\\u0106","cacute":"\\u0107","capand":"\\u2a44","capbrcup":"\\u2a49","capcap":"\\u2a4b","cap":"\\u2229","Cap":"\\u22d2","capcup":"\\u2a47","capdot":"\\u2a40","CapitalDifferentialD":"\\u2145","caps":"\\u2229\\ufe00","caret":"\\u2041","caron":"\\u02c7","Cayleys":"\\u212d","ccaps":"\\u2a4d","Ccaron":"\\u010c","ccaron":"\\u010d","Ccedil":"\\xc7","ccedil":"\\xe7","Ccirc":"\\u0108","ccirc":"\\u0109","Cconint":"\\u2230","ccups":"\\u2a4c","ccupssm":"\\u2a50","Cdot":"\\u010a","cdot":"\\u010b","cedil":"\\xb8","Cedilla":"\\xb8","cemptyv":"\\u29b2","cent":"\\xa2","centerdot":"\\xb7","CenterDot":"\\xb7","cfr":"\\ud835\\udd20","Cfr":"\\u212d","CHcy":"\\u0427","chcy":"\\u0447","check":"\\u2713","checkmark":"\\u2713","Chi":"\\u03a7","chi":"\\u03c7","circ":"\\u02c6","circeq":"\\u2257","circlearrowleft":"\\u21ba","circlearrowright":"\\u21bb","circledast":"\\u229b","circledcirc":"\\u229a","circleddash":"\\u229d","CircleDot":"\\u2299","circledR":"\\xae","circledS":"\\u24c8","CircleMinus":"\\u2296","CirclePlus":"\\u2295","CircleTimes":"\\u2297","cir":"\\u25cb","cirE":"\\u29c3","cire":"\\u2257","cirfnint":"\\u2a10","cirmid":"\\u2aef","cirscir":"\\u29c2","ClockwiseContourIntegral":"\\u2232","CloseCurlyDoubleQuote":"\\u201d","CloseCurlyQuote":"\\u2019","clubs":"\\u2663","clubsuit":"\\u2663","colon":":","Colon":"\\u2237","Colone":"\\u2a74","colone":"\\u2254","coloneq":"\\u2254","comma":",","commat":"@","comp":"\\u2201","compfn":"\\u2218","complement":"\\u2201","complexes":"\\u2102","cong":"\\u2245","congdot":"\\u2a6d","Congruent":"\\u2261","conint":"\\u222e","Conint":"\\u222f","ContourIntegral":"\\u222e","copf":"\\ud835\\udd54","Copf":"\\u2102","coprod":"\\u2210","Coproduct":"\\u2210","copy":"\\xa9","COPY":"\\xa9","copysr":"\\u2117","CounterClockwiseContourIntegral":"\\u2233","crarr":"\\u21b5","cross":"\\u2717","Cross":"\\u2a2f","Cscr":"\\ud835\\udc9e","cscr":"\\ud835\\udcb8","csub":"\\u2acf","csube":"\\u2ad1","csup":"\\u2ad0","csupe":"\\u2ad2","ctdot":"\\u22ef","cudarrl":"\\u2938","cudarrr":"\\u2935","cuepr":"\\u22de","cuesc":"\\u22df","cularr":"\\u21b6","cularrp":"\\u293d","cupbrcap":"\\u2a48","cupcap":"\\u2a46","CupCap":"\\u224d","cup":"\\u222a","Cup":"\\u22d3","cupcup":"\\u2a4a","cupdot":"\\u228d","cupor":"\\u2a45","cups":"\\u222a\\ufe00","curarr":"\\u21b7","curarrm":"\\u293c","curlyeqprec":"\\u22de","curlyeqsucc":"\\u22df","curlyvee":"\\u22ce","curlywedge":"\\u22cf","curren":"\\xa4","curvearrowleft":"\\u21b6","curvearrowright":"\\u21b7","cuvee":"\\u22ce","cuwed":"\\u22cf","cwconint":"\\u2232","cwint":"\\u2231","cylcty":"\\u232d","dagger":"\\u2020","Dagger":"\\u2021","daleth":"\\u2138","darr":"\\u2193","Darr":"\\u21a1","dArr":"\\u21d3","dash":"\\u2010","Dashv":"\\u2ae4","dashv":"\\u22a3","dbkarow":"\\u290f","dblac":"\\u02dd","Dcaron":"\\u010e","dcaron":"\\u010f","Dcy":"\\u0414","dcy":"\\u0434","ddagger":"\\u2021","ddarr":"\\u21ca","DD":"\\u2145","dd":"\\u2146","DDotrahd":"\\u2911","ddotseq":"\\u2a77","deg":"\\xb0","Del":"\\u2207","Delta":"\\u0394","delta":"\\u03b4","demptyv":"\\u29b1","dfisht":"\\u297f","Dfr":"\\ud835\\udd07","dfr":"\\ud835\\udd21","dHar":"\\u2965","dharl":"\\u21c3","dharr":"\\u21c2","DiacriticalAcute":"\\xb4","DiacriticalDot":"\\u02d9","DiacriticalDoubleAcute":"\\u02dd","DiacriticalGrave":"`","DiacriticalTilde":"\\u02dc","diam":"\\u22c4","diamond":"\\u22c4","Diamond":"\\u22c4","diamondsuit":"\\u2666","diams":"\\u2666","die":"\\xa8","DifferentialD":"\\u2146","digamma":"\\u03dd","disin":"\\u22f2","div":"\\xf7","divide":"\\xf7","divideontimes":"\\u22c7","divonx":"\\u22c7","DJcy":"\\u0402","djcy":"\\u0452","dlcorn":"\\u231e","dlcrop":"\\u230d","dollar":"$","Dopf":"\\ud835\\udd3b","dopf":"\\ud835\\udd55","Dot":"\\xa8","dot":"\\u02d9","DotDot":"\\u20dc","doteq":"\\u2250","doteqdot":"\\u2251","DotEqual":"\\u2250","dotminus":"\\u2238","dotplus":"\\u2214","dotsquare":"\\u22a1","doublebarwedge":"\\u2306","DoubleContourIntegral":"\\u222f","DoubleDot":"\\xa8","DoubleDownArrow":"\\u21d3","DoubleLeftArrow":"\\u21d0","DoubleLeftRightArrow":"\\u21d4","DoubleLeftTee":"\\u2ae4","DoubleLongLeftArrow":"\\u27f8","DoubleLongLeftRightArrow":"\\u27fa","DoubleLongRightArrow":"\\u27f9","DoubleRightArrow":"\\u21d2","DoubleRightTee":"\\u22a8","DoubleUpArrow":"\\u21d1","DoubleUpDownArrow":"\\u21d5","DoubleVerticalBar":"\\u2225","DownArrowBar":"\\u2913","downarrow":"\\u2193","DownArrow":"\\u2193","Downarrow":"\\u21d3","DownArrowUpArrow":"\\u21f5","DownBreve":"\\u0311","downdownarrows":"\\u21ca","downharpoonleft":"\\u21c3","downharpoonright":"\\u21c2","DownLeftRightVector":"\\u2950","DownLeftTeeVector":"\\u295e","DownLeftVectorBar":"\\u2956","DownLeftVector":"\\u21bd","DownRightTeeVector":"\\u295f","DownRightVectorBar":"\\u2957","DownRightVector":"\\u21c1","DownTeeArrow":"\\u21a7","DownTee":"\\u22a4","drbkarow":"\\u2910","drcorn":"\\u231f","drcrop":"\\u230c","Dscr":"\\ud835\\udc9f","dscr":"\\ud835\\udcb9","DScy":"\\u0405","dscy":"\\u0455","dsol":"\\u29f6","Dstrok":"\\u0110","dstrok":"\\u0111","dtdot":"\\u22f1","dtri":"\\u25bf","dtrif":"\\u25be","duarr":"\\u21f5","duhar":"\\u296f","dwangle":"\\u29a6","DZcy":"\\u040f","dzcy":"\\u045f","dzigrarr":"\\u27ff","Eacute":"\\xc9","eacute":"\\xe9","easter":"\\u2a6e","Ecaron":"\\u011a","ecaron":"\\u011b","Ecirc":"\\xca","ecirc":"\\xea","ecir":"\\u2256","ecolon":"\\u2255","Ecy":"\\u042d","ecy":"\\u044d","eDDot":"\\u2a77","Edot":"\\u0116","edot":"\\u0117","eDot":"\\u2251","ee":"\\u2147","efDot":"\\u2252","Efr":"\\ud835\\udd08","efr":"\\ud835\\udd22","eg":"\\u2a9a","Egrave":"\\xc8","egrave":"\\xe8","egs":"\\u2a96","egsdot":"\\u2a98","el":"\\u2a99","Element":"\\u2208","elinters":"\\u23e7","ell":"\\u2113","els":"\\u2a95","elsdot":"\\u2a97","Emacr":"\\u0112","emacr":"\\u0113","empty":"\\u2205","emptyset":"\\u2205","EmptySmallSquare":"\\u25fb","emptyv":"\\u2205","EmptyVerySmallSquare":"\\u25ab","emsp13":"\\u2004","emsp14":"\\u2005","emsp":"\\u2003","ENG":"\\u014a","eng":"\\u014b","ensp":"\\u2002","Eogon":"\\u0118","eogon":"\\u0119","Eopf":"\\ud835\\udd3c","eopf":"\\ud835\\udd56","epar":"\\u22d5","eparsl":"\\u29e3","eplus":"\\u2a71","epsi":"\\u03b5","Epsilon":"\\u0395","epsilon":"\\u03b5","epsiv":"\\u03f5","eqcirc":"\\u2256","eqcolon":"\\u2255","eqsim":"\\u2242","eqslantgtr":"\\u2a96","eqslantless":"\\u2a95","Equal":"\\u2a75","equals":"=","EqualTilde":"\\u2242","equest":"\\u225f","Equilibrium":"\\u21cc","equiv":"\\u2261","equivDD":"\\u2a78","eqvparsl":"\\u29e5","erarr":"\\u2971","erDot":"\\u2253","escr":"\\u212f","Escr":"\\u2130","esdot":"\\u2250","Esim":"\\u2a73","esim":"\\u2242","Eta":"\\u0397","eta":"\\u03b7","ETH":"\\xd0","eth":"\\xf0","Euml":"\\xcb","euml":"\\xeb","euro":"\\u20ac","excl":"!","exist":"\\u2203","Exists":"\\u2203","expectation":"\\u2130","exponentiale":"\\u2147","ExponentialE":"\\u2147","fallingdotseq":"\\u2252","Fcy":"\\u0424","fcy":"\\u0444","female":"\\u2640","ffilig":"\\ufb03","fflig":"\\ufb00","ffllig":"\\ufb04","Ffr":"\\ud835\\udd09","ffr":"\\ud835\\udd23","filig":"\\ufb01","FilledSmallSquare":"\\u25fc","FilledVerySmallSquare":"\\u25aa","fjlig":"fj","flat":"\\u266d","fllig":"\\ufb02","fltns":"\\u25b1","fnof":"\\u0192","Fopf":"\\ud835\\udd3d","fopf":"\\ud835\\udd57","forall":"\\u2200","ForAll":"\\u2200","fork":"\\u22d4","forkv":"\\u2ad9","Fouriertrf":"\\u2131","fpartint":"\\u2a0d","frac12":"\\xbd","frac13":"\\u2153","frac14":"\\xbc","frac15":"\\u2155","frac16":"\\u2159","frac18":"\\u215b","frac23":"\\u2154","frac25":"\\u2156","frac34":"\\xbe","frac35":"\\u2157","frac38":"\\u215c","frac45":"\\u2158","frac56":"\\u215a","frac58":"\\u215d","frac78":"\\u215e","frasl":"\\u2044","frown":"\\u2322","fscr":"\\ud835\\udcbb","Fscr":"\\u2131","gacute":"\\u01f5","Gamma":"\\u0393","gamma":"\\u03b3","Gammad":"\\u03dc","gammad":"\\u03dd","gap":"\\u2a86","Gbreve":"\\u011e","gbreve":"\\u011f","Gcedil":"\\u0122","Gcirc":"\\u011c","gcirc":"\\u011d","Gcy":"\\u0413","gcy":"\\u0433","Gdot":"\\u0120","gdot":"\\u0121","ge":"\\u2265","gE":"\\u2267","gEl":"\\u2a8c","gel":"\\u22db","geq":"\\u2265","geqq":"\\u2267","geqslant":"\\u2a7e","gescc":"\\u2aa9","ges":"\\u2a7e","gesdot":"\\u2a80","gesdoto":"\\u2a82","gesdotol":"\\u2a84","gesl":"\\u22db\\ufe00","gesles":"\\u2a94","Gfr":"\\ud835\\udd0a","gfr":"\\ud835\\udd24","gg":"\\u226b","Gg":"\\u22d9","ggg":"\\u22d9","gimel":"\\u2137","GJcy":"\\u0403","gjcy":"\\u0453","gla":"\\u2aa5","gl":"\\u2277","glE":"\\u2a92","glj":"\\u2aa4","gnap":"\\u2a8a","gnapprox":"\\u2a8a","gne":"\\u2a88","gnE":"\\u2269","gneq":"\\u2a88","gneqq":"\\u2269","gnsim":"\\u22e7","Gopf":"\\ud835\\udd3e","gopf":"\\ud835\\udd58","grave":"`","GreaterEqual":"\\u2265","GreaterEqualLess":"\\u22db","GreaterFullEqual":"\\u2267","GreaterGreater":"\\u2aa2","GreaterLess":"\\u2277","GreaterSlantEqual":"\\u2a7e","GreaterTilde":"\\u2273","Gscr":"\\ud835\\udca2","gscr":"\\u210a","gsim":"\\u2273","gsime":"\\u2a8e","gsiml":"\\u2a90","gtcc":"\\u2aa7","gtcir":"\\u2a7a","gt":">","GT":">","Gt":"\\u226b","gtdot":"\\u22d7","gtlPar":"\\u2995","gtquest":"\\u2a7c","gtrapprox":"\\u2a86","gtrarr":"\\u2978","gtrdot":"\\u22d7","gtreqless":"\\u22db","gtreqqless":"\\u2a8c","gtrless":"\\u2277","gtrsim":"\\u2273","gvertneqq":"\\u2269\\ufe00","gvnE":"\\u2269\\ufe00","Hacek":"\\u02c7","hairsp":"\\u200a","half":"\\xbd","hamilt":"\\u210b","HARDcy":"\\u042a","hardcy":"\\u044a","harrcir":"\\u2948","harr":"\\u2194","hArr":"\\u21d4","harrw":"\\u21ad","Hat":"^","hbar":"\\u210f","Hcirc":"\\u0124","hcirc":"\\u0125","hearts":"\\u2665","heartsuit":"\\u2665","hellip":"\\u2026","hercon":"\\u22b9","hfr":"\\ud835\\udd25","Hfr":"\\u210c","HilbertSpace":"\\u210b","hksearow":"\\u2925","hkswarow":"\\u2926","hoarr":"\\u21ff","homtht":"\\u223b","hookleftarrow":"\\u21a9","hookrightarrow":"\\u21aa","hopf":"\\ud835\\udd59","Hopf":"\\u210d","horbar":"\\u2015","HorizontalLine":"\\u2500","hscr":"\\ud835\\udcbd","Hscr":"\\u210b","hslash":"\\u210f","Hstrok":"\\u0126","hstrok":"\\u0127","HumpDownHump":"\\u224e","HumpEqual":"\\u224f","hybull":"\\u2043","hyphen":"\\u2010","Iacute":"\\xcd","iacute":"\\xed","ic":"\\u2063","Icirc":"\\xce","icirc":"\\xee","Icy":"\\u0418","icy":"\\u0438","Idot":"\\u0130","IEcy":"\\u0415","iecy":"\\u0435","iexcl":"\\xa1","iff":"\\u21d4","ifr":"\\ud835\\udd26","Ifr":"\\u2111","Igrave":"\\xcc","igrave":"\\xec","ii":"\\u2148","iiiint":"\\u2a0c","iiint":"\\u222d","iinfin":"\\u29dc","iiota":"\\u2129","IJlig":"\\u0132","ijlig":"\\u0133","Imacr":"\\u012a","imacr":"\\u012b","image":"\\u2111","ImaginaryI":"\\u2148","imagline":"\\u2110","imagpart":"\\u2111","imath":"\\u0131","Im":"\\u2111","imof":"\\u22b7","imped":"\\u01b5","Implies":"\\u21d2","incare":"\\u2105","in":"\\u2208","infin":"\\u221e","infintie":"\\u29dd","inodot":"\\u0131","intcal":"\\u22ba","int":"\\u222b","Int":"\\u222c","integers":"\\u2124","Integral":"\\u222b","intercal":"\\u22ba","Intersection":"\\u22c2","intlarhk":"\\u2a17","intprod":"\\u2a3c","InvisibleComma":"\\u2063","InvisibleTimes":"\\u2062","IOcy":"\\u0401","iocy":"\\u0451","Iogon":"\\u012e","iogon":"\\u012f","Iopf":"\\ud835\\udd40","iopf":"\\ud835\\udd5a","Iota":"\\u0399","iota":"\\u03b9","iprod":"\\u2a3c","iquest":"\\xbf","iscr":"\\ud835\\udcbe","Iscr":"\\u2110","isin":"\\u2208","isindot":"\\u22f5","isinE":"\\u22f9","isins":"\\u22f4","isinsv":"\\u22f3","isinv":"\\u2208","it":"\\u2062","Itilde":"\\u0128","itilde":"\\u0129","Iukcy":"\\u0406","iukcy":"\\u0456","Iuml":"\\xcf","iuml":"\\xef","Jcirc":"\\u0134","jcirc":"\\u0135","Jcy":"\\u0419","jcy":"\\u0439","Jfr":"\\ud835\\udd0d","jfr":"\\ud835\\udd27","jmath":"\\u0237","Jopf":"\\ud835\\udd41","jopf":"\\ud835\\udd5b","Jscr":"\\ud835\\udca5","jscr":"\\ud835\\udcbf","Jsercy":"\\u0408","jsercy":"\\u0458","Jukcy":"\\u0404","jukcy":"\\u0454","Kappa":"\\u039a","kappa":"\\u03ba","kappav":"\\u03f0","Kcedil":"\\u0136","kcedil":"\\u0137","Kcy":"\\u041a","kcy":"\\u043a","Kfr":"\\ud835\\udd0e","kfr":"\\ud835\\udd28","kgreen":"\\u0138","KHcy":"\\u0425","khcy":"\\u0445","KJcy":"\\u040c","kjcy":"\\u045c","Kopf":"\\ud835\\udd42","kopf":"\\ud835\\udd5c","Kscr":"\\ud835\\udca6","kscr":"\\ud835\\udcc0","lAarr":"\\u21da","Lacute":"\\u0139","lacute":"\\u013a","laemptyv":"\\u29b4","lagran":"\\u2112","Lambda":"\\u039b","lambda":"\\u03bb","lang":"\\u27e8","Lang":"\\u27ea","langd":"\\u2991","langle":"\\u27e8","lap":"\\u2a85","Laplacetrf":"\\u2112","laquo":"\\xab","larrb":"\\u21e4","larrbfs":"\\u291f","larr":"\\u2190","Larr":"\\u219e","lArr":"\\u21d0","larrfs":"\\u291d","larrhk":"\\u21a9","larrlp":"\\u21ab","larrpl":"\\u2939","larrsim":"\\u2973","larrtl":"\\u21a2","latail":"\\u2919","lAtail":"\\u291b","lat":"\\u2aab","late":"\\u2aad","lates":"\\u2aad\\ufe00","lbarr":"\\u290c","lBarr":"\\u290e","lbbrk":"\\u2772","lbrace":"{","lbrack":"[","lbrke":"\\u298b","lbrksld":"\\u298f","lbrkslu":"\\u298d","Lcaron":"\\u013d","lcaron":"\\u013e","Lcedil":"\\u013b","lcedil":"\\u013c","lceil":"\\u2308","lcub":"{","Lcy":"\\u041b","lcy":"\\u043b","ldca":"\\u2936","ldquo":"\\u201c","ldquor":"\\u201e","ldrdhar":"\\u2967","ldrushar":"\\u294b","ldsh":"\\u21b2","le":"\\u2264","lE":"\\u2266","LeftAngleBracket":"\\u27e8","LeftArrowBar":"\\u21e4","leftarrow":"\\u2190","LeftArrow":"\\u2190","Leftarrow":"\\u21d0","LeftArrowRightArrow":"\\u21c6","leftarrowtail":"\\u21a2","LeftCeiling":"\\u2308","LeftDoubleBracket":"\\u27e6","LeftDownTeeVector":"\\u2961","LeftDownVectorBar":"\\u2959","LeftDownVector":"\\u21c3","LeftFloor":"\\u230a","leftharpoondown":"\\u21bd","leftharpoonup":"\\u21bc","leftleftarrows":"\\u21c7","leftrightarrow":"\\u2194","LeftRightArrow":"\\u2194","Leftrightarrow":"\\u21d4","leftrightarrows":"\\u21c6","leftrightharpoons":"\\u21cb","leftrightsquigarrow":"\\u21ad","LeftRightVector":"\\u294e","LeftTeeArrow":"\\u21a4","LeftTee":"\\u22a3","LeftTeeVector":"\\u295a","leftthreetimes":"\\u22cb","LeftTriangleBar":"\\u29cf","LeftTriangle":"\\u22b2","LeftTriangleEqual":"\\u22b4","LeftUpDownVector":"\\u2951","LeftUpTeeVector":"\\u2960","LeftUpVectorBar":"\\u2958","LeftUpVector":"\\u21bf","LeftVectorBar":"\\u2952","LeftVector":"\\u21bc","lEg":"\\u2a8b","leg":"\\u22da","leq":"\\u2264","leqq":"\\u2266","leqslant":"\\u2a7d","lescc":"\\u2aa8","les":"\\u2a7d","lesdot":"\\u2a7f","lesdoto":"\\u2a81","lesdotor":"\\u2a83","lesg":"\\u22da\\ufe00","lesges":"\\u2a93","lessapprox":"\\u2a85","lessdot":"\\u22d6","lesseqgtr":"\\u22da","lesseqqgtr":"\\u2a8b","LessEqualGreater":"\\u22da","LessFullEqual":"\\u2266","LessGreater":"\\u2276","lessgtr":"\\u2276","LessLess":"\\u2aa1","lesssim":"\\u2272","LessSlantEqual":"\\u2a7d","LessTilde":"\\u2272","lfisht":"\\u297c","lfloor":"\\u230a","Lfr":"\\ud835\\udd0f","lfr":"\\ud835\\udd29","lg":"\\u2276","lgE":"\\u2a91","lHar":"\\u2962","lhard":"\\u21bd","lharu":"\\u21bc","lharul":"\\u296a","lhblk":"\\u2584","LJcy":"\\u0409","ljcy":"\\u0459","llarr":"\\u21c7","ll":"\\u226a","Ll":"\\u22d8","llcorner":"\\u231e","Lleftarrow":"\\u21da","llhard":"\\u296b","lltri":"\\u25fa","Lmidot":"\\u013f","lmidot":"\\u0140","lmoustache":"\\u23b0","lmoust":"\\u23b0","lnap":"\\u2a89","lnapprox":"\\u2a89","lne":"\\u2a87","lnE":"\\u2268","lneq":"\\u2a87","lneqq":"\\u2268","lnsim":"\\u22e6","loang":"\\u27ec","loarr":"\\u21fd","lobrk":"\\u27e6","longleftarrow":"\\u27f5","LongLeftArrow":"\\u27f5","Longleftarrow":"\\u27f8","longleftrightarrow":"\\u27f7","LongLeftRightArrow":"\\u27f7","Longleftrightarrow":"\\u27fa","longmapsto":"\\u27fc","longrightarrow":"\\u27f6","LongRightArrow":"\\u27f6","Longrightarrow":"\\u27f9","looparrowleft":"\\u21ab","looparrowright":"\\u21ac","lopar":"\\u2985","Lopf":"\\ud835\\udd43","lopf":"\\ud835\\udd5d","loplus":"\\u2a2d","lotimes":"\\u2a34","lowast":"\\u2217","lowbar":"_","LowerLeftArrow":"\\u2199","LowerRightArrow":"\\u2198","loz":"\\u25ca","lozenge":"\\u25ca","lozf":"\\u29eb","lpar":"(","lparlt":"\\u2993","lrarr":"\\u21c6","lrcorner":"\\u231f","lrhar":"\\u21cb","lrhard":"\\u296d","lrm":"\\u200e","lrtri":"\\u22bf","lsaquo":"\\u2039","lscr":"\\ud835\\udcc1","Lscr":"\\u2112","lsh":"\\u21b0","Lsh":"\\u21b0","lsim":"\\u2272","lsime":"\\u2a8d","lsimg":"\\u2a8f","lsqb":"[","lsquo":"\\u2018","lsquor":"\\u201a","Lstrok":"\\u0141","lstrok":"\\u0142","ltcc":"\\u2aa6","ltcir":"\\u2a79","lt":"<","LT":"<","Lt":"\\u226a","ltdot":"\\u22d6","lthree":"\\u22cb","ltimes":"\\u22c9","ltlarr":"\\u2976","ltquest":"\\u2a7b","ltri":"\\u25c3","ltrie":"\\u22b4","ltrif":"\\u25c2","ltrPar":"\\u2996","lurdshar":"\\u294a","luruhar":"\\u2966","lvertneqq":"\\u2268\\ufe00","lvnE":"\\u2268\\ufe00","macr":"\\xaf","male":"\\u2642","malt":"\\u2720","maltese":"\\u2720","Map":"\\u2905","map":"\\u21a6","mapsto":"\\u21a6","mapstodown":"\\u21a7","mapstoleft":"\\u21a4","mapstoup":"\\u21a5","marker":"\\u25ae","mcomma":"\\u2a29","Mcy":"\\u041c","mcy":"\\u043c","mdash":"\\u2014","mDDot":"\\u223a","measuredangle":"\\u2221","MediumSpace":"\\u205f","Mellintrf":"\\u2133","Mfr":"\\ud835\\udd10","mfr":"\\ud835\\udd2a","mho":"\\u2127","micro":"\\xb5","midast":"*","midcir":"\\u2af0","mid":"\\u2223","middot":"\\xb7","minusb":"\\u229f","minus":"\\u2212","minusd":"\\u2238","minusdu":"\\u2a2a","MinusPlus":"\\u2213","mlcp":"\\u2adb","mldr":"\\u2026","mnplus":"\\u2213","models":"\\u22a7","Mopf":"\\ud835\\udd44","mopf":"\\ud835\\udd5e","mp":"\\u2213","mscr":"\\ud835\\udcc2","Mscr":"\\u2133","mstpos":"\\u223e","Mu":"\\u039c","mu":"\\u03bc","multimap":"\\u22b8","mumap":"\\u22b8","nabla":"\\u2207","Nacute":"\\u0143","nacute":"\\u0144","nang":"\\u2220\\u20d2","nap":"\\u2249","napE":"\\u2a70\\u0338","napid":"\\u224b\\u0338","napos":"\\u0149","napprox":"\\u2249","natural":"\\u266e","naturals":"\\u2115","natur":"\\u266e","nbsp":"\\xa0","nbump":"\\u224e\\u0338","nbumpe":"\\u224f\\u0338","ncap":"\\u2a43","Ncaron":"\\u0147","ncaron":"\\u0148","Ncedil":"\\u0145","ncedil":"\\u0146","ncong":"\\u2247","ncongdot":"\\u2a6d\\u0338","ncup":"\\u2a42","Ncy":"\\u041d","ncy":"\\u043d","ndash":"\\u2013","nearhk":"\\u2924","nearr":"\\u2197","neArr":"\\u21d7","nearrow":"\\u2197","ne":"\\u2260","nedot":"\\u2250\\u0338","NegativeMediumSpace":"\\u200b","NegativeThickSpace":"\\u200b","NegativeThinSpace":"\\u200b","NegativeVeryThinSpace":"\\u200b","nequiv":"\\u2262","nesear":"\\u2928","nesim":"\\u2242\\u0338","NestedGreaterGreater":"\\u226b","NestedLessLess":"\\u226a","NewLine":"\\\\n","nexist":"\\u2204","nexists":"\\u2204","Nfr":"\\ud835\\udd11","nfr":"\\ud835\\udd2b","ngE":"\\u2267\\u0338","nge":"\\u2271","ngeq":"\\u2271","ngeqq":"\\u2267\\u0338","ngeqslant":"\\u2a7e\\u0338","nges":"\\u2a7e\\u0338","nGg":"\\u22d9\\u0338","ngsim":"\\u2275","nGt":"\\u226b\\u20d2","ngt":"\\u226f","ngtr":"\\u226f","nGtv":"\\u226b\\u0338","nharr":"\\u21ae","nhArr":"\\u21ce","nhpar":"\\u2af2","ni":"\\u220b","nis":"\\u22fc","nisd":"\\u22fa","niv":"\\u220b","NJcy":"\\u040a","njcy":"\\u045a","nlarr":"\\u219a","nlArr":"\\u21cd","nldr":"\\u2025","nlE":"\\u2266\\u0338","nle":"\\u2270","nleftarrow":"\\u219a","nLeftarrow":"\\u21cd","nleftrightarrow":"\\u21ae","nLeftrightarrow":"\\u21ce","nleq":"\\u2270","nleqq":"\\u2266\\u0338","nleqslant":"\\u2a7d\\u0338","nles":"\\u2a7d\\u0338","nless":"\\u226e","nLl":"\\u22d8\\u0338","nlsim":"\\u2274","nLt":"\\u226a\\u20d2","nlt":"\\u226e","nltri":"\\u22ea","nltrie":"\\u22ec","nLtv":"\\u226a\\u0338","nmid":"\\u2224","NoBreak":"\\u2060","NonBreakingSpace":"\\xa0","nopf":"\\ud835\\udd5f","Nopf":"\\u2115","Not":"\\u2aec","not":"\\xac","NotCongruent":"\\u2262","NotCupCap":"\\u226d","NotDoubleVerticalBar":"\\u2226","NotElement":"\\u2209","NotEqual":"\\u2260","NotEqualTilde":"\\u2242\\u0338","NotExists":"\\u2204","NotGreater":"\\u226f","NotGreaterEqual":"\\u2271","NotGreaterFullEqual":"\\u2267\\u0338","NotGreaterGreater":"\\u226b\\u0338","NotGreaterLess":"\\u2279","NotGreaterSlantEqual":"\\u2a7e\\u0338","NotGreaterTilde":"\\u2275","NotHumpDownHump":"\\u224e\\u0338","NotHumpEqual":"\\u224f\\u0338","notin":"\\u2209","notindot":"\\u22f5\\u0338","notinE":"\\u22f9\\u0338","notinva":"\\u2209","notinvb":"\\u22f7","notinvc":"\\u22f6","NotLeftTriangleBar":"\\u29cf\\u0338","NotLeftTriangle":"\\u22ea","NotLeftTriangleEqual":"\\u22ec","NotLess":"\\u226e","NotLessEqual":"\\u2270","NotLessGreater":"\\u2278","NotLessLess":"\\u226a\\u0338","NotLessSlantEqual":"\\u2a7d\\u0338","NotLessTilde":"\\u2274","NotNestedGreaterGreater":"\\u2aa2\\u0338","NotNestedLessLess":"\\u2aa1\\u0338","notni":"\\u220c","notniva":"\\u220c","notnivb":"\\u22fe","notnivc":"\\u22fd","NotPrecedes":"\\u2280","NotPrecedesEqual":"\\u2aaf\\u0338","NotPrecedesSlantEqual":"\\u22e0","NotReverseElement":"\\u220c","NotRightTriangleBar":"\\u29d0\\u0338","NotRightTriangle":"\\u22eb","NotRightTriangleEqual":"\\u22ed","NotSquareSubset":"\\u228f\\u0338","NotSquareSubsetEqual":"\\u22e2","NotSquareSuperset":"\\u2290\\u0338","NotSquareSupersetEqual":"\\u22e3","NotSubset":"\\u2282\\u20d2","NotSubsetEqual":"\\u2288","NotSucceeds":"\\u2281","NotSucceedsEqual":"\\u2ab0\\u0338","NotSucceedsSlantEqual":"\\u22e1","NotSucceedsTilde":"\\u227f\\u0338","NotSuperset":"\\u2283\\u20d2","NotSupersetEqual":"\\u2289","NotTilde":"\\u2241","NotTildeEqual":"\\u2244","NotTildeFullEqual":"\\u2247","NotTildeTilde":"\\u2249","NotVerticalBar":"\\u2224","nparallel":"\\u2226","npar":"\\u2226","nparsl":"\\u2afd\\u20e5","npart":"\\u2202\\u0338","npolint":"\\u2a14","npr":"\\u2280","nprcue":"\\u22e0","nprec":"\\u2280","npreceq":"\\u2aaf\\u0338","npre":"\\u2aaf\\u0338","nrarrc":"\\u2933\\u0338","nrarr":"\\u219b","nrArr":"\\u21cf","nrarrw":"\\u219d\\u0338","nrightarrow":"\\u219b","nRightarrow":"\\u21cf","nrtri":"\\u22eb","nrtrie":"\\u22ed","nsc":"\\u2281","nsccue":"\\u22e1","nsce":"\\u2ab0\\u0338","Nscr":"\\ud835\\udca9","nscr":"\\ud835\\udcc3","nshortmid":"\\u2224","nshortparallel":"\\u2226","nsim":"\\u2241","nsime":"\\u2244","nsimeq":"\\u2244","nsmid":"\\u2224","nspar":"\\u2226","nsqsube":"\\u22e2","nsqsupe":"\\u22e3","nsub":"\\u2284","nsubE":"\\u2ac5\\u0338","nsube":"\\u2288","nsubset":"\\u2282\\u20d2","nsubseteq":"\\u2288","nsubseteqq":"\\u2ac5\\u0338","nsucc":"\\u2281","nsucceq":"\\u2ab0\\u0338","nsup":"\\u2285","nsupE":"\\u2ac6\\u0338","nsupe":"\\u2289","nsupset":"\\u2283\\u20d2","nsupseteq":"\\u2289","nsupseteqq":"\\u2ac6\\u0338","ntgl":"\\u2279","Ntilde":"\\xd1","ntilde":"\\xf1","ntlg":"\\u2278","ntriangleleft":"\\u22ea","ntrianglelefteq":"\\u22ec","ntriangleright":"\\u22eb","ntrianglerighteq":"\\u22ed","Nu":"\\u039d","nu":"\\u03bd","num":"#","numero":"\\u2116","numsp":"\\u2007","nvap":"\\u224d\\u20d2","nvdash":"\\u22ac","nvDash":"\\u22ad","nVdash":"\\u22ae","nVDash":"\\u22af","nvge":"\\u2265\\u20d2","nvgt":">\\u20d2","nvHarr":"\\u2904","nvinfin":"\\u29de","nvlArr":"\\u2902","nvle":"\\u2264\\u20d2","nvlt":"<\\u20d2","nvltrie":"\\u22b4\\u20d2","nvrArr":"\\u2903","nvrtrie":"\\u22b5\\u20d2","nvsim":"\\u223c\\u20d2","nwarhk":"\\u2923","nwarr":"\\u2196","nwArr":"\\u21d6","nwarrow":"\\u2196","nwnear":"\\u2927","Oacute":"\\xd3","oacute":"\\xf3","oast":"\\u229b","Ocirc":"\\xd4","ocirc":"\\xf4","ocir":"\\u229a","Ocy":"\\u041e","ocy":"\\u043e","odash":"\\u229d","Odblac":"\\u0150","odblac":"\\u0151","odiv":"\\u2a38","odot":"\\u2299","odsold":"\\u29bc","OElig":"\\u0152","oelig":"\\u0153","ofcir":"\\u29bf","Ofr":"\\ud835\\udd12","ofr":"\\ud835\\udd2c","ogon":"\\u02db","Ograve":"\\xd2","ograve":"\\xf2","ogt":"\\u29c1","ohbar":"\\u29b5","ohm":"\\u03a9","oint":"\\u222e","olarr":"\\u21ba","olcir":"\\u29be","olcross":"\\u29bb","oline":"\\u203e","olt":"\\u29c0","Omacr":"\\u014c","omacr":"\\u014d","Omega":"\\u03a9","omega":"\\u03c9","Omicron":"\\u039f","omicron":"\\u03bf","omid":"\\u29b6","ominus":"\\u2296","Oopf":"\\ud835\\udd46","oopf":"\\ud835\\udd60","opar":"\\u29b7","OpenCurlyDoubleQuote":"\\u201c","OpenCurlyQuote":"\\u2018","operp":"\\u29b9","oplus":"\\u2295","orarr":"\\u21bb","Or":"\\u2a54","or":"\\u2228","ord":"\\u2a5d","order":"\\u2134","orderof":"\\u2134","ordf":"\\xaa","ordm":"\\xba","origof":"\\u22b6","oror":"\\u2a56","orslope":"\\u2a57","orv":"\\u2a5b","oS":"\\u24c8","Oscr":"\\ud835\\udcaa","oscr":"\\u2134","Oslash":"\\xd8","oslash":"\\xf8","osol":"\\u2298","Otilde":"\\xd5","otilde":"\\xf5","otimesas":"\\u2a36","Otimes":"\\u2a37","otimes":"\\u2297","Ouml":"\\xd6","ouml":"\\xf6","ovbar":"\\u233d","OverBar":"\\u203e","OverBrace":"\\u23de","OverBracket":"\\u23b4","OverParenthesis":"\\u23dc","para":"\\xb6","parallel":"\\u2225","par":"\\u2225","parsim":"\\u2af3","parsl":"\\u2afd","part":"\\u2202","PartialD":"\\u2202","Pcy":"\\u041f","pcy":"\\u043f","percnt":"%","period":".","permil":"\\u2030","perp":"\\u22a5","pertenk":"\\u2031","Pfr":"\\ud835\\udd13","pfr":"\\ud835\\udd2d","Phi":"\\u03a6","phi":"\\u03c6","phiv":"\\u03d5","phmmat":"\\u2133","phone":"\\u260e","Pi":"\\u03a0","pi":"\\u03c0","pitchfork":"\\u22d4","piv":"\\u03d6","planck":"\\u210f","planckh":"\\u210e","plankv":"\\u210f","plusacir":"\\u2a23","plusb":"\\u229e","pluscir":"\\u2a22","plus":"+","plusdo":"\\u2214","plusdu":"\\u2a25","pluse":"\\u2a72","PlusMinus":"\\xb1","plusmn":"\\xb1","plussim":"\\u2a26","plustwo":"\\u2a27","pm":"\\xb1","Poincareplane":"\\u210c","pointint":"\\u2a15","popf":"\\ud835\\udd61","Popf":"\\u2119","pound":"\\xa3","prap":"\\u2ab7","Pr":"\\u2abb","pr":"\\u227a","prcue":"\\u227c","precapprox":"\\u2ab7","prec":"\\u227a","preccurlyeq":"\\u227c","Precedes":"\\u227a","PrecedesEqual":"\\u2aaf","PrecedesSlantEqual":"\\u227c","PrecedesTilde":"\\u227e","preceq":"\\u2aaf","precnapprox":"\\u2ab9","precneqq":"\\u2ab5","precnsim":"\\u22e8","pre":"\\u2aaf","prE":"\\u2ab3","precsim":"\\u227e","prime":"\\u2032","Prime":"\\u2033","primes":"\\u2119","prnap":"\\u2ab9","prnE":"\\u2ab5","prnsim":"\\u22e8","prod":"\\u220f","Product":"\\u220f","profalar":"\\u232e","profline":"\\u2312","profsurf":"\\u2313","prop":"\\u221d","Proportional":"\\u221d","Proportion":"\\u2237","propto":"\\u221d","prsim":"\\u227e","prurel":"\\u22b0","Pscr":"\\ud835\\udcab","pscr":"\\ud835\\udcc5","Psi":"\\u03a8","psi":"\\u03c8","puncsp":"\\u2008","Qfr":"\\ud835\\udd14","qfr":"\\ud835\\udd2e","qint":"\\u2a0c","qopf":"\\ud835\\udd62","Qopf":"\\u211a","qprime":"\\u2057","Qscr":"\\ud835\\udcac","qscr":"\\ud835\\udcc6","quaternions":"\\u210d","quatint":"\\u2a16","quest":"?","questeq":"\\u225f","quot":"\\\\"","QUOT":"\\\\"","rAarr":"\\u21db","race":"\\u223d\\u0331","Racute":"\\u0154","racute":"\\u0155","radic":"\\u221a","raemptyv":"\\u29b3","rang":"\\u27e9","Rang":"\\u27eb","rangd":"\\u2992","range":"\\u29a5","rangle":"\\u27e9","raquo":"\\xbb","rarrap":"\\u2975","rarrb":"\\u21e5","rarrbfs":"\\u2920","rarrc":"\\u2933","rarr":"\\u2192","Rarr":"\\u21a0","rArr":"\\u21d2","rarrfs":"\\u291e","rarrhk":"\\u21aa","rarrlp":"\\u21ac","rarrpl":"\\u2945","rarrsim":"\\u2974","Rarrtl":"\\u2916","rarrtl":"\\u21a3","rarrw":"\\u219d","ratail":"\\u291a","rAtail":"\\u291c","ratio":"\\u2236","rationals":"\\u211a","rbarr":"\\u290d","rBarr":"\\u290f","RBarr":"\\u2910","rbbrk":"\\u2773","rbrace":"}","rbrack":"]","rbrke":"\\u298c","rbrksld":"\\u298e","rbrkslu":"\\u2990","Rcaron":"\\u0158","rcaron":"\\u0159","Rcedil":"\\u0156","rcedil":"\\u0157","rceil":"\\u2309","rcub":"}","Rcy":"\\u0420","rcy":"\\u0440","rdca":"\\u2937","rdldhar":"\\u2969","rdquo":"\\u201d","rdquor":"\\u201d","rdsh":"\\u21b3","real":"\\u211c","realine":"\\u211b","realpart":"\\u211c","reals":"\\u211d","Re":"\\u211c","rect":"\\u25ad","reg":"\\xae","REG":"\\xae","ReverseElement":"\\u220b","ReverseEquilibrium":"\\u21cb","ReverseUpEquilibrium":"\\u296f","rfisht":"\\u297d","rfloor":"\\u230b","rfr":"\\ud835\\udd2f","Rfr":"\\u211c","rHar":"\\u2964","rhard":"\\u21c1","rharu":"\\u21c0","rharul":"\\u296c","Rho":"\\u03a1","rho":"\\u03c1","rhov":"\\u03f1","RightAngleBracket":"\\u27e9","RightArrowBar":"\\u21e5","rightarrow":"\\u2192","RightArrow":"\\u2192","Rightarrow":"\\u21d2","RightArrowLeftArrow":"\\u21c4","rightarrowtail":"\\u21a3","RightCeiling":"\\u2309","RightDoubleBracket":"\\u27e7","RightDownTeeVector":"\\u295d","RightDownVectorBar":"\\u2955","RightDownVector":"\\u21c2","RightFloor":"\\u230b","rightharpoondown":"\\u21c1","rightharpoonup":"\\u21c0","rightleftarrows":"\\u21c4","rightleftharpoons":"\\u21cc","rightrightarrows":"\\u21c9","rightsquigarrow":"\\u219d","RightTeeArrow":"\\u21a6","RightTee":"\\u22a2","RightTeeVector":"\\u295b","rightthreetimes":"\\u22cc","RightTriangleBar":"\\u29d0","RightTriangle":"\\u22b3","RightTriangleEqual":"\\u22b5","RightUpDownVector":"\\u294f","RightUpTeeVector":"\\u295c","RightUpVectorBar":"\\u2954","RightUpVector":"\\u21be","RightVectorBar":"\\u2953","RightVector":"\\u21c0","ring":"\\u02da","risingdotseq":"\\u2253","rlarr":"\\u21c4","rlhar":"\\u21cc","rlm":"\\u200f","rmoustache":"\\u23b1","rmoust":"\\u23b1","rnmid":"\\u2aee","roang":"\\u27ed","roarr":"\\u21fe","robrk":"\\u27e7","ropar":"\\u2986","ropf":"\\ud835\\udd63","Ropf":"\\u211d","roplus":"\\u2a2e","rotimes":"\\u2a35","RoundImplies":"\\u2970","rpar":")","rpargt":"\\u2994","rppolint":"\\u2a12","rrarr":"\\u21c9","Rrightarrow":"\\u21db","rsaquo":"\\u203a","rscr":"\\ud835\\udcc7","Rscr":"\\u211b","rsh":"\\u21b1","Rsh":"\\u21b1","rsqb":"]","rsquo":"\\u2019","rsquor":"\\u2019","rthree":"\\u22cc","rtimes":"\\u22ca","rtri":"\\u25b9","rtrie":"\\u22b5","rtrif":"\\u25b8","rtriltri":"\\u29ce","RuleDelayed":"\\u29f4","ruluhar":"\\u2968","rx":"\\u211e","Sacute":"\\u015a","sacute":"\\u015b","sbquo":"\\u201a","scap":"\\u2ab8","Scaron":"\\u0160","scaron":"\\u0161","Sc":"\\u2abc","sc":"\\u227b","sccue":"\\u227d","sce":"\\u2ab0","scE":"\\u2ab4","Scedil":"\\u015e","scedil":"\\u015f","Scirc":"\\u015c","scirc":"\\u015d","scnap":"\\u2aba","scnE":"\\u2ab6","scnsim":"\\u22e9","scpolint":"\\u2a13","scsim":"\\u227f","Scy":"\\u0421","scy":"\\u0441","sdotb":"\\u22a1","sdot":"\\u22c5","sdote":"\\u2a66","searhk":"\\u2925","searr":"\\u2198","seArr":"\\u21d8","searrow":"\\u2198","sect":"\\xa7","semi":";","seswar":"\\u2929","setminus":"\\u2216","setmn":"\\u2216","sext":"\\u2736","Sfr":"\\ud835\\udd16","sfr":"\\ud835\\udd30","sfrown":"\\u2322","sharp":"\\u266f","SHCHcy":"\\u0429","shchcy":"\\u0449","SHcy":"\\u0428","shcy":"\\u0448","ShortDownArrow":"\\u2193","ShortLeftArrow":"\\u2190","shortmid":"\\u2223","shortparallel":"\\u2225","ShortRightArrow":"\\u2192","ShortUpArrow":"\\u2191","shy":"\\xad","Sigma":"\\u03a3","sigma":"\\u03c3","sigmaf":"\\u03c2","sigmav":"\\u03c2","sim":"\\u223c","simdot":"\\u2a6a","sime":"\\u2243","simeq":"\\u2243","simg":"\\u2a9e","simgE":"\\u2aa0","siml":"\\u2a9d","simlE":"\\u2a9f","simne":"\\u2246","simplus":"\\u2a24","simrarr":"\\u2972","slarr":"\\u2190","SmallCircle":"\\u2218","smallsetminus":"\\u2216","smashp":"\\u2a33","smeparsl":"\\u29e4","smid":"\\u2223","smile":"\\u2323","smt":"\\u2aaa","smte":"\\u2aac","smtes":"\\u2aac\\ufe00","SOFTcy":"\\u042c","softcy":"\\u044c","solbar":"\\u233f","solb":"\\u29c4","sol":"/","Sopf":"\\ud835\\udd4a","sopf":"\\ud835\\udd64","spades":"\\u2660","spadesuit":"\\u2660","spar":"\\u2225","sqcap":"\\u2293","sqcaps":"\\u2293\\ufe00","sqcup":"\\u2294","sqcups":"\\u2294\\ufe00","Sqrt":"\\u221a","sqsub":"\\u228f","sqsube":"\\u2291","sqsubset":"\\u228f","sqsubseteq":"\\u2291","sqsup":"\\u2290","sqsupe":"\\u2292","sqsupset":"\\u2290","sqsupseteq":"\\u2292","square":"\\u25a1","Square":"\\u25a1","SquareIntersection":"\\u2293","SquareSubset":"\\u228f","SquareSubsetEqual":"\\u2291","SquareSuperset":"\\u2290","SquareSupersetEqual":"\\u2292","SquareUnion":"\\u2294","squarf":"\\u25aa","squ":"\\u25a1","squf":"\\u25aa","srarr":"\\u2192","Sscr":"\\ud835\\udcae","sscr":"\\ud835\\udcc8","ssetmn":"\\u2216","ssmile":"\\u2323","sstarf":"\\u22c6","Star":"\\u22c6","star":"\\u2606","starf":"\\u2605","straightepsilon":"\\u03f5","straightphi":"\\u03d5","strns":"\\xaf","sub":"\\u2282","Sub":"\\u22d0","subdot":"\\u2abd","subE":"\\u2ac5","sube":"\\u2286","subedot":"\\u2ac3","submult":"\\u2ac1","subnE":"\\u2acb","subne":"\\u228a","subplus":"\\u2abf","subrarr":"\\u2979","subset":"\\u2282","Subset":"\\u22d0","subseteq":"\\u2286","subseteqq":"\\u2ac5","SubsetEqual":"\\u2286","subsetneq":"\\u228a","subsetneqq":"\\u2acb","subsim":"\\u2ac7","subsub":"\\u2ad5","subsup":"\\u2ad3","succapprox":"\\u2ab8","succ":"\\u227b","succcurlyeq":"\\u227d","Succeeds":"\\u227b","SucceedsEqual":"\\u2ab0","SucceedsSlantEqual":"\\u227d","SucceedsTilde":"\\u227f","succeq":"\\u2ab0","succnapprox":"\\u2aba","succneqq":"\\u2ab6","succnsim":"\\u22e9","succsim":"\\u227f","SuchThat":"\\u220b","sum":"\\u2211","Sum":"\\u2211","sung":"\\u266a","sup1":"\\xb9","sup2":"\\xb2","sup3":"\\xb3","sup":"\\u2283","Sup":"\\u22d1","supdot":"\\u2abe","supdsub":"\\u2ad8","supE":"\\u2ac6","supe":"\\u2287","supedot":"\\u2ac4","Superset":"\\u2283","SupersetEqual":"\\u2287","suphsol":"\\u27c9","suphsub":"\\u2ad7","suplarr":"\\u297b","supmult":"\\u2ac2","supnE":"\\u2acc","supne":"\\u228b","supplus":"\\u2ac0","supset":"\\u2283","Supset":"\\u22d1","supseteq":"\\u2287","supseteqq":"\\u2ac6","supsetneq":"\\u228b","supsetneqq":"\\u2acc","supsim":"\\u2ac8","supsub":"\\u2ad4","supsup":"\\u2ad6","swarhk":"\\u2926","swarr":"\\u2199","swArr":"\\u21d9","swarrow":"\\u2199","swnwar":"\\u292a","szlig":"\\xdf","Tab":"\\\\t","target":"\\u2316","Tau":"\\u03a4","tau":"\\u03c4","tbrk":"\\u23b4","Tcaron":"\\u0164","tcaron":"\\u0165","Tcedil":"\\u0162","tcedil":"\\u0163","Tcy":"\\u0422","tcy":"\\u0442","tdot":"\\u20db","telrec":"\\u2315","Tfr":"\\ud835\\udd17","tfr":"\\ud835\\udd31","there4":"\\u2234","therefore":"\\u2234","Therefore":"\\u2234","Theta":"\\u0398","theta":"\\u03b8","thetasym":"\\u03d1","thetav":"\\u03d1","thickapprox":"\\u2248","thicksim":"\\u223c","ThickSpace":"\\u205f\\u200a","ThinSpace":"\\u2009","thinsp":"\\u2009","thkap":"\\u2248","thksim":"\\u223c","THORN":"\\xde","thorn":"\\xfe","tilde":"\\u02dc","Tilde":"\\u223c","TildeEqual":"\\u2243","TildeFullEqual":"\\u2245","TildeTilde":"\\u2248","timesbar":"\\u2a31","timesb":"\\u22a0","times":"\\xd7","timesd":"\\u2a30","tint":"\\u222d","toea":"\\u2928","topbot":"\\u2336","topcir":"\\u2af1","top":"\\u22a4","Topf":"\\ud835\\udd4b","topf":"\\ud835\\udd65","topfork":"\\u2ada","tosa":"\\u2929","tprime":"\\u2034","trade":"\\u2122","TRADE":"\\u2122","triangle":"\\u25b5","triangledown":"\\u25bf","triangleleft":"\\u25c3","trianglelefteq":"\\u22b4","triangleq":"\\u225c","triangleright":"\\u25b9","trianglerighteq":"\\u22b5","tridot":"\\u25ec","trie":"\\u225c","triminus":"\\u2a3a","TripleDot":"\\u20db","triplus":"\\u2a39","trisb":"\\u29cd","tritime":"\\u2a3b","trpezium":"\\u23e2","Tscr":"\\ud835\\udcaf","tscr":"\\ud835\\udcc9","TScy":"\\u0426","tscy":"\\u0446","TSHcy":"\\u040b","tshcy":"\\u045b","Tstrok":"\\u0166","tstrok":"\\u0167","twixt":"\\u226c","twoheadleftarrow":"\\u219e","twoheadrightarrow":"\\u21a0","Uacute":"\\xda","uacute":"\\xfa","uarr":"\\u2191","Uarr":"\\u219f","uArr":"\\u21d1","Uarrocir":"\\u2949","Ubrcy":"\\u040e","ubrcy":"\\u045e","Ubreve":"\\u016c","ubreve":"\\u016d","Ucirc":"\\xdb","ucirc":"\\xfb","Ucy":"\\u0423","ucy":"\\u0443","udarr":"\\u21c5","Udblac":"\\u0170","udblac":"\\u0171","udhar":"\\u296e","ufisht":"\\u297e","Ufr":"\\ud835\\udd18","ufr":"\\ud835\\udd32","Ugrave":"\\xd9","ugrave":"\\xf9","uHar":"\\u2963","uharl":"\\u21bf","uharr":"\\u21be","uhblk":"\\u2580","ulcorn":"\\u231c","ulcorner":"\\u231c","ulcrop":"\\u230f","ultri":"\\u25f8","Umacr":"\\u016a","umacr":"\\u016b","uml":"\\xa8","UnderBar":"_","UnderBrace":"\\u23df","UnderBracket":"\\u23b5","UnderParenthesis":"\\u23dd","Union":"\\u22c3","UnionPlus":"\\u228e","Uogon":"\\u0172","uogon":"\\u0173","Uopf":"\\ud835\\udd4c","uopf":"\\ud835\\udd66","UpArrowBar":"\\u2912","uparrow":"\\u2191","UpArrow":"\\u2191","Uparrow":"\\u21d1","UpArrowDownArrow":"\\u21c5","updownarrow":"\\u2195","UpDownArrow":"\\u2195","Updownarrow":"\\u21d5","UpEquilibrium":"\\u296e","upharpoonleft":"\\u21bf","upharpoonright":"\\u21be","uplus":"\\u228e","UpperLeftArrow":"\\u2196","UpperRightArrow":"\\u2197","upsi":"\\u03c5","Upsi":"\\u03d2","upsih":"\\u03d2","Upsilon":"\\u03a5","upsilon":"\\u03c5","UpTeeArrow":"\\u21a5","UpTee":"\\u22a5","upuparrows":"\\u21c8","urcorn":"\\u231d","urcorner":"\\u231d","urcrop":"\\u230e","Uring":"\\u016e","uring":"\\u016f","urtri":"\\u25f9","Uscr":"\\ud835\\udcb0","uscr":"\\ud835\\udcca","utdot":"\\u22f0","Utilde":"\\u0168","utilde":"\\u0169","utri":"\\u25b5","utrif":"\\u25b4","uuarr":"\\u21c8","Uuml":"\\xdc","uuml":"\\xfc","uwangle":"\\u29a7","vangrt":"\\u299c","varepsilon":"\\u03f5","varkappa":"\\u03f0","varnothing":"\\u2205","varphi":"\\u03d5","varpi":"\\u03d6","varpropto":"\\u221d","varr":"\\u2195","vArr":"\\u21d5","varrho":"\\u03f1","varsigma":"\\u03c2","varsubsetneq":"\\u228a\\ufe00","varsubsetneqq":"\\u2acb\\ufe00","varsupsetneq":"\\u228b\\ufe00","varsupsetneqq":"\\u2acc\\ufe00","vartheta":"\\u03d1","vartriangleleft":"\\u22b2","vartriangleright":"\\u22b3","vBar":"\\u2ae8","Vbar":"\\u2aeb","vBarv":"\\u2ae9","Vcy":"\\u0412","vcy":"\\u0432","vdash":"\\u22a2","vDash":"\\u22a8","Vdash":"\\u22a9","VDash":"\\u22ab","Vdashl":"\\u2ae6","veebar":"\\u22bb","vee":"\\u2228","Vee":"\\u22c1","veeeq":"\\u225a","vellip":"\\u22ee","verbar":"|","Verbar":"\\u2016","vert":"|","Vert":"\\u2016","VerticalBar":"\\u2223","VerticalLine":"|","VerticalSeparator":"\\u2758","VerticalTilde":"\\u2240","VeryThinSpace":"\\u200a","Vfr":"\\ud835\\udd19","vfr":"\\ud835\\udd33","vltri":"\\u22b2","vnsub":"\\u2282\\u20d2","vnsup":"\\u2283\\u20d2","Vopf":"\\ud835\\udd4d","vopf":"\\ud835\\udd67","vprop":"\\u221d","vrtri":"\\u22b3","Vscr":"\\ud835\\udcb1","vscr":"\\ud835\\udccb","vsubnE":"\\u2acb\\ufe00","vsubne":"\\u228a\\ufe00","vsupnE":"\\u2acc\\ufe00","vsupne":"\\u228b\\ufe00","Vvdash":"\\u22aa","vzigzag":"\\u299a","Wcirc":"\\u0174","wcirc":"\\u0175","wedbar":"\\u2a5f","wedge":"\\u2227","Wedge":"\\u22c0","wedgeq":"\\u2259","weierp":"\\u2118","Wfr":"\\ud835\\udd1a","wfr":"\\ud835\\udd34","Wopf":"\\ud835\\udd4e","wopf":"\\ud835\\udd68","wp":"\\u2118","wr":"\\u2240","wreath":"\\u2240","Wscr":"\\ud835\\udcb2","wscr":"\\ud835\\udccc","xcap":"\\u22c2","xcirc":"\\u25ef","xcup":"\\u22c3","xdtri":"\\u25bd","Xfr":"\\ud835\\udd1b","xfr":"\\ud835\\udd35","xharr":"\\u27f7","xhArr":"\\u27fa","Xi":"\\u039e","xi":"\\u03be","xlarr":"\\u27f5","xlArr":"\\u27f8","xmap":"\\u27fc","xnis":"\\u22fb","xodot":"\\u2a00","Xopf":"\\ud835\\udd4f","xopf":"\\ud835\\udd69","xoplus":"\\u2a01","xotime":"\\u2a02","xrarr":"\\u27f6","xrArr":"\\u27f9","Xscr":"\\ud835\\udcb3","xscr":"\\ud835\\udccd","xsqcup":"\\u2a06","xuplus":"\\u2a04","xutri":"\\u25b3","xvee":"\\u22c1","xwedge":"\\u22c0","Yacute":"\\xdd","yacute":"\\xfd","YAcy":"\\u042f","yacy":"\\u044f","Ycirc":"\\u0176","ycirc":"\\u0177","Ycy":"\\u042b","ycy":"\\u044b","yen":"\\xa5","Yfr":"\\ud835\\udd1c","yfr":"\\ud835\\udd36","YIcy":"\\u0407","yicy":"\\u0457","Yopf":"\\ud835\\udd50","yopf":"\\ud835\\udd6a","Yscr":"\\ud835\\udcb4","yscr":"\\ud835\\udcce","YUcy":"\\u042e","yucy":"\\u044e","yuml":"\\xff","Yuml":"\\u0178","Zacute":"\\u0179","zacute":"\\u017a","Zcaron":"\\u017d","zcaron":"\\u017e","Zcy":"\\u0417","zcy":"\\u0437","Zdot":"\\u017b","zdot":"\\u017c","zeetrf":"\\u2128","ZeroWidthSpace":"\\u200b","Zeta":"\\u0396","zeta":"\\u03b6","zfr":"\\ud835\\udd37","Zfr":"\\u2128","ZHcy":"\\u0416","zhcy":"\\u0436","zigrarr":"\\u21dd","zopf":"\\ud835\\udd6b","Zopf":"\\u2124","Zscr":"\\ud835\\udcb5","zscr":"\\ud835\\udccf","zwj":"\\u200d","zwnj":"\\u200c"}\');\n}, function(module) {\n    module.exports = JSON.parse(\'{"amp":"&","apos":"\\\'","gt":">","lt":"<","quot":"\\\\""}\');\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    }), exports.isTag = function(elem) {\n        return "tag" === elem.type || "script" === elem.type || "style" === elem.type;\n    }, exports.Text = "text", exports.Directive = "directive", exports.Comment = "comment", \n    exports.Script = "script", exports.Style = "style", exports.Tag = "tag", exports.CDATA = "cdata", \n    exports.Doctype = "doctype";\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n        return (extendStatics = Object.setPrototypeOf || {\n            __proto__: []\n        } instanceof Array && function(d, b) {\n            d.__proto__ = b;\n        } || function(d, b) {\n            for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n        })(d, b);\n    }, function(d, b) {\n        function __() {\n            this.constructor = d;\n        }\n        extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n        new __);\n    }), __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var Tokenizer_1 = __importDefault(__webpack_require__(13)), events_1 = __webpack_require__(31), formTags = new Set([ "input", "option", "optgroup", "select", "button", "datalist", "textarea" ]), pTag = new Set([ "p" ]), openImpliesClose = {\n        tr: new Set([ "tr", "th", "td" ]),\n        th: new Set([ "th" ]),\n        td: new Set([ "thead", "th", "td" ]),\n        body: new Set([ "head", "link", "script" ]),\n        li: new Set([ "li" ]),\n        p: pTag,\n        h1: pTag,\n        h2: pTag,\n        h3: pTag,\n        h4: pTag,\n        h5: pTag,\n        h6: pTag,\n        select: formTags,\n        input: formTags,\n        output: formTags,\n        button: formTags,\n        datalist: formTags,\n        textarea: formTags,\n        option: new Set([ "option" ]),\n        optgroup: new Set([ "optgroup", "option" ]),\n        dd: new Set([ "dt", "dd" ]),\n        dt: new Set([ "dt", "dd" ]),\n        address: pTag,\n        article: pTag,\n        aside: pTag,\n        blockquote: pTag,\n        details: pTag,\n        div: pTag,\n        dl: pTag,\n        fieldset: pTag,\n        figcaption: pTag,\n        figure: pTag,\n        footer: pTag,\n        form: pTag,\n        header: pTag,\n        hr: pTag,\n        main: pTag,\n        nav: pTag,\n        ol: pTag,\n        pre: pTag,\n        section: pTag,\n        table: pTag,\n        ul: pTag,\n        rt: new Set([ "rt", "rp" ]),\n        rp: new Set([ "rt", "rp" ]),\n        tbody: new Set([ "thead", "tbody" ]),\n        tfoot: new Set([ "thead", "tbody" ])\n    }, voidElements = new Set([ "area", "base", "basefont", "br", "col", "command", "embed", "frame", "hr", "img", "input", "isindex", "keygen", "link", "meta", "param", "source", "track", "wbr" ]), foreignContextElements = new Set([ "math", "svg" ]), htmlIntegrationElements = new Set([ "mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignObject", "desc", "title" ]), reNameEnd = /\\s|\\//, Parser = function(_super) {\n        function Parser(cbs, options) {\n            var _this = _super.call(this) || this;\n            return _this._tagname = "", _this._attribname = "", _this._attribvalue = "", _this._attribs = null, \n            _this._stack = [], _this._foreignContext = [], _this.startIndex = 0, _this.endIndex = null, \n            _this.parseChunk = Parser.prototype.write, _this.done = Parser.prototype.end, _this._options = options || {}, \n            _this._cbs = cbs || {}, _this._tagname = "", _this._attribname = "", _this._attribvalue = "", \n            _this._attribs = null, _this._stack = [], _this._foreignContext = [], _this.startIndex = 0, \n            _this.endIndex = null, _this._lowerCaseTagNames = "lowerCaseTags" in _this._options ? !!_this._options.lowerCaseTags : !_this._options.xmlMode, \n            _this._lowerCaseAttributeNames = "lowerCaseAttributeNames" in _this._options ? !!_this._options.lowerCaseAttributeNames : !_this._options.xmlMode, \n            _this._tokenizer = new (_this._options.Tokenizer || Tokenizer_1.default)(_this._options, _this), \n            _this._cbs.onparserinit && _this._cbs.onparserinit(_this), _this;\n        }\n        return __extends(Parser, _super), Parser.prototype._updatePosition = function(initialOffset) {\n            null === this.endIndex ? this._tokenizer._sectionStart <= initialOffset ? this.startIndex = 0 : this.startIndex = this._tokenizer._sectionStart - initialOffset : this.startIndex = this.endIndex + 1, \n            this.endIndex = this._tokenizer.getAbsoluteIndex();\n        }, Parser.prototype.ontext = function(data) {\n            this._updatePosition(1), this.endIndex--, this._cbs.ontext && this._cbs.ontext(data);\n        }, Parser.prototype.onopentagname = function(name) {\n            if (this._lowerCaseTagNames && (name = name.toLowerCase()), this._tagname = name, \n            !this._options.xmlMode && Object.prototype.hasOwnProperty.call(openImpliesClose, name)) for (var el = void 0; openImpliesClose[name].has(el = this._stack[this._stack.length - 1]); this.onclosetag(el)) ;\n            !this._options.xmlMode && voidElements.has(name) || (this._stack.push(name), foreignContextElements.has(name) ? this._foreignContext.push(!0) : htmlIntegrationElements.has(name) && this._foreignContext.push(!1)), \n            this._cbs.onopentagname && this._cbs.onopentagname(name), this._cbs.onopentag && (this._attribs = {});\n        }, Parser.prototype.onopentagend = function() {\n            this._updatePosition(1), this._attribs && (this._cbs.onopentag && this._cbs.onopentag(this._tagname, this._attribs), \n            this._attribs = null), !this._options.xmlMode && this._cbs.onclosetag && voidElements.has(this._tagname) && this._cbs.onclosetag(this._tagname), \n            this._tagname = "";\n        }, Parser.prototype.onclosetag = function(name) {\n            if (this._updatePosition(1), this._lowerCaseTagNames && (name = name.toLowerCase()), \n            (foreignContextElements.has(name) || htmlIntegrationElements.has(name)) && this._foreignContext.pop(), \n            !this._stack.length || !this._options.xmlMode && voidElements.has(name)) this._options.xmlMode || "br" !== name && "p" !== name || (this.onopentagname(name), \n            this._closeCurrentTag()); else {\n                var pos = this._stack.lastIndexOf(name);\n                if (-1 !== pos) if (this._cbs.onclosetag) for (pos = this._stack.length - pos; pos--; ) this._cbs.onclosetag(this._stack.pop()); else this._stack.length = pos; else "p" !== name || this._options.xmlMode || (this.onopentagname(name), \n                this._closeCurrentTag());\n            }\n        }, Parser.prototype.onselfclosingtag = function() {\n            this._options.xmlMode || this._options.recognizeSelfClosing || this._foreignContext[this._foreignContext.length - 1] ? this._closeCurrentTag() : this.onopentagend();\n        }, Parser.prototype._closeCurrentTag = function() {\n            var name = this._tagname;\n            this.onopentagend(), this._stack[this._stack.length - 1] === name && (this._cbs.onclosetag && this._cbs.onclosetag(name), \n            this._stack.pop());\n        }, Parser.prototype.onattribname = function(name) {\n            this._lowerCaseAttributeNames && (name = name.toLowerCase()), this._attribname = name;\n        }, Parser.prototype.onattribdata = function(value) {\n            this._attribvalue += value;\n        }, Parser.prototype.onattribend = function() {\n            this._cbs.onattribute && this._cbs.onattribute(this._attribname, this._attribvalue), \n            this._attribs && !Object.prototype.hasOwnProperty.call(this._attribs, this._attribname) && (this._attribs[this._attribname] = this._attribvalue), \n            this._attribname = "", this._attribvalue = "";\n        }, Parser.prototype._getInstructionName = function(value) {\n            var idx = value.search(reNameEnd), name = idx < 0 ? value : value.substr(0, idx);\n            return this._lowerCaseTagNames && (name = name.toLowerCase()), name;\n        }, Parser.prototype.ondeclaration = function(value) {\n            if (this._cbs.onprocessinginstruction) {\n                var name_1 = this._getInstructionName(value);\n                this._cbs.onprocessinginstruction("!" + name_1, "!" + value);\n            }\n        }, Parser.prototype.onprocessinginstruction = function(value) {\n            if (this._cbs.onprocessinginstruction) {\n                var name_2 = this._getInstructionName(value);\n                this._cbs.onprocessinginstruction("?" + name_2, "?" + value);\n            }\n        }, Parser.prototype.oncomment = function(value) {\n            this._updatePosition(4), this._cbs.oncomment && this._cbs.oncomment(value), this._cbs.oncommentend && this._cbs.oncommentend();\n        }, Parser.prototype.oncdata = function(value) {\n            this._updatePosition(1), this._options.xmlMode || this._options.recognizeCDATA ? (this._cbs.oncdatastart && this._cbs.oncdatastart(), \n            this._cbs.ontext && this._cbs.ontext(value), this._cbs.oncdataend && this._cbs.oncdataend()) : this.oncomment("[CDATA[" + value + "]]");\n        }, Parser.prototype.onerror = function(err) {\n            this._cbs.onerror && this._cbs.onerror(err);\n        }, Parser.prototype.onend = function() {\n            if (this._cbs.onclosetag) for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i])) ;\n            this._cbs.onend && this._cbs.onend();\n        }, Parser.prototype.reset = function() {\n            this._cbs.onreset && this._cbs.onreset(), this._tokenizer.reset(), this._tagname = "", \n            this._attribname = "", this._attribs = null, this._stack = [], this._cbs.onparserinit && this._cbs.onparserinit(this);\n        }, Parser.prototype.parseComplete = function(data) {\n            this.reset(), this.end(data);\n        }, Parser.prototype.write = function(chunk) {\n            this._tokenizer.write(chunk);\n        }, Parser.prototype.end = function(chunk) {\n            this._tokenizer.end(chunk);\n        }, Parser.prototype.pause = function() {\n            this._tokenizer.pause();\n        }, Parser.prototype.resume = function() {\n            this._tokenizer.resume();\n        }, Parser;\n    }(events_1.EventEmitter);\n    exports.Parser = Parser;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var decode_codepoint_1 = __importDefault(__webpack_require__(14)), entities_json_1 = __importDefault(__webpack_require__(9)), legacy_json_1 = __importDefault(__webpack_require__(15)), xml_json_1 = __importDefault(__webpack_require__(10));\n    function whitespace(c) {\n        return " " === c || "\\n" === c || "\\t" === c || "\\f" === c || "\\r" === c;\n    }\n    function ifElseState(upper, SUCCESS, FAILURE) {\n        var lower = upper.toLowerCase();\n        return upper === lower ? function(t, c) {\n            c === lower ? t._state = SUCCESS : (t._state = FAILURE, t._index--);\n        } : function(t, c) {\n            c === lower || c === upper ? t._state = SUCCESS : (t._state = FAILURE, t._index--);\n        };\n    }\n    function consumeSpecialNameChar(upper, NEXT_STATE) {\n        var lower = upper.toLowerCase();\n        return function(t, c) {\n            c === lower || c === upper ? t._state = NEXT_STATE : (t._state = 3, t._index--);\n        };\n    }\n    var stateBeforeCdata1 = ifElseState("C", 23, 16), stateBeforeCdata2 = ifElseState("D", 24, 16), stateBeforeCdata3 = ifElseState("A", 25, 16), stateBeforeCdata4 = ifElseState("T", 26, 16), stateBeforeCdata5 = ifElseState("A", 27, 16), stateBeforeScript1 = consumeSpecialNameChar("R", 34), stateBeforeScript2 = consumeSpecialNameChar("I", 35), stateBeforeScript3 = consumeSpecialNameChar("P", 36), stateBeforeScript4 = consumeSpecialNameChar("T", 37), stateAfterScript1 = ifElseState("R", 39, 1), stateAfterScript2 = ifElseState("I", 40, 1), stateAfterScript3 = ifElseState("P", 41, 1), stateAfterScript4 = ifElseState("T", 42, 1), stateBeforeStyle1 = consumeSpecialNameChar("Y", 44), stateBeforeStyle2 = consumeSpecialNameChar("L", 45), stateBeforeStyle3 = consumeSpecialNameChar("E", 46), stateAfterStyle1 = ifElseState("Y", 48, 1), stateAfterStyle2 = ifElseState("L", 49, 1), stateAfterStyle3 = ifElseState("E", 50, 1), stateBeforeEntity = ifElseState("#", 52, 53), stateBeforeNumericEntity = ifElseState("X", 55, 54), Tokenizer = function() {\n        function Tokenizer(options, cbs) {\n            this._state = 1, this._buffer = "", this._sectionStart = 0, this._index = 0, this._bufferOffset = 0, \n            this._baseState = 1, this._special = 1, this._running = !0, this._ended = !1, this._cbs = cbs, \n            this._xmlMode = !(!options || !options.xmlMode), this._decodeEntities = !(!options || !options.decodeEntities);\n        }\n        return Tokenizer.prototype.reset = function() {\n            this._state = 1, this._buffer = "", this._sectionStart = 0, this._index = 0, this._bufferOffset = 0, \n            this._baseState = 1, this._special = 1, this._running = !0, this._ended = !1;\n        }, Tokenizer.prototype._stateText = function(c) {\n            "<" === c ? (this._index > this._sectionStart && this._cbs.ontext(this._getSection()), \n            this._state = 2, this._sectionStart = this._index) : this._decodeEntities && 1 === this._special && "&" === c && (this._index > this._sectionStart && this._cbs.ontext(this._getSection()), \n            this._baseState = 1, this._state = 51, this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateBeforeTagName = function(c) {\n            "/" === c ? this._state = 5 : "<" === c ? (this._cbs.ontext(this._getSection()), \n            this._sectionStart = this._index) : ">" === c || 1 !== this._special || whitespace(c) ? this._state = 1 : "!" === c ? (this._state = 15, \n            this._sectionStart = this._index + 1) : "?" === c ? (this._state = 17, this._sectionStart = this._index + 1) : (this._state = this._xmlMode || "s" !== c && "S" !== c ? 3 : 31, \n            this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateInTagName = function(c) {\n            ("/" === c || ">" === c || whitespace(c)) && (this._emitToken("onopentagname"), \n            this._state = 8, this._index--);\n        }, Tokenizer.prototype._stateBeforeClosingTagName = function(c) {\n            whitespace(c) || (">" === c ? this._state = 1 : 1 !== this._special ? "s" === c || "S" === c ? this._state = 32 : (this._state = 1, \n            this._index--) : (this._state = 6, this._sectionStart = this._index));\n        }, Tokenizer.prototype._stateInClosingTagName = function(c) {\n            (">" === c || whitespace(c)) && (this._emitToken("onclosetag"), this._state = 7, \n            this._index--);\n        }, Tokenizer.prototype._stateAfterClosingTagName = function(c) {\n            ">" === c && (this._state = 1, this._sectionStart = this._index + 1);\n        }, Tokenizer.prototype._stateBeforeAttributeName = function(c) {\n            ">" === c ? (this._cbs.onopentagend(), this._state = 1, this._sectionStart = this._index + 1) : "/" === c ? this._state = 4 : whitespace(c) || (this._state = 9, \n            this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateInSelfClosingTag = function(c) {\n            ">" === c ? (this._cbs.onselfclosingtag(), this._state = 1, this._sectionStart = this._index + 1) : whitespace(c) || (this._state = 8, \n            this._index--);\n        }, Tokenizer.prototype._stateInAttributeName = function(c) {\n            ("=" === c || "/" === c || ">" === c || whitespace(c)) && (this._cbs.onattribname(this._getSection()), \n            this._sectionStart = -1, this._state = 10, this._index--);\n        }, Tokenizer.prototype._stateAfterAttributeName = function(c) {\n            "=" === c ? this._state = 11 : "/" === c || ">" === c ? (this._cbs.onattribend(), \n            this._state = 8, this._index--) : whitespace(c) || (this._cbs.onattribend(), this._state = 9, \n            this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateBeforeAttributeValue = function(c) {\n            \'"\' === c ? (this._state = 12, this._sectionStart = this._index + 1) : "\'" === c ? (this._state = 13, \n            this._sectionStart = this._index + 1) : whitespace(c) || (this._state = 14, this._sectionStart = this._index, \n            this._index--);\n        }, Tokenizer.prototype._stateInAttributeValueDoubleQuotes = function(c) {\n            \'"\' === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), this._state = 8) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n            this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateInAttributeValueSingleQuotes = function(c) {\n            "\'" === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), this._state = 8) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n            this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateInAttributeValueNoQuotes = function(c) {\n            whitespace(c) || ">" === c ? (this._emitToken("onattribdata"), this._cbs.onattribend(), \n            this._state = 8, this._index--) : this._decodeEntities && "&" === c && (this._emitToken("onattribdata"), \n            this._baseState = this._state, this._state = 51, this._sectionStart = this._index);\n        }, Tokenizer.prototype._stateBeforeDeclaration = function(c) {\n            this._state = "[" === c ? 22 : "-" === c ? 18 : 16;\n        }, Tokenizer.prototype._stateInDeclaration = function(c) {\n            ">" === c && (this._cbs.ondeclaration(this._getSection()), this._state = 1, this._sectionStart = this._index + 1);\n        }, Tokenizer.prototype._stateInProcessingInstruction = function(c) {\n            ">" === c && (this._cbs.onprocessinginstruction(this._getSection()), this._state = 1, \n            this._sectionStart = this._index + 1);\n        }, Tokenizer.prototype._stateBeforeComment = function(c) {\n            "-" === c ? (this._state = 19, this._sectionStart = this._index + 1) : this._state = 16;\n        }, Tokenizer.prototype._stateInComment = function(c) {\n            "-" === c && (this._state = 20);\n        }, Tokenizer.prototype._stateAfterComment1 = function(c) {\n            this._state = "-" === c ? 21 : 19;\n        }, Tokenizer.prototype._stateAfterComment2 = function(c) {\n            ">" === c ? (this._cbs.oncomment(this._buffer.substring(this._sectionStart, this._index - 2)), \n            this._state = 1, this._sectionStart = this._index + 1) : "-" !== c && (this._state = 19);\n        }, Tokenizer.prototype._stateBeforeCdata6 = function(c) {\n            "[" === c ? (this._state = 28, this._sectionStart = this._index + 1) : (this._state = 16, \n            this._index--);\n        }, Tokenizer.prototype._stateInCdata = function(c) {\n            "]" === c && (this._state = 29);\n        }, Tokenizer.prototype._stateAfterCdata1 = function(c) {\n            this._state = "]" === c ? 30 : 28;\n        }, Tokenizer.prototype._stateAfterCdata2 = function(c) {\n            ">" === c ? (this._cbs.oncdata(this._buffer.substring(this._sectionStart, this._index - 2)), \n            this._state = 1, this._sectionStart = this._index + 1) : "]" !== c && (this._state = 28);\n        }, Tokenizer.prototype._stateBeforeSpecial = function(c) {\n            "c" === c || "C" === c ? this._state = 33 : "t" === c || "T" === c ? this._state = 43 : (this._state = 3, \n            this._index--);\n        }, Tokenizer.prototype._stateBeforeSpecialEnd = function(c) {\n            2 !== this._special || "c" !== c && "C" !== c ? 3 !== this._special || "t" !== c && "T" !== c ? this._state = 1 : this._state = 47 : this._state = 38;\n        }, Tokenizer.prototype._stateBeforeScript5 = function(c) {\n            ("/" === c || ">" === c || whitespace(c)) && (this._special = 2), this._state = 3, \n            this._index--;\n        }, Tokenizer.prototype._stateAfterScript5 = function(c) {\n            ">" === c || whitespace(c) ? (this._special = 1, this._state = 6, this._sectionStart = this._index - 6, \n            this._index--) : this._state = 1;\n        }, Tokenizer.prototype._stateBeforeStyle4 = function(c) {\n            ("/" === c || ">" === c || whitespace(c)) && (this._special = 3), this._state = 3, \n            this._index--;\n        }, Tokenizer.prototype._stateAfterStyle4 = function(c) {\n            ">" === c || whitespace(c) ? (this._special = 1, this._state = 6, this._sectionStart = this._index - 5, \n            this._index--) : this._state = 1;\n        }, Tokenizer.prototype._parseNamedEntityStrict = function() {\n            if (this._sectionStart + 1 < this._index) {\n                var entity = this._buffer.substring(this._sectionStart + 1, this._index), map = this._xmlMode ? xml_json_1.default : entities_json_1.default;\n                Object.prototype.hasOwnProperty.call(map, entity) && (this._emitPartial(map[entity]), \n                this._sectionStart = this._index + 1);\n            }\n        }, Tokenizer.prototype._parseLegacyEntity = function() {\n            var start = this._sectionStart + 1, limit = this._index - start;\n            for (limit > 6 && (limit = 6); limit >= 2; ) {\n                var entity = this._buffer.substr(start, limit);\n                if (Object.prototype.hasOwnProperty.call(legacy_json_1.default, entity)) return this._emitPartial(legacy_json_1.default[entity]), \n                void (this._sectionStart += limit + 1);\n                limit--;\n            }\n        }, Tokenizer.prototype._stateInNamedEntity = function(c) {\n            ";" === c ? (this._parseNamedEntityStrict(), this._sectionStart + 1 < this._index && !this._xmlMode && this._parseLegacyEntity(), \n            this._state = this._baseState) : (c < "a" || c > "z") && (c < "A" || c > "Z") && (c < "0" || c > "9") && (this._xmlMode || this._sectionStart + 1 === this._index || (1 !== this._baseState ? "=" !== c && this._parseNamedEntityStrict() : this._parseLegacyEntity()), \n            this._state = this._baseState, this._index--);\n        }, Tokenizer.prototype._decodeNumericEntity = function(offset, base) {\n            var sectionStart = this._sectionStart + offset;\n            if (sectionStart !== this._index) {\n                var entity = this._buffer.substring(sectionStart, this._index), parsed = parseInt(entity, base);\n                this._emitPartial(decode_codepoint_1.default(parsed)), this._sectionStart = this._index;\n            } else this._sectionStart--;\n            this._state = this._baseState;\n        }, Tokenizer.prototype._stateInNumericEntity = function(c) {\n            ";" === c ? (this._decodeNumericEntity(2, 10), this._sectionStart++) : (c < "0" || c > "9") && (this._xmlMode ? this._state = this._baseState : this._decodeNumericEntity(2, 10), \n            this._index--);\n        }, Tokenizer.prototype._stateInHexEntity = function(c) {\n            ";" === c ? (this._decodeNumericEntity(3, 16), this._sectionStart++) : (c < "a" || c > "f") && (c < "A" || c > "F") && (c < "0" || c > "9") && (this._xmlMode ? this._state = this._baseState : this._decodeNumericEntity(3, 16), \n            this._index--);\n        }, Tokenizer.prototype._cleanup = function() {\n            this._sectionStart < 0 ? (this._buffer = "", this._bufferOffset += this._index, \n            this._index = 0) : this._running && (1 === this._state ? (this._sectionStart !== this._index && this._cbs.ontext(this._buffer.substr(this._sectionStart)), \n            this._buffer = "", this._bufferOffset += this._index, this._index = 0) : this._sectionStart === this._index ? (this._buffer = "", \n            this._bufferOffset += this._index, this._index = 0) : (this._buffer = this._buffer.substr(this._sectionStart), \n            this._index -= this._sectionStart, this._bufferOffset += this._sectionStart), this._sectionStart = 0);\n        }, Tokenizer.prototype.write = function(chunk) {\n            this._ended && this._cbs.onerror(Error(".write() after done!")), this._buffer += chunk, \n            this._parse();\n        }, Tokenizer.prototype._parse = function() {\n            for (;this._index < this._buffer.length && this._running; ) {\n                var c = this._buffer.charAt(this._index);\n                1 === this._state ? this._stateText(c) : 12 === this._state ? this._stateInAttributeValueDoubleQuotes(c) : 9 === this._state ? this._stateInAttributeName(c) : 19 === this._state ? this._stateInComment(c) : 8 === this._state ? this._stateBeforeAttributeName(c) : 3 === this._state ? this._stateInTagName(c) : 6 === this._state ? this._stateInClosingTagName(c) : 2 === this._state ? this._stateBeforeTagName(c) : 10 === this._state ? this._stateAfterAttributeName(c) : 13 === this._state ? this._stateInAttributeValueSingleQuotes(c) : 11 === this._state ? this._stateBeforeAttributeValue(c) : 5 === this._state ? this._stateBeforeClosingTagName(c) : 7 === this._state ? this._stateAfterClosingTagName(c) : 31 === this._state ? this._stateBeforeSpecial(c) : 20 === this._state ? this._stateAfterComment1(c) : 14 === this._state ? this._stateInAttributeValueNoQuotes(c) : 4 === this._state ? this._stateInSelfClosingTag(c) : 16 === this._state ? this._stateInDeclaration(c) : 15 === this._state ? this._stateBeforeDeclaration(c) : 21 === this._state ? this._stateAfterComment2(c) : 18 === this._state ? this._stateBeforeComment(c) : 32 === this._state ? this._stateBeforeSpecialEnd(c) : 38 === this._state ? stateAfterScript1(this, c) : 39 === this._state ? stateAfterScript2(this, c) : 40 === this._state ? stateAfterScript3(this, c) : 33 === this._state ? stateBeforeScript1(this, c) : 34 === this._state ? stateBeforeScript2(this, c) : 35 === this._state ? stateBeforeScript3(this, c) : 36 === this._state ? stateBeforeScript4(this, c) : 37 === this._state ? this._stateBeforeScript5(c) : 41 === this._state ? stateAfterScript4(this, c) : 42 === this._state ? this._stateAfterScript5(c) : 43 === this._state ? stateBeforeStyle1(this, c) : 28 === this._state ? this._stateInCdata(c) : 44 === this._state ? stateBeforeStyle2(this, c) : 45 === this._state ? stateBeforeStyle3(this, c) : 46 === this._state ? this._stateBeforeStyle4(c) : 47 === this._state ? stateAfterStyle1(this, c) : 48 === this._state ? stateAfterStyle2(this, c) : 49 === this._state ? stateAfterStyle3(this, c) : 50 === this._state ? this._stateAfterStyle4(c) : 17 === this._state ? this._stateInProcessingInstruction(c) : 53 === this._state ? this._stateInNamedEntity(c) : 22 === this._state ? stateBeforeCdata1(this, c) : 51 === this._state ? stateBeforeEntity(this, c) : 23 === this._state ? stateBeforeCdata2(this, c) : 24 === this._state ? stateBeforeCdata3(this, c) : 29 === this._state ? this._stateAfterCdata1(c) : 30 === this._state ? this._stateAfterCdata2(c) : 25 === this._state ? stateBeforeCdata4(this, c) : 26 === this._state ? stateBeforeCdata5(this, c) : 27 === this._state ? this._stateBeforeCdata6(c) : 55 === this._state ? this._stateInHexEntity(c) : 54 === this._state ? this._stateInNumericEntity(c) : 52 === this._state ? stateBeforeNumericEntity(this, c) : this._cbs.onerror(Error("unknown _state"), this._state), \n                this._index++;\n            }\n            this._cleanup();\n        }, Tokenizer.prototype.pause = function() {\n            this._running = !1;\n        }, Tokenizer.prototype.resume = function() {\n            this._running = !0, this._index < this._buffer.length && this._parse(), this._ended && this._finish();\n        }, Tokenizer.prototype.end = function(chunk) {\n            this._ended && this._cbs.onerror(Error(".end() after done!")), chunk && this.write(chunk), \n            this._ended = !0, this._running && this._finish();\n        }, Tokenizer.prototype._finish = function() {\n            this._sectionStart < this._index && this._handleTrailingData(), this._cbs.onend();\n        }, Tokenizer.prototype._handleTrailingData = function() {\n            var data = this._buffer.substr(this._sectionStart);\n            28 === this._state || 29 === this._state || 30 === this._state ? this._cbs.oncdata(data) : 19 === this._state || 20 === this._state || 21 === this._state ? this._cbs.oncomment(data) : 53 !== this._state || this._xmlMode ? 54 !== this._state || this._xmlMode ? 55 !== this._state || this._xmlMode ? 3 !== this._state && 8 !== this._state && 11 !== this._state && 10 !== this._state && 9 !== this._state && 13 !== this._state && 12 !== this._state && 14 !== this._state && 6 !== this._state && this._cbs.ontext(data) : (this._decodeNumericEntity(3, 16), \n            this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData())) : (this._decodeNumericEntity(2, 10), \n            this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData())) : (this._parseLegacyEntity(), \n            this._sectionStart < this._index && (this._state = this._baseState, this._handleTrailingData()));\n        }, Tokenizer.prototype.getAbsoluteIndex = function() {\n            return this._bufferOffset + this._index;\n        }, Tokenizer.prototype._getSection = function() {\n            return this._buffer.substring(this._sectionStart, this._index);\n        }, Tokenizer.prototype._emitToken = function(name) {\n            this._cbs[name](this._getSection()), this._sectionStart = -1;\n        }, Tokenizer.prototype._emitPartial = function(value) {\n            1 !== this._baseState ? this._cbs.onattribdata(value) : this._cbs.ontext(value);\n        }, Tokenizer;\n    }();\n    exports.default = Tokenizer;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var decode_json_1 = __importDefault(__webpack_require__(30));\n    exports.default = function(codePoint) {\n        if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) return "\\ufffd";\n        codePoint in decode_json_1.default && (codePoint = decode_json_1.default[codePoint]);\n        var output = "";\n        return codePoint > 65535 && (codePoint -= 65536, output += String.fromCharCode(codePoint >>> 10 & 1023 | 55296), \n        codePoint = 56320 | 1023 & codePoint), output += String.fromCharCode(codePoint);\n    };\n}, function(module) {\n    module.exports = JSON.parse(\'{"Aacute":"\\xc1","aacute":"\\xe1","Acirc":"\\xc2","acirc":"\\xe2","acute":"\\xb4","AElig":"\\xc6","aelig":"\\xe6","Agrave":"\\xc0","agrave":"\\xe0","amp":"&","AMP":"&","Aring":"\\xc5","aring":"\\xe5","Atilde":"\\xc3","atilde":"\\xe3","Auml":"\\xc4","auml":"\\xe4","brvbar":"\\xa6","Ccedil":"\\xc7","ccedil":"\\xe7","cedil":"\\xb8","cent":"\\xa2","copy":"\\xa9","COPY":"\\xa9","curren":"\\xa4","deg":"\\xb0","divide":"\\xf7","Eacute":"\\xc9","eacute":"\\xe9","Ecirc":"\\xca","ecirc":"\\xea","Egrave":"\\xc8","egrave":"\\xe8","ETH":"\\xd0","eth":"\\xf0","Euml":"\\xcb","euml":"\\xeb","frac12":"\\xbd","frac14":"\\xbc","frac34":"\\xbe","gt":">","GT":">","Iacute":"\\xcd","iacute":"\\xed","Icirc":"\\xce","icirc":"\\xee","iexcl":"\\xa1","Igrave":"\\xcc","igrave":"\\xec","iquest":"\\xbf","Iuml":"\\xcf","iuml":"\\xef","laquo":"\\xab","lt":"<","LT":"<","macr":"\\xaf","micro":"\\xb5","middot":"\\xb7","nbsp":"\\xa0","not":"\\xac","Ntilde":"\\xd1","ntilde":"\\xf1","Oacute":"\\xd3","oacute":"\\xf3","Ocirc":"\\xd4","ocirc":"\\xf4","Ograve":"\\xd2","ograve":"\\xf2","ordf":"\\xaa","ordm":"\\xba","Oslash":"\\xd8","oslash":"\\xf8","Otilde":"\\xd5","otilde":"\\xf5","Ouml":"\\xd6","ouml":"\\xf6","para":"\\xb6","plusmn":"\\xb1","pound":"\\xa3","quot":"\\\\"","QUOT":"\\\\"","raquo":"\\xbb","reg":"\\xae","REG":"\\xae","sect":"\\xa7","shy":"\\xad","sup1":"\\xb9","sup2":"\\xb2","sup3":"\\xb3","szlig":"\\xdf","THORN":"\\xde","thorn":"\\xfe","times":"\\xd7","Uacute":"\\xda","uacute":"\\xfa","Ucirc":"\\xdb","ucirc":"\\xfb","Ugrave":"\\xd9","ugrave":"\\xf9","uml":"\\xa8","Uuml":"\\xdc","uuml":"\\xfc","Yacute":"\\xdd","yacute":"\\xfd","yen":"\\xa5","yuml":"\\xff"}\');\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var node_1 = __webpack_require__(32);\n    exports.Node = node_1.Node, exports.Element = node_1.Element, exports.DataNode = node_1.DataNode, \n    exports.NodeWithChildren = node_1.NodeWithChildren;\n    var reWhitespace = /\\s+/g, defaultOpts = {\n        normalizeWhitespace: !1,\n        withStartIndices: !1,\n        withEndIndices: !1\n    }, DomHandler = function() {\n        function DomHandler(callback, options, elementCB) {\n            this.dom = [], this._done = !1, this._tagStack = [], this._lastNode = null, this._parser = null, \n            "function" == typeof options && (elementCB = options, options = defaultOpts), "object" == typeof callback && (options = callback, \n            callback = void 0), this._callback = callback || null, this._options = options || defaultOpts, \n            this._elementCB = elementCB || null;\n        }\n        return DomHandler.prototype.onparserinit = function(parser) {\n            this._parser = parser;\n        }, DomHandler.prototype.onreset = function() {\n            this.dom = [], this._done = !1, this._tagStack = [], this._lastNode = null, this._parser = this._parser || null;\n        }, DomHandler.prototype.onend = function() {\n            this._done || (this._done = !0, this._parser = null, this.handleCallback(null));\n        }, DomHandler.prototype.onerror = function(error) {\n            this.handleCallback(error);\n        }, DomHandler.prototype.onclosetag = function() {\n            this._lastNode = null;\n            var elem = this._tagStack.pop();\n            elem && this._parser && (this._options.withEndIndices && (elem.endIndex = this._parser.endIndex), \n            this._elementCB && this._elementCB(elem));\n        }, DomHandler.prototype.onopentag = function(name, attribs) {\n            var element = new node_1.Element(name, attribs);\n            this.addNode(element), this._tagStack.push(element);\n        }, DomHandler.prototype.ontext = function(data) {\n            var normalize = this._options.normalizeWhitespace, _lastNode = this._lastNode;\n            if (_lastNode && "text" === _lastNode.type) normalize ? _lastNode.data = (_lastNode.data + data).replace(reWhitespace, " ") : _lastNode.data += data; else {\n                normalize && (data = data.replace(reWhitespace, " "));\n                var node = new node_1.DataNode("text", data);\n                this.addNode(node), this._lastNode = node;\n            }\n        }, DomHandler.prototype.oncomment = function(data) {\n            if (this._lastNode && "comment" === this._lastNode.type) this._lastNode.data += data; else {\n                var node = new node_1.DataNode("comment", data);\n                this.addNode(node), this._lastNode = node;\n            }\n        }, DomHandler.prototype.oncommentend = function() {\n            this._lastNode = null;\n        }, DomHandler.prototype.oncdatastart = function() {\n            var text = new node_1.DataNode("text", ""), node = new node_1.NodeWithChildren("cdata", [ text ]);\n            this.addNode(node), text.parent = node, this._lastNode = text;\n        }, DomHandler.prototype.oncdataend = function() {\n            this._lastNode = null;\n        }, DomHandler.prototype.onprocessinginstruction = function(name, data) {\n            var node = new node_1.ProcessingInstruction(name, data);\n            this.addNode(node);\n        }, DomHandler.prototype.handleCallback = function(error) {\n            if ("function" == typeof this._callback) this._callback(error, this.dom); else if (error) throw error;\n        }, DomHandler.prototype.addNode = function(node) {\n            var parent = this._tagStack[this._tagStack.length - 1], siblings = parent ? parent.children : this.dom, previousSibling = siblings[siblings.length - 1];\n            this._parser && (this._options.withStartIndices && (node.startIndex = this._parser.startIndex), \n            this._options.withEndIndices && (node.endIndex = this._parser.endIndex)), siblings.push(node), \n            previousSibling && (node.prev = previousSibling, previousSibling.next = node), parent && (node.parent = parent), \n            this._lastNode = null;\n        }, DomHandler.prototype.addDataNode = function(node) {\n            this.addNode(node), this._lastNode = node;\n        }, DomHandler;\n    }();\n    exports.DomHandler = DomHandler, exports.default = DomHandler;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n        return (extendStatics = Object.setPrototypeOf || {\n            __proto__: []\n        } instanceof Array && function(d, b) {\n            d.__proto__ = b;\n        } || function(d, b) {\n            for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n        })(d, b);\n    }, function(d, b) {\n        function __() {\n            this.constructor = d;\n        }\n        extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n        new __);\n    }), __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    }, __importStar = this && this.__importStar || function(mod) {\n        if (mod && mod.__esModule) return mod;\n        var result = {};\n        if (null != mod) for (var k in mod) Object.hasOwnProperty.call(mod, k) && (result[k] = mod[k]);\n        return result.default = mod, result;\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var domhandler_1 = __importDefault(__webpack_require__(16)), DomUtils = __importStar(__webpack_require__(18)), Parser_1 = __webpack_require__(12), FeedHandler = function(_super) {\n        function FeedHandler(callback, options) {\n            return "object" == typeof callback && null !== callback && (options = callback = void 0), \n            _super.call(this, callback, options) || this;\n        }\n        return __extends(FeedHandler, _super), FeedHandler.prototype.onend = function() {\n            var feed = {}, feedRoot = getOneElement(isValidFeed, this.dom);\n            if (feedRoot) if ("feed" === feedRoot.name) {\n                var childs = feedRoot.children;\n                feed.type = "atom", addConditionally(feed, "id", "id", childs), addConditionally(feed, "title", "title", childs);\n                var href = getAttribute("href", getOneElement("link", childs));\n                href && (feed.link = href), addConditionally(feed, "description", "subtitle", childs), \n                (updated = fetch("updated", childs)) && (feed.updated = new Date(updated)), addConditionally(feed, "author", "email", childs, !0), \n                feed.items = getElements("entry", childs).map((function(item) {\n                    var entry = {}, children = item.children;\n                    addConditionally(entry, "id", "id", children), addConditionally(entry, "title", "title", children);\n                    var href = getAttribute("href", getOneElement("link", children));\n                    href && (entry.link = href);\n                    var description = fetch("summary", children) || fetch("content", children);\n                    description && (entry.description = description);\n                    var pubDate = fetch("updated", children);\n                    return pubDate && (entry.pubDate = new Date(pubDate)), entry;\n                }));\n            } else {\n                var updated;\n                childs = getOneElement("channel", feedRoot.children).children;\n                feed.type = feedRoot.name.substr(0, 3), feed.id = "", addConditionally(feed, "title", "title", childs), \n                addConditionally(feed, "link", "link", childs), addConditionally(feed, "description", "description", childs), \n                (updated = fetch("lastBuildDate", childs)) && (feed.updated = new Date(updated)), \n                addConditionally(feed, "author", "managingEditor", childs, !0), feed.items = getElements("item", feedRoot.children).map((function(item) {\n                    var entry = {}, children = item.children;\n                    addConditionally(entry, "id", "guid", children), addConditionally(entry, "title", "title", children), \n                    addConditionally(entry, "link", "link", children), addConditionally(entry, "description", "description", children);\n                    var pubDate = fetch("pubDate", children);\n                    return pubDate && (entry.pubDate = new Date(pubDate)), entry;\n                }));\n            }\n            this.feed = feed, this.handleCallback(feedRoot ? null : Error("couldn\'t find root of feed"));\n        }, FeedHandler;\n    }(domhandler_1.default);\n    function getElements(what, where) {\n        return DomUtils.getElementsByTagName(what, where, !0);\n    }\n    function getOneElement(what, where) {\n        return DomUtils.getElementsByTagName(what, where, !0, 1)[0];\n    }\n    function fetch(what, where, recurse) {\n        return void 0 === recurse && (recurse = !1), DomUtils.getText(DomUtils.getElementsByTagName(what, where, recurse, 1)).trim();\n    }\n    function getAttribute(name, elem) {\n        return elem ? elem.attribs[name] : null;\n    }\n    function addConditionally(obj, prop, what, where, recurse) {\n        void 0 === recurse && (recurse = !1);\n        var tmp = fetch(what, where, recurse);\n        tmp && (obj[prop] = tmp);\n    }\n    function isValidFeed(value) {\n        return "rss" === value || "feed" === value || "rdf:RDF" === value;\n    }\n    exports.FeedHandler = FeedHandler;\n    var defaultOptions = {\n        xmlMode: !0\n    };\n    exports.parseFeed = function(feed, options) {\n        void 0 === options && (options = defaultOptions);\n        var handler = new FeedHandler(options);\n        return new Parser_1.Parser(handler, options).end(feed), handler.feed;\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    function __export(m) {\n        for (var p in m) exports.hasOwnProperty(p) || (exports[p] = m[p]);\n    }\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    }), __export(__webpack_require__(33)), __export(__webpack_require__(37)), __export(__webpack_require__(38)), \n    __export(__webpack_require__(21)), __export(__webpack_require__(39)), __export(__webpack_require__(40)), \n    __export(__webpack_require__(8));\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var entities_json_1 = __importDefault(__webpack_require__(9)), legacy_json_1 = __importDefault(__webpack_require__(15)), xml_json_1 = __importDefault(__webpack_require__(10)), decode_codepoint_1 = __importDefault(__webpack_require__(14));\n    function getStrictDecoder(map) {\n        var keys = Object.keys(map).join("|"), replace = getReplacer(map), re = new RegExp("&(?:" + (keys += "|#[xX][\\\\da-fA-F]+|#\\\\d+") + ");", "g");\n        return function(str) {\n            return String(str).replace(re, replace);\n        };\n    }\n    exports.decodeXML = getStrictDecoder(xml_json_1.default), exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default);\n    var sorter = function(a, b) {\n        return a < b ? 1 : -1;\n    };\n    function getReplacer(map) {\n        return function(str) {\n            return "#" === str.charAt(1) ? "X" === str.charAt(2) || "x" === str.charAt(2) ? decode_codepoint_1.default(parseInt(str.substr(3), 16)) : decode_codepoint_1.default(parseInt(str.substr(2), 10)) : map[str.slice(1, -1)];\n        };\n    }\n    exports.decodeHTML = function() {\n        for (var legacy = Object.keys(legacy_json_1.default).sort(sorter), keys = Object.keys(entities_json_1.default).sort(sorter), i = 0, j = 0; i < keys.length; i++) legacy[j] === keys[i] ? (keys[i] += ";?", \n        j++) : keys[i] += ";";\n        var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\\\da-fA-F]+;?|#\\\\d+;?)", "g"), replace = getReplacer(entities_json_1.default);\n        function replacer(str) {\n            return ";" !== str.substr(-1) && (str += ";"), replace(str);\n        }\n        return function(str) {\n            return String(str).replace(re, replacer);\n        };\n    }();\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var inverseXML = getInverseObj(__importDefault(__webpack_require__(10)).default), xmlReplacer = getInverseReplacer(inverseXML);\n    exports.encodeXML = getInverse(inverseXML, xmlReplacer);\n    var inverseHTML = getInverseObj(__importDefault(__webpack_require__(9)).default), htmlReplacer = getInverseReplacer(inverseHTML);\n    function getInverseObj(obj) {\n        return Object.keys(obj).sort().reduce((function(inverse, name) {\n            return inverse[obj[name]] = "&" + name + ";", inverse;\n        }), {});\n    }\n    function getInverseReplacer(inverse) {\n        var single = [], multiple = [];\n        return Object.keys(inverse).forEach((function(k) {\n            return 1 === k.length ? single.push("\\\\" + k) : multiple.push(k);\n        })), multiple.unshift("[" + single.join("") + "]"), new RegExp(multiple.join("|"), "g");\n    }\n    exports.encodeHTML = getInverse(inverseHTML, htmlReplacer);\n    var reNonASCII = /[^\\0-\\x7F]/g, reAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n    function singleCharReplacer(c) {\n        return "&#x" + c.charCodeAt(0).toString(16).toUpperCase() + ";";\n    }\n    function astralReplacer(c, _) {\n        return "&#x" + (1024 * (c.charCodeAt(0) - 55296) + c.charCodeAt(1) - 56320 + 65536).toString(16).toUpperCase() + ";";\n    }\n    function getInverse(inverse, re) {\n        return function(data) {\n            return data.replace(re, (function(name) {\n                return inverse[name];\n            })).replace(reAstralSymbols, astralReplacer).replace(reNonASCII, singleCharReplacer);\n        };\n    }\n    var reXmlChars = getInverseReplacer(inverseXML);\n    exports.escape = function(data) {\n        return data.replace(reXmlChars, singleCharReplacer).replace(reAstralSymbols, astralReplacer).replace(reNonASCII, singleCharReplacer);\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var tagtypes_1 = __webpack_require__(8);\n    function find(test, elems, recurse, limit) {\n        for (var result = [], i = 0; i < elems.length; i++) {\n            var elem = elems[i];\n            if (test(elem) && (result.push(elem), --limit <= 0)) break;\n            if (recurse && tagtypes_1.hasChildren(elem) && elem.children.length > 0) {\n                var children = find(test, elem.children, recurse, limit);\n                if (result = result.concat(children), (limit -= children.length) <= 0) break;\n            }\n        }\n        return result;\n    }\n    exports.filter = function(test, element, recurse, limit) {\n        return void 0 === recurse && (recurse = !0), void 0 === limit && (limit = 1 / 0), \n        Array.isArray(element) || (element = [ element ]), find(test, element, recurse, limit);\n    }, exports.find = find, exports.findOneChild = function(test, elems) {\n        for (var i = 0; i < elems.length; i++) if (test(elems[i])) return elems[i];\n        return null;\n    }, exports.findOne = function findOne(test, elems, recurse) {\n        void 0 === recurse && (recurse = !0);\n        for (var elem = null, i = 0; i < elems.length && !elem; i++) {\n            var checked = elems[i];\n            tagtypes_1.isTag(checked) && (test(checked) ? elem = checked : recurse && checked.children.length > 0 && (elem = findOne(test, checked.children)));\n        }\n        return elem;\n    }, exports.existsOne = function existsOne(test, elems) {\n        for (var i = 0; i < elems.length; i++) {\n            var checked = elems[i];\n            if (tagtypes_1.isTag(checked) && (test(checked) || checked.children.length > 0 && existsOne(test, checked.children))) return !0;\n        }\n        return !1;\n    }, exports.findAll = function(test, rootElems) {\n        for (var result = [], stack = rootElems.slice(); stack.length; ) {\n            var elem = stack.shift();\n            elem && tagtypes_1.isTag(elem) && (elem.children && elem.children.length > 0 && stack.unshift.apply(stack, elem.children), \n            test(elem) && result.push(elem));\n        }\n        return result;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_exports__.a = {\n        LETTER_PATTERN: "A-Za-z\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B4\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0AF9\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58-\\\\u0C5A\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D5F-\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F5\\\\u13F8-\\\\u13FD\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16F1-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FD5\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6E5\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA7AD\\\\uA7B0-\\\\uA7B7\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA8FD\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB65\\\\uAB70-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC",\n        COMMENT_UNDERLAY_FOCUSED_COLOR: "#eaf3ff",\n        COMMENT_UNDERLAY_TARGET_COLOR: "#ffedb8",\n        COMMENT_UNDERLAY_NEW_COLOR: "#e8ffd1",\n        COMMENT_UNDERLAY_OWN_COLOR: "#f7ebff",\n        COMMENT_UNDERLAY_SIDE_MARGIN: 5,\n        HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,\n        CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,\n        BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,\n        SECONDS_IN_A_DAY: 86400,\n        MILLISECONDS_IN_A_MINUTE: 6e4,\n        POPULAR_NOT_INLINE_ELEMENTS: [ "BLOCKQUOTE", "DD", "DIV", "DL", "FORM", "H2", "H3", "H4", "H5", "H6", "HR", "INPUT", "LI", "OL", "P", "PRE", "TABLE", "TBODY", "TR", "TH", "TD", "UL" ],\n        POPULAR_INLINE_ELEMENTS: [ "A", "ABBR", "B", "BIG", "BR", "CITE", "CODE", "EM", "FONT", "I", "IMG", "KBD", "S", "SMALL", "SPAN", "STRIKE", "STRONG", "SUB", "SUP", "TT", "U", "VAR" ],\n        UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [ "mw-empty-elt", "tleft", "tright", "floatleft", "floatright" ],\n        BAD_COMMENT_BEGINNINGS: [ /^\x3c!--[^]*?--\x3e *\\n*/, /^(?:----+|<hr>) *\\n*/, /^\\{\\|.*?\\|\\} *\\n*(?=[*:#])/ ],\n        FLOATING_ELEMENTS_SELECTORS: [ ".cd-floating", ".tright", ".floatright", \'*[style*="float:right"]\', \'*[style*="float: right"]\', \'*[style*="float:left"]\', \'*[style*="float: left"]\' ],\n        SIGN_CODE: "~~".concat("~~")\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_exports__.a = {\n        init() {\n            this.timerTotal = {}, this.timerStartTimestamps = {}, this.timerRunCount = {}, this.timerAllRunsTotal = {}, \n            this.initCounters(), this.array = [], this.object = {};\n        },\n        initCounters() {\n            this.counters = "undefined" == typeof Proxy ? {} : new Proxy({}, {\n                get: (obj, prop) => prop in obj ? obj[prop] : 0\n            });\n        },\n        startTimer(label) {\n            this.timerStartTimestamps[label] = Date.now();\n        },\n        stopTimer(label) {\n            if (void 0 === this.timerStartTimestamps[label]) return;\n            void 0 === this.timerTotal[label] && (this.timerTotal[label] = 0);\n            const thisTime = Date.now() - this.timerStartTimestamps[label];\n            this.timerTotal[label] += thisTime, delete this.timerStartTimestamps[label], void 0 === this.timerAllRunsTotal[label] && (this.timerAllRunsTotal[label] = 0, \n            this.timerRunCount[label] = 0), this.timerAllRunsTotal[label] += thisTime, this.timerRunCount[label]++;\n        },\n        resetTimer(label) {\n            void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), delete this.timerTotal[label];\n        },\n        fullResetTimer(label) {\n            this.resetTimer(label), delete this.timerAllRunsTotal[label], delete this.timerRunCount[label];\n        },\n        logAndResetTimer(label) {\n            void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), void 0 !== this.timerTotal[label] && (console.debug("".concat(label, ": ").concat(this.timerTotal[label])), \n            this.resetTimer(label));\n        },\n        logAndResetEverything(sort) {\n            const timerLabels = Object.keys(this.timerTotal);\n            sort && timerLabels.sort(), timerLabels.forEach(label => {\n                this.logAndResetTimer(label);\n            });\n            const counterLabels = Object.keys(this.counters);\n            sort && counterLabels.sort(), counterLabels.forEach(label => {\n                console.debug("counter ".concat(label, ": ").concat(this.counters[label]));\n            }), this.initCounters(), this.array.length && (console.debug("array: ", this.array), \n            this.array = []), Object.keys(this.object).length && (console.debug("object: ", this.object), \n            this.object = {});\n        },\n        averageTimerTime(label) {\n            if (!this.timerAllRunsTotal[label]) return void console.error("No data for timer ".concat(label));\n            const average = this.timerAllRunsTotal[label] / this.timerRunCount[label];\n            console.debug("".concat(label, ": ").concat(average.toFixed(1), " average for ").concat(this.timerRunCount[label], " runs"));\n        },\n        incrementCounter(label) {\n            this.counters[label]++;\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return CommentSkeleton;\n    }));\n    var _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2), _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__), _CdError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3), _cd__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0);\n    class CommentSkeleton {\n        constructor(parser, signature) {\n            _parser.set(this, {\n                writable: !0,\n                value: void 0\n            }), _cachedSection.set(this, {\n                writable: !0,\n                value: void 0\n            }), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _parser, parser);\n            let parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).collectParts(signature.element);\n            parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).removeNestedParts(parts), \n            parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).encloseInlineParts(parts, signature.element), \n            parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).filterParts(parts), \n            parts.reverse(), parts = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).replaceListsWithItems(parts, signature.element), \n            this.id = _cd__WEBPACK_IMPORTED_MODULE_3__.a.comments.length, this.date = signature.date || null, \n            this.timestamp = signature.timestampText, this.authorName = signature.authorName, \n            this.own = this.authorName === _cd__WEBPACK_IMPORTED_MODULE_3__.a.g.CURRENT_USER_NAME, \n            this.anchor = signature.anchor, this.unsigned = signature.unsigned, this.parts = parts, \n            this.elements = this.parts.map(part => part.node);\n            if (this.highlightables = this.elements.filter(el => !/^H[1-6]$/.test(el.tagName) && !_cd__WEBPACK_IMPORTED_MODULE_3__.a.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some(name => el.classList.contains(name)) && !/float: *(?:left|right)/.test(el.getAttribute("style"))), \n            !this.highlightables.length) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n            if (this.addAttributes(), this.setLevels(), this.parts[0].isHeading ? (this.followsHeading = !0, \n            0 !== this.level && (this.parts.splice(0, 1), this.elements.splice(0, 1))) : this.followsHeading = !0, \n            this.parts[0].isHeading) {\n                this.isOpeningSection = !0;\n                const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);\n                this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);\n            } else this.isOpeningSection = !1;\n        }\n        addAttributes() {\n            this.anchor && !this.elements[0].getAttribute("id") && this.elements[0].setAttribute("id", this.anchor), \n            this.elements[0].classList.add("cd-commentPart-first"), this.elements[this.elements.length - 1].classList.add("cd-commentPart-last"), \n            this.elements.forEach(el => {\n                el.classList.add("cd-commentPart"), el.setAttribute("data-comment-id", String(this.id));\n            });\n        }\n        setLevels() {\n            const levelElements = {};\n            levelElements.top = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).getLevelsUpTree(this.highlightables[0]), \n            levelElements.bottom = this.highlightables.length > 1 ? _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) : levelElements.top, \n            this.level = Math.min(levelElements.top.length, levelElements.bottom.length);\n            for (let i = 0; i < this.level; i++) levelElements.top[i] && levelElements.top[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1)), \n            levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i] && levelElements.bottom[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1));\n        }\n        getSection() {\n            return _cd__WEBPACK_IMPORTED_MODULE_3__.a.sections.slice().reverse().find(section => section.comments.includes(this)) || null;\n        }\n        get section() {\n            return void 0 === _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _cachedSection) && _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _cachedSection, this.getSection()), \n            _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _cachedSection);\n        }\n        get sourcePage() {\n            return this.section ? this.section.sourcePage : _cd__WEBPACK_IMPORTED_MODULE_3__.a.g.CURRENT_PAGE;\n        }\n    }\n    var _parser = new WeakMap, _cachedSection = new WeakMap;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return SectionSkeleton;\n    }));\n    var _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2), _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0__), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default = __webpack_require__.n(_babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1__), _CdError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3), _cd__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0), _treeWalker__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6);\n    class SectionSkeleton {\n        constructor(parser, headingElement) {\n            if (_parser.set(this, {\n                writable: !0,\n                value: void 0\n            }), _babel_runtime_helpers_classPrivateFieldSet__WEBPACK_IMPORTED_MODULE_1___default()(this, _parser, parser), \n            this.headlineElement = _babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).context.getElementByClassName(headingElement, "mw-headline"), \n            !this.headlineElement) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n            this.anchor = this.headlineElement.getAttribute("id");\n            const classesToFilter = [ "mw-headline-number", ..._cd__WEBPACK_IMPORTED_MODULE_3__.a.config.foreignElementsInHeadlinesClasses ], nodes = Array.from(this.headlineElement.childNodes).filter(node => node.nodeType !== Node.ELEMENT_NODE || !Array.from(node.classList).some(name => classesToFilter.includes(name)));\n            this.headline = nodes.map(node => node.textContent).join("").trim();\n            const levelMatch = headingElement.tagName.match(/^H([2-6])$/);\n            this.level = levelMatch && Number(levelMatch[1]);\n            const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_4__.c(_cd__WEBPACK_IMPORTED_MODULE_3__.a.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName) && !node.classList.contains("cd-sectionButtonContainer"), !0, headingElement), elements = [ headingElement ], levelRegexp = new RegExp("^H[1-".concat(this.level, "]$"));\n            let firstCommentPart, lastCommentPart, hasSubsections = !1;\n            for (;treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName); ) void 0 === this.lastElementInFirstChunk && /^H[3-6]$/.test(treeWalker.currentNode.tagName) && (hasSubsections = !0, \n            this.lastElementInFirstChunk = elements[elements.length - 1]), elements.push(treeWalker.currentNode);\n            if (this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1], \n            !elements.length) throw new _CdError__WEBPACK_IMPORTED_MODULE_2__.a;\n            if (elements[1]) {\n                for (treeWalker.currentNode = elements[elements.length - 1]; treeWalker.lastChild(); ) ;\n                const lastNode = treeWalker.currentNode;\n                treeWalker.currentNode = elements[1];\n                do {\n                    treeWalker.currentNode.classList.contains("cd-commentPart") && (firstCommentPart = treeWalker.currentNode);\n                } while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());\n                treeWalker.currentNode = lastNode;\n                do {\n                    treeWalker.currentNode.classList.contains("cd-commentPart") && (lastCommentPart = treeWalker.currentNode);\n                } while (!lastCommentPart && treeWalker.currentNode !== elements[1] && treeWalker.previousNode());\n            }\n            if (firstCommentPart) {\n                const firstCommentPartId = Number(firstCommentPart.getAttribute("data-comment-id")), lastCommentPartId = Number(lastCommentPart.getAttribute("data-comment-id"));\n                if (this.comments = _cd__WEBPACK_IMPORTED_MODULE_3__.a.comments.slice(firstCommentPartId, lastCommentPartId + 1), \n                hasSubsections) {\n                    const endIndex = this.comments.findIndex(comment => !(_babel_runtime_helpers_classPrivateFieldGet__WEBPACK_IMPORTED_MODULE_0___default()(this, _parser).context.follows(this.lastElementInFirstChunk, comment.elements[0]) || this.lastElementInFirstChunk.contains(comment.elements[0])));\n                    this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);\n                }\n            }\n            this.id = _cd__WEBPACK_IMPORTED_MODULE_3__.a.sections.length, this.comments = this.comments || [], \n            this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments, this.elements = elements;\n        }\n    }\n    var _parser = new WeakMap;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    module.exports = function(string, quoteStyle) {\n        var getHtmlTranslationTable = __webpack_require__(44), tmpStr = "", entity = "", symbol = "";\n        tmpStr = string.toString();\n        var hashMap = getHtmlTranslationTable("HTML_ENTITIES", quoteStyle);\n        if (!1 === hashMap) return !1;\n        for (symbol in delete hashMap["&"], hashMap["&"] = "&amp;", hashMap) entity = hashMap[symbol], \n        tmpStr = tmpStr.split(entity).join(symbol);\n        return tmpStr = tmpStr.split("&#039;").join("\'");\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return Parser;\n    }));\n    var _cd__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0), _treeWalker__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6), _util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1), _timestamp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);\n    function getUserNameFromLink(element) {\n        const href = element.getAttribute("href");\n        if (!href) return null;\n        const pageName = function(url) {\n            if ("undefined" == typeof mw || "/wiki/$1" === mw.config.get("wgArticlePath") && "/w/index.php" === mw.config.get("wgScript")) {\n                url = url.replace(/^(?:https?:)?\\/\\/[^/]+/, "").replace(/^\\/wiki\\//, "").replace(/^\\/w\\/index.php\\?title=/, "").replace(/&action=edit.*/, "").replace(/#.*/, "").replace(/_/g, " ");\n                try {\n                    url = decodeURIComponent(url);\n                } catch (e) {\n                    return null;\n                }\n                return url;\n            }\n            {\n                const uri = new mw.Uri(url), match = uri.path.match(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.ARTICLE_PATH_REGEXP);\n                if (match) try {\n                    return decodeURIComponent(match[1]);\n                } catch (e) {\n                    return null;\n                }\n                return uri.query.title ? uri.query.title : null;\n            }\n        }(href);\n        if (!pageName) return null;\n        let userName;\n        const match = pageName.match(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.USER_NAMESPACES_REGEXP);\n        return match ? userName = match[1] : pageName.startsWith(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.CONTRIBS_PAGE + "/") && (userName = pageName.replace(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.CONTRIBS_PAGE_LINK_REGEXP, "")), \n        userName && Object(_util__WEBPACK_IMPORTED_MODULE_2__.b)(Object(_util__WEBPACK_IMPORTED_MODULE_2__.g)(userName.replace(/\\/.*/, ""))).trim();\n    }\n    class Parser {\n        constructor(context) {\n            this.context = context;\n        }\n        createComment(signature) {\n            return new this.context.CommentClass(this, signature);\n        }\n        createSection(headingElement, watchedSectionsRequest) {\n            return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);\n        }\n        findTimestamps() {\n            const blocksToExclude = [ ...Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("blockquote")), ...Object(_util__WEBPACK_IMPORTED_MODULE_2__.c)(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.elementsToExcludeClasses.map(className => Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByClassName(className)))) ];\n            return this.context.getAllTextNodes().map(node => {\n                const text = node.textContent, {date: date, match: match} = Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.b)(text) || {};\n                if (date && !blocksToExclude.some(block => block.contains(node))) return {\n                    node: node,\n                    date: date,\n                    match: match\n                };\n            }).filter(_util__WEBPACK_IMPORTED_MODULE_2__.a).map(finding => {\n                const {node: node, match: match, date: date} = finding, element = this.context.document.createElement("span");\n                element.classList.add("cd-timestamp");\n                const textNode = this.context.document.createTextNode(match[2]);\n                element.appendChild(textNode);\n                const remainedText = node.textContent.slice(match.index + match[0].length);\n                let afterNode;\n                return remainedText && (afterNode = this.context.document.createTextNode(remainedText)), \n                node.textContent = node.textContent.slice(0, match.index + match[1].length), node.parentNode.insertBefore(element, node.nextSibling), \n                afterNode && node.parentNode.insertBefore(afterNode, element.nextSibling), {\n                    element: element,\n                    date: date\n                };\n            });\n        }\n        findSignatures(timestamps) {\n            const signatures = timestamps.map(timestamp => {\n                const date = timestamp.date, timestampElement = timestamp.element, timestampText = timestamp.element.textContent;\n                let unsignedElement, closestNotInlineAncestor;\n                for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(el) ? el.classList.contains(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass) && (unsignedElement = el) : closestNotInlineAncestor = el;\n                const unsigned = Boolean(unsignedElement);\n                if (closestNotInlineAncestor) {\n                    const cniaChildren = Array.from(closestNotInlineAncestor[this.context.childElementsProperty]), treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.b(timestamp.element);\n                    let found = !1;\n                    for (;!found && treeWalker.nextNode() && closestNotInlineAncestor.contains(treeWalker.currentNode) && (!cniaChildren.includes(treeWalker.currentNode) || Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode)); ) treeWalker.currentNode.classList.contains("cd-timestamp") && (found = !0);\n                    if (found) return;\n                }\n                const startElement = unsignedElement || timestamp.element, treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.a(startElement);\n                let authorName, firstSignatureElement, length = 0;\n                const signatureNodes = [];\n                unsignedElement ? firstSignatureElement = startElement : (signatureNodes.push(startElement), \n                treeWalker.previousSibling());\n                do {\n                    const node = treeWalker.currentNode;\n                    if (length += node.textContent.length, node.nodeType === Node.ELEMENT_NODE) {\n                        if (node.classList.contains("cd-timestamp")) break;\n                        let hasAuthorLinks = !1;\n                        if ("A" === node.tagName) {\n                            const userName = getUserNameFromLink(node);\n                            userName && (authorName || (authorName = userName), authorName === userName && (hasAuthorLinks = !0));\n                        } else {\n                            Array.from(node.getElementsByTagName("a")).some(link => {\n                                const userName = getUserNameFromLink(link);\n                                if (userName && (authorName || (authorName = userName), authorName === userName)) return hasAuthorLinks = !0, \n                                !0;\n                            });\n                        }\n                        hasAuthorLinks && (firstSignatureElement = node);\n                    }\n                    signatureNodes.push(node);\n                } while (treeWalker.previousSibling() && length < _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureScanLimit);\n                const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);\n                signatureNodes.splice(-1 === firstSignatureElementIndex ? 1 : firstSignatureElementIndex + 1);\n                const anchor = Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.a)(timestamp.date, authorName, !0);\n                Object(_timestamp__WEBPACK_IMPORTED_MODULE_3__.c)(anchor);\n                const signatureContainer = startElement.parentNode, startElementNextSibling = startElement.nextSibling, element = this.context.document.createElement("span");\n                if (element.classList.add("cd-signature"), signatureNodes.reverse().forEach(node => {\n                    element.appendChild(node);\n                }), signatureContainer.insertBefore(element, startElementNextSibling), authorName) return {\n                    element: element,\n                    timestampElement: timestampElement,\n                    timestampText: timestampText,\n                    date: date,\n                    authorName: authorName,\n                    anchor: anchor,\n                    unsigned: unsigned\n                };\n            }).filter(_util__WEBPACK_IMPORTED_MODULE_2__.a);\n            return _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass && Array.from(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByClassName(_cd__WEBPACK_IMPORTED_MODULE_0__.a.config.unsignedClass)).forEach(element => {\n                if (!this.context.getElementByClassName(element, "cd-timestamp")) {\n                    Array.from(element.getElementsByTagName("a")).some(link => {\n                        const authorName = getUserNameFromLink(link);\n                        if (authorName) {\n                            element.classList.add("cd-signature");\n                            const unsigned = !0;\n                            return signatures.push({\n                                element: element,\n                                authorName: authorName,\n                                unsigned: unsigned\n                            }), !0;\n                        }\n                    });\n                }\n            }), signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1), \n            signatures;\n        }\n        collectParts(signatureElement) {\n            const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.a(signatureElement);\n            let firstForeignComponentAfter, parts = [];\n            for (;!firstForeignComponentAfter; ) {\n                for (;!treeWalker.currentNode.nextSibling && treeWalker.parentNode(); ) ;\n                if (!treeWalker.nextSibling()) break;\n                Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0) || (firstForeignComponentAfter = treeWalker.currentNode);\n            }\n            if (firstForeignComponentAfter && signatureElement.parentNode.contains(firstForeignComponentAfter)) {\n                for (treeWalker.currentNode = signatureElement; treeWalker.nextSibling() && Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0); ) parts.push({\n                    node: treeWalker.currentNode,\n                    isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,\n                    isHeading: !1,\n                    hasCurrentSignature: !1,\n                    hasForeignComponents: !1,\n                    lastStep: "start"\n                });\n                parts.reverse(), treeWalker.currentNode = signatureElement;\n            } else treeWalker.currentNode = signatureElement.parentNode;\n            parts.push({\n                node: treeWalker.currentNode,\n                isTextNode: !1,\n                isHeading: !1,\n                hasCurrentSignature: !0,\n                hasForeignComponents: !1,\n                lastStep: "start"\n            });\n            const timezoneRegexp = new RegExp(_cd__WEBPACK_IMPORTED_MODULE_0__.a.g.TIMEZONE_REGEXP.source + "\\\\s*$");\n            for (let i = 0; i < 500; i++) {\n                let lastStep;\n                const previousPart = parts[parts.length - 1];\n                if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {\n                    const text = previousPart.node.textContent;\n                    if (timezoneRegexp.test(text) || _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureEndingRegexp && _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.signatureEndingRegexp.test(text)) {\n                        previousPart.hasForeignComponents = !0;\n                        break;\n                    }\n                }\n                if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {\n                    let previousNode, dived = !1;\n                    for (;(previousNode = treeWalker.currentNode) && treeWalker.lastChild(); ) {\n                        if (Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(treeWalker.currentNode, !0)) {\n                            treeWalker.currentNode = previousNode;\n                            break;\n                        }\n                        dived = !0;\n                    }\n                    if (!dived) break;\n                    lastStep = "dive";\n                } else if (treeWalker.previousSibling()) lastStep = "back"; else {\n                    if (!treeWalker.parentNode()) break;\n                    lastStep = "up";\n                }\n                const node = treeWalker.currentNode, isTextNode = node.nodeType === Node.TEXT_NODE;\n                if ("back" === lastStep && [ "OL", "UL" ].includes(previousPart.node.tagName) && !([ "DL", "OL", "UL" ].includes(node.tagName) || isTextNode && node.previousSibling && [ "DL", "OL", "UL" ].includes(node.previousSibling.tagName)) && previousPart.node[this.context.childElementsProperty].length && previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)) break;\n                let isHeading = null, hasCurrentSignature = null, hasForeignComponents = null;\n                if (!isTextNode) {\n                    if (node.classList.contains("cd-commentPart") || "toc" === node.getAttribute("id") || "TD" === node.tagName || "HR" === node.tagName && node.previousElementSibling && this.context.getElementByClassName(node.previousElementSibling, "cd-signature") || _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.customForeignComponentChecker && _cd__WEBPACK_IMPORTED_MODULE_0__.a.config.customForeignComponentChecker(node, this.context)) break;\n                    isHeading = /^H[1-6]$/.test(node.tagName), hasCurrentSignature = node.contains(signatureElement), \n                    hasForeignComponents = node.getElementsByClassName("cd-signature", Number(hasCurrentSignature) + 1).length - Number(hasCurrentSignature) > 0 || firstForeignComponentAfter && node.contains(firstForeignComponentAfter);\n                }\n                if (parts.push({\n                    node: node,\n                    isTextNode: isTextNode,\n                    isHeading: isHeading,\n                    hasCurrentSignature: hasCurrentSignature,\n                    hasForeignComponents: hasForeignComponents,\n                    lastStep: lastStep\n                }), isHeading) break;\n            }\n            return parts;\n        }\n        removeNestedParts(parts) {\n            for (let i = parts.length - 1; i >= 0; i--) {\n                const part = parts[i];\n                if ("up" === part.lastStep && !part.hasForeignComponents) {\n                    let nextDiveElementIndex = 0;\n                    for (let j = i - 1; j > 0; j--) if ("dive" === parts[j].lastStep) {\n                        nextDiveElementIndex = j;\n                        break;\n                    }\n                    parts.splice(nextDiveElementIndex, i - nextDiveElementIndex), i = nextDiveElementIndex;\n                }\n            }\n            return parts;\n        }\n        encloseInlineParts(parts, signatureElement) {\n            const sequencesToBeEnclosed = [];\n            let start = null, encloseThis = !1;\n            for (let i = 0; i <= parts.length; i++) {\n                const part = parts[i];\n                if (!part || null !== start && ![ "back", "start" ].includes(part.lastStep) || part.hasForeignComponents || part.isHeading) {\n                    if (null !== start) {\n                        if (encloseThis) {\n                            const end = i - 1;\n                            sequencesToBeEnclosed.push({\n                                start: start,\n                                end: end\n                            });\n                        }\n                        start = null, encloseThis = !1;\n                    }\n                } else {\n                    if (null === start) {\n                        if (Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(part.node.parentNode)) {\n                            for (let j = i + 1; j < parts.length; j++) "up" !== parts[j].lastStep || (i = j - 1);\n                            break;\n                        }\n                        start = i;\n                    }\n                    !encloseThis && (part.isTextNode && part.node.textContent.trim() || Object(_util__WEBPACK_IMPORTED_MODULE_2__.e)(part.node)) && (encloseThis = !0);\n                }\n            }\n            for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {\n                const sequence = sequencesToBeEnclosed[i], wrapper = this.context.document.createElement("div"), nextSibling = parts[sequence.start].node.nextSibling, parent = parts[sequence.start].node.parentNode;\n                for (let j = sequence.end; j >= sequence.start; j--) wrapper.appendChild(parts[j].node);\n                parent.insertBefore(wrapper, nextSibling);\n                const newNode = {\n                    node: wrapper,\n                    isTextNode: !1,\n                    isHeading: !1,\n                    hasCurrentSignature: wrapper.contains(signatureElement),\n                    hasForeignComponents: !1,\n                    lastStep: "replaced"\n                };\n                parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);\n            }\n            return parts;\n        }\n        filterParts(parts) {\n            for (let i = (parts = parts.filter(part => !part.hasForeignComponents && !part.isTextNode)).length - 1; i > 0; i--) {\n                const part = parts[i];\n                if ("P" !== part.node.tagName || part.node.textContent.trim()) break;\n                parts.splice(i, 1);\n            }\n            return parts;\n        }\n        replaceListsWithItems(parts, signatureElement) {\n            const lastPart = parts[parts.length - 1];\n            for (let i = parts.length - 1; i >= 0; i--) {\n                const part = parts[i];\n                if ([ "UL", "DL", "OL", "LI", "DD" ].includes(part.node.tagName) && ("up" === part.lastStep && (!parts[i - 1] || "back" !== parts[i - 1].lastStep) || ("DD" === lastPart.node.tagName || "DD" === lastPart.node.parentNode.tagName || "DL" === lastPart.node.tagName) && !parts.slice(i + 1).some(part => "P" === part.node.tagName))) {\n                    const partTextNoSpaces = part.node.textContent.replace(/\\s+/g, "");\n                    let children, current = [ part.node ];\n                    do {\n                        children = current.reduce((arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])), []);\n                    } while (children.length && children.every(child => [ "UL", "DL", "OL", "LI", "DD" ].includes(child.tagName)) && children.map(child => child.textContent).join("").replace(/\\s+/g, "") === partTextNoSpaces && (current = children));\n                    if (current.length > 1) {\n                        const newParts = current.map(el => ({\n                            node: el,\n                            isTextNode: !1,\n                            hasCurrentSignature: el.contains(signatureElement),\n                            hasForeignComponents: !1,\n                            lastStep: "replaced"\n                        }));\n                        parts.splice(i, 1, ...newParts);\n                    } else current[0] !== part.node && Object.assign(part, {\n                        node: current[0],\n                        lastStep: "replaced"\n                    });\n                }\n            }\n            return parts;\n        }\n        getLevelsUpTree(initialElement) {\n            const levelElements = [], treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_1__.b(initialElement);\n            for (;treeWalker.parentNode(); ) {\n                const el = treeWalker.currentNode;\n                if ([ "UL", "DL", "OL" ].includes(el.tagName)) {\n                    if (el.classList.contains("cd-commentLevel")) {\n                        const match = el.getAttribute("class").match(/cd-commentLevel-(\\d+)/);\n                        return match && levelElements.unshift(...Array(Number(match[1]))), levelElements;\n                    }\n                    levelElements.unshift(el);\n                }\n            }\n            return levelElements;\n        }\n        findHeadings() {\n            const headings = [ ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h2"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h3"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h4"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h5"), ..._cd__WEBPACK_IMPORTED_MODULE_0__.a.g.rootElement.getElementsByTagName("h6") ];\n            return headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1), \n            headings;\n        }\n    }\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.d(__webpack_exports__, "a", (function() {\n        return getAllTextNodes;\n    }));\n    var lib = __webpack_require__(5), cd = __webpack_require__(0), html_entity_decode = __webpack_require__(26), html_entity_decode_default = __webpack_require__.n(html_entity_decode);\n    __webpack_require__(7), __webpack_require__(2), __webpack_require__(1);\n    new WeakMap, __webpack_require__(4);\n    function decodeHtmlEntities(s) {\n        if (-1 === s.indexOf("&")) return s;\n        {\n            let result = s;\n            return -1 !== result.indexOf("&#38;amp;") && (result = result.replace(/&#38;amp;/g, "&amp;amp;")), \n            result = -1 === result.indexOf("&#") ? result : result.replace(/&#(\\d+);/g, (s, m1) => String.fromCharCode(m1)), \n            -1 === result.indexOf("&") ? result : html_entity_decode_default()(result);\n        }\n    }\n    function walkThroughSubtree(base, callback, checkSelf) {\n        if (checkSelf && callback(base)) return !0;\n        for (let n = base.firstChild; n; n = n.nextSibling) if (walkThroughSubtree(n, callback, !0)) return !0;\n    }\n    function getAllTextNodes() {\n        let nodes = [];\n        return walkThroughSubtree(cd.a.g.rootElement, node => {\n            node.nodeType === Node.TEXT_NODE && nodes.push(node);\n        }), nodes;\n    }\n    self.Node = {\n        TEXT_NODE: 3,\n        ELEMENT_NODE: 1\n    };\n    const dummyDom = Object(lib.parseDOM)("<a>a</a>"), Element = dummyDom[0].constructor, DataNode = dummyDom[0].childNodes[0].constructor, NodeConstructor = Object.getPrototypeOf(DataNode);\n    Object.defineProperty(Element.prototype, "childElements", {\n        get: function() {\n            return this.childNodes.filter(node => node.nodeType === Node.ELEMENT_NODE);\n        }\n    }), Object.defineProperty(Element.prototype, "previousElementSibling", {\n        get: function() {\n            for (let n = this.previousSibling; n; n = n.previousSibling) if (n.nodeType === Node.ELEMENT_NODE) return n;\n            return null;\n        }\n    }), Object.defineProperty(Element.prototype, "nextElementSibling", {\n        get: function() {\n            for (let n = this.nextSibling; n; n = n.nextSibling) if (n.nodeType === Node.ELEMENT_NODE) return n;\n            return null;\n        }\n    }), Object.defineProperty(Element.prototype, "firstElementChild", {\n        get: function() {\n            let n;\n            for (n = this.firstChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.nextSibling) ;\n            return n || null;\n        }\n    }), Object.defineProperty(Element.prototype, "lastElementChild", {\n        get: function() {\n            let n;\n            for (n = this.lastChild; n && n.nodeType !== Node.ELEMENT_NODE; n = n.previousSibling) ;\n            return n || null;\n        }\n    }), Object.defineProperty(Element.prototype, "textContent", {\n        get: function() {\n            cd.a.debug.startTimer("textContent");\n            let returnValue = "";\n            return this.childNodes.forEach(node => {\n                returnValue += node.textContent;\n            }), cd.a.debug.stopTimer("textContent"), returnValue;\n        }\n    }), Object.defineProperty(Element.prototype, "outerHTML", {\n        get: function() {\n            return lib.DomUtils.getOuterHTML(this);\n        }\n    }), Element.prototype.getAttribute = function(name) {\n        let value = this.attribs[name];\n        return value && "string" == typeof value && -1 !== value.indexOf("&") && (value = value.replace(/&amp;/g, "&").replace(/&quot;/g, \'"\')), \n        value;\n    }, Element.prototype.setAttribute = function(name, value) {\n        value && "string" == typeof value && (-1 !== value.indexOf("&") && (value = value.replace(/&/g, "&amp;")), \n        -1 !== value.indexOf(\'"\') && (value = value.replace(/"/g, "&quot;"))), this.attribs[name] = value || "";\n    }, Element.prototype.appendChild = function(node) {\n        cd.a.debug.startTimer("appendChild"), node.parentNode && node.remove(), lib.DomUtils.appendChild(this, node), \n        cd.a.debug.stopTimer("appendChild");\n    }, Element.prototype.insertBefore = function(node, referenceNode) {\n        cd.a.debug.startTimer("insertBefore"), referenceNode ? (node.parentNode && node.remove(), \n        lib.DomUtils.prepend(referenceNode, node)) : this.appendChild(node), cd.a.debug.stopTimer("insertBefore");\n    }, Element.prototype.removeChild = function(node) {\n        node.parentNode === this && lib.DomUtils.removeElement(node);\n    }, Element.prototype.contains = function(node) {\n        if (cd.a.debug.startTimer("contains"), node === this) return !0;\n        if (!this.childNodes.length) return !1;\n        for (let n = node; n; n = n.parentNode) if (n === this) return !0;\n        return cd.a.debug.stopTimer("contains"), !1;\n    }, Element.prototype.follows = function(node) {\n        if (cd.a.debug.startTimer("follows"), this.startIndex && node.startIndex) return this.startIndex > node.startIndex;\n        if (this === node) return !1;\n        const thisTree = [], nodeTree = [];\n        let sharedParent, thisSharedParentChild, nodeSharedParentChild;\n        for (let current = this; current; current = current.parentNode) {\n            if (current === node) return !0;\n            thisTree.unshift(current);\n        }\n        for (let current = node; current; current = current.parentNode) if (nodeTree.unshift(current), \n        thisTree.includes(current)) {\n            sharedParent = current, thisSharedParentChild = thisTree[thisTree.indexOf(current) + 1], \n            nodeSharedParentChild = nodeTree[1];\n            break;\n        }\n        const returnValue = !sharedParent || sharedParent.childNodes.indexOf(thisSharedParentChild) > sharedParent.childNodes.indexOf(nodeSharedParentChild);\n        return cd.a.debug.stopTimer("follows"), returnValue;\n    }, Object.defineProperty(Element.prototype, "tagName", {\n        get: function() {\n            return this.name.toUpperCase();\n        }\n    }), Object.defineProperty(Element.prototype, "classList", {\n        get: function() {\n            return this._classList || (this._classList = {\n                list: [],\n                movedFromClassAttr: !1,\n                moveFromClassAttr(classAttr) {\n                    this.list = (classAttr || "").split(" "), this.movedFromClassAttr = !0;\n                },\n                add: (...names) => {\n                    names.forEach(name => {\n                        cd.a.debug.startTimer("addClass");\n                        let classAttr = this.getAttribute("class") || "";\n                        classAttr && (classAttr += " "), classAttr += name, this.setAttribute("class", classAttr), \n                        this._classList.movedFromClassAttr ? this._classList.list.push(name) : this._classList.moveFromClassAttr(classAttr), \n                        cd.a.debug.stopTimer("addClass");\n                    });\n                },\n                contains: name => {\n                    cd.a.debug.startTimer("containsClass");\n                    const classAttr = this.getAttribute("class");\n                    if (!classAttr) return cd.a.debug.stopTimer("containsClass"), !1;\n                    this._classList.movedFromClassAttr || this._classList.moveFromClassAttr(classAttr);\n                    const returnValue = Boolean(this._classList.list.length) && -1 !== this._classList.list.indexOf(name);\n                    return cd.a.debug.stopTimer("containsClass"), returnValue;\n                }\n            }), this._classList;\n        }\n    }), Element.prototype.getElementsByClassName = function(name, limit, our) {\n        cd.a.debug.startTimer("getElementsByClassName");\n        let nodes = [];\n        return walkThroughSubtree(this, node => {\n            if (node.nodeType === Node.ELEMENT_NODE) return !(node.nodeType !== Node.ELEMENT_NODE || !node.classList.contains(name, our) || (nodes.push(node), \n            !limit || nodes.length !== limit)) || void 0;\n        }), cd.a.debug.stopTimer("getElementsByClassName"), nodes;\n    }, Element.prototype.getElementsByTagName = function(name) {\n        cd.a.debug.startTimer("getElementsByTagName");\n        const returnValue = lib.DomUtils.getElementsByTagName(name, this);\n        return cd.a.debug.stopTimer("getElementsByTagName"), returnValue;\n    }, Object.defineProperty(DataNode.prototype, "textContent", {\n        get: function() {\n            return decodeHtmlEntities(this.data);\n        },\n        set: function(value) {\n            this.data = value;\n        }\n    }), NodeConstructor.prototype.remove = function() {\n        lib.DomUtils.removeElement(this), this.prev = null, this.next = null;\n    };\n    class Document extends Element {\n        constructor(dom) {\n            super("body", {});\n            for (const el of dom) this.appendChild(el);\n        }\n        createElement(name) {\n            return new Element(name, {});\n        }\n        createTextNode(content) {\n            return new DataNode("text", content);\n        }\n    }\n    Document.prototype.getElementsByClassName = Element.prototype.getElementsByClassName, \n    self.Document = Document;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    "use strict";\n    __webpack_require__.r(__webpack_exports__);\n    var _CdError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3), _CommentSkeleton__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(24), _Parser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27), _SectionSkeleton__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25), _cd__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0), _debug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(23), _staticGlobals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(22), _treeWalker__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(28), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5), _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9___default = __webpack_require__.n(_htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__), _timestamp__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4);\n    self.cd = _cd__WEBPACK_IMPORTED_MODULE_4__.a, _cd__WEBPACK_IMPORTED_MODULE_4__.a.g = _staticGlobals__WEBPACK_IMPORTED_MODULE_6__.a, \n    _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug = _debug__WEBPACK_IMPORTED_MODULE_5__.a, \n    _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.init();\n    const context = {\n        CommentClass: _CommentSkeleton__WEBPACK_IMPORTED_MODULE_1__.a,\n        SectionClass: _SectionSkeleton__WEBPACK_IMPORTED_MODULE_3__.a,\n        childElementsProperty: "childElements",\n        follows: (el1, el2) => el1.follows(el2),\n        getAllTextNodes: _htmlparser2Extended__WEBPACK_IMPORTED_MODULE_8__.a,\n        getElementByClassName: (node, className) => node.getElementsByClassName(className, 1)[0] || null\n    };\n    let alarmTimeout;\n    function setAlarm(interval) {\n        clearTimeout(alarmTimeout), alarmTimeout = setTimeout(() => {\n            postMessage({\n                type: "wakeUp"\n            });\n        }, interval);\n    }\n    function parse() {\n        _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments = [], _cd__WEBPACK_IMPORTED_MODULE_4__.a.sections = [], \n        Object(_timestamp__WEBPACK_IMPORTED_MODULE_10__.d)(), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("processing comments");\n        const parser = new _Parser__WEBPACK_IMPORTED_MODULE_2__.a(context);\n        _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("find timestamps");\n        const timestamps = parser.findTimestamps();\n        _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("find timestamps"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("find signatures");\n        const signatures = parser.findSignatures(timestamps);\n        _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("find signatures"), signatures.forEach(signature => {\n            try {\n                const comment = parser.createComment(signature);\n                void 0 !== comment.id && _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.push(comment);\n            } catch (e) {\n                e instanceof _CdError__WEBPACK_IMPORTED_MODULE_0__.a || console.error(e);\n            }\n        }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("processing comments"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("processing sections"), \n        parser.findHeadings().forEach(heading => {\n            try {\n                const section = parser.createSection(heading);\n                void 0 !== section.id && _cd__WEBPACK_IMPORTED_MODULE_4__.a.sections.push(section);\n            } catch (e) {\n                e instanceof _CdError__WEBPACK_IMPORTED_MODULE_0__.a || console.error(e);\n            }\n        }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.forEach(comment => {\n            if (comment.own && _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1]) {\n                if (_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.specialElements.pageHasOutdents) {\n                    const treeWalker = new _treeWalker__WEBPACK_IMPORTED_MODULE_7__.b(comment.elements[comment.elements.length - 1]);\n                    let found;\n                    for (;!found && treeWalker.nextNode() && !treeWalker.currentNode.classList.contains("cd-commentPart"); ) found = treeWalker.currentNode.classList.contains("outdent-template");\n                    found && (_cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1].toMe = !0);\n                }\n                _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments[comment.id + 1].toMe || _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments.slice(comment.id + 1).some(otherComment => {\n                    if (!(otherComment.section === comment.section && otherComment.level > comment.level)) return !0;\n                    otherComment.level !== comment.level + 1 && otherComment.id !== comment.id + 1 || (otherComment.toMe = !0);\n                });\n            }\n            comment.section && (comment.sectionHeadline = comment.section.headline, comment.sectionAnchor = comment.section.anchor, \n            delete comment.section), delete comment.elements, delete comment.parts, delete comment.highlightables, \n            delete comment.addAttributes, delete comment.setLevels, delete comment.getSection;\n        }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("processing sections"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("post message from the worker"), \n        postMessage({\n            type: "parse",\n            comments: _cd__WEBPACK_IMPORTED_MODULE_4__.a.comments\n        }), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("post message from the worker"), \n        _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("worker operations"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.logAndResetEverything();\n    }\n    function onMessageFromWindow(e) {\n        const message = e.data;\n        if ("setAlarm" === message.type && setAlarm(message.interval), "removeAlarm" === message.type && clearTimeout(alarmTimeout), \n        "parse" === message.type) {\n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("worker operations"), Object.assign(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g, message.g), \n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.config = message.config;\n            let checker = _cd__WEBPACK_IMPORTED_MODULE_4__.a.config.customForeignComponentChecker;\n            !checker || /^ *function +/.test(checker) || /^.+=>/.test(checker) || (checker = "function " + checker), \n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.config.customForeignComponentChecker = eval(checker), \n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.TIMESTAMP_PARSER = eval(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.TIMESTAMP_PARSER), \n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.startTimer("parse html");\n            const dom = Object(_htmlparser2Extended__WEBPACK_IMPORTED_MODULE_9__.parseDOM)(message.text, {\n                withStartIndices: !0,\n                withEndIndices: !0\n            });\n            _cd__WEBPACK_IMPORTED_MODULE_4__.a.debug.stopTimer("parse html"), _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement = new Document(dom), \n            context.document = _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement, _cd__WEBPACK_IMPORTED_MODULE_4__.a.g.specialElements = {\n                pageHasOutdents: Boolean(_cd__WEBPACK_IMPORTED_MODULE_4__.a.g.rootElement.getElementsByClassName("outdent-template", 1).length)\n            }, parse();\n        }\n    }\n    onmessage = onMessageFromWindow;\n}, function(module) {\n    module.exports = JSON.parse(\'{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}\');\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var ReflectOwnKeys, R = "object" == typeof Reflect ? Reflect : null, ReflectApply = R && "function" == typeof R.apply ? R.apply : function(target, receiver, args) {\n        return Function.prototype.apply.call(target, receiver, args);\n    };\n    ReflectOwnKeys = R && "function" == typeof R.ownKeys ? R.ownKeys : Object.getOwnPropertySymbols ? function(target) {\n        return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n    } : function(target) {\n        return Object.getOwnPropertyNames(target);\n    };\n    var NumberIsNaN = Number.isNaN || function(value) {\n        return value != value;\n    };\n    function EventEmitter() {\n        EventEmitter.init.call(this);\n    }\n    module.exports = EventEmitter, EventEmitter.EventEmitter = EventEmitter, EventEmitter.prototype._events = void 0, \n    EventEmitter.prototype._eventsCount = 0, EventEmitter.prototype._maxListeners = void 0;\n    var defaultMaxListeners = 10;\n    function checkListener(listener) {\n        if ("function" != typeof listener) throw new TypeError(\'The "listener" argument must be of type Function. Received type \' + typeof listener);\n    }\n    function _getMaxListeners(that) {\n        return void 0 === that._maxListeners ? EventEmitter.defaultMaxListeners : that._maxListeners;\n    }\n    function _addListener(target, type, listener, prepend) {\n        var m, events, existing, warning;\n        if (checkListener(listener), void 0 === (events = target._events) ? (events = target._events = Object.create(null), \n        target._eventsCount = 0) : (void 0 !== events.newListener && (target.emit("newListener", type, listener.listener ? listener.listener : listener), \n        events = target._events), existing = events[type]), void 0 === existing) existing = events[type] = listener, \n        ++target._eventsCount; else if ("function" == typeof existing ? existing = events[type] = prepend ? [ listener, existing ] : [ existing, listener ] : prepend ? existing.unshift(listener) : existing.push(listener), \n        (m = _getMaxListeners(target)) > 0 && existing.length > m && !existing.warned) {\n            existing.warned = !0;\n            var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit");\n            w.name = "MaxListenersExceededWarning", w.emitter = target, w.type = type, w.count = existing.length, \n            warning = w, console && console.warn && console.warn(warning);\n        }\n        return target;\n    }\n    function onceWrapper() {\n        if (!this.fired) return this.target.removeListener(this.type, this.wrapFn), this.fired = !0, \n        0 === arguments.length ? this.listener.call(this.target) : this.listener.apply(this.target, arguments);\n    }\n    function _onceWrap(target, type, listener) {\n        var state = {\n            fired: !1,\n            wrapFn: void 0,\n            target: target,\n            type: type,\n            listener: listener\n        }, wrapped = onceWrapper.bind(state);\n        return wrapped.listener = listener, state.wrapFn = wrapped, wrapped;\n    }\n    function _listeners(target, type, unwrap) {\n        var events = target._events;\n        if (void 0 === events) return [];\n        var evlistener = events[type];\n        return void 0 === evlistener ? [] : "function" == typeof evlistener ? unwrap ? [ evlistener.listener || evlistener ] : [ evlistener ] : unwrap ? function(arr) {\n            for (var ret = new Array(arr.length), i = 0; i < ret.length; ++i) ret[i] = arr[i].listener || arr[i];\n            return ret;\n        }(evlistener) : arrayClone(evlistener, evlistener.length);\n    }\n    function listenerCount(type) {\n        var events = this._events;\n        if (void 0 !== events) {\n            var evlistener = events[type];\n            if ("function" == typeof evlistener) return 1;\n            if (void 0 !== evlistener) return evlistener.length;\n        }\n        return 0;\n    }\n    function arrayClone(arr, n) {\n        for (var copy = new Array(n), i = 0; i < n; ++i) copy[i] = arr[i];\n        return copy;\n    }\n    Object.defineProperty(EventEmitter, "defaultMaxListeners", {\n        enumerable: !0,\n        get: function() {\n            return defaultMaxListeners;\n        },\n        set: function(arg) {\n            if ("number" != typeof arg || arg < 0 || NumberIsNaN(arg)) throw new RangeError(\'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received \' + arg + ".");\n            defaultMaxListeners = arg;\n        }\n    }), EventEmitter.init = function() {\n        void 0 !== this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = Object.create(null), \n        this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;\n    }, EventEmitter.prototype.setMaxListeners = function(n) {\n        if ("number" != typeof n || n < 0 || NumberIsNaN(n)) throw new RangeError(\'The value of "n" is out of range. It must be a non-negative number. Received \' + n + ".");\n        return this._maxListeners = n, this;\n    }, EventEmitter.prototype.getMaxListeners = function() {\n        return _getMaxListeners(this);\n    }, EventEmitter.prototype.emit = function(type) {\n        for (var args = [], i = 1; i < arguments.length; i++) args.push(arguments[i]);\n        var doError = "error" === type, events = this._events;\n        if (void 0 !== events) doError = doError && void 0 === events.error; else if (!doError) return !1;\n        if (doError) {\n            var er;\n            if (args.length > 0 && (er = args[0]), er instanceof Error) throw er;\n            var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));\n            throw err.context = er, err;\n        }\n        var handler = events[type];\n        if (void 0 === handler) return !1;\n        if ("function" == typeof handler) ReflectApply(handler, this, args); else {\n            var len = handler.length, listeners = arrayClone(handler, len);\n            for (i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);\n        }\n        return !0;\n    }, EventEmitter.prototype.addListener = function(type, listener) {\n        return _addListener(this, type, listener, !1);\n    }, EventEmitter.prototype.on = EventEmitter.prototype.addListener, EventEmitter.prototype.prependListener = function(type, listener) {\n        return _addListener(this, type, listener, !0);\n    }, EventEmitter.prototype.once = function(type, listener) {\n        return checkListener(listener), this.on(type, _onceWrap(this, type, listener)), \n        this;\n    }, EventEmitter.prototype.prependOnceListener = function(type, listener) {\n        return checkListener(listener), this.prependListener(type, _onceWrap(this, type, listener)), \n        this;\n    }, EventEmitter.prototype.removeListener = function(type, listener) {\n        var list, events, position, i, originalListener;\n        if (checkListener(listener), void 0 === (events = this._events)) return this;\n        if (void 0 === (list = events[type])) return this;\n        if (list === listener || list.listener === listener) 0 == --this._eventsCount ? this._events = Object.create(null) : (delete events[type], \n        events.removeListener && this.emit("removeListener", type, list.listener || listener)); else if ("function" != typeof list) {\n            for (position = -1, i = list.length - 1; i >= 0; i--) if (list[i] === listener || list[i].listener === listener) {\n                originalListener = list[i].listener, position = i;\n                break;\n            }\n            if (position < 0) return this;\n            0 === position ? list.shift() : function(list, index) {\n                for (;index + 1 < list.length; index++) list[index] = list[index + 1];\n                list.pop();\n            }(list, position), 1 === list.length && (events[type] = list[0]), void 0 !== events.removeListener && this.emit("removeListener", type, originalListener || listener);\n        }\n        return this;\n    }, EventEmitter.prototype.off = EventEmitter.prototype.removeListener, EventEmitter.prototype.removeAllListeners = function(type) {\n        var listeners, events, i;\n        if (void 0 === (events = this._events)) return this;\n        if (void 0 === events.removeListener) return 0 === arguments.length ? (this._events = Object.create(null), \n        this._eventsCount = 0) : void 0 !== events[type] && (0 == --this._eventsCount ? this._events = Object.create(null) : delete events[type]), \n        this;\n        if (0 === arguments.length) {\n            var key, keys = Object.keys(events);\n            for (i = 0; i < keys.length; ++i) "removeListener" !== (key = keys[i]) && this.removeAllListeners(key);\n            return this.removeAllListeners("removeListener"), this._events = Object.create(null), \n            this._eventsCount = 0, this;\n        }\n        if ("function" == typeof (listeners = events[type])) this.removeListener(type, listeners); else if (void 0 !== listeners) for (i = listeners.length - 1; i >= 0; i--) this.removeListener(type, listeners[i]);\n        return this;\n    }, EventEmitter.prototype.listeners = function(type) {\n        return _listeners(this, type, !0);\n    }, EventEmitter.prototype.rawListeners = function(type) {\n        return _listeners(this, type, !1);\n    }, EventEmitter.listenerCount = function(emitter, type) {\n        return "function" == typeof emitter.listenerCount ? emitter.listenerCount(type) : listenerCount.call(emitter, type);\n    }, EventEmitter.prototype.listenerCount = listenerCount, EventEmitter.prototype.eventNames = function() {\n        return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n        return (extendStatics = Object.setPrototypeOf || {\n            __proto__: []\n        } instanceof Array && function(d, b) {\n            d.__proto__ = b;\n        } || function(d, b) {\n            for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n        })(d, b);\n    }, function(d, b) {\n        function __() {\n            this.constructor = d;\n        }\n        extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n        new __);\n    });\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var nodeTypes = new Map([ [ "tag", 1 ], [ "script", 1 ], [ "style", 1 ], [ "directive", 1 ], [ "text", 3 ], [ "cdata", 4 ], [ "comment", 8 ] ]), Node = function() {\n        function Node(type) {\n            this.type = type, this.parent = null, this.prev = null, this.next = null, this.startIndex = null, \n            this.endIndex = null;\n        }\n        return Object.defineProperty(Node.prototype, "nodeType", {\n            get: function() {\n                return nodeTypes.get(this.type) || 1;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Object.defineProperty(Node.prototype, "parentNode", {\n            get: function() {\n                return this.parent || null;\n            },\n            set: function(parent) {\n                this.parent = parent;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Object.defineProperty(Node.prototype, "previousSibling", {\n            get: function() {\n                return this.prev || null;\n            },\n            set: function(prev) {\n                this.prev = prev;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Object.defineProperty(Node.prototype, "nextSibling", {\n            get: function() {\n                return this.next || null;\n            },\n            set: function(next) {\n                this.next = next;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Node;\n    }();\n    exports.Node = Node;\n    var DataNode = function(_super) {\n        function DataNode(type, data) {\n            var _this = _super.call(this, type) || this;\n            return _this.data = data, _this;\n        }\n        return __extends(DataNode, _super), Object.defineProperty(DataNode.prototype, "nodeValue", {\n            get: function() {\n                return this.data;\n            },\n            set: function(data) {\n                this.data = data;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), DataNode;\n    }(Node);\n    exports.DataNode = DataNode;\n    var ProcessingInstruction = function(_super) {\n        function ProcessingInstruction(name, data) {\n            var _this = _super.call(this, "directive", data) || this;\n            return _this.name = name, _this;\n        }\n        return __extends(ProcessingInstruction, _super), ProcessingInstruction;\n    }(DataNode);\n    exports.ProcessingInstruction = ProcessingInstruction;\n    var NodeWithChildren = function(_super) {\n        function NodeWithChildren(type, children) {\n            var _this = _super.call(this, type) || this;\n            return _this.children = children, _this;\n        }\n        return __extends(NodeWithChildren, _super), Object.defineProperty(NodeWithChildren.prototype, "firstChild", {\n            get: function() {\n                return this.children[0] || null;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Object.defineProperty(NodeWithChildren.prototype, "lastChild", {\n            get: function() {\n                return this.children[this.children.length - 1] || null;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Object.defineProperty(NodeWithChildren.prototype, "childNodes", {\n            get: function() {\n                return this.children;\n            },\n            set: function(children) {\n                this.children = children;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), NodeWithChildren;\n    }(Node);\n    exports.NodeWithChildren = NodeWithChildren;\n    var Element = function(_super) {\n        function Element(name, attribs) {\n            var _this = _super.call(this, "script" === name ? "script" : "style" === name ? "style" : "tag", []) || this;\n            return _this.name = name, _this.attribs = attribs, _this.attribs = attribs, _this;\n        }\n        return __extends(Element, _super), Object.defineProperty(Element.prototype, "tagName", {\n            get: function() {\n                return this.name;\n            },\n            set: function(name) {\n                this.name = name;\n            },\n            enumerable: !0,\n            configurable: !0\n        }), Element;\n    }(NodeWithChildren);\n    exports.Element = Element;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var tagtypes_1 = __webpack_require__(8), dom_serializer_1 = __importDefault(__webpack_require__(34));\n    exports.getOuterHTML = dom_serializer_1.default, exports.getInnerHTML = function(node, options) {\n        return tagtypes_1.hasChildren(node) ? node.children.map((function(node) {\n            return exports.getOuterHTML(node, options);\n        })).join("") : "";\n    }, exports.getText = function getText(node) {\n        return Array.isArray(node) ? node.map(getText).join("") : tagtypes_1.isTag(node) ? "br" === node.name ? "\\n" : getText(node.children) : tagtypes_1.isCDATA(node) ? getText(node.children) : tagtypes_1.isText(node) ? node.data : "";\n    };\n}, function(module, exports, __webpack_require__) {\n    var ElementType = __webpack_require__(11), entities = __webpack_require__(35), foreignNames = __webpack_require__(36);\n    foreignNames.elementNames.__proto__ = null, foreignNames.attributeNames.__proto__ = null;\n    var unencodedElements = {\n        __proto__: null,\n        style: !0,\n        script: !0,\n        xmp: !0,\n        iframe: !0,\n        noembed: !0,\n        noframes: !0,\n        plaintext: !0,\n        noscript: !0\n    };\n    var singleTag = {\n        __proto__: null,\n        area: !0,\n        base: !0,\n        basefont: !0,\n        br: !0,\n        col: !0,\n        command: !0,\n        embed: !0,\n        frame: !0,\n        hr: !0,\n        img: !0,\n        input: !0,\n        isindex: !0,\n        keygen: !0,\n        link: !0,\n        meta: !0,\n        param: !0,\n        source: !0,\n        track: !0,\n        wbr: !0\n    }, render = module.exports = function(dom, opts) {\n        Array.isArray(dom) || dom.cheerio || (dom = [ dom ]), opts = opts || {};\n        for (var output = "", i = 0; i < dom.length; i++) {\n            var elem = dom[i];\n            "root" === elem.type ? output += render(elem.children, opts) : ElementType.isTag(elem) ? output += renderTag(elem, opts) : elem.type === ElementType.Directive ? output += renderDirective(elem) : elem.type === ElementType.Comment ? output += renderComment(elem) : elem.type === ElementType.CDATA ? output += renderCdata(elem) : output += renderText(elem, opts);\n        }\n        return output;\n    }, foreignModeIntegrationPoints = [ "mi", "mo", "mn", "ms", "mtext", "annotation-xml", "foreignObject", "desc", "title" ];\n    function renderTag(elem, opts) {\n        "foreign" === opts.xmlMode && (elem.name = foreignNames.elementNames[elem.name] || elem.name, \n        elem.parent && foreignModeIntegrationPoints.indexOf(elem.parent.name) >= 0 && (opts = Object.assign({}, opts, {\n            xmlMode: !1\n        }))), !opts.xmlMode && [ "svg", "math" ].indexOf(elem.name) >= 0 && (opts = Object.assign({}, opts, {\n            xmlMode: "foreign"\n        }));\n        var tag = "<" + elem.name, attribs = function(attributes, opts) {\n            if (attributes) {\n                var value, output = "";\n                for (var key in attributes) value = attributes[key], output && (output += " "), \n                "foreign" === opts.xmlMode && (key = foreignNames.attributeNames[key] || key), output += key, \n                (null !== value && "" !== value || opts.xmlMode) && (output += \'="\' + (opts.decodeEntities ? entities.encodeXML(value) : value.replace(/\\"/g, "&quot;")) + \'"\');\n                return output;\n            }\n        }(elem.attribs, opts);\n        return attribs && (tag += " " + attribs), !opts.xmlMode || elem.children && 0 !== elem.children.length ? (tag += ">", \n        elem.children && (tag += render(elem.children, opts)), singleTag[elem.name] && !opts.xmlMode || (tag += "</" + elem.name + ">")) : tag += "/>", \n        tag;\n    }\n    function renderDirective(elem) {\n        return "<" + elem.data + ">";\n    }\n    function renderText(elem, opts) {\n        var data = elem.data || "";\n        return !opts.decodeEntities || elem.parent && elem.parent.name in unencodedElements || (data = entities.encodeXML(data)), \n        data;\n    }\n    function renderCdata(elem) {\n        return "<![CDATA[" + elem.children[0].data + "]]>";\n    }\n    function renderComment(elem) {\n        return "\\x3c!--" + elem.data + "--\\x3e";\n    }\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var decode_1 = __webpack_require__(19), encode_1 = __webpack_require__(20);\n    exports.decode = function(data, level) {\n        return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTML)(data);\n    }, exports.decodeStrict = function(data, level) {\n        return (!level || level <= 0 ? decode_1.decodeXML : decode_1.decodeHTMLStrict)(data);\n    }, exports.encode = function(data, level) {\n        return (!level || level <= 0 ? encode_1.encodeXML : encode_1.encodeHTML)(data);\n    };\n    var encode_2 = __webpack_require__(20);\n    exports.encodeXML = encode_2.encodeXML, exports.encodeHTML = encode_2.encodeHTML, \n    exports.escape = encode_2.escape, exports.encodeHTML4 = encode_2.encodeHTML, exports.encodeHTML5 = encode_2.encodeHTML;\n    var decode_2 = __webpack_require__(19);\n    exports.decodeXML = decode_2.decodeXML, exports.decodeHTML = decode_2.decodeHTML, \n    exports.decodeHTMLStrict = decode_2.decodeHTMLStrict, exports.decodeHTML4 = decode_2.decodeHTML, \n    exports.decodeHTML5 = decode_2.decodeHTML, exports.decodeHTML4Strict = decode_2.decodeHTMLStrict, \n    exports.decodeHTML5Strict = decode_2.decodeHTMLStrict, exports.decodeXMLStrict = decode_2.decodeXML;\n}, function(module) {\n    module.exports = JSON.parse(\'{"elementNames":{"altglyph":"altGlyph","altglyphdef":"altGlyphDef","altglyphitem":"altGlyphItem","animatecolor":"animateColor","animatemotion":"animateMotion","animatetransform":"animateTransform","clippath":"clipPath","feblend":"feBlend","fecolormatrix":"feColorMatrix","fecomponenttransfer":"feComponentTransfer","fecomposite":"feComposite","feconvolvematrix":"feConvolveMatrix","fediffuselighting":"feDiffuseLighting","fedisplacementmap":"feDisplacementMap","fedistantlight":"feDistantLight","fedropshadow":"feDropShadow","feflood":"feFlood","fefunca":"feFuncA","fefuncb":"feFuncB","fefuncg":"feFuncG","fefuncr":"feFuncR","fegaussianblur":"feGaussianBlur","feimage":"feImage","femerge":"feMerge","femergenode":"feMergeNode","femorphology":"feMorphology","feoffset":"feOffset","fepointlight":"fePointLight","fespecularlighting":"feSpecularLighting","fespotlight":"feSpotLight","fetile":"feTile","feturbulence":"feTurbulence","foreignobject":"foreignObject","glyphref":"glyphRef","lineargradient":"linearGradient","radialgradient":"radialGradient","textpath":"textPath"},"attributeNames":{"definitionurl":"definitionURL","attributename":"attributeName","attributetype":"attributeType","basefrequency":"baseFrequency","baseprofile":"baseProfile","calcmode":"calcMode","clippathunits":"clipPathUnits","diffuseconstant":"diffuseConstant","edgemode":"edgeMode","filterunits":"filterUnits","glyphref":"glyphRef","gradienttransform":"gradientTransform","gradientunits":"gradientUnits","kernelmatrix":"kernelMatrix","kernelunitlength":"kernelUnitLength","keypoints":"keyPoints","keysplines":"keySplines","keytimes":"keyTimes","lengthadjust":"lengthAdjust","limitingconeangle":"limitingConeAngle","markerheight":"markerHeight","markerunits":"markerUnits","markerwidth":"markerWidth","maskcontentunits":"maskContentUnits","maskunits":"maskUnits","numoctaves":"numOctaves","pathlength":"pathLength","patterncontentunits":"patternContentUnits","patterntransform":"patternTransform","patternunits":"patternUnits","pointsatx":"pointsAtX","pointsaty":"pointsAtY","pointsatz":"pointsAtZ","preservealpha":"preserveAlpha","preserveaspectratio":"preserveAspectRatio","primitiveunits":"primitiveUnits","refx":"refX","refy":"refY","repeatcount":"repeatCount","repeatdur":"repeatDur","requiredextensions":"requiredExtensions","requiredfeatures":"requiredFeatures","specularconstant":"specularConstant","specularexponent":"specularExponent","spreadmethod":"spreadMethod","startoffset":"startOffset","stddeviation":"stdDeviation","stitchtiles":"stitchTiles","surfacescale":"surfaceScale","systemlanguage":"systemLanguage","tablevalues":"tableValues","targetx":"targetX","targety":"targetY","textlength":"textLength","viewbox":"viewBox","viewtarget":"viewTarget","xchannelselector":"xChannelSelector","ychannelselector":"yChannelSelector","zoomandpan":"zoomAndPan"}}\');\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    function getChildren(elem) {\n        return elem.children || null;\n    }\n    function getParent(elem) {\n        return elem.parent || null;\n    }\n    function getAttributeValue(elem, name) {\n        return elem.attribs && elem.attribs[name];\n    }\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    }), exports.getChildren = getChildren, exports.getParent = getParent, exports.getSiblings = function(elem) {\n        var parent = getParent(elem);\n        return parent ? getChildren(parent) : [ elem ];\n    }, exports.getAttributeValue = getAttributeValue, exports.hasAttrib = function(elem, name) {\n        return !!getAttributeValue(elem, name);\n    }, exports.getName = function(elem) {\n        return elem.name;\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    }), exports.removeElement = function(elem) {\n        if (elem.prev && (elem.prev.next = elem.next), elem.next && (elem.next.prev = elem.prev), \n        elem.parent) {\n            var childs = elem.parent.children;\n            childs.splice(childs.lastIndexOf(elem), 1);\n        }\n    }, exports.replaceElement = function(elem, replacement) {\n        var prev = replacement.prev = elem.prev;\n        prev && (prev.next = replacement);\n        var next = replacement.next = elem.next;\n        next && (next.prev = replacement);\n        var parent = replacement.parent = elem.parent;\n        if (parent) {\n            var childs = parent.children;\n            childs[childs.lastIndexOf(elem)] = replacement;\n        }\n    }, exports.appendChild = function(elem, child) {\n        if (child.parent = elem, 1 !== elem.children.push(child)) {\n            var sibling = elem.children[elem.children.length - 2];\n            sibling.next = child, child.prev = sibling, child.next = null;\n        }\n    }, exports.append = function(elem, next) {\n        var parent = elem.parent, currNext = elem.next;\n        if (next.next = currNext, next.prev = elem, elem.next = next, next.parent = parent, \n        currNext) {\n            if (currNext.prev = next, parent) {\n                var childs = parent.children;\n                childs.splice(childs.lastIndexOf(currNext), 0, next);\n            }\n        } else parent && parent.children.push(next);\n    }, exports.prepend = function(elem, prev) {\n        var parent = elem.parent;\n        if (parent) {\n            var childs = parent.children;\n            childs.splice(childs.lastIndexOf(elem), 0, prev);\n        }\n        elem.prev && (elem.prev.next = prev), prev.parent = parent, prev.prev = elem.prev, \n        prev.next = elem, elem.prev = prev;\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var querying_1 = __webpack_require__(21), tagtypes_1 = __webpack_require__(8);\n    function isTextNode(node) {\n        return "text" === node.type;\n    }\n    var Checks = {\n        tag_name: function(name) {\n            return "function" == typeof name ? function(elem) {\n                return tagtypes_1.isTag(elem) && name(elem.name);\n            } : "*" === name ? tagtypes_1.isTag : function(elem) {\n                return tagtypes_1.isTag(elem) && elem.name === name;\n            };\n        },\n        tag_type: function(type) {\n            return "function" == typeof type ? function(elem) {\n                return type(elem.type);\n            } : function(elem) {\n                return elem.type === type;\n            };\n        },\n        tag_contains: function(data) {\n            return "function" == typeof data ? function(elem) {\n                return isTextNode(elem) && data(elem.data);\n            } : function(elem) {\n                return isTextNode(elem) && elem.data === data;\n            };\n        }\n    };\n    function getAttribCheck(attrib, value) {\n        return "function" == typeof value ? function(elem) {\n            return tagtypes_1.isTag(elem) && value(elem.attribs[attrib]);\n        } : function(elem) {\n            return tagtypes_1.isTag(elem) && elem.attribs[attrib] === value;\n        };\n    }\n    function combineFuncs(a, b) {\n        return function(elem) {\n            return a(elem) || b(elem);\n        };\n    }\n    function compileTest(options) {\n        var funcs = Object.keys(options).map((function(key) {\n            var value = options[key];\n            return key in Checks ? Checks[key](value) : getAttribCheck(key, value);\n        }));\n        return 0 === funcs.length ? null : funcs.reduce(combineFuncs);\n    }\n    exports.testElement = function(options, element) {\n        var test = compileTest(options);\n        return !test || test(element);\n    }, exports.getElements = function(options, element, recurse, limit) {\n        void 0 === limit && (limit = 1 / 0);\n        var test = compileTest(options);\n        return test ? querying_1.filter(test, element, recurse, limit) : [];\n    }, exports.getElementById = function(id, element, recurse) {\n        return void 0 === recurse && (recurse = !0), Array.isArray(element) || (element = [ element ]), \n        querying_1.findOne(getAttribCheck("id", id), element, recurse);\n    }, exports.getElementsByTagName = function(name, element, recurse, limit) {\n        return void 0 === limit && (limit = 1 / 0), querying_1.filter(Checks.tag_name(name), element, recurse, limit);\n    }, exports.getElementsByTagType = function(type, element, recurse, limit) {\n        return void 0 === recurse && (recurse = !0), void 0 === limit && (limit = 1 / 0), \n        querying_1.filter(Checks.tag_type(type), element, recurse, limit);\n    };\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var tagtypes_1 = __webpack_require__(8);\n    function compareDocumentPosition(nodeA, nodeB) {\n        var aParents = [], bParents = [];\n        if (nodeA === nodeB) return 0;\n        for (var current = tagtypes_1.hasChildren(nodeA) ? nodeA : nodeA.parent; current; ) aParents.unshift(current), \n        current = current.parent;\n        for (current = tagtypes_1.hasChildren(nodeB) ? nodeB : nodeB.parent; current; ) bParents.unshift(current), \n        current = current.parent;\n        for (var idx = 0; aParents[idx] === bParents[idx]; ) idx++;\n        if (0 === idx) return 1;\n        var sharedParent = aParents[idx - 1], siblings = sharedParent.children, aSibling = aParents[idx], bSibling = bParents[idx];\n        return siblings.indexOf(aSibling) > siblings.indexOf(bSibling) ? sharedParent === nodeB ? 20 : 4 : sharedParent === nodeA ? 10 : 2;\n    }\n    exports.removeSubsets = function(nodes) {\n        for (var idx = nodes.length; --idx >= 0; ) {\n            var node = nodes[idx];\n            if (idx > 0 && nodes.lastIndexOf(node, idx - 1) >= 0) nodes.splice(idx, 1); else for (var ancestor = node.parent; ancestor; ancestor = ancestor.parent) if (nodes.indexOf(ancestor) > -1) {\n                nodes.splice(idx, 1);\n                break;\n            }\n        }\n        return nodes;\n    }, exports.compareDocumentPosition = compareDocumentPosition, exports.uniqueSort = function(nodes) {\n        return (nodes = nodes.filter((function(node, i, arr) {\n            return !arr.includes(node, i + 1);\n        }))).sort((function(a, b) {\n            var relative = compareDocumentPosition(a, b);\n            return 2 & relative ? -1 : 4 & relative ? 1 : 0;\n        })), nodes;\n    };\n}, function(module, exports) {}, function(module, exports, __webpack_require__) {\n    "use strict";\n    var extendStatics, __extends = this && this.__extends || (extendStatics = function(d, b) {\n        return (extendStatics = Object.setPrototypeOf || {\n            __proto__: []\n        } instanceof Array && function(d, b) {\n            d.__proto__ = b;\n        } || function(d, b) {\n            for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]);\n        })(d, b);\n    }, function(d, b) {\n        function __() {\n            this.constructor = d;\n        }\n        extendStatics(d, b), d.prototype = null === b ? Object.create(b) : (__.prototype = b.prototype, \n        new __);\n    }), __importDefault = this && this.__importDefault || function(mod) {\n        return mod && mod.__esModule ? mod : {\n            default: mod\n        };\n    };\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var CollectingHandler = function(_super) {\n        function CollectingHandler(cbs) {\n            void 0 === cbs && (cbs = {});\n            var _this = _super.call(this, (function(name) {\n                for (var _a, args = [], _i = 1; _i < arguments.length; _i++) args[_i - 1] = arguments[_i];\n                _this.events.push([ name ].concat(args)), _this._cbs[name] && (_a = _this._cbs)[name].apply(_a, args);\n            })) || this;\n            return _this._cbs = cbs, _this.events = [], _this;\n        }\n        return __extends(CollectingHandler, _super), CollectingHandler.prototype.onreset = function() {\n            this.events = [], this._cbs.onreset && this._cbs.onreset();\n        }, CollectingHandler.prototype.restart = function() {\n            var _a;\n            this._cbs.onreset && this._cbs.onreset();\n            for (var i = 0; i < this.events.length; i++) {\n                var _b = this.events[i], name_1 = _b[0], args = _b.slice(1);\n                this._cbs[name_1] && (_a = this._cbs)[name_1].apply(_a, args);\n            }\n        }, CollectingHandler;\n    }(__importDefault(__webpack_require__(43)).default);\n    exports.CollectingHandler = CollectingHandler;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    Object.defineProperty(exports, "__esModule", {\n        value: !0\n    });\n    var MultiplexHandler = function() {\n        function MultiplexHandler(func) {\n            this._func = func;\n        }\n        return MultiplexHandler.prototype.onattribute = function(name, value) {\n            this._func("onattribute", name, value);\n        }, MultiplexHandler.prototype.oncdatastart = function() {\n            this._func("oncdatastart");\n        }, MultiplexHandler.prototype.oncdataend = function() {\n            this._func("oncdataend");\n        }, MultiplexHandler.prototype.ontext = function(text) {\n            this._func("ontext", text);\n        }, MultiplexHandler.prototype.onprocessinginstruction = function(name, value) {\n            this._func("onprocessinginstruction", name, value);\n        }, MultiplexHandler.prototype.oncomment = function(comment) {\n            this._func("oncomment", comment);\n        }, MultiplexHandler.prototype.oncommentend = function() {\n            this._func("oncommentend");\n        }, MultiplexHandler.prototype.onclosetag = function(name) {\n            this._func("onclosetag", name);\n        }, MultiplexHandler.prototype.onopentag = function(name, attribs) {\n            this._func("onopentag", name, attribs);\n        }, MultiplexHandler.prototype.onopentagname = function(name) {\n            this._func("onopentagname", name);\n        }, MultiplexHandler.prototype.onerror = function(error) {\n            this._func("onerror", error);\n        }, MultiplexHandler.prototype.onend = function() {\n            this._func("onend");\n        }, MultiplexHandler.prototype.onparserinit = function(parser) {\n            this._func("onparserinit", parser);\n        }, MultiplexHandler.prototype.onreset = function() {\n            this._func("onreset");\n        }, MultiplexHandler;\n    }();\n    exports.default = MultiplexHandler;\n}, function(module, exports, __webpack_require__) {\n    "use strict";\n    module.exports = function(table, quoteStyle) {\n        var decimal, useTable, useQuoteStyle, entities = {}, hashMap = {}, constMappingTable = {}, constMappingQuoteStyle = {};\n        if (constMappingTable[0] = "HTML_SPECIALCHARS", constMappingTable[1] = "HTML_ENTITIES", \n        constMappingQuoteStyle[0] = "ENT_NOQUOTES", constMappingQuoteStyle[2] = "ENT_COMPAT", \n        constMappingQuoteStyle[3] = "ENT_QUOTES", useTable = isNaN(table) ? table ? table.toUpperCase() : "HTML_SPECIALCHARS" : constMappingTable[table], \n        useQuoteStyle = isNaN(quoteStyle) ? quoteStyle ? quoteStyle.toUpperCase() : "ENT_COMPAT" : constMappingQuoteStyle[quoteStyle], \n        "HTML_SPECIALCHARS" !== useTable && "HTML_ENTITIES" !== useTable) throw new Error("Table: " + useTable + " not supported");\n        for (decimal in entities[38] = "&amp;", "HTML_ENTITIES" === useTable && (entities[160] = "&nbsp;", \n        entities[161] = "&iexcl;", entities[162] = "&cent;", entities[163] = "&pound;", \n        entities[164] = "&curren;", entities[165] = "&yen;", entities[166] = "&brvbar;", \n        entities[167] = "&sect;", entities[168] = "&uml;", entities[169] = "&copy;", entities[170] = "&ordf;", \n        entities[171] = "&laquo;", entities[172] = "&not;", entities[173] = "&shy;", entities[174] = "&reg;", \n        entities[175] = "&macr;", entities[176] = "&deg;", entities[177] = "&plusmn;", entities[178] = "&sup2;", \n        entities[179] = "&sup3;", entities[180] = "&acute;", entities[181] = "&micro;", \n        entities[182] = "&para;", entities[183] = "&middot;", entities[184] = "&cedil;", \n        entities[185] = "&sup1;", entities[186] = "&ordm;", entities[187] = "&raquo;", entities[188] = "&frac14;", \n        entities[189] = "&frac12;", entities[190] = "&frac34;", entities[191] = "&iquest;", \n        entities[192] = "&Agrave;", entities[193] = "&Aacute;", entities[194] = "&Acirc;", \n        entities[195] = "&Atilde;", entities[196] = "&Auml;", entities[197] = "&Aring;", \n        entities[198] = "&AElig;", entities[199] = "&Ccedil;", entities[200] = "&Egrave;", \n        entities[201] = "&Eacute;", entities[202] = "&Ecirc;", entities[203] = "&Euml;", \n        entities[204] = "&Igrave;", entities[205] = "&Iacute;", entities[206] = "&Icirc;", \n        entities[207] = "&Iuml;", entities[208] = "&ETH;", entities[209] = "&Ntilde;", entities[210] = "&Ograve;", \n        entities[211] = "&Oacute;", entities[212] = "&Ocirc;", entities[213] = "&Otilde;", \n        entities[214] = "&Ouml;", entities[215] = "&times;", entities[216] = "&Oslash;", \n        entities[217] = "&Ugrave;", entities[218] = "&Uacute;", entities[219] = "&Ucirc;", \n        entities[220] = "&Uuml;", entities[221] = "&Yacute;", entities[222] = "&THORN;", \n        entities[223] = "&szlig;", entities[224] = "&agrave;", entities[225] = "&aacute;", \n        entities[226] = "&acirc;", entities[227] = "&atilde;", entities[228] = "&auml;", \n        entities[229] = "&aring;", entities[230] = "&aelig;", entities[231] = "&ccedil;", \n        entities[232] = "&egrave;", entities[233] = "&eacute;", entities[234] = "&ecirc;", \n        entities[235] = "&euml;", entities[236] = "&igrave;", entities[237] = "&iacute;", \n        entities[238] = "&icirc;", entities[239] = "&iuml;", entities[240] = "&eth;", entities[241] = "&ntilde;", \n        entities[242] = "&ograve;", entities[243] = "&oacute;", entities[244] = "&ocirc;", \n        entities[245] = "&otilde;", entities[246] = "&ouml;", entities[247] = "&divide;", \n        entities[248] = "&oslash;", entities[249] = "&ugrave;", entities[250] = "&uacute;", \n        entities[251] = "&ucirc;", entities[252] = "&uuml;", entities[253] = "&yacute;", \n        entities[254] = "&thorn;", entities[255] = "&yuml;"), "ENT_NOQUOTES" !== useQuoteStyle && (entities[34] = "&quot;"), \n        "ENT_QUOTES" === useQuoteStyle && (entities[39] = "&#39;"), entities[60] = "&lt;", \n        entities[62] = "&gt;", entities) entities.hasOwnProperty(decimal) && (hashMap[String.fromCharCode(decimal)] = entities[decimal]);\n        return hashMap;\n    };\n} ]);', null);
    };
}, function(module, exports, __webpack_require__) {
    "use strict";
    module.exports = function(table, quoteStyle) {
        var decimal, useTable, useQuoteStyle, entities = {}, hashMap = {}, constMappingTable = {}, constMappingQuoteStyle = {};
        if (constMappingTable[0] = "HTML_SPECIALCHARS", constMappingTable[1] = "HTML_ENTITIES", 
        constMappingQuoteStyle[0] = "ENT_NOQUOTES", constMappingQuoteStyle[2] = "ENT_COMPAT", 
        constMappingQuoteStyle[3] = "ENT_QUOTES", useTable = isNaN(table) ? table ? table.toUpperCase() : "HTML_SPECIALCHARS" : constMappingTable[table], 
        useQuoteStyle = isNaN(quoteStyle) ? quoteStyle ? quoteStyle.toUpperCase() : "ENT_COMPAT" : constMappingQuoteStyle[quoteStyle], 
        "HTML_SPECIALCHARS" !== useTable && "HTML_ENTITIES" !== useTable) throw new Error("Table: " + useTable + " not supported");
        for (decimal in entities[38] = "&amp;", "HTML_ENTITIES" === useTable && (entities[160] = "&nbsp;", 
        entities[161] = "&iexcl;", entities[162] = "&cent;", entities[163] = "&pound;", 
        entities[164] = "&curren;", entities[165] = "&yen;", entities[166] = "&brvbar;", 
        entities[167] = "&sect;", entities[168] = "&uml;", entities[169] = "&copy;", entities[170] = "&ordf;", 
        entities[171] = "&laquo;", entities[172] = "&not;", entities[173] = "&shy;", entities[174] = "&reg;", 
        entities[175] = "&macr;", entities[176] = "&deg;", entities[177] = "&plusmn;", entities[178] = "&sup2;", 
        entities[179] = "&sup3;", entities[180] = "&acute;", entities[181] = "&micro;", 
        entities[182] = "&para;", entities[183] = "&middot;", entities[184] = "&cedil;", 
        entities[185] = "&sup1;", entities[186] = "&ordm;", entities[187] = "&raquo;", entities[188] = "&frac14;", 
        entities[189] = "&frac12;", entities[190] = "&frac34;", entities[191] = "&iquest;", 
        entities[192] = "&Agrave;", entities[193] = "&Aacute;", entities[194] = "&Acirc;", 
        entities[195] = "&Atilde;", entities[196] = "&Auml;", entities[197] = "&Aring;", 
        entities[198] = "&AElig;", entities[199] = "&Ccedil;", entities[200] = "&Egrave;", 
        entities[201] = "&Eacute;", entities[202] = "&Ecirc;", entities[203] = "&Euml;", 
        entities[204] = "&Igrave;", entities[205] = "&Iacute;", entities[206] = "&Icirc;", 
        entities[207] = "&Iuml;", entities[208] = "&ETH;", entities[209] = "&Ntilde;", entities[210] = "&Ograve;", 
        entities[211] = "&Oacute;", entities[212] = "&Ocirc;", entities[213] = "&Otilde;", 
        entities[214] = "&Ouml;", entities[215] = "&times;", entities[216] = "&Oslash;", 
        entities[217] = "&Ugrave;", entities[218] = "&Uacute;", entities[219] = "&Ucirc;", 
        entities[220] = "&Uuml;", entities[221] = "&Yacute;", entities[222] = "&THORN;", 
        entities[223] = "&szlig;", entities[224] = "&agrave;", entities[225] = "&aacute;", 
        entities[226] = "&acirc;", entities[227] = "&atilde;", entities[228] = "&auml;", 
        entities[229] = "&aring;", entities[230] = "&aelig;", entities[231] = "&ccedil;", 
        entities[232] = "&egrave;", entities[233] = "&eacute;", entities[234] = "&ecirc;", 
        entities[235] = "&euml;", entities[236] = "&igrave;", entities[237] = "&iacute;", 
        entities[238] = "&icirc;", entities[239] = "&iuml;", entities[240] = "&eth;", entities[241] = "&ntilde;", 
        entities[242] = "&ograve;", entities[243] = "&oacute;", entities[244] = "&ocirc;", 
        entities[245] = "&otilde;", entities[246] = "&ouml;", entities[247] = "&divide;", 
        entities[248] = "&oslash;", entities[249] = "&ugrave;", entities[250] = "&uacute;", 
        entities[251] = "&ucirc;", entities[252] = "&uuml;", entities[253] = "&yacute;", 
        entities[254] = "&thorn;", entities[255] = "&yuml;"), "ENT_NOQUOTES" !== useQuoteStyle && (entities[34] = "&quot;"), 
        "ENT_QUOTES" === useQuoteStyle && (entities[39] = "&#39;"), entities[60] = "&lt;", 
        entities[62] = "&gt;", entities) entities.hasOwnProperty(decimal) && (hashMap[String.fromCharCode(decimal)] = entities[decimal]);
        return hashMap;
    };
}, function(module, exports, __webpack_require__) {
    "use strict";
    var URL = window.URL || window.webkitURL;
    module.exports = function(content, url) {
        try {
            try {
                var blob;
                try {
                    (blob = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder)).append(content), 
                    blob = blob.getBlob();
                } catch (e) {
                    blob = new Blob([ content ]);
                }
                return new Worker(URL.createObjectURL(blob));
            } catch (e) {
                return new Worker("data:application/javascript," + encodeURIComponent(content));
            }
        } catch (e) {
            if (!url) throw Error("Inline worker is not supported");
            return new Worker(url);
        }
    };
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, "a:not([href]) {\n  cursor: pointer;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(14);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentPart-first {\n  margin-top: 0.5em;\n}\n.cd-commentPart-last {\n  margin-bottom: 0.5em;\n}\nol > li.cd-commentPart-first {\n  margin-top: 0;\n}\nol > li.cd-commentPart-last {\n  margin-bottom: 0.1em;\n}\n.cd-commentLevel.cd-commentLevel:not(ol) {\n  list-style-type: none;\n  list-style-image: none;\n  padding-left: 1em;\n  margin: 0 0 0 1em;\n  border-left: 1px solid #c8ccd1;\n}\ndl.cd-commentLevel > dd {\n  margin-left: 0;\n}\n.cd-button-pending.cd-button-pending.cd-button-pending .oo-ui-buttonElement-button {\n  cursor: wait;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(16);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, '.cd-commentForm.cd-commentForm {\n  display: flow-root;\n  -ms-display: grid;\n  margin: 0.5em 0;\n}\n.cd-commentForm.cd-commentForm.cd-commentLevel {\n  margin-top: 0.5em;\n}\n.cd-commentForm.cd-commentForm-addSection,\n.cd-commentForm.cd-commentForm-addSubsection,\n.cd-commentForm.cd-commentForm-replyInSection:not(.cd-commentForm-inNumberedList),\n.cd-commentForm.cd-commentForm-sectionOpeningComment {\n  margin-top: 1em;\n}\n.cd-commentForm .cd-headlineInput {\n  margin-bottom: 0.25em;\n}\n.cd-commentForm .oo-ui-textInputWidget {\n  max-width: none;\n}\n.cd-commentForm .cd-summaryInput {\n  margin-top: 0.25em;\n}\n.cd-commentForm .cd-checkboxesContainer {\n  margin-top: 0.5em;\n}\n.cd-commentForm .cd-checkboxesContainer .oo-ui-fieldLayout {\n  margin-right: 1em;\n}\n.cd-commentForm .cd-checkboxesContainer .oo-ui-fieldLayout:last-child {\n  margin-right: 0;\n}\n.cd-commentForm .cd-buttonsContainer {\n  margin-top: 0.5em;\n  display: flow-root;\n  -ms-display: grid;\n}\n.cd-commentForm .cd-leftButtonsContainer {\n  float: left;\n}\n.cd-commentForm .cd-rightButtonsContainer {\n  float: right;\n}\n.cd-commentForm .cd-rightButtonsContainer > .oo-ui-buttonWidget:last-child {\n  margin-right: -0.3125em;\n}\n.cd-commentForm .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {\n  vertical-align: middle;\n}\n.cd-commentForm .cd-scriptSettingsButton {\n  margin: -1em 0 0;\n}\n.cd-commentForm table.diff {\n  margin-bottom: 0.5em;\n}\n.cd-commentForm + .cd-commentLevel,\n.cd-commentForm + dd > .cd-commentLevel:first-child,\n.cd-commentForm + li > .cd-commentLevel:first-child {\n  padding-top: 0.1px;\n}\n.cd-commentForm + .cd-commentForm {\n  padding-top: 0.5em;\n}\n.cd-commentForm .wikiEditor-ui-left {\n  float: none;\n}\n.cd-commentForm .wikiEditor-ui-toolbar .group .tool-select .options {\n  z-index: 1;\n}\n.cd-commentForm-innerWrapper {\n  margin-bottom: 0;\n  display: flow-root;\n  -ms-display: grid;\n}\n.cd-commentForm-signature {\n  opacity: 0.67;\n}\n.cd-commentForm-dummyElement {\n  height: 0;\n}\nol > li.cd-commentForm.cd-commentForm {\n  display: list-item;\n  -ms-display: list-item;\n}\n.cd-replyWrapper,\n.cd-sectionButtonContainer .cd-commentForm.cd-commentForm {\n  margin-top: 0.5em;\n}\n.cd-commentInput {\n  margin-top: 1px;\n  border: 1px solid #a2a9b1;\n}\n.cd-commentInput .wikiEditor-ui .wikiEditor-ui-top {\n  border-color: #a2a9b1;\n}\n.cd-commentInput .wikiEditor-ui .wikiEditor-ui-view {\n  border: 0;\n}\n.cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input {\n  width: calc(100% + 2px);\n  margin: -1px;\n  position: relative;\n}\nbody:not(.skin-monobook) .cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input {\n  border: 1px solid #a2a9b1;\n  box-shadow: none;\n}\nbody:not(.skin-monobook) .cd-commentInput.oo-ui-textInputWidget .oo-ui-inputWidget-input.oo-ui-inputWidget-input:focus {\n  outline: 2px solid #36c;\n  outline-offset: -2px;\n}\n.cd-previewArea {\n  margin-top: 0.5em;\n  padding: 0.5em 0.75em;\n  background-color: #f8f9fa;\n}\n.cd-previewArea > .mw-parser-output > *:first-child {\n  margin-top: 0;\n}\n.cd-previewArea > .mw-parser-output > *:last-child {\n  margin-bottom: 0;\n}\n.cd-previewArea .mw-editsection {\n  display: none;\n}\n.cd-previewArea:empty {\n  margin: 0;\n  padding: 0;\n}\n.cd-previewArea-above {\n  margin-top: 0;\n  margin-bottom: 0.5em;\n  width: calc(100% - 1.5em);\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child {\n  margin-bottom: 0;\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child > dd {\n  margin-left: 0;\n  margin-bottom: 0;\n}\n.cd-previewArea-indentedComment > .mw-parser-output > dl:first-child + p {\n  margin-top: 0;\n}\n.cd-messageArea {\n  width: 100%;\n}\n.cd-previewArea,\n.cd-messageArea {\n  position: relative;\n  clear: both;\n}\n.cd-previewArea .cd-closeButton,\n.cd-messageArea .cd-closeButton {\n  background-color: #f8f9fa;\n}\n.cd-previewArea:hover .cd-closeButton,\n.cd-messageArea:hover .cd-closeButton {\n  opacity: 1;\n}\n.cd-previewArea-above,\n.cd-messageArea {\n  float: left;\n}\n.cd-previewArea-above + *,\n.cd-messageArea + * {\n  clear: both;\n}\n.cd-commentForm-blockLabel {\n  color: #72777d;\n  margin-bottom: 0.5em;\n}\n.cd-closeButton {\n  position: absolute;\n  z-index: 1;\n  top: 0;\n  right: 0;\n  width: 20px;\n  height: 20px;\n  background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/18/OOjs_UI_icon_close-ltr.svg);\n  background-position: center center;\n  background-repeat: no-repeat;\n  opacity: 0;\n  transition: opacity 0.2s ease-in;\n}\n.cd-message {\n  margin-bottom: 0.5em;\n}\n.cd-popupsOverlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 5;\n  font-size: 14px;\n}\n.cd-insertButtons {\n  background-color: #f8f9fa;\n  border-color: #a2a9b1;\n  border-width: 0 1px 1px;\n  border-style: solid;\n  font-size: 0.928571em;\n  line-height: 1.384616em;\n}\n.cd-insertButtons::after {\n  display: block;\n  content: "";\n  clear: both;\n}\n.cd-insertButtons:empty {\n  border: 0;\n}\n.cd-insertButtons-item {\n  color: #222;\n  padding: 2px 0.5em 3px;\n  white-space: nowrap;\n  display: block;\n  float: left;\n}\n.cd-insertButtons-item:hover,\n.cd-insertButtons-item:focus {\n  text-decoration: none;\n  color: #222;\n  background-color: rgba(0, 23, 70, 0.086);\n}\n.cd-toolbarPlaceholder {\n  background-color: #f8f9fa;\n  border-color: #a2a9b1;\n  border-width: 1px 1px 0;\n  border-style: solid;\n  height: 32px;\n  margin: 1px 0 -1px;\n}\n.cd-commentForm-disabled .wikiEditor-ui-top,\n.cd-commentForm-disabled .cd-insertButtons {\n  pointer-events: none;\n}\n', "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(18);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, '.cd-sectionLinkWrapper::before {\n  content: " | ";\n  color: #54595d;\n}\n.cd-sectionLink-pending.cd-sectionLink-pending {\n  opacity: 0.5;\n  cursor: wait;\n  text-decoration: none;\n}\n.cd-sectionButtonContainer {\n  margin-top: 0.5em;\n}\n.cd-replyWrapper:not(.cd-commentForm) {\n  margin-left: -1px;\n}\n.cd-sectionButton {\n  padding-top: 0;\n  padding-bottom: 0;\n}\nol .cd-sectionButton {\n  margin-top: -2px;\n}\n', "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(20);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentUnderlay {\n  position: absolute;\n  z-index: -1;\n}\n.cd-commentUnderlay-focused.cd-commentUnderlay-focused {\n  background-color: var(--cd-comment-underlay-focused-color);\n}\n.cd-commentUnderlay-target.cd-commentUnderlay-target {\n  background-color: var(--cd-comment-underlay-target-color);\n}\n.cd-commentUnderlay-new {\n  background-color: var(--cd-comment-underlay-new-color);\n}\n.cd-commentUnderlay-own {\n  background-color: var(--cd-comment-underlay-own-color);\n}\n.cd-commentOverlay {\n  position: absolute;\n  display: none;\n  pointer-events: none;\n}\n.cd-commentOverlay-focused {\n  display: block;\n}\n.cd-commentOverlay-innerWrapper {\n  position: absolute;\n  z-index: 1;\n  bottom: 0;\n  right: 0;\n  font-size: 14px;\n  line-height: normal;\n  pointer-events: all;\n}\n.cd-commentOverlay-gradient {\n  width: 1.4em;\n  display: inline-block;\n  padding: 0 1px 4px;\n  line-height: 1.28571429em;\n  -moz-user-select: none;\n  -webkit-user-select: none;\n  user-select: none;\n}\n.cd-commentOverlay-content {\n  display: inline-block;\n  padding: 0 0.5em 2px;\n  background-color: var(--cd-comment-underlay-focused-color);\n}\n.cd-commentOverlay-content .oo-ui-buttonWidget {\n  margin-right: 0;\n}\n.cd-commentOverlay-content .cd-commentButton:not(:first-child) {\n  margin-left: 1em;\n}\n.cd-commentOverlay .cd-button.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover,\n.cd-commentOverlay .cd-button.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {\n  background-color: transparent;\n}\n.cd-commentLayersContainerParent {\n  position: relative;\n  z-index: 0;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(22);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, '#cd-navPanel {\n  position: fixed;\n  top: 44%;\n  left: 0;\n  z-index: 5;\n  width: 32px;\n  background-color: #fff;\n  border: 1px solid #a2a9b1;\n  border-left: 0;\n  opacity: 0.695;\n  font-size: 13px;\n  line-height: 1.2;\n  color: #000;\n  -moz-user-select: none;\n  -webkit-user-select: none;\n  user-select: none;\n}\n#cd-navPanel:hover {\n  opacity: 1;\n}\n#cd-navPanel-refreshButton {\n  padding: 4px;\n  width: 24px;\n  height: 24px;\n  background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/17/OOjs_UI_icon_reload.svg);\n  background-size: 20px 20px;\n}\n#cd-navPanel-refreshButton:not(:empty) {\n  background-image: none;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-weight: bold;\n}\n#cd-navPanel-previousButton {\n  background-image: url(https://upload.wikimedia.org/wikipedia/commons/1/10/OOjs_UI_icon_collapse.svg);\n  background-size: 14px 14px;\n}\n#cd-navPanel-nextButton {\n  background-image: url(https://upload.wikimedia.org/wikipedia/commons/9/90/OOjs_UI_icon_expand.svg);\n  background-size: 14px 14px;\n}\n#cd-navPanel-firstUnseenButton {\n  height: 15px;\n  padding: 7px 0;\n}\n#cd-navPanel-commentFormButton {\n  background-image: url(https://upload.wikimedia.org/wikipedia/commons/a/ac/OOjs_UI_icon_ongoingConversation-ltr.svg);\n  background-size: 16px 16px;\n}\n.cd-navPanel-button {\n  display: block;\n  text-align: center;\n  background-position: center center;\n  background-repeat: no-repeat;\n  cursor: pointer;\n}\n.cd-navPanel-button:hover {\n  background-color: #f3f4f5;\n}\n.cd-navPanel-button:not(:first-child) {\n  position: relative;\n  height: 29px;\n  margin-top: 1px;\n}\n.cd-navPanel-button:not(:first-child)::before {\n  position: absolute;\n  top: -1px;\n  left: 4px;\n  margin: 0 auto 1px;\n  width: 24px;\n  height: 0;\n  border-top: 1px solid #a2a9b1;\n  content: "";\n}\n.cd-navPanel-refreshButton-interesting {\n  color: #7d00cc;\n}\n', "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(24);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, ".skin-monobook .cd-commentUnderlay {\n  z-index: -1;\n}\n.skin-monobook .cd-commentOverlay-innerWrapper {\n  z-index: 2;\n}\n.skin-monobook .cd-commentButton.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {\n  line-height: 1.172em;\n}\n.skin-monobook .cd-commentInput {\n  border: 1px solid #ccc;\n}\n.skin-monobook .cd-commentInput .wikiEditor-ui .wikiEditor-ui-top {\n  border-color: #ccc;\n}\n.skin-monobook .cd-insertButtons {\n  border-color: #ccc;\n}\n.skin-monobook .cd-toolbarPlaceholder {\n  border-color: #ccc;\n}\n.skin-timeless .mw-body-content,\n.skin-modern #mw-content-text {\n  position: relative;\n}\n.skin-minerva #mw-content-text dl {\n  margin-left: 0;\n}\n.skin-minerva #mw-content-text dd {\n  margin-left: 1em;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(26);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentButton.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button,\n.cd-sectionButton.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button {\n  padding: 0;\n}\n.cd-commentButton.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child,\n.cd-sectionButton.oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child {\n  margin-left: 0;\n}\n.cd-button.oo-ui-buttonElement > .oo-ui-buttonElement-button {\n  min-height: unset;\n}\nol > .cd-replyWrapper:not(.cd-replyWrapper-hasCommentForm) {\n  list-style-type: none;\n}\n.action-view .cd-hidden:not(#cd-notExistingClass) {\n  display: none;\n}\np.cd-shown {\n  display: block !important;\n}\n.cd-destructiveText {\n  color: #d33;\n}\n.cd-loadingPopup {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 1.5em;\n  z-index: 111;\n  margin: 0 auto;\n  padding: 17px 17px 11px 17px;\n  background-color: #fff;\n  border: 1px solid #c8ccd1;\n}\n.cd-loadingPopup-logo {\n  display: block;\n  margin: 0 auto;\n}\n.cd-spaceBeforeSectionMenu {\n  height: 0;\n  float: right;\n}\n.cd-notification-restoreCommentForms {\n  display: inline-block;\n  position: relative;\n  padding: 0.25em;\n  margin: -0.25em;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, exports, __webpack_require__) {
    var api = __webpack_require__(3), content = __webpack_require__(28);
    "string" == typeof (content = content.__esModule ? content.default : content) && (content = [ [ module.i, content, "" ] ]);
    var options = {
        insert: "head",
        singleton: !1
    };
    api(content, options);
    module.exports = content.locals || {};
}, function(module, exports, __webpack_require__) {
    (exports = __webpack_require__(4)(!1)).push([ module.i, ".cd-commentLink-interesting a {\n  font-weight: bold;\n}\n.cd-watchlistMenu {\n  display: inline-block;\n  border: 1px solid #a2a9b1;\n  border-radius: 2px;\n  padding: 0 0.5em 0.5em;\n  vertical-align: top;\n  margin: -10px 1em 0 0.5em;\n}\n#mw-watchlist-options .cd-watchlistMenu {\n  float: right;\n}\n.cd-watchlistMenu-legend {\n  padding: 0 0.5em;\n}\n.cd-watchlistMenu-button {\n  margin-right: 0;\n}\n.cd-watchlistMenu-button-switchInteresting {\n  margin-bottom: -2px;\n}\n.cd-editWatchedSections-input {\n  margin: 1px 0;\n}\n.cd-editWatchedSections-input textarea {\n  resize: none;\n}\n", "" ]), 
    module.exports = exports;
}, function(module, __webpack_exports__, __webpack_require__) {
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    var nano_css = __webpack_require__(6), asyncToGenerator = __webpack_require__(1), asyncToGenerator_default = __webpack_require__.n(asyncToGenerator), classPrivateFieldGet = __webpack_require__(0), classPrivateFieldGet_default = __webpack_require__.n(classPrivateFieldGet), classPrivateFieldSet = __webpack_require__(2), classPrivateFieldSet_default = __webpack_require__.n(classPrivateFieldSet);
    class CdError extends Error {
        constructor(data) {
            let message;
            data ? (message = data.type, data.code && (message += "/".concat(data.code)), data.apiData && data.apiData.error && data.apiData.error.code && (message += "/".concat(data.apiData.error.code))) : message = "", 
            super(message), this.name = "CdError", this.data = data;
        }
    }
    const context = "undefined" == typeof window ? self : window;
    context.convenientDiscussions = context.convenientDiscussions || {}, "object" != typeof context.convenientDiscussions && (context.convenientDiscussions = {});
    var cd = context.convenientDiscussions;
    class TreeWalker {
        constructor(root, acceptNode, onlyElementNodes = !1, startNode = root) {
            this.acceptNode = acceptNode, this.root = root, this.currentNode = startNode, onlyElementNodes ? (this.firstChildProperty = "firstElementChild", 
            this.lastChildProperty = "lastElementChild", this.previousSiblingProperty = "previousElementSibling", 
            this.nextSiblingProperty = "nextElementSibling") : (this.firstChildProperty = "firstChild", 
            this.lastChildProperty = "lastChild", this.previousSiblingProperty = "previousSibling", 
            this.nextSiblingProperty = "nextSibling");
        }
        tryMove(property) {
            let node = this.currentNode;
            if (node === this.root && !property.includes("Child")) return null;
            do {
                node = node[property];
            } while (node && this.acceptNode && !this.acceptNode(node));
            return node && (this.currentNode = node), node || null;
        }
        parentNode() {
            return this.tryMove("parentNode");
        }
        firstChild() {
            return this.tryMove(this.firstChildProperty);
        }
        lastChild() {
            return this.tryMove(this.lastChildProperty);
        }
        previousSibling() {
            return this.tryMove(this.previousSiblingProperty);
        }
        nextSibling() {
            return this.tryMove(this.nextSiblingProperty);
        }
        nextNode() {
            let node = this.currentNode;
            do {
                if (node[this.firstChildProperty]) node = node[this.firstChildProperty]; else {
                    for (;node && !node[this.nextSiblingProperty] && node.parentNode !== this.root; ) node = node.parentNode;
                    node && (node = node[this.nextSiblingProperty]);
                }
            } while (node && this.acceptNode && !this.acceptNode(node));
            return node && (this.currentNode = node), node;
        }
        previousNode() {
            let node = this.currentNode;
            if (node !== this.root) {
                do {
                    if (node[this.previousSiblingProperty]) for (node = node[this.previousSiblingProperty]; node[this.lastChildProperty]; ) node = node[this.lastChildProperty]; else node = node.parentNode;
                } while (node && this.acceptNode && !this.acceptNode(node));
                return node && (this.currentNode = node), node;
            }
        }
    }
    class treeWalker_ElementsTreeWalker extends TreeWalker {
        constructor(startNode) {
            super(cd.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName), !0), 
            startNode && (this.currentNode = startNode);
        }
    }
    class treeWalker_ElementsAndTextTreeWalker extends TreeWalker {
        constructor(startNode) {
            super(cd.g.rootElement, node => node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE && ![ "STYLE", "LINK" ].includes(node.tagName)), 
            startNode && (this.currentNode = startNode);
        }
    }
    var _parser = new WeakMap;
    function removeDuplicates(arr) {
        return arr && "object" == typeof arr ? arr.filter((value, i) => arr.indexOf(value) === i) : null;
    }
    function isInline(node, countTextNodesAsInline) {
        return !(!countTextNodesAsInline || node.nodeType !== Node.TEXT_NODE) || (node.nodeType !== Node.ELEMENT_NODE ? null : !!cd.g.POPULAR_INLINE_ELEMENTS.includes(node.tagName) || !cd.g.POPULAR_NOT_INLINE_ELEMENTS.includes(node.tagName) && ("undefined" != typeof window ? (console.warn("Expensive operation: isInline() called for the element:", node), 
        "inline" === window.getComputedStyle(node).display) : null));
    }
    function caseInsensitiveFirstCharPattern(s) {
        const firstChar = s[0];
        return (firstChar.toUpperCase() !== firstChar.toLowerCase() ? "[" + firstChar.toUpperCase() + firstChar.toLowerCase() + "]" : mw.util.escapeRegExp(firstChar)) + mw.util.escapeRegExp(s.slice(1));
    }
    function isTalkNamespace(namespaceNumber) {
        return namespaceNumber % 2 == 1 || cd.config.customTalkNamespaces.includes(namespaceNumber);
    }
    function isProbablyTalkPage(page, namespaceNumber) {
        if (void 0 === namespaceNumber) {
            namespaceNumber = new mw.Title.newFromText(page).namespace;
        }
        return isTalkNamespace(namespaceNumber) && (namespaceNumber % 2 == 1 || !cd.config.pageWhiteListRegexp || cd.config.pageWhiteListRegexp.test(page)) && (!cd.config.pageBlackListRegexp || !cd.config.pageBlackListRegexp.test(page));
    }
    function isCommentEdit(summary) {
        return summary && (summary.includes("".concat(cd.s("es-edit"), " ").concat(cd.s("es-reply-genitive"))) || summary.includes("".concat(cd.s("es-edit"), " ").concat(cd.s("es-addition-genitive"))));
    }
    function isUndo(summary) {
        return summary && cd.config.undoTexts.some(text => summary.includes(text));
    }
    function defined(el) {
        return void 0 !== el;
    }
    function notNull(el) {
        return null != el;
    }
    function reorderArray(arr, startIndex, reverse = !1) {
        return reverse ? arr.slice(startIndex + 1).concat(arr.slice(0, startIndex + 1)).reverse() : arr.slice(startIndex).concat(arr.slice(0, startIndex));
    }
    function handleApiReject(code, data) {
        throw new CdError("http" === code ? {
            type: "network"
        } : {
            type: "api",
            code: "error",
            apiData: data
        });
    }
    function underlinesToSpaces(s) {
        return s.replace(/_/g, " ");
    }
    function spacesToUnderlines(s) {
        return s.replace(/ /g, "_");
    }
    function animateLink(html, className, callback) {
        const $link = html instanceof $ ? html : cd.util.wrapInElement(html);
        return $link.find(".".concat(className)).on("click", callback), $link;
    }
    function firstCharToUpperCase(s) {
        return s.length ? s[0].toUpperCase() + s.slice(1) : "";
    }
    function util_getMessages(messages) {
        return messages.map(mw.msg);
    }
    function isInputFocused() {
        return $(":focus:input").length || $(":focus").prop("isContentEditable");
    }
    var commentLayers = {
        underlays: [],
        layersContainers: [],
        redrawIfNecessary(removeUnhighlighted = !1) {
            if (!this.underlays.length || document.hidden) return;
            const comments = [], rootBottom = cd.g.$root.get(0).getBoundingClientRect().bottom + window.pageYOffset;
            let floatingRects, notMovedCount = 0;
            cd.comments.slice().reverse().some(comment => {
                const shouldBeHighlighted = comment.newness || comment.own && cd.settings.highlightOwnComments;
                if ((removeUnhighlighted || comment.positions && comment.positions.bottom > rootBottom) && !shouldBeHighlighted && comment.$underlay) comment.removeLayers(); else if (shouldBeHighlighted && !comment.editForm) {
                    floatingRects = floatingRects || cd.g.specialElements.floating.map(el => el.getBoundingClientRect());
                    const isMoved = comment.configureLayers(!1, floatingRects);
                    if (isMoved) notMovedCount = 0, comments.push(comment); else if (!1 === isMoved && (notMovedCount++, 
                    2 === notMovedCount)) return !0;
                }
            }), comments.forEach(comment => {
                comment.updateLayersPositions();
            });
        },
        reset() {
            this.underlays = [], this.layersContainers.forEach(container => {
                container.innerHTML = "";
            });
        }
    }, userRegistry = {
        users: {},
        getUser(name) {
            if (name.includes("#") && (name = name.slice(0, name.indexOf("#"))), name = underlinesToSpaces(firstCharToUpperCase(name)).trim(), 
            !this.users[name]) {
                const options = name === cd.g.CURRENT_USER_NAME ? {
                    gender: cd.g.CURRENT_USER_GENDER
                } : {};
                this.users[name] = new userRegistry_User(name, options);
            }
            return this.users[name];
        }
    };
    class userRegistry_User {
        constructor(name, options = {}) {
            _cachedRegistered.set(this, {
                writable: !0,
                value: void 0
            }), this.name = name, this.options = new mw.Map, Object.keys(options).forEach(name => {
                this[name] = options[name];
            });
        }
        get registered() {
            return void 0 === classPrivateFieldGet_default()(this, _cachedRegistered) && classPrivateFieldSet_default()(this, _cachedRegistered, !mw.util.isIPAddress(this.name)), 
            classPrivateFieldGet_default()(this, _cachedRegistered);
        }
        set gender(value) {
            this.options.set("gender", value);
        }
        get gender() {
            return this.options.get("gender");
        }
    }
    var _cachedRegistered = new WeakMap, lz_string = __webpack_require__(5), lz_string_default = __webpack_require__.n(lz_string);
    function packVisits(visits) {
        return Object.keys(visits).map(key => "".concat(key, ",").concat(visits[key].join(","), "\n")).join("").trim();
    }
    function getSettings() {
        return _getSettings.apply(this, arguments);
    }
    function _getSettings() {
        return (_getSettings = asyncToGenerator_default()((function*(reuse = !1) {
            const {options: options} = yield getUserInfo(reuse);
            let settings;
            try {
                settings = JSON.parse(options[cd.g.SETTINGS_OPTION_FULL_NAME]) || {};
            } catch (e) {
                settings = cd.settings;
            }
            return settings;
        }))).apply(this, arguments);
    }
    function setSettings(_x) {
        return _setSettings.apply(this, arguments);
    }
    function _setSettings() {
        return (_setSettings = asyncToGenerator_default()((function*(settings) {
            yield setOption(cd.g.SETTINGS_OPTION_FULL_NAME, JSON.stringify(settings || cd.settings));
        }))).apply(this, arguments);
    }
    function getVisits() {
        return _getVisits.apply(this, arguments);
    }
    function _getVisits() {
        return (_getVisits = asyncToGenerator_default()((function*(reuse = !1) {
            const visits = yield cd.g.firstRun && null === mw.user.options.get(cd.g.VISITS_OPTION_FULL_NAME) ? Promise.resolve({}) : getUserInfo(reuse).then(options => options.visits), articleId = mw.config.get("wgArticleId");
            let thisPageVisits;
            return articleId && (visits[articleId] = visits[articleId] || [], thisPageVisits = visits[articleId]), 
            cd.g.visits = visits, cd.g.thisPageVisits = thisPageVisits, {
                visits: visits,
                thisPageVisits: thisPageVisits
            };
        }))).apply(this, arguments);
    }
    function cleanUpVisits(originalVisits) {
        const visits = Object.assign({}, originalVisits), timestamps = Object.keys(visits).reduce((acc, key) => acc.concat(visits[key]), []);
        timestamps.sort();
        const boundary = timestamps[Math.floor(timestamps.length / 10)];
        return Object.keys(visits).forEach(key => {
            visits[key] = visits[key].filter(visit => visit >= boundary), visits[key].length || delete visits[key];
        }), visits;
    }
    function setVisits(_x2) {
        return _setVisits.apply(this, arguments);
    }
    function _setVisits() {
        return (_setVisits = asyncToGenerator_default()((function*(visits) {
            if (!visits) return;
            const visitsString = packVisits(visits), visitsStringCompressed = lz_string_default.a.compressToEncodedURIComponent(visitsString);
            try {
                yield setOption(cd.g.VISITS_OPTION_FULL_NAME, visitsStringCompressed);
            } catch (e) {
                if (e instanceof CdError) {
                    const {type: type, code: code} = e.data;
                    "internal" === type && "sizeLimit" === code ? setVisits(cleanUpVisits(visits)) : console.error(e);
                } else console.error(e);
            }
        }))).apply(this, arguments);
    }
    function getWatchedSections() {
        return _getWatchedSections.apply(this, arguments);
    }
    function _getWatchedSections() {
        return (_getWatchedSections = asyncToGenerator_default()((function*(reuse = !1, keptData = {}, noTimers = !1) {
            const watchedSections = yield cd.g.firstRun && null === mw.user.options.get(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME) ? Promise.resolve({}) : getUserInfo(reuse).then(options => options.watchedSections), articleId = mw.config.get("wgArticleId");
            let thisPageWatchedSections;
            return articleId && (watchedSections[articleId] = watchedSections[articleId] || [], 
            thisPageWatchedSections = watchedSections[articleId], keptData.justWatchedSection && (thisPageWatchedSections.includes(keptData.justWatchedSection) || thisPageWatchedSections.push(keptData.justWatchedSection)), 
            keptData.justUnwatchedSection && thisPageWatchedSections.includes(keptData.justUnwatchedSection) && thisPageWatchedSections.splice(thisPageWatchedSections.indexOf(keptData.justUnwatchedSection), 1)), 
            {
                watchedSections: watchedSections,
                thisPageWatchedSections: thisPageWatchedSections
            };
        }))).apply(this, arguments);
    }
    function setWatchedSections(watchedSections) {
        const watchedSectionsString = function(watchedSections) {
            return Object.keys(watchedSections).filter(pageId => watchedSections[pageId].length).map(key => " ".concat(key, " ").concat(watchedSections[key].join("\n"), "\n")).join("").trim();
        }(watchedSections), watchedSectionsStringCompressed = lz_string_default.a.compressToEncodedURIComponent(watchedSectionsString);
        setOption(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME, watchedSectionsStringCompressed);
    }
    function makeRequestNoTimers(params, method = "get") {
        return new Promise((resolve, reject) => {
            cd.g.api[method](params, {
                success: resp => {
                    resp.error ? reject("api", resp) : resolve(resp);
                },
                error: (jqXHR, textStatus) => {
                    reject("http", textStatus);
                }
            });
        });
    }
    function getCurrentPageData() {
        return _getCurrentPageData.apply(this, arguments);
    }
    function _getCurrentPageData() {
        return (_getCurrentPageData = asyncToGenerator_default()((function*(markAsRead = !1, noTimers = !1) {
            const params = {
                action: "parse",
                page: cd.g.CURRENT_PAGE,
                prop: [ "text", "revid", "modules", "jsconfigvars" ],
                formatversion: 2
            }, request = noTimers ? makeRequestNoTimers(params).catch(handleApiReject) : cd.g.api.get(params).catch(handleApiReject);
            markAsRead && $.get(mw.util.getUrl(cd.g.CURRENT_PAGE));
            const resp = yield request;
            if (void 0 === resp.parse) throw new CdError({
                type: "api",
                code: "noData"
            });
            return resp.parse;
        }))).apply(this, arguments);
    }
    function parseCode(_x, _x2) {
        return _parseCode.apply(this, arguments);
    }
    function _parseCode() {
        return (_parseCode = asyncToGenerator_default()((function*(code, options) {
            const defaultOptions = {
                action: "parse",
                text: code,
                prop: [ "text", "modules" ],
                pst: !0,
                disablelimitreport: !0,
                formatversion: 2
            };
            return cd.g.api.post(Object.assign({}, defaultOptions, options)).then(resp => {
                const html = resp && resp.parse && resp.parse.text;
                if (!html) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                return mw.loader.load(resp.parse.modules), mw.loader.load(resp.parse.modulestyles), 
                {
                    html: html,
                    parsedSummary: resp.parse.parsedsummary
                };
            }, handleApiReject);
        }))).apply(this, arguments);
    }
    function getLastRevision(_x3) {
        return _getLastRevision.apply(this, arguments);
    }
    function _getLastRevision() {
        return (_getLastRevision = asyncToGenerator_default()((function*(title) {
            if (!mw.config.get("wgArticleId")) return {
                code: ""
            };
            const resp = yield cd.g.api.get({
                action: "query",
                titles: title.toString(),
                prop: "revisions",
                rvprop: [ "ids", "content" ],
                redirects: !0,
                curtimestamp: !0,
                formatversion: 2
            }).catch(handleApiReject), query = resp.query, page = query && query.pages && query.pages[0], revision = page && page.revisions && page.revisions[0];
            if (!query || !page) throw new CdError({
                type: "api",
                code: "noData"
            });
            if (page.missing) throw new CdError({
                type: "api",
                code: "missing"
            });
            if (page.invalid) throw new CdError({
                type: "api",
                code: "invalid"
            });
            if (!revision) throw new CdError({
                type: "api",
                code: "noData"
            });
            return {
                code: revision.content,
                revisionId: revision.revid,
                redirectTarget: query.redirects && query.redirects[0] && query.redirects[0].to,
                queryTimestamp: resp.curtimestamp
            };
        }))).apply(this, arguments);
    }
    let keptUserInfoRequest;
    function getUserInfo(reuse = !1) {
        if (reuse && keptUserInfoRequest) return keptUserInfoRequest;
        return keptUserInfoRequest = makeRequestNoTimers({
            action: "query",
            meta: "userinfo",
            uiprop: [ "options", "rights" ],
            formatversion: 2
        }).then(resp => {
            const userinfo = resp && resp.query && resp.query.userinfo, options = userinfo && userinfo.options, rights = userinfo && userinfo.rights;
            if (!options || !rights) throw new CdError({
                type: "api",
                code: "noData"
            });
            const visitsCompressed = options[cd.g.VISITS_OPTION_FULL_NAME], visits = function(visitsString) {
                const visits = {}, regexp = /^(\d+), *(.+)$/gm;
                let match;
                for (;match = regexp.exec(visitsString); ) visits[match[1]] = match[2].split(",");
                return visits;
            }(visitsCompressed ? lz_string_default.a.decompressFromEncodedURIComponent(visitsCompressed) : ""), watchedSectionsCompressed = options[cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME], watchedSections = function(watchedSectionsString) {
                const watchedSections = {}, pages = watchedSectionsString.split(/(?:^|\n )(\d+) /).slice(1);
                let pageId;
                for (let i = 0, isPageId = !0; i < pages.length; i++, isPageId = !isPageId) isPageId ? pageId = pages[i] : watchedSections[pageId] = pages[i].split("\n");
                return watchedSections;
            }(watchedSectionsCompressed ? lz_string_default.a.decompressFromEncodedURIComponent(watchedSectionsCompressed) : "");
            return cd.g.CURRENT_USER_RIGHTS = rights, {
                options: options,
                visits: visits,
                watchedSections: watchedSections,
                rights: rights
            };
        }, handleApiReject), keptUserInfoRequest;
    }
    function getPageTitles(_x4) {
        return _getPageTitles.apply(this, arguments);
    }
    function _getPageTitles() {
        return (_getPageTitles = asyncToGenerator_default()((function*(pageIds) {
            const allPages = [], limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
            let nextPageIds;
            for (;nextPageIds = pageIds.splice(0, limit).join("|"); ) {
                const resp = yield cd.g.api.post({
                    action: "query",
                    pageids: nextPageIds,
                    formatversion: 2
                }).catch(handleApiReject);
                if (resp.error) throw new CdError({
                    type: "api",
                    code: "error",
                    apiData: resp
                });
                const query = resp && resp.query, pages = query && query.pages;
                if (!pages) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                allPages.push(...pages);
            }
            return allPages;
        }))).apply(this, arguments);
    }
    function getPageIds(_x5) {
        return _getPageIds.apply(this, arguments);
    }
    function _getPageIds() {
        return (_getPageIds = asyncToGenerator_default()((function*(pageTitles) {
            const allPages = [], allNormalized = [], allRedirects = [], limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
            let nextPageTitles;
            for (;nextPageTitles = pageTitles.splice(0, limit).join("|"); ) {
                const resp = yield cd.g.api.post({
                    action: "query",
                    titles: nextPageTitles,
                    redirects: !0,
                    formatversion: 2
                }).catch(handleApiReject);
                if (resp.error) throw new CdError({
                    type: "api",
                    code: "error",
                    apiData: resp
                });
                const query = resp && resp.query, pages = query && query.pages;
                if (!pages) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                const normalized = query.normalized || [], redirects = query.redirects || [];
                allNormalized.push(...normalized), allRedirects.push(...redirects), allPages.push(...pages);
            }
            return {
                pages: allPages,
                normalized: allNormalized,
                redirects: allRedirects
            };
        }))).apply(this, arguments);
    }
    function setOption(_x6, _x7) {
        return _setOption.apply(this, arguments);
    }
    function _setOption() {
        return (_setOption = asyncToGenerator_default()((function*(name, value) {
            if (value.length > 65535) throw new CdError({
                type: "internal",
                code: "sizeLimit"
            });
            const resp = yield cd.g.api.postWithToken("csrf", {
                action: "options",
                optionname: name,
                optionvalue: value
            }).catch(handleApiReject);
            if (!resp || "success" !== resp.options) throw new CdError({
                type: "api",
                code: "noSuccess"
            });
        }))).apply(this, arguments);
    }
    function getUserGenders(_x8) {
        return _getUserGenders.apply(this, arguments);
    }
    function _getUserGenders() {
        return (_getUserGenders = asyncToGenerator_default()((function*(users, noTimers = !1) {
            const usersToRequest = users.filter(user => !user.gender).map(user => user.name), limit = cd.g.CURRENT_USER_RIGHTS && cd.g.CURRENT_USER_RIGHTS.includes("apihighlimits") ? 500 : 50;
            let nextUsers;
            for (;nextUsers = usersToRequest.splice(0, limit).join("|"); ) {
                const params = {
                    action: "query",
                    list: "users",
                    ususers: nextUsers,
                    usprop: "gender",
                    formatversion: 2
                }, request = noTimers ? makeRequestNoTimers(params, "post").catch(handleApiReject) : cd.g.api.post(params).catch(handleApiReject), resp = yield request, users = resp && resp.query && resp.query.users;
                if (!users) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                users.forEach(user => {
                    userRegistry.getUser(user.name).gender = user.gender;
                });
            }
        }))).apply(this, arguments);
    }
    var jqueryExtensions = {
        cdRemoveNonElementNodes: function() {
            return this.filter((function() {
                return this.nodeType === Node.ELEMENT_NODE;
            }));
        },
        cdScrollTo(alignment = "top", smooth = !0, callback) {
            cd.g.autoScrollInProgress = !0;
            let offset, $elements = this.cdRemoveNonElementNodes();
            const offsetTop = $elements.first().offset().top, offsetLast = $elements.last().offset().top + $elements.last().height();
            return offset = "center" === alignment ? Math.min(offsetTop, offsetTop + .5 * (offsetLast - offsetTop) - .5 * $(window).height()) : "bottom" === alignment ? offsetLast - $(window).height() : offsetTop, 
            smooth ? $("body, html").animate({
                scrollTop: offset
            }, {
                complete: () => {
                    cd.g.autoScrollInProgress = !1, js_navPanel.isMounted() && (js_navPanel.registerSeenComments(), 
                    js_navPanel.updateCommentFormButton()), callback && callback();
                }
            }) : (window.scrollTo(0, offset), cd.g.autoScrollInProgress = !1, js_navPanel.isMounted() && (js_navPanel.registerSeenComments(), 
            js_navPanel.updateCommentFormButton())), this;
        },
        cdIsInViewport(partially = !1) {
            const $elements = this.cdRemoveNonElementNodes(), wasHidden = $elements.get().every(el => "none" === el.style.display);
            wasHidden && $elements.show();
            const elementTop = $elements.first().offset().top, elementBottom = $elements.last().offset().top + $elements.last().height();
            wasHidden && $elements.hide();
            const viewportTop = $(window).scrollTop(), viewportBottom = viewportTop + $(window).height();
            return partially ? elementBottom > viewportTop && elementTop < viewportBottom : elementTop >= viewportTop && elementBottom <= viewportBottom;
        },
        cdScrollIntoView(alignment) {
            return this.cdIsInViewport() || this.cdScrollTo(alignment), this;
        },
        cdGetText() {
            let text;
            const dummyElement = document.createElement("div");
            return Array.from(this.get(0).childNodes).forEach(node => {
                dummyElement.appendChild(node.cloneNode(!0));
            }), document.body.appendChild(dummyElement), text = dummyElement.innerText, document.body.removeChild(dummyElement), 
            text;
        },
        cdAddCloseButton() {
            if (this.find(".cd-closeButton").length) return this;
            const $closeButton = $("<a>").attr("title", cd.s("cf-block-close")).addClass("cd-closeButton").on("click", () => {
                this.empty();
            });
            return this.prepend($closeButton), this;
        }
    };
    let parseTimestampRegexp, parseTimestampRegexpNoTimezone;
    function parseTimestamp(timestamp, timezoneOffset) {
        parseTimestampRegexp || (parseTimestampRegexp = new RegExp("^([^]*)(".concat(cd.g.TIMESTAMP_REGEXP.source, ")"))), 
        parseTimestampRegexpNoTimezone || (parseTimestampRegexpNoTimezone = new RegExp("^([^]*)(".concat(cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.source, ")")));
        const regexp = void 0 === timezoneOffset ? parseTimestampRegexp : parseTimestampRegexpNoTimezone, match = timestamp.match(regexp);
        if (!match) return null;
        let date = cd.g.TIMESTAMP_PARSER(match, cd.g.TIMESTAMP_MATCHING_GROUPS, cd.g.DIGITS, cd.g.LOCAL_TIMEZONE_OFFSET);
        return timezoneOffset && (date = new Date(date.getTime() - timezoneOffset * cd.g.MILLISECONDS_IN_A_MINUTE)), 
        {
            date: date,
            match: match
        };
    }
    function zeroPad(number, length) {
        return ("0000" + number).slice(-length);
    }
    function formatDate(date) {
        const format = cd.g.DATE_FORMAT;
        let s = "";
        for (let p = 0; p < format.length; p++) {
            let code = format[p];
            switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]), 
            code) {
              case "xx":
                s += "x";
                break;

              case "xg":
                s += util_getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ])[date.getUTCMonth()];
                break;

              case "d":
                s += zeroPad(date.getUTCDate(), 2);
                break;

              case "D":
                s += util_getMessages([ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ])[date.getUTCDay()];
                break;

              case "j":
                s += date.getUTCDate();
                break;

              case "l":
                s += util_getMessages([ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ])[date.getDay()];
                break;

              case "F":
                s += util_getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ])[date.getUTCMonth()];
                break;

              case "M":
                s += util_getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ])[date.getUTCMonth()];
                break;

              case "n":
                s += date.getUTCMonth() + 1;
                break;

              case "Y":
                s += date.getUTCFullYear();
                break;

              case "xkY":
                s += date.getUTCFullYear() + 543;
                break;

              case "G":
                s += date.getUTCHours();
                break;

              case "H":
                s += zeroPad(date.getUTCHours(), 2);
                break;

              case "i":
                s += zeroPad(date.getUTCMinutes(), 2);
                break;

              case "\\":
                p < format.length - 1 ? s += format[++p] : s += "\\";
                break;

              case '"':
                if (p < format.length - 1) {
                    const endQuote = format.indexOf('"', p + 1);
                    -1 === endQuote ? s += '"' : (s += format.substr(p + 1, endQuote - p - 1), p = endQuote);
                } else s += '"';
                break;

              default:
                s += format[p];
            }
        }
        return s;
    }
    function generateCommentAnchor(date, author, resolveCollisions = !1) {
        let year = date.getUTCFullYear(), month = date.getUTCMonth(), day = date.getUTCDate(), hours = date.getUTCHours(), minutes = date.getUTCMinutes(), anchor = zeroPad(year, 4) + zeroPad(month + 1, 2) + zeroPad(day, 2) + zeroPad(hours, 2) + zeroPad(minutes, 2) + (author ? "_" + spacesToUnderlines(author) : "");
        if (resolveCollisions && commentAnchors.includes(anchor)) {
            let anchorNum = 2;
            const base = anchor;
            do {
                anchor = "".concat(base, "_").concat(anchorNum), anchorNum++;
            } while (commentAnchors.includes(anchor));
        }
        return anchor;
    }
    let commentAnchors = [];
    function registerCommentAnchor(anchor) {
        anchor && commentAnchors.push(anchor);
    }
    function resetCommentAnchors() {
        commentAnchors = [];
    }
    function parseCommentAnchor(commentAnchor) {
        const match = commentAnchor.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})_(.+)$/);
        if (!match) return null;
        const year = Number(match[1]), month = Number(match[2]) - 1, day = Number(match[3]), hours = Number(match[4]), minutes = Number(match[5]), author = match[6];
        return {
            date: new Date(Date.UTC(year, month, day, hours, minutes)),
            author: author
        };
    }
    function getUserNameFromLink(element) {
        const href = element.getAttribute("href");
        if (!href) return null;
        const pageName = function(url) {
            if ("undefined" == typeof mw || "/wiki/$1" === mw.config.get("wgArticlePath") && "/w/index.php" === mw.config.get("wgScript")) {
                url = url.replace(/^(?:https?:)?\/\/[^/]+/, "").replace(/^\/wiki\//, "").replace(/^\/w\/index.php\?title=/, "").replace(/&action=edit.*/, "").replace(/#.*/, "").replace(/_/g, " ");
                try {
                    url = decodeURIComponent(url);
                } catch (e) {
                    return null;
                }
                return url;
            }
            {
                const uri = new mw.Uri(url), match = uri.path.match(cd.g.ARTICLE_PATH_REGEXP);
                if (match) try {
                    return decodeURIComponent(match[1]);
                } catch (e) {
                    return null;
                }
                return uri.query.title ? uri.query.title : null;
            }
        }(href);
        if (!pageName) return null;
        let userName;
        const match = pageName.match(cd.g.USER_NAMESPACES_REGEXP);
        return match ? userName = match[1] : pageName.startsWith(cd.g.CONTRIBS_PAGE + "/") && (userName = pageName.replace(cd.g.CONTRIBS_PAGE_LINK_REGEXP, "")), 
        userName && firstCharToUpperCase(underlinesToSpaces(userName.replace(/\/.*/, ""))).trim();
    }
    class Parser_Parser {
        constructor(context) {
            this.context = context;
        }
        createComment(signature) {
            return new this.context.CommentClass(this, signature);
        }
        createSection(headingElement, watchedSectionsRequest) {
            return new this.context.SectionClass(this, headingElement, watchedSectionsRequest);
        }
        findTimestamps() {
            const blocksToExclude = [ ...Array.from(cd.g.rootElement.getElementsByTagName("blockquote")), ...(arr = cd.config.elementsToExcludeClasses.map(className => Array.from(cd.g.rootElement.getElementsByClassName(className))), 
            [].concat(...arr)) ];
            var arr;
            return this.context.getAllTextNodes().map(node => {
                const text = node.textContent, {date: date, match: match} = parseTimestamp(text) || {};
                if (date && !blocksToExclude.some(block => block.contains(node))) return {
                    node: node,
                    date: date,
                    match: match
                };
            }).filter(defined).map(finding => {
                const {node: node, match: match, date: date} = finding, element = this.context.document.createElement("span");
                element.classList.add("cd-timestamp");
                const textNode = this.context.document.createTextNode(match[2]);
                element.appendChild(textNode);
                const remainedText = node.textContent.slice(match.index + match[0].length);
                let afterNode;
                return remainedText && (afterNode = this.context.document.createTextNode(remainedText)), 
                node.textContent = node.textContent.slice(0, match.index + match[1].length), node.parentNode.insertBefore(element, node.nextSibling), 
                afterNode && node.parentNode.insertBefore(afterNode, element.nextSibling), {
                    element: element,
                    date: date
                };
            });
        }
        findSignatures(timestamps) {
            const signatures = timestamps.map(timestamp => {
                const date = timestamp.date, timestampElement = timestamp.element, timestampText = timestamp.element.textContent;
                let unsignedElement, closestNotInlineAncestor;
                for (let el = timestamp.element; !closestNotInlineAncestor; el = el.parentNode) isInline(el) ? el.classList.contains(cd.config.unsignedClass) && (unsignedElement = el) : closestNotInlineAncestor = el;
                const unsigned = Boolean(unsignedElement);
                if (closestNotInlineAncestor) {
                    const cniaChildren = Array.from(closestNotInlineAncestor[this.context.childElementsProperty]), treeWalker = new treeWalker_ElementsTreeWalker(timestamp.element);
                    let found = !1;
                    for (;!found && treeWalker.nextNode() && closestNotInlineAncestor.contains(treeWalker.currentNode) && (!cniaChildren.includes(treeWalker.currentNode) || isInline(treeWalker.currentNode)); ) treeWalker.currentNode.classList.contains("cd-timestamp") && (found = !0);
                    if (found) return;
                }
                const startElement = unsignedElement || timestamp.element, treeWalker = new treeWalker_ElementsAndTextTreeWalker(startElement);
                let authorName, firstSignatureElement, length = 0;
                const signatureNodes = [];
                unsignedElement ? firstSignatureElement = startElement : (signatureNodes.push(startElement), 
                treeWalker.previousSibling());
                do {
                    const node = treeWalker.currentNode;
                    if (length += node.textContent.length, node.nodeType === Node.ELEMENT_NODE) {
                        if (node.classList.contains("cd-timestamp")) break;
                        let hasAuthorLinks = !1;
                        if ("A" === node.tagName) {
                            const userName = getUserNameFromLink(node);
                            userName && (authorName || (authorName = userName), authorName === userName && (hasAuthorLinks = !0));
                        } else {
                            Array.from(node.getElementsByTagName("a")).some(link => {
                                const userName = getUserNameFromLink(link);
                                if (userName && (authorName || (authorName = userName), authorName === userName)) return hasAuthorLinks = !0, 
                                !0;
                            });
                        }
                        hasAuthorLinks && (firstSignatureElement = node);
                    }
                    signatureNodes.push(node);
                } while (treeWalker.previousSibling() && length < cd.config.signatureScanLimit);
                const firstSignatureElementIndex = signatureNodes.indexOf(firstSignatureElement);
                signatureNodes.splice(-1 === firstSignatureElementIndex ? 1 : firstSignatureElementIndex + 1);
                const anchor = generateCommentAnchor(timestamp.date, authorName, !0);
                registerCommentAnchor(anchor);
                const signatureContainer = startElement.parentNode, startElementNextSibling = startElement.nextSibling, element = this.context.document.createElement("span");
                if (element.classList.add("cd-signature"), signatureNodes.reverse().forEach(node => {
                    element.appendChild(node);
                }), signatureContainer.insertBefore(element, startElementNextSibling), authorName) return {
                    element: element,
                    timestampElement: timestampElement,
                    timestampText: timestampText,
                    date: date,
                    authorName: authorName,
                    anchor: anchor,
                    unsigned: unsigned
                };
            }).filter(defined);
            return cd.config.unsignedClass && Array.from(cd.g.rootElement.getElementsByClassName(cd.config.unsignedClass)).forEach(element => {
                if (!this.context.getElementByClassName(element, "cd-timestamp")) {
                    Array.from(element.getElementsByTagName("a")).some(link => {
                        const authorName = getUserNameFromLink(link);
                        if (authorName) {
                            element.classList.add("cd-signature");
                            const unsigned = !0;
                            return signatures.push({
                                element: element,
                                authorName: authorName,
                                unsigned: unsigned
                            }), !0;
                        }
                    });
                }
            }), signatures.sort((sig1, sig2) => this.context.follows(sig1.element, sig2.element) ? 1 : -1), 
            signatures;
        }
        collectParts(signatureElement) {
            const treeWalker = new treeWalker_ElementsAndTextTreeWalker(signatureElement);
            let firstForeignComponentAfter, parts = [];
            for (;!firstForeignComponentAfter; ) {
                for (;!treeWalker.currentNode.nextSibling && treeWalker.parentNode(); ) ;
                if (!treeWalker.nextSibling()) break;
                isInline(treeWalker.currentNode, !0) || (firstForeignComponentAfter = treeWalker.currentNode);
            }
            if (firstForeignComponentAfter && signatureElement.parentNode.contains(firstForeignComponentAfter)) {
                for (treeWalker.currentNode = signatureElement; treeWalker.nextSibling() && isInline(treeWalker.currentNode, !0); ) parts.push({
                    node: treeWalker.currentNode,
                    isTextNode: treeWalker.currentNode.nodeType === Node.TEXT_NODE,
                    isHeading: !1,
                    hasCurrentSignature: !1,
                    hasForeignComponents: !1,
                    lastStep: "start"
                });
                parts.reverse(), treeWalker.currentNode = signatureElement;
            } else treeWalker.currentNode = signatureElement.parentNode;
            parts.push({
                node: treeWalker.currentNode,
                isTextNode: !1,
                isHeading: !1,
                hasCurrentSignature: !0,
                hasForeignComponents: !1,
                lastStep: "start"
            });
            const timezoneRegexp = new RegExp(cd.g.TIMEZONE_REGEXP.source + "\\s*$");
            for (let i = 0; i < 500; i++) {
                let lastStep;
                const previousPart = parts[parts.length - 1];
                if (!previousPart.isTextNode && !previousPart.hasCurrentSignature) {
                    const text = previousPart.node.textContent;
                    if (timezoneRegexp.test(text) || cd.config.signatureEndingRegexp && cd.config.signatureEndingRegexp.test(text)) {
                        previousPart.hasForeignComponents = !0;
                        break;
                    }
                }
                if (!previousPart.hasCurrentSignature && previousPart.hasForeignComponents) {
                    let previousNode, dived = !1;
                    for (;(previousNode = treeWalker.currentNode) && treeWalker.lastChild(); ) {
                        if (isInline(treeWalker.currentNode, !0)) {
                            treeWalker.currentNode = previousNode;
                            break;
                        }
                        dived = !0;
                    }
                    if (!dived) break;
                    lastStep = "dive";
                } else if (treeWalker.previousSibling()) lastStep = "back"; else {
                    if (!treeWalker.parentNode()) break;
                    lastStep = "up";
                }
                const node = treeWalker.currentNode, isTextNode = node.nodeType === Node.TEXT_NODE;
                if ("back" === lastStep && [ "OL", "UL" ].includes(previousPart.node.tagName) && !([ "DL", "OL", "UL" ].includes(node.tagName) || isTextNode && node.previousSibling && [ "DL", "OL", "UL" ].includes(node.previousSibling.tagName)) && previousPart.node[this.context.childElementsProperty].length && previousPart.node[this.context.childElementsProperty][0].contains(signatureElement)) break;
                let isHeading = null, hasCurrentSignature = null, hasForeignComponents = null;
                if (!isTextNode) {
                    if (node.classList.contains("cd-commentPart") || "toc" === node.getAttribute("id") || "TD" === node.tagName || "HR" === node.tagName && node.previousElementSibling && this.context.getElementByClassName(node.previousElementSibling, "cd-signature") || cd.config.customForeignComponentChecker && cd.config.customForeignComponentChecker(node, this.context)) break;
                    isHeading = /^H[1-6]$/.test(node.tagName), hasCurrentSignature = node.contains(signatureElement), 
                    hasForeignComponents = node.getElementsByClassName("cd-signature", Number(hasCurrentSignature) + 1).length - Number(hasCurrentSignature) > 0 || firstForeignComponentAfter && node.contains(firstForeignComponentAfter);
                }
                if (parts.push({
                    node: node,
                    isTextNode: isTextNode,
                    isHeading: isHeading,
                    hasCurrentSignature: hasCurrentSignature,
                    hasForeignComponents: hasForeignComponents,
                    lastStep: lastStep
                }), isHeading) break;
            }
            return parts;
        }
        removeNestedParts(parts) {
            for (let i = parts.length - 1; i >= 0; i--) {
                const part = parts[i];
                if ("up" === part.lastStep && !part.hasForeignComponents) {
                    let nextDiveElementIndex = 0;
                    for (let j = i - 1; j > 0; j--) if ("dive" === parts[j].lastStep) {
                        nextDiveElementIndex = j;
                        break;
                    }
                    parts.splice(nextDiveElementIndex, i - nextDiveElementIndex), i = nextDiveElementIndex;
                }
            }
            return parts;
        }
        encloseInlineParts(parts, signatureElement) {
            const sequencesToBeEnclosed = [];
            let start = null, encloseThis = !1;
            for (let i = 0; i <= parts.length; i++) {
                const part = parts[i];
                if (!part || null !== start && ![ "back", "start" ].includes(part.lastStep) || part.hasForeignComponents || part.isHeading) {
                    if (null !== start) {
                        if (encloseThis) {
                            const end = i - 1;
                            sequencesToBeEnclosed.push({
                                start: start,
                                end: end
                            });
                        }
                        start = null, encloseThis = !1;
                    }
                } else {
                    if (null === start) {
                        if (isInline(part.node.parentNode)) {
                            for (let j = i + 1; j < parts.length; j++) "up" !== parts[j].lastStep || (i = j - 1);
                            break;
                        }
                        start = i;
                    }
                    !encloseThis && (part.isTextNode && part.node.textContent.trim() || isInline(part.node)) && (encloseThis = !0);
                }
            }
            for (let i = sequencesToBeEnclosed.length - 1; i >= 0; i--) {
                const sequence = sequencesToBeEnclosed[i], wrapper = this.context.document.createElement("div"), nextSibling = parts[sequence.start].node.nextSibling, parent = parts[sequence.start].node.parentNode;
                for (let j = sequence.end; j >= sequence.start; j--) wrapper.appendChild(parts[j].node);
                parent.insertBefore(wrapper, nextSibling);
                const newNode = {
                    node: wrapper,
                    isTextNode: !1,
                    isHeading: !1,
                    hasCurrentSignature: wrapper.contains(signatureElement),
                    hasForeignComponents: !1,
                    lastStep: "replaced"
                };
                parts.splice(sequence.start, sequence.end - sequence.start + 1, newNode);
            }
            return parts;
        }
        filterParts(parts) {
            for (let i = (parts = parts.filter(part => !part.hasForeignComponents && !part.isTextNode)).length - 1; i > 0; i--) {
                const part = parts[i];
                if ("P" !== part.node.tagName || part.node.textContent.trim()) break;
                parts.splice(i, 1);
            }
            return parts;
        }
        replaceListsWithItems(parts, signatureElement) {
            const lastPart = parts[parts.length - 1];
            for (let i = parts.length - 1; i >= 0; i--) {
                const part = parts[i];
                if ([ "UL", "DL", "OL", "LI", "DD" ].includes(part.node.tagName) && ("up" === part.lastStep && (!parts[i - 1] || "back" !== parts[i - 1].lastStep) || ("DD" === lastPart.node.tagName || "DD" === lastPart.node.parentNode.tagName || "DL" === lastPart.node.tagName) && !parts.slice(i + 1).some(part => "P" === part.node.tagName))) {
                    const partTextNoSpaces = part.node.textContent.replace(/\s+/g, "");
                    let children, current = [ part.node ];
                    do {
                        children = current.reduce((arr, element) => arr.concat(Array.from(element[this.context.childElementsProperty])), []);
                    } while (children.length && children.every(child => [ "UL", "DL", "OL", "LI", "DD" ].includes(child.tagName)) && children.map(child => child.textContent).join("").replace(/\s+/g, "") === partTextNoSpaces && (current = children));
                    if (current.length > 1) {
                        const newParts = current.map(el => ({
                            node: el,
                            isTextNode: !1,
                            hasCurrentSignature: el.contains(signatureElement),
                            hasForeignComponents: !1,
                            lastStep: "replaced"
                        }));
                        parts.splice(i, 1, ...newParts);
                    } else current[0] !== part.node && Object.assign(part, {
                        node: current[0],
                        lastStep: "replaced"
                    });
                }
            }
            return parts;
        }
        getLevelsUpTree(initialElement) {
            const levelElements = [], treeWalker = new treeWalker_ElementsTreeWalker(initialElement);
            for (;treeWalker.parentNode(); ) {
                const el = treeWalker.currentNode;
                if ([ "UL", "DL", "OL" ].includes(el.tagName)) {
                    if (el.classList.contains("cd-commentLevel")) {
                        const match = el.getAttribute("class").match(/cd-commentLevel-(\d+)/);
                        return match && levelElements.unshift(...Array(Number(match[1]))), levelElements;
                    }
                    levelElements.unshift(el);
                }
            }
            return levelElements;
        }
        findHeadings() {
            const headings = [ ...cd.g.rootElement.getElementsByTagName("h2"), ...cd.g.rootElement.getElementsByTagName("h3"), ...cd.g.rootElement.getElementsByTagName("h4"), ...cd.g.rootElement.getElementsByTagName("h5"), ...cd.g.rootElement.getElementsByTagName("h6") ];
            return headings.sort((heading1, heading2) => this.context.follows(heading1, heading2) ? 1 : -1), 
            headings;
        }
    }
    function windowGetAllTextNodes() {
        const result = document.evaluate(".//descendant::text()", cd.g.rootElement, null, XPathResult.ANY_TYPE, null), textNodes = [];
        let node;
        for (;node = result.iterateNext(); ) textNodes.push(node);
        return textNodes;
    }
    function findSpecialElements() {
        const floatingElementsSelector = [ ...cd.g.FLOATING_ELEMENTS_SELECTORS, ...cd.config.customFloatingElementsSelectors ].join(", "), floating = cd.g.$root.find(floatingElementsSelector).get().filter(el => !el.classList.contains("cd-ignoreFloating"));
        floating.forEach(el => {
            const style = window.getComputedStyle(el);
            el.setAttribute("data-margin-top", parseFloat(style.marginTop)), el.setAttribute("data-margin-bottom", parseFloat(style.marginBottom));
        });
        const closedDiscussionsSelector = cd.config.closedDiscussionsClasses.map(name => ".".concat(name)).join(", ");
        return {
            floating: floating,
            closedDiscussions: cd.g.$root.find(closedDiscussionsSelector).get(),
            pageHasOutdents: Boolean(cd.g.$root.find(".outdent-template").length)
        };
    }
    function changeElementType(element, newType, firstVisibleElementData) {
        const newElement = document.createElement(newType);
        for (;element.firstChild; ) newElement.appendChild(element.firstChild);
        Array.from(element.attributes).forEach(attribute => {
            newElement.setAttribute(attribute.name, attribute.value);
        }), element.parentNode.replaceChild(newElement, element);
        let commentId = element.getAttribute("data-comment-id");
        if (null !== commentId) {
            commentId = Number(commentId);
            const comment = cd.comments[commentId];
            comment.elements.splice(comment.elements.indexOf(element), 1, newElement), comment.highlightables.includes(element) && (comment.highlightables.splice(comment.highlightables.indexOf(element), 1, newElement), 
            comment.bindEvents(newElement));
        }
        return element === firstVisibleElementData.element && (firstVisibleElementData.element = newElement), 
        newElement;
    }
    function mergeAdjacentCommentLevels(firstVisibleElementData) {
        const levels = cd.g.rootElement.querySelectorAll(".cd-commentLevel:not(ol) + .cd-commentLevel:not(ol)");
        if (!levels.length) return;
        const isOrHasCommentLevel = el => el.classList.contains("cd-commentLevel") && "OL" !== el.tagName || el.querySelector(".cd-commentLevel:not(ol)");
        Array.from(levels).forEach(bottomElement => {
            const topElement = bottomElement.previousElementSibling;
            if (!topElement) return;
            let currentTopElement = topElement, currentBottomElement = bottomElement;
            do {
                const topTag = currentTopElement.tagName, bottomInnerTags = {};
                let firstMoved;
                if ("UL" === topTag ? bottomInnerTags.DD = "LI" : "DL" === topTag && (bottomInnerTags.LI = "DD"), 
                isOrHasCommentLevel(currentTopElement)) {
                    for (;currentBottomElement.childNodes.length; ) {
                        let child = currentBottomElement.firstChild;
                        if (child.nodeType === Node.ELEMENT_NODE) bottomInnerTags[child.tagName] && (child = changeElementType(child, bottomInnerTags[child.tagName], firstVisibleElementData)), 
                        void 0 === firstMoved && (firstMoved = child); else if (void 0 === firstMoved && child.textContent.trim()) {
                            firstMoved = null;
                            const newChild = document.createElement("span");
                            newChild.appendChild(child), child = newChild;
                        }
                        currentTopElement.appendChild(child);
                    }
                    currentBottomElement.parentNode.removeChild(currentBottomElement);
                }
                currentBottomElement = firstMoved, currentTopElement = firstMoved && firstMoved.previousElementSibling;
            } while (currentTopElement && currentBottomElement && isOrHasCommentLevel(currentBottomElement));
        });
    }
    function prepare(_x) {
        return _prepare.apply(this, arguments);
    }
    function _prepare() {
        return (_prepare = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
            cd.g.$root = cd.g.$content.children(".mw-parser-output"), cd.g.$root.length || (cd.g.$root = cd.g.$content), 
            cd.g.rootElement = cd.g.$root.get(0), cd.comments = [], cd.sections = [], cd.g.firstRun ? yield init({
                messagesRequest: messagesRequest
            }) : (resetCommentAnchors(), commentLayers.reset());
        }))).apply(this, arguments);
    }
    function getFirstVisibleElementData() {
        let element, top;
        if (0 !== window.pageYOffset && cd.g.rootElement.getBoundingClientRect().top <= 0) {
            const treeWalker = new treeWalker_ElementsTreeWalker(cd.g.rootElement.firstElementChild);
            for (;;) {
                if (!isInline(treeWalker.currentNode.tagName)) {
                    const rect = treeWalker.currentNode.getBoundingClientRect();
                    if (rect.bottom >= 0 && 0 !== rect.height) {
                        if (element = treeWalker.currentNode, top = rect.top, treeWalker.firstChild()) continue;
                        break;
                    }
                }
                if (!treeWalker.nextSibling()) break;
            }
        }
        return {
            element: element,
            top: top
        };
    }
    function processComments(parser, firstVisibleElementData) {
        const timestamps = parser.findTimestamps();
        parser.findSignatures(timestamps).forEach(signature => {
            try {
                const comment = parser.createComment(signature);
                comment.highlightables.length && cd.comments.push(comment);
            } catch (e) {
                e instanceof CdError || console.error(e);
            }
        }), function(firstVisibleElementData) {
            mergeAdjacentCommentLevels(firstVisibleElementData), mergeAdjacentCommentLevels(firstVisibleElementData), 
            cd.g.rootElement.querySelector(".cd-commentLevel:not(ol) + .cd-commentLevel:not(ol)") && console.warn(".cd-commentLevel adjacencies have left."), 
            $("dl").has("dt").each((i, element) => {
                Array.from(element.classList).filter(className => className.startsWith("cd-commentLevel")).forEach(className => element.classList.remove(className));
            });
        }(firstVisibleElementData), mw.hook("convenientDiscussions.commentsReady").fire(cd.comments);
    }
    function processSections(parser, watchedSectionsRequest) {
        parser.findHeadings().forEach(heading => {
            try {
                const section = parser.createSection(heading, watchedSectionsRequest);
                void 0 !== section.id && cd.sections.push(section);
            } catch (e) {
                e instanceof CdError || console.error(e);
            }
        }), cd.sections.forEach((section, i) => {
            section.isLastSection = i === cd.sections.length - 1;
        }), cd.sections.forEach((section, i) => {
            if (section.subsections = [], cd.sections.slice(i + 1).some(otherSection => {
                if (!(otherSection.level > section.level)) return !0;
                section.subsections.push(otherSection), 2 === section.level && (otherSection.baseSection = section);
            }), section.level > 2 && cd.sections.slice(0, i).reverse().some(otherSection => {
                if (otherSection.level < section.level) return section.parent = otherSection, !0;
            }), !section.frozen && 2 === section.level) {
                const targetSection = section.subsections.length ? section.subsections[section.subsections.length - 1] : section;
                targetSection.$replyButtonLink && targetSection.$replyButtonLink.on("mouseenter", section.replyButtonHoverHandler).on("mouseleave", section.replyButtonUnhoverHandler);
            }
        });
        const $space = $("<span>").addClass("cd-spaceBeforeSectionMenu").text(" ");
        $(".mw-headline").each((function() {
            $(this).append($space.clone());
        })), mw.hook("convenientDiscussions.sectionsReady").fire(cd.sections);
    }
    function connectToAddTopicLinks() {
        $(cd.g.ADD_TOPIC_SELECTORS).off("click.cd").on("click.cd", (function(e) {
            const href = $(this).attr("href");
            if (e.ctrlKey || e.shiftKey || mw.util.getParamValue("preload", href)) return;
            e.preventDefault();
            const editintro = mw.util.getParamValue("editintro", href);
            cd.g.addSectionForm ? (cd.g.addSectionForm.$element.cdScrollIntoView("center"), 
            cd.g.addSectionForm.headlineInput.focus()) : cd.g.addSectionForm = new CommentForm_CommentForm({
                mode: "addSection",
                $addSectionLink: $(this),
                scrollIntoView: !0,
                editintro: editintro
            });
        })).attr("title", cd.s("addtopicbutton-tooltip"));
    }
    function processFragment(_x2, _x3) {
        return _processFragment.apply(this, arguments);
    }
    function _processFragment() {
        return (_processFragment = asyncToGenerator_default()((function*(keptCommentAnchor, keptSectionAnchor) {
            let fragment, decodedFragment, escapedFragment, escapedDecodedFragment, commentAnchor, date, author, comment;
            if (cd.g.firstRun) {
                fragment = location.hash.slice(1);
                try {
                    decodedFragment = decodeURIComponent(fragment);
                } catch (e) {
                    console.error(e);
                }
                escapedFragment = $.escapeSelector(fragment), escapedDecodedFragment = decodedFragment && $.escapeSelector(decodedFragment), 
                /^\d{12}_.+$/.test(fragment) && (commentAnchor = decodedFragment);
            } else commentAnchor = keptCommentAnchor;
            if (commentAnchor) {
                if (({date: date, author: author} = parseCommentAnchor(commentAnchor) || {}), comment = Comment_Comment.getCommentByAnchor(commentAnchor), 
                !keptCommentAnchor && !comment) {
                    let commentAnchorToCheck;
                    for (let gap = 1; !comment && gap <= 5; gap++) {
                        commentAnchorToCheck = generateCommentAnchor(new Date(date.getTime() - cd.g.MILLISECONDS_IN_A_MINUTE * gap), author), 
                        comment = Comment_Comment.getCommentByAnchor(commentAnchorToCheck);
                    }
                }
                comment && setTimeout(() => {
                    comment.scrollToAndHighlightTarget(!1);
                }, 0);
            }
            if (keptSectionAnchor) {
                const section = Section_Section.getSectionByAnchor(keptSectionAnchor);
                section && section.$elements.first().cdScrollTo("top", !1);
            }
            if (cd.g.firstRun) {
                const fragmentHasNoTarget = decodedFragment && !comment && !cd.config.idleFragments.includes(decodedFragment) && !decodedFragment.startsWith("/media/") && !$(":target").length && !$('a[name="'.concat(escapedDecodedFragment, '"]')).length && !$('*[id="'.concat(escapedDecodedFragment, '"]')).length && !$('a[name="'.concat(escapedFragment, '"]')).length && !$('*[id="'.concat(escapedFragment, '"]')).length;
                decodedFragment && fragmentHasNoTarget && cd.g.isPageActive && (yield notFound(decodedFragment, date));
            }
        }))).apply(this, arguments);
    }
    function highlightOwnComments() {
        if (!cd.settings.highlightOwnComments) return;
        const myComments = cd.comments.filter(comment => comment.own), floatingRects = myComments.length ? cd.g.specialElements.floating.map(el => el.getBoundingClientRect()) : void 0;
        myComments.forEach(comment => {
            comment.configureLayers(!1, floatingRects);
        }), myComments.forEach(comment => {
            comment.addLayers();
        });
    }
    function confirmDesktopNotifications() {
        return _confirmDesktopNotifications.apply(this, arguments);
    }
    function _confirmDesktopNotifications() {
        return (_confirmDesktopNotifications = asyncToGenerator_default()((function*() {
            "unknown" === cd.settings.desktopNotifications && "denied" !== Notification.permission && getSettings(!0).then(settings => {
                if ("unknown" === settings.desktopNotifications) {
                    const actions = [ {
                        label: cd.s("dn-confirm-yes"),
                        action: "accept",
                        flags: "primary"
                    }, {
                        label: cd.s("dn-confirm-no"),
                        action: "reject"
                    } ];
                    confirmDialog(cd.s("dn-confirm"), {
                        size: "medium",
                        actions: actions
                    }).then(action => {
                        let promise;
                        "accept" === action ? "default" === Notification.permission ? (OO.ui.alert(cd.s("dn-grantpermission")), 
                        Notification.requestPermission(permission => {
                            "granted" === permission ? (cd.settings.desktopNotifications = settings.desktopNotifications = "all", 
                            promise = setSettings(settings)) : "denied" === permission && (cd.settings.desktopNotifications = settings.desktopNotifications = "none", 
                            promise = setSettings(settings));
                        })) : "granted" === Notification.permission && (cd.settings.desktopNotifications = settings.desktopNotifications = "all", 
                        promise = setSettings(settings)) : "reject" === action && (cd.settings.desktopNotifications = settings.desktopNotifications = "none", 
                        promise = setSettings(settings)), promise && promise.catch(e => {
                            mw.notify(cd.s("error-settings-save"), {
                                type: "error"
                            }), console.warn(e);
                        });
                    });
                }
            }), "unknown" !== cd.settings.desktopNotifications && "default" === Notification.permission && (yield OO.ui.alert(cd.s("dn-grantpermission-again"), {
                title: cd.s("script-name")
            }), Notification.requestPermission());
        }))).apply(this, arguments);
    }
    function debugLog() {
        const timePerComment = (cd.debug.timerTotal["main code"] + cd.debug.timerTotal["final code and rendering"]) / cd.comments.length;
        cd.debug.logAndResetTimer("total time"), console.debug("number of comments: ".concat(cd.comments.length)), 
        console.debug("per comment: ".concat(timePerComment.toFixed(2))), cd.debug.logAndResetEverything();
    }
    function processPage() {
        return _processPage.apply(this, arguments);
    }
    function _processPage() {
        return (_processPage = asyncToGenerator_default()((function*(keptData = {}) {
            cd.debug.stopTimer(cd.g.firstRun ? "loading data" : "laying out HTML"), cd.debug.startTimer("preparations"), 
            yield prepare(keptData);
            const firstVisibleElementData = cd.g.firstRun ? getFirstVisibleElementData() : {};
            let watchedSectionsRequest;
            cd.debug.stopTimer("preparations"), cd.debug.startTimer("main code"), cd.g.IS_ARCHIVE_PAGE = Boolean(cd.config.archivePathRegexp && cd.config.archivePathRegexp.test(cd.g.CURRENT_PAGE)), 
            cd.g.isPageActive = !(!mw.config.get("wgArticleId") || cd.g.IS_ARCHIVE_PAGE || (mw.util.getParamValue("diff") || mw.util.getParamValue("oldid")) && mw.config.get("wgRevisionId") !== mw.config.get("wgCurRevisionId")), 
            cd.g.editWatchedSections = editWatchedSections, cd.g.settingsDialog = settingsDialog, 
            mw.config.get("wgArticleId") && (watchedSectionsRequest = getWatchedSections(!0, keptData), 
            watchedSectionsRequest.catch(e => {
                console.warn("Couldn't load the settings from the server.", e);
            }));
            const visitsRequest = cd.g.isPageActive ? getVisits(!0) : void 0;
            cd.g.specialElements = findSpecialElements(), cd.config.customBeforeParse && cd.config.customBeforeParse(), 
            cd.debug.startTimer("process comments");
            const parser = new Parser_Parser({
                CommentClass: Comment_Comment,
                SectionClass: Section_Section,
                childElementsProperty: "children",
                document: document,
                follows: (el1, el2) => el1.compareDocumentPosition(el2) & Node.DOCUMENT_POSITION_PRECEDING,
                getAllTextNodes: windowGetAllTextNodes,
                getElementByClassName: (node, className) => node.querySelector(".".concat(className))
            });
            try {
                processComments(parser, firstVisibleElementData);
            } catch (e) {
                console.error(e);
            }
            if (cd.debug.stopTimer("process comments"), cd.debug.startTimer("process sections"), 
            processSections(parser, watchedSectionsRequest), cd.debug.stopTimer("process sections"), 
            connectToAddTopicLinks(), cd.debug.stopTimer("main code"), cd.debug.startTimer("final code and rendering"), 
            firstVisibleElementData.element || keptData.scrollPosition) {
                const y = firstVisibleElementData.element ? window.pageYOffset + firstVisibleElementData.element.getBoundingClientRect().top - firstVisibleElementData.top : keptData.scrollPosition;
                window.scrollTo(0, y);
            }
            highlightOwnComments(), processFragment(keptData.commentAnchor, keptData.sectionAnchor), 
            cd.g.isPageActive && (cd.g.firstRun || keptData.wasPageCreated ? js_navPanel.mount() : js_navPanel.reset(), 
            js_navPanel.processVisits(visitsRequest, keptData.unseenCommentAnchors), restoreCommentForms()), 
            cd.g.firstRun && ($(document).on("mousemove mouseover", highlightFocused), $(window).on("resize orientationchange", windowResizeHandler), 
            addPreventUnloadCondition("commentForms", () => (saveSession(!0), mw.user.options.get("useeditwarning") && (CommentForm_CommentForm.getLastActiveAlteredCommentForm() || alwaysConfirmLeavingPage && cd.commentForms.length)))), 
            (cd.g.firstRun && cd.g.isPageActive || keptData.wasPageCreated) && ($(document).on("keydown", globalKeyDownHandler).on("scroll resize orientationchange", () => {
                js_navPanel.registerSeenComments(), js_navPanel.updateCommentFormButton();
            }), setInterval(() => {
                commentLayers.redrawIfNecessary();
            }, 1e3), setTimeout(() => {
                new MutationObserver(records => {
                    records.every(record => /^cd-comment(Underlay|Overlay|Layers)/.test(record.target.className)) || commentLayers.redrawIfNecessary();
                }).observe(cd.g.$content.get(0), {
                    attributes: !0,
                    childList: !0,
                    subtree: !0
                });
            }, 500));
            let alwaysConfirmLeavingPage = !1;
            mw.user.options.get("editondblclick") && mw.loader.using("mediawiki.action.view.dblClickEdit").then(() => {
                $("#ca-edit").off("click"), alwaysConfirmLeavingPage = !0;
            }), mw.user.options.get("editsectiononrightclick") && mw.loader.using("mediawiki.action.view.rightClickEdit").then(() => {
                $(".mw-editsection a").off("click"), alwaysConfirmLeavingPage = !0;
            }), cd.g.firstRun && confirmDesktopNotifications(), mw.hook("convenientDiscussions.pageReady").fire(cd), 
            removeLoadingOverlay(), cd.g.firstRun = !1, cd.g.rootElement.getBoundingClientRect(), 
            cd.debug.stopTimer("final code and rendering"), cd.debug.stopTimer("total time"), 
            debugLog();
        }))).apply(this, arguments);
    }
    /**
 * Timestamp regexp generator, timestamp parser generator, date formats, digits, and timezones.
 *
 * The code is based on {@link
 * https://gerrit.wikimedia.org/r/#/c/mediawiki/core/+/539305/3/signaturedetector.js}.
 *
 * @module dateFormat
 * @author Bartosz Dziewoński <matma.rex@gmail.com>
 * @license GPL v2
 */    const DATE_FORMATS = {
        ab: "H:i, j xg Y",
        abs: "j F Y H.i",
        ace: "j F Y H.i",
        "ady-cyrl": "H:i, j F Y",
        "aeb-arab": "H:i\u060c j xg Y",
        "aeb-latn": "H:i, j F Y",
        af: "H:i, j F Y",
        ais: "H:i, j F Y",
        ak: "H:i, j F Y",
        aln: "j F Y H:i",
        ami: "H:i, j F Y",
        am: "H:i, j F Y",
        ang: "H:i, j F Y",
        an: "H:i j M Y",
        anp: "H:i, j F Y",
        arc: "H:i, j F Y",
        ar: "H:i\u060c j xg Y",
        arn: "H:i j M Y",
        arq: "H:i\u060c j xg Y",
        ary: "H:i, j F Y",
        arz: "H:i\u060c j xg Y",
        ase: "H:i, j F Y",
        as: "H:i, j F Y",
        ast: "H:i j M Y",
        atj: "j F Y \xe0 H:i",
        av: "H:i, j xg Y",
        avk: "H:i, j F Y",
        awa: "H:i, j F Y",
        ay: "H:i j M Y",
        azb: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        az: "H:i, j F Y",
        ba: "H:i, j xg Y",
        ban: "j F Y H.i",
        bar: "H:i, j. M Y",
        "bbc-latn": "j F Y H.i",
        bcc: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        bcl: "H:i, j F Y",
        be: "H:i, j xg Y",
        "be-tarask": "H:i, j xg Y",
        bg: "H:i, j F Y",
        bgn: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        bho: "H:i, j F Y",
        bi: "H:i, j F Y",
        bjn: "j F Y H.i",
        bm: "j F Y \xe0 H:i",
        bn: "H:i, j F Y",
        bo: "H:i, j F Y",
        bpy: "H:i, j F Y",
        bqi: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        brh: "H:i, j F Y",
        br: 'j M Y "da" H:i',
        bs: "H:i, j F Y",
        btm: "j F Y H.i",
        bto: "H:i, j F Y",
        bug: "j F Y H.i",
        bxr: "H:i, j xg Y",
        ca: "H:i, j M Y",
        "cbk-zam": "H:i j M Y",
        cdo: 'Y "ni\xe8ng" n "ngu\u014fk" j "h\xf4\u0324" (D) H:i',
        ceb: "H:i, j F Y",
        ce: "Y, j F, H:i",
        ch: "H:i, j F Y",
        chr: "H:i, j F Y",
        chy: "H:i, j F Y",
        ckb: "H:i\u060c j\u06cc xg Y",
        co: "H:i, j M Y",
        cps: "H:i, j F Y",
        "crh-cyrl": 'H:i, Y "\u0441." xg j',
        "crh-latn": 'H:i, Y "s." xg j',
        cr: "H:i, j F Y",
        csb: "H:i, j M Y",
        cs: "j. n. Y, H:i",
        cu: "H:i, xg j \u0447\u0438\u0441\u043b\u0430, Y",
        cv: "H:i, j xg Y",
        cy: "H:i, j F Y",
        da: "j. M Y, H:i",
        "de-at": "H:i, j. M Y",
        "de-ch": "H:i, j. M Y",
        "de-formal": "H:i, j. M Y",
        de: "H:i, j. M Y",
        din: "H:i, j F Y",
        diq: "H:i, j F Y",
        dsb: "j. xg Y, H:i",
        dtp: "H:i, j F Y",
        dty: "H:i, j F Y",
        dv: "H:i, j F Y",
        dz: "H:i, j F Y",
        ee: "H:i, j F Y",
        egl: "H:i, j M Y",
        el: "H:i, j xg Y",
        eml: "H:i, j M Y",
        "en-ca": "H:i, j F Y",
        "en-gb": "H:i, j F Y",
        en: "H:i, j F Y",
        eo: "H:i, j M. Y",
        "es-formal": "H:i j M Y",
        es: "H:i j M Y",
        et: 'j. F Y, "kell" H:i',
        eu: "H:i, j F Y",
        exif: "H:i, j F Y",
        ext: "H:i j M Y",
        fa: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        ff: "j F Y \xe0 H:i",
        fi: 'j. F"ta" Y "kello" H.i',
        fit: 'j. F"ta" Y "kello" H.i',
        fj: "H:i, j F Y",
        fo: 'j. M Y "kl." H:i',
        frc: "j F Y \xe0 H:i",
        fr: "j F Y \xe0 H:i",
        frp: 'j F Y "a" H:i',
        frr: "H:i, j. M Y",
        fur: 'j "di" M Y "a lis" H:i',
        fy: "j M Y, H.i",
        gag: "H.i, j F Y",
        ga: "H:i, j F Y",
        "gan-hans": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "gan-hant": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        gan: "Y\u5e74n\u6708j\u65e5 (D) H:i",
        gcr: "j F Y \xe0 H:i",
        gd: "H:i, j F Y",
        gl: 'j \\d\\e F \\d\\e Y "\xe1s" H:i',
        glk: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        gn: "H:i j M Y",
        gom: "H:i, j F Y",
        "gom-deva": "H:i, j F Y",
        "gom-latn": "H:i, j F Y",
        gor: "j F Y H.i",
        got: "H:i, j F Y",
        grc: "H:i, j xg Y",
        gsw: "H:i, j. M Y",
        gu: "H:i, j F Y",
        gv: "H:i, j F Y",
        ha: "H:i, j F Y",
        hak: "H:i, j F Y",
        haw: "H:i, j F Y",
        he: "H:i, j xg Y",
        "hif-latn": "H:i, j F Y",
        hi: "H:i, j F Y",
        hil: "H:i, j F Y",
        hr: "H:i, j. F Y.",
        hrx: "H:i, j. M Y",
        hsb: "j. xg Y, H:i",
        ht: "j F Y \xe0 H:i",
        "hu-formal": "Y. F j., H:i",
        hu: "Y. F j., H:i",
        hy: "H:i, j xg Y",
        hyw: "H:i, j xg Y",
        ia: "H:i, j F Y",
        id: "j F Y H.i",
        ie: "H:i, j F Y",
        ig: "H:i, j F Y",
        ii: "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "ike-cans": "H:i, j F Y",
        "ike-latn": "H:i, j F Y",
        ik: "H:i, j F Y",
        ilo: "H:i, j F Y",
        inh: "H:i, j xg Y",
        io: "H:i, j M. Y",
        is: 'j. F Y "kl." H:i',
        it: "H:i, j M Y",
        ja: "Y\u5e74n\u6708j\u65e5 (D) H:i",
        jam: "H:i, j F Y",
        jbo: "H:i, j F Y",
        jut: "j. M Y, H:i",
        jv: "j F Y H.i",
        kaa: 'H:i, Y "j." xg j',
        kab: "H:i, j F Y",
        ka: "H:i, j F Y",
        "kbd-cyrl": "H:i, j F Y",
        kbp: "j F Y \xe0 H:i",
        kg: "H:i, j F Y",
        khw: "H:i\u060c j xg Y\u0621",
        ki: "H:i, j F Y",
        kiu: "H.i, j F Y",
        kjp: ' H:i"\u104a" j F Y',
        "kk-arab": 'H:i\u060c Y "\u062c." xg j',
        "kk-cyrl": 'H:i, Y "\u0436." xg j',
        kk: 'H:i, Y "\u0436." xg j',
        "kk-latn": 'H:i, Y "j." xg j',
        kl: "j. M Y, H:i",
        km: "\u1798\u17c4\u1784H:i l \u1791d F \u1786\u17d2\u1793\u17b6Y",
        kn: "H:i, j F Y",
        krc: "H:i, j xg Y",
        kri: "H:i, j F Y",
        krj: "H:i, j F Y",
        krl: 'j. F"ta" Y "kello" H.i',
        "ks-arab": "H:i, j F Y",
        "ks-deva": "H:i, j F Y",
        ksh: "H:i, j. M Y",
        ks: "H:i, j F Y",
        "ku-arab": "H:i\u060c j\u06cc xg Y",
        "ku-latn": "H:i, j F Y",
        kum: "H:i, j xg Y",
        kv: "H:i, j xg Y",
        kw: "H:i, j F Y",
        ky: "H:i, j F Y",
        lad: "H:i j M Y",
        la: "H:i, j xg Y",
        lbe: "H:i, j xg Y",
        lb: "H:i, j. M Y",
        lez: "H:i, j xg Y",
        lfn: "H:i, j F Y",
        lg: "H:i, j F Y",
        lij: "H:i, j M Y",
        li: "j M Y H:i",
        liv: 'j. F Y, "kell" H:i',
        lki: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        lmo: "H:i, j M Y",
        ln: "j F Y \xe0 H:i",
        lo: "H:i, j F Y",
        loz: "H:i, j F Y",
        lrc: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        ltg: 'Y". gada" j. F", plkst." H.i',
        lt: "H:i, j F Y",
        lus: "H:i, j F Y",
        luz: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        lv: 'Y". gada" j. F", plkst." H.i',
        lzh: "Y\u5e74n\u6708j\u65e5 \uff08D\uff09 H\u6642i\u5206",
        lzz: "H.i, j F Y",
        mai: "H:i, j F Y",
        "map-bms": "j F Y H.i",
        mdf: "H:i, j xg Y",
        mg: "j F Y \xe0 H:i",
        mhr: "H:i, j xg Y",
        mi: "H:i, j F Y",
        min: "j F Y H.i",
        mk: "H:i, j F Y",
        ml: "H:i, j F Y",
        mni: "H:i, j F Y",
        mn: "H:i, j F Y",
        mnw: ' H:i"\u104a" j F Y',
        mo: "j F Y H:i",
        mrj: "H:i, j xg Y",
        mr: "H:i, j F Y",
        ms: "H:i, j F Y",
        mt: "H:i, j F Y",
        mwl: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
        my: ' H:i"\u104a" j F Y',
        myv: "H:i, j xg Y",
        mzn: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        nah: "H:i j M Y",
        na: "H:i, j F Y",
        nan: 'Y-"n\xee" n-"goe\u030dh" j-"ji\u030dt" (D) H:i',
        nap: "H:i, j M Y",
        nb: 'j. M Y "kl." H:i',
        nds: "H:i, j. M Y",
        "nds-nl": "H:i, j M Y",
        ne: "H:i, j F Y",
        new: "H:i, j F Y",
        niu: "H:i, j F Y",
        "nl-informal": "j M Y H:i",
        nl: "j M Y H:i",
        nn: 'j. F Y "kl." H:i',
        nov: "H:i, j F Y",
        nqo: "H:i, j F Y",
        nrm: "j F Y \xe0 H:i",
        nso: "H:i, j F Y",
        nv: "H:i, j F Y",
        ny: "H:i, j F Y",
        nys: "H:i, j F Y",
        oc: 'j F "de" Y "a" H.i',
        olo: 'j. F"ta" Y "kello" H.i',
        om: "H:i, j F Y",
        or: "H:i, j F Y",
        os: "H:i, j xg Y",
        pag: "H:i, j F Y",
        pa: "H:i, j F Y",
        pam: "H:i, j F Y",
        pap: "H:i, j F Y",
        pcd: "j F Y \xe0 H:i",
        pdc: "H:i, j. M Y",
        pdt: "H:i, j. M Y",
        pfl: "H:i, j. M Y",
        pih: "H:i, j F Y",
        pi: "H:i, j F Y",
        pl: "H:i, j M Y",
        pms: "H:i, j M Y",
        pnb: "H:i, j F Y",
        pnt: "H:i, j xg Y",
        prg: "H:i, j F Y",
        ps: "H:i, j F Y",
        "pt-br": 'H"h"i"min" "de" j "de" F "de" Y',
        pt: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
        qqq: "H:i, j F Y",
        qug: "H:i j M Y",
        qu: "H:i j M Y",
        rgn: "H:i, j M Y",
        rif: "H:i, j F Y",
        rm: "H:i, j F Y",
        rmy: "j F Y H:i",
        "roa-tara": "H:i, j M Y",
        ro: "j F Y H:i",
        rue: "H:i, j xg Y",
        ru: "H:i, j xg Y",
        rup: "j F Y H:i",
        "ruq-cyrl": "H:i, j F Y",
        "ruq-latn": "j F Y H:i",
        rw: "H:i, j F Y",
        sah: "H:i, j xg Y",
        sa: "H:i, j F Y",
        sat: "H:i, j F Y",
        sc: "H:i, j M Y",
        scn: "H:i, j M Y",
        sco: "H:i, j F Y",
        sdc: "H:i, j F Y",
        sdh: "j xg Y\u060c \u0633\u0627\u0639\u062a H:i",
        sd: "H:i, j F Y",
        sei: "H:i, j F Y",
        se: 'xg j "b." Y "dii." G.i',
        ses: "j F Y \xe0 H:i",
        sg: "j F Y \xe0 H:i",
        sgs: "H:i, j F Y",
        shi: "H:i, j F Y",
        sh: "H:i, j F Y",
        shn: "H:i, j F Y",
        "shy-latn": "H:i, j F Y",
        si: "H:i, j F Y",
        sk: "H:i, j. F Y",
        "skr-arab": "H:i\u060c j xg Y\u0621",
        sli: "H:i, j. M Y",
        sl: "H:i, j. F Y",
        sma: "H:i, j F Y",
        sm: "H:i, j F Y",
        sn: "H:i, j F Y",
        so: "H:i, j F Y",
        sq: "j F Y H:i",
        "sr-ec": "H:i, j. F Y.",
        "sr-el": "H:i, j. F Y.",
        srn: "j M Y H:i",
        ss: "H:i, j F Y",
        st: "H:i, j F Y",
        stq: "H:i, j. M Y",
        sty: "H:i, j xg Y",
        su: "j F Y H.i",
        sv: 'j F Y "kl." H.i',
        sw: "H:i, j F Y",
        szl: "H:i, j M Y",
        ta: "H:i, j F Y",
        tay: "H:i, j F Y",
        tcy: "H:i, j F Y",
        te: "H:i, j F Y",
        tet: "H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y",
        "tg-cyrl": "H:i, j xg Y",
        "tg-latn": "H:i, j F Y",
        th: "H:i, j F xkY",
        ti: "H:i, j F Y",
        tk: "H:i, j F Y",
        tl: "H:i, j F Y",
        tly: "H:i, j F Y",
        tn: "H:i, j F Y",
        to: "H:i, j F Y",
        tpi: "H:i, j F Y",
        tr: "H.i, j F Y",
        tru: "H:i, j F Y",
        trv: "H:i, j F Y",
        ts: "H:i, j F Y",
        "tt-cyrl": "j M Y, H:i",
        "tt-latn": "j M Y, H:i",
        tw: "H:i, j F Y",
        ty: "j F Y \xe0 H:i",
        tyv: "H:i, j xg Y",
        tzm: "H:i, j F Y",
        udm: "H:i, j xg Y",
        "ug-arab": "H:i, j F Y",
        "ug-latn": "H:i, j F Y",
        uk: "H:i, j xg Y",
        ur: "H:i\u060c j xg Y\u0621",
        uz: "H:i, j-F Y",
        vec: "H:i, j M Y",
        ve: "H:i, j F Y",
        vep: 'j. F Y, "kell" H:i',
        vi: 'H:i, "ng\xe0y" j "th\xe1ng" n "n\u0103m" Y',
        vls: "j M Y H:i",
        vmf: "H:i, j. M Y",
        vo: 'H:i, Y F j"id"',
        vot: 'j. F"ta" Y "kello" H.i',
        vro: 'j. F Y, "kell" H:i',
        wa: "j F Y \xe0 H:i",
        war: "H:i, j F Y",
        wo: "j F Y \xe0 H:i",
        wuu: "Y\u5e74n\u6708j\u53f7 (D) H:i",
        xal: "H:i, j xg Y",
        xh: "H:i, j F Y",
        xmf: "H:i, j F Y",
        xsy: "H:i, j F Y",
        yi: "H:i, j xg Y",
        yo: "H:i, j F Y",
        yue: "Y\u5e74n\u6708j\u865f (D) H:i",
        za: "Y\u5e74n\u6708j\u65e5 (D) H:i",
        zea: "j M Y H:i",
        zgh: "H:i, j F Y",
        "zh-hans": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "zh-hant": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "zh-hk": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        zh: "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "zh-sg": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        "zh-tw": "Y\u5e74n\u6708j\u65e5 (D) H:i",
        zu: "H:i, j F Y"
    }, DIGITS = {
        "aeb-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        anp: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        ar: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        as: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
        azb: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        bcc: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        bgn: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        bho: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        bn: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
        bo: "\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29",
        bpy: "\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef",
        bqi: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        ckb: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        dty: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        dz: "\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29",
        fa: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        glk: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        "gom-deva": "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        gu: "\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef",
        hi: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        kjp: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
        "kk-arab": "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        km: "\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9",
        kn: "\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef",
        "ks-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        "ks-deva": "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        ks: "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        "ku-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        lki: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        lo: "\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9",
        lrc: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        luz: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        lzh: "\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d",
        mai: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        mni: "\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9",
        mnw: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
        mr: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        my: "\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049",
        mzn: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        ne: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        new: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        nqo: "\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9",
        or: "\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f",
        pi: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        ps: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        sa: "\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f",
        sat: "\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59",
        sdh: "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9",
        "skr-arab": "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669",
        tcy: "\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef"
    }, TIMEZONES = [ "acdt", "acst", "act", "acwdt", "acwst", "addt", "adt", "aedt", "aest", "aft", "ahdt", "ahst", "akdt", "akst", "amst", "amt", "ant", "apt", "arst", "art", "ast", "awdt", "awst", "awt", "azomt", "azost", "azot", "bdst", "bdt", "beat", "beaut", "bmt", "bnt", "bortst", "bort", "bost", "bot", "brst", "brt", "bst", "btt", "burt", "cant", "capt", "cast", "cat", "cawt", "cct", "cddt", "cdt", "cemt", "cest", "cet", "cgst", "cgt", "chadt", "chast", "chdt", "chost", "chot", "chut", "ckhst", "ckt", "clst", "clt", "cmt", "cost", "cot", "cpt", "cst", "cut", "cvst", "cvt", "cwt", "cxt", "chst", "dact", "dmt", "easst", "east", "eat", "ect", "eddt", "edt", "eest", "eet", "egst", "egt", "ehdt", "emt", "ept", "est", "ewt", "ffmt", "fjst", "fjt", "fkst", "fkt", "fmt", "fnst", "fnt", "galt", "gamt", "gbgt", "gft", "ghst", "gilt", "gmt", "gst", "gyt", "hdt", "hkst", "hkt", "hmt", "hovst", "hovt", "hst", "ict", "iddt", "idt", "ihst", "imt", "iot", "irdt", "irst", "isst", "ist", "javt", "jcst", "jdt", "jmt", "jst", "jwst", "kart", "kdt", "kmt", "kost", "kst", "kwat", "lhdt", "lhst", "lint", "lkt", "lrt", "lst", "madmt", "madst", "madt", "malst", "malt", "mart", "mddt", "mdst", "mdt", "mest", "met", "mht", "mist", "mmt", "most", "mot", "mpt", "msd", "msk", "mst", "must", "mut", "mvt", "mwt", "myt", "ncst", "nct", "nddt", "ndt", "negt", "nest", "net", "nfst", "nft", "nmt", "npt", "nrt", "nst", "nut", "nwt", "nzdt", "nzmt", "nzst", "pddt", "pdt", "pest", "pet", "pgt", "phot", "phst", "pht", "pkst", "pkt", "plmt", "pmdt", "pmmt", "pmst", "pmt", "pnt", "pont", "ppmt", "ppt", "pst", "pwt", "pyst", "pyt", "qmt", "ret", "rmt", "sast", "sbt", "sct", "sdmt", "sdt", "set", "sgt", "sjmt", "smt", "srt", "sst", "swat", "taht", "tbmt", "tkt", "tlt", "tmt", "tost", "tot", "tvt", "uct", "ulast", "ulat", "utc", "uyhst", "uyst", "uyt", "vet", "vust", "vut", "wakt", "warst", "wart", "wast", "wat", "wemt", "west", "wet", "wft", "wgst", "wgt", "wib", "wita", "wit", "wmt", "wsdt", "wsst", "xjt", "yddt", "ydt", "ypt", "yst", "ywt", "a", "b", "c", "d", "e", "f", "g", "h", "i", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" ];
    function loadMessages() {
        const requests = [];
        mw.messages.set(cd.config.messages), cd.g.CONTRIBS_PAGE = cd.config.contribsPage, 
        cd.g.LOCAL_TIMEZONE_OFFSET = cd.config.localTimezoneOffset;
        const messageNames = [ "sun", "mon", "tue", "wed", "thu", "fri", "sat", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec", "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december", "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen", "parentheses", "parentheses-start", "parentheses-end" ], messagesRequests = [];
        for (let i = 0; i < messageNames.length; i += 50) {
            const nextNames = messageNames.slice(i, i + 50);
            messagesRequests.push(cd.g.api.loadMessagesIfMissing(nextNames, {
                amlang: mw.config.get("wgContentLanguage")
            }));
        }
        if (Promise.all(messagesRequests).then(() => {
            cd.g.MESSAGES = {}, messageNames.forEach(name => {
                cd.g.MESSAGES[name] = mw.msg(name);
            });
        }), requests.push(...messagesRequests), !Object.keys(cd.config.messages).some(name => name.startsWith("timezone-"))) {
            const request = cd.g.api.loadMessages(void 0, {
                amlang: mw.config.get("wgContentLanguage"),
                amincludelocal: 1,
                amfilter: "timezone-"
            });
            requests.push(request);
        }
        if (!cd.g.CONTRIBS_PAGE || null === cd.g.LOCAL_TIMEZONE_OFFSET) {
            const request = cd.g.api.get({
                action: "query",
                meta: "siteinfo",
                siprop: [ "specialpagealiases", "general" ]
            }).then(resp => {
                resp.query.specialpagealiases.some(alias => {
                    if ("Contributions" === alias.realname) return cd.g.CONTRIBS_PAGE = mw.config.get("wgFormattedNamespaces")[-1] + ":" + alias.aliases[0], 
                    !0;
                }), cd.g.LOCAL_TIMEZONE_OFFSET = resp.query.general.timeoffset;
            });
            requests.push(request);
        }
        return Promise.all(requests);
    }
    function setLocalTimestampRegexps() {
        const mainPartPattern = function(format, digits) {
            const regexpAlternateGroup = arr => "(" + arr.map(mw.util.escapeRegExp).join("|") + ")";
            let s = "\\b";
            for (let p = 0; p < format.length; p++) {
                let num = !1, code = format[p];
                switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]), 
                code) {
                  case "xx":
                    s += "x";
                    break;

                  case "xg":
                    s += regexpAlternateGroup(util_getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ]));
                    break;

                  case "d":
                    num = "2";
                    break;

                  case "D":
                    s += regexpAlternateGroup(util_getMessages([ "sun", "mon", "tue", "wed", "thu", "fri", "sat" ]));
                    break;

                  case "j":
                    num = "1,2";
                    break;

                  case "l":
                    s += regexpAlternateGroup(util_getMessages([ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ]));
                    break;

                  case "F":
                    s += regexpAlternateGroup(util_getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ]));
                    break;

                  case "M":
                    s += regexpAlternateGroup(util_getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ]));
                    break;

                  case "n":
                    num = "1,2";
                    break;

                  case "Y":
                  case "xkY":
                    num = "4";
                    break;

                  case "G":
                    num = "1,2";
                    break;

                  case "H":
                  case "i":
                    num = "2";
                    break;

                  case "\\":
                    p < format.length - 1 ? s += format[++p] : s += "\\";
                    break;

                  case '"':
                    if (p < format.length - 1) {
                        const endQuote = format.indexOf('"', p + 1);
                        -1 === endQuote ? s += '"' : (s += format.substr(p + 1, endQuote - p - 1), p = endQuote);
                    } else s += '"';
                    break;

                  default:
                    s += format[p];
                }
                !1 !== num && (s += "(" + (digits + "{" + num + "}") + ")");
            }
            return s;
        }(cd.g.DATE_FORMAT, cd.g.DIGITS ? "[" + cd.g.DIGITS + "]" : "\\d"), timezones = Object.keys(cd.config.messages).filter(name => name.startsWith("timezone-")).map(name => name.slice(9)), timezonePattern = "\\((?:" + (timezones.length ? timezones : TIMEZONES).map(abbr => {
            const message = mw.message("timezone-" + abbr);
            return message.exists() ? message.text() : abbr;
        }).map(mw.util.escapeRegExp).join("|").toUpperCase() + ")\\)", pattern = mainPartPattern + " " + timezonePattern;
        cd.g.TIMESTAMP_REGEXP = new RegExp(pattern), cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE = new RegExp(mainPartPattern), 
        cd.g.TIMEZONE_REGEXP = new RegExp(timezonePattern, "g");
    }
    function initTimestampParsingTools() {
        !function() {
            const langCode = mw.config.get("wgContentLanguage");
            cd.g.DATE_FORMAT = DATE_FORMATS[langCode], cd.g.DIGITS = mw.config.get("wgTranslateNumerals") ? DIGITS[langCode] : null;
        }(), setLocalTimestampRegexps(), function() {
            const format = cd.g.DATE_FORMAT, matchingGroups = [];
            for (let p = 0; p < format.length; p++) {
                let code = format[p];
                switch ("x" === code && p < format.length - 1 && (code += format[++p]), "xk" === code && p < format.length - 1 && (code += format[++p]), 
                code) {
                  case "xx":
                    break;

                  case "xg":
                  case "d":
                  case "j":
                  case "D":
                  case "l":
                  case "F":
                  case "M":
                  case "n":
                  case "Y":
                  case "xkY":
                  case "G":
                  case "H":
                  case "i":
                    matchingGroups.push(code);
                    break;

                  case "\\":
                    p < format.length - 1 && ++p;
                    break;

                  case '"':
                    if (p < format.length - 1) {
                        const endQuote = format.indexOf('"', p + 1);
                        -1 !== endQuote && (p = endQuote);
                    }
                }
            }
            cd.g.TIMESTAMP_PARSER = (match, matchingGroups, digits, timezoneOffset) => {
                const untransformDigits = text => digits ? text.replace(new RegExp("[" + digits + "]", "g"), m => digits.indexOf(m)) : text, getMessages = messages => messages.map(name => cd.g.MESSAGES[name]);
                let year = 0, monthIdx = 0, day = 0, hour = 0, minute = 0;
                for (let i = 0; i < matchingGroups.length; i++) {
                    const code = matchingGroups[i], text = match[i + 3];
                    switch (code) {
                      case "xg":
                        monthIdx = getMessages([ "january-gen", "february-gen", "march-gen", "april-gen", "may-gen", "june-gen", "july-gen", "august-gen", "september-gen", "october-gen", "november-gen", "december-gen" ]).indexOf(text);
                        break;

                      case "d":
                      case "j":
                        day = Number(untransformDigits(text));
                        break;

                      case "D":
                      case "l":
                        break;

                      case "F":
                        monthIdx = getMessages([ "january", "february", "march", "april", "may_long", "june", "july", "august", "september", "october", "november", "december" ]).indexOf(text);
                        break;

                      case "M":
                        monthIdx = getMessages([ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" ]).indexOf(text);
                        break;

                      case "n":
                        monthIdx = Number(untransformDigits(text)) - 1;
                        break;

                      case "Y":
                        year = Number(untransformDigits(text));
                        break;

                      case "xkY":
                        year = Number(untransformDigits(text)) - 543;
                        break;

                      case "G":
                      case "H":
                        hour = Number(untransformDigits(text));
                        break;

                      case "i":
                        minute = Number(untransformDigits(text));
                        break;

                      default:
                        throw "Not implemented";
                    }
                }
                return new Date(Date.UTC(year, monthIdx, day, hour, minute) - 60 * timezoneOffset * 1e3);
            }, cd.g.TIMESTAMP_MATCHING_GROUPS = matchingGroups;
        }();
    }
    function initSettings() {
        cd.settings = cd.settings || {}, cd.defaultSettings = {
            allowEditOthersComments: !1,
            alwaysExpandSettings: !1,
            autopreview: !0,
            desktopNotifications: "unknown",
            defaultCommentLinkType: cd.config.defaultCommentLinkType || "diff",
            defaultSectionLinkType: "wikilink",
            highlightOwnComments: !0,
            insertButtonsChanged: !1,
            insertButtons: cd.config.defaultInsertButtons || [],
            mySignature: cd.g.SIGN_CODE,
            notifications: "all",
            notificationsBlacklist: [],
            showLoadingOverlay: !0,
            showToolbar: !0,
            watchSectionOnReply: !0
        };
        const aliases = {
            desktopNotifications: [ "browserNotifications" ]
        };
        let nativeSettings;
        try {
            nativeSettings = JSON.parse(mw.user.options.get(cd.g.SETTINGS_OPTION_FULL_NAME)) || {};
        } catch (e) {
            nativeSettings = {};
        }
        Object.keys(cd.defaultSettings).forEach(name => {
            const settingName = "cd" + firstCharToUpperCase(name);
            settingName in window && (cd.settings[name] = window[settingName]), void 0 !== nativeSettings[name] && typeof nativeSettings[name] == typeof cd.defaultSettings[name] && (cd.settings[name] = nativeSettings[name]), 
            (aliases[name] || []).forEach(alias => {
                void 0 !== nativeSettings[alias] && typeof nativeSettings[alias] == typeof cd.defaultSettings[name] && (cd.settings[name] = nativeSettings[alias]);
            });
        }), cd.settings.insertButtonsChanged || JSON.stringify(nativeSettings.insertButtons) === JSON.stringify(cd.config.defaultInsertButtons) || (cd.settings.insertButtons = cd.config.defaultInsertButtons), 
        cd.settings = Object.assign({}, cd.defaultSettings, cd.settings), JSON.stringify(cd.settings) !== mw.user.options.get(cd.g.SETTINGS_OPTION_FULL_NAME) && setSettings().catch(e => {
            console.warn("Couldn't save the settings to the server.", e);
        });
    }
    function initTalkPageCss() {
        const focusedColor = window.getComputedStyle(document.documentElement).getPropertyValue("--cd-comment-underlay-focused-color"), bodyBackgroundColor = $("#content").length ? window.getComputedStyle($("#content").get(0)).backgroundColor : "white";
        document.documentElement.style.setProperty("--cd-comment-underlay-focused-transparent-color", function(color) {
            const dummyElement = document.createElement("span");
            return dummyElement.style.color = color, (color = dummyElement.style.color).includes("rgba") ? color.replace(/\d+(?=\))/, "0") : color.replace(/rgb/, "rgba").replace(/\)/, ", 0)");
        }(focusedColor || cd.g.COMMENT_UNDERLAY_FOCUSED_COLOR)), cd.g.nanoCss.put(":root", {
            "--cd-comment-underlay-focused-color": cd.g.COMMENT_UNDERLAY_FOCUSED_COLOR,
            "--cd-comment-underlay-target-color": cd.g.COMMENT_UNDERLAY_TARGET_COLOR,
            "--cd-comment-underlay-new-color": cd.g.COMMENT_UNDERLAY_NEW_COLOR,
            "--cd-comment-underlay-own-color": cd.g.COMMENT_UNDERLAY_OWN_COLOR
        }), cd.g.nanoCss.put(".cd-commentOverlay-gradient", {
            backgroundImage: "linear-gradient(to left, var(--cd-comment-underlay-focused-color), var(--cd-comment-underlay-focused-transparent-color))"
        }), cd.g.nanoCss.put(".cd-messageArea .cd-closeButton", {
            backgroundColor: bodyBackgroundColor
        });
    }
    function init(_x) {
        return _init.apply(this, arguments);
    }
    function _init() {
        return (_init = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
            cd.g.api = cd.g.api || new mw.Api, (yield messagesRequest) || loadMessages(), initSettings(), 
            initTimestampParsingTools(), cd.config.tagName ? (cd.g.SUMMARY_POSTFIX = "", cd.g.SUMMARY_LENGTH_LIMIT = mw.config.get("wgCommentCodePointLimit")) : (cd.g.SUMMARY_POSTFIX = " ([[".concat(cd.config.helpWikilink, "|").concat(cd.s("script-name-short"), "]])"), 
            cd.g.SUMMARY_LENGTH_LIMIT = mw.config.get("wgCommentCodePointLimit") - cd.g.SUMMARY_POSTFIX.length), 
            cd.g.CONTRIBS_PAGE_LINK_REGEXP = new RegExp("^".concat(cd.g.CONTRIBS_PAGE, "/")), 
            cd.g.CURRENT_USER_GENDER = mw.user.options.get("gender"), cd.g.QQX_MODE = "qqx" === mw.util.getParamValue("uselang"), 
            cd.g.GENDER_AFFECTS_USER_STRING = cd.s("user-male-dative") !== cd.s("user-female-dative") || cd.s("user-male-dative") !== cd.s("user-unknown-dative") || cd.s("user-male-genitive") !== cd.s("user-female-genitive") || cd.s("user-male-genitive") !== cd.s("user-unknown-genitive"), 
            cd.g.dontHandleScroll = !1, cd.g.autoScrollInProgress = !1, cd.commentForms = [];
            const namespaceIds = mw.config.get("wgNamespaceIds"), userNamespaces = Object.keys(namespaceIds).filter(key => [ 2, 3 ].includes(namespaceIds[key])), userNamespacesPattern = underlinesToSpaces(userNamespaces.join("|"));
            cd.g.USER_NAMESPACES_REGEXP = new RegExp("(?:^|:)(?:".concat(userNamespacesPattern, "):(.+)"), "i");
            const anySpace = s => s.replace(/:/g, " : ").replace(/[ _]/g, "[ _]*"), userNamespacesPatternAnySpace = anySpace(userNamespaces.join("|")), contributionsPageAnySpace = anySpace(cd.g.CONTRIBS_PAGE);
            if (cd.g.CAPTURE_USER_NAME_PATTERN = "\\[\\[[ _]*:?(?:\\w*:){0,2}(?:(?:".concat(userNamespacesPatternAnySpace, ")[ _]*:[ _]*|") + "(?:Special[ _]*:[ _]*Contributions|".concat(contributionsPageAnySpace, ")\\/[ _]*)([^|\\]/]+)(/)?"), 
            cd.config.unsignedTemplates.length) {
                const unsignedTemplatesPattern = cd.config.unsignedTemplates.map(caseInsensitiveFirstCharPattern).join("|");
                cd.g.UNSIGNED_TEMPLATES_REGEXP = new RegExp("(\\{\\{ *(?:".concat(unsignedTemplatesPattern, ") *\\|[ \\u200E]*([^}|]+?)[ \\u200E]*(?:\\|[ \\u200E]*([^}]+?)[ \\u200E]*)?\\}\\}).*\\n"), "g");
            }
            const currentUserSignature = mw.user.options.get("nickname"), authorInSignatureMatch = currentUserSignature.match(new RegExp("\\s*".concat(cd.g.CAPTURE_USER_NAME_PATTERN), "i"));
            if (authorInSignatureMatch) {
                const textBeforeSignature = cd.settings.mySignature !== cd.defaultSettings.mySignature && cd.settings.mySignature.includes("~~".concat("~")) ? mw.util.escapeRegExp(cd.settings.mySignature.slice(0, cd.settings.mySignature.indexOf("~~".concat("~")))) : "", signatureBeginning = mw.util.escapeRegExp(currentUserSignature.slice(0, authorInSignatureMatch.index));
                cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP = new RegExp(textBeforeSignature + signatureBeginning + "$");
            }
            const pniePattern = cd.g.POPULAR_NOT_INLINE_ELEMENTS.join("|");
            cd.g.PNIE_PATTERN = "(?:".concat(pniePattern, ")");
            const commentAntipatternsPatternParts = [];
            if (cd.config.elementsToExcludeClasses.length || cd.config.templatesToExclude.length || cd.config.commentAntipatterns.length) {
                if (cd.config.elementsToExcludeClasses) {
                    const elementsToExcludeClassesPattern = cd.config.elementsToExcludeClasses.join("\\b|\\b");
                    commentAntipatternsPatternParts.push("class=(['\"])[^'\"\\n]*(?:\\b".concat(elementsToExcludeClassesPattern, "\\b)[^'\"\\n]*\\1"));
                }
                if (cd.config.templatesToExclude.length) {
                    const templatesToExcludePattern = cd.config.templatesToExclude.map(caseInsensitiveFirstCharPattern).join("|");
                    commentAntipatternsPatternParts.push("\\{\\{ *(?:".concat(templatesToExcludePattern, ") *(?:\\||\\}\\})"));
                }
                cd.config.commentAntipatterns && commentAntipatternsPatternParts.push(...cd.config.commentAntipatterns);
                const commentAntipatternPattern = commentAntipatternsPatternParts.join("|");
                cd.g.COMMENT_ANTIPATTERNS_REGEXP = new RegExp("^.*(?:".concat(commentAntipatternPattern, ").*$"), "mg");
            }
            cd.g.ARTICLE_PATH_REGEXP = new RegExp(mw.util.escapeRegExp(mw.config.get("wgArticlePath")).replace(mw.util.escapeRegExp("$1"), "(.*)"));
            const quoteBeginnings = [ "<blockquote>", "<q>" ], quoteEndings = [ "</blockquote>", "</q>" ];
            cd.config.pairQuoteTemplates.forEach(template => {
                quoteBeginnings.push("{{".concat(template[0])), quoteEndings.push("{{".concat(template[1]));
            });
            const quoteBeginningsPattern = quoteBeginnings.map(mw.util.escapeRegExp).join("|"), quoteEndingsPattern = quoteEndings.map(mw.util.escapeRegExp).join("|");
            cd.g.QUOTE_REGEXP = new RegExp("(".concat(quoteBeginningsPattern, ")([^]*?)(").concat(quoteEndingsPattern, ")"), "ig"), 
            cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES = cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.concat(cd.config.customUnhighlightableElementsClasses);
            const fileNamespacesPatternAnySpace = anySpace(Object.keys(namespaceIds).filter(key => 6 === namespaceIds[key]).join("|"));
            cd.g.FILE_PREFIX_PATTERN = "(?:".concat(fileNamespacesPatternAnySpace, "):"), cd.g.BAD_COMMENT_BEGINNINGS = cd.g.BAD_COMMENT_BEGINNINGS.concat([ new RegExp("^\\[\\[".concat(cd.g.FILE_PREFIX_PATTERN, ".+\\n*(?=[*:#])")) ]).concat(cd.config.customBadCommentBeginnings), 
            cd.g.ADD_TOPIC_SELECTORS = [ "#ca-addsection a" ].concat(cd.config.customAddTopicLinkSelectors).join(", "), 
            createWindowManager(), cd.g.COMMENT_ELEMENT_PROTOTYPES = {}, cd.g.SECTION_ELEMENT_PROTOTYPES = {}, 
            cd.g.COMMENT_ELEMENT_PROTOTYPES.goToParentButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-gotoparent"),
                title: cd.s("cm-gotoparent-tooltip"),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0);
            const defaultTypeProperty = "cm-copylink-tooltip-".concat(cd.settings.defaultCommentLinkType.toLowerCase());
            cd.g.COMMENT_ELEMENT_PROTOTYPES.linkButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-copylink"),
                title: cd.s("cm-copylink-tooltip", cd.s(defaultTypeProperty)),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.pendingLinkButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-copylink"),
                title: cd.s("cm-copylink-tooltip", cd.s(defaultTypeProperty)),
                framed: !1,
                disabled: !0,
                classes: [ "cd-button", "cd-commentButton", "cd-button-pending" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.thankButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-thank"),
                title: cd.s("cm-thank-tooltip"),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.pendingThankButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-thank"),
                title: cd.s("cm-thank-tooltip"),
                framed: !1,
                disabled: !0,
                classes: [ "cd-button", "cd-commentButton", "cd-button-pending" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.disabledThankButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-thank"),
                title: cd.s("cm-thank-disabled-tooltip"),
                framed: !1,
                disabled: !0,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.editButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-edit"),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.replyButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-reply"),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            }).$element.get(0), cd.g.SECTION_ELEMENT_PROTOTYPES.replyButton = new OO.ui.ButtonWidget({
                label: cd.s("section-reply"),
                framed: !1,
                classes: [ "cd-button", "cd-sectionButton" ]
            }).$element.get(0), cd.g.SECTION_ELEMENT_PROTOTYPES.addSubsectionButton = new OO.ui.ButtonWidget({
                label: cd.s("section-addsubsection"),
                framed: !1,
                classes: [ "cd-button", "cd-sectionButton" ]
            }).$element.get(0), cd.g.COMMENT_ELEMENT_PROTOTYPES.underlay = document.createElement("div"), 
            cd.g.COMMENT_ELEMENT_PROTOTYPES.underlay.className = "cd-commentUnderlay", cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay = document.createElement("div"), 
            cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay.className = "cd-commentOverlay";
            const overlayInnerWrapper = document.createElement("div");
            overlayInnerWrapper.className = "cd-commentOverlay-innerWrapper", cd.g.COMMENT_ELEMENT_PROTOTYPES.overlay.appendChild(overlayInnerWrapper);
            const overlayGradient = document.createElement("div");
            overlayGradient.textContent = "\xa0", overlayGradient.className = "cd-commentOverlay-gradient", 
            overlayInnerWrapper.appendChild(overlayGradient);
            const overlayContent = document.createElement("div");
            overlayContent.className = "cd-commentOverlay-content", overlayInnerWrapper.appendChild(overlayContent), 
            $.fn.extend(jqueryExtensions);
        }))).apply(this, arguments);
    }
    function getUnseenCommentAnchors() {
        return cd.comments.filter(comment => "unseen" === comment.newness).map(comment => comment.anchor);
    }
    function updatePageContent(_x2, _x3) {
        return _updatePageContent.apply(this, arguments);
    }
    function _updatePageContent() {
        return (_updatePageContent = asyncToGenerator_default()((function*(html, keptData) {
            cd.debug.stopTimer("getting HTML"), cd.debug.startTimer("laying out HTML"), cd.g.$content.children(".mw-parser-output").remove(), 
            cd.g.$content.append(html);
            try {
                yield processPage(Object.assign({}, keptData, {
                    unseenCommentAnchors: getUnseenCommentAnchors()
                }));
            } catch (e) {
                mw.notify(cd.s("error-reloadpage"), {
                    type: "error"
                }), removeLoadingOverlay(), console.error(e);
            }
            mw.hook("wikipage.content").fire(cd.g.$content);
        }))).apply(this, arguments);
    }
    let $loadingPopup, newCount, unseenCount;
    function isShowLoadingOverlaySettingOff() {
        return cd.settings && !1 === cd.settings.showLoadingOverlay || !cd.settings && void 0 !== window.cdShowLoadingOverlay && !1 === window.cdShowLoadingOverlay;
    }
    function setLoadingOverlay() {
        isShowLoadingOverlaySettingOff() || ($loadingPopup ? $loadingPopup.show() : ($loadingPopup = $("<div>").addClass("cd-loadingPopup"), 
        $("<img>").addClass("cd-loadingPopup-logo").attr("src", cd.config.logoDataUrl).appendTo($loadingPopup), 
        $(document.body).append($loadingPopup)));
    }
    function removeLoadingOverlay() {
        $loadingPopup && !isShowLoadingOverlaySettingOff() && $loadingPopup.hide();
    }
    function reloadPage() {
        return _reloadPage.apply(this, arguments);
    }
    function _reloadPage() {
        return (_reloadPage = asyncToGenerator_default()((function*(keptData = {}) {
            let pageData;
            saveSession(), keptData.scrollPosition = window.pageYOffset, js_navPanel.closeAllNotifications(), 
            cd.debug.init(), cd.debug.startTimer("total time"), cd.debug.startTimer("getting HTML"), 
            setLoadingOverlay(), getUserInfo();
            try {
                pageData = yield getCurrentPageData(!0);
            } catch (e) {
                if (removeLoadingOverlay(), keptData.commentAnchor) throw e;
                return mw.notify(cd.s("error-reloadpage"), {
                    type: "error"
                }), void console.warn(e);
            }
            cd.commentForms.forEach(commentForm => {
                commentForm.$element.detach();
            }), mw.config.set({
                wgRevisionId: pageData.revid,
                wgCurRevisionId: pageData.revid
            }), mw.loader.load(pageData.modules), mw.loader.load(pageData.modulestyles), mw.config.set(pageData.jsconfigvars), 
            updatePageTitle(0, !1), updatePageContent(pageData.text, keptData);
        }))).apply(this, arguments);
    }
    function saveSession(warnedLeave) {
        const forms = cd.commentForms.map(commentForm => {
            let targetData;
            const target = commentForm.target;
            return commentForm.target instanceof Comment_Comment ? targetData = {
                anchor: target.anchor
            } : target instanceof Section_Section && (targetData = {
                headline: target.headline,
                firstCommentAnchor: target.comments[0] && target.comments[0].anchor,
                index: target.id
            }), {
                mode: commentForm.mode,
                targetData: targetData,
                addSectionLinkHref: commentForm.$addSectionLink && commentForm.$addSectionLink.attr("href"),
                headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
                comment: commentForm.commentInput.getValue(),
                summary: commentForm.summaryInput.getValue(),
                minor: commentForm.minorCheckbox && commentForm.minorCheckbox.isSelected(),
                watch: commentForm.watchCheckbox && commentForm.watchCheckbox.isSelected(),
                watchSection: commentForm.watchSectionCheckbox && commentForm.watchSectionCheckbox.isSelected(),
                ping: commentForm.pingCheckbox && commentForm.pingCheckbox.isSelected(),
                small: commentForm.smallCheckbox && commentForm.smallCheckbox.isSelected(),
                noSignature: commentForm.noSignatureCheckbox && commentForm.noSignatureCheckbox.isSelected(),
                delete: commentForm.deleteCheckbox && commentForm.deleteCheckbox.isSelected(),
                originalHeadline: commentForm.originalHeadline,
                originalComment: commentForm.originalComment,
                summaryAltered: commentForm.summaryAltered,
                lastFocused: commentForm.lastFocused
            };
        }), commentFormsData = forms.length ? {
            forms: forms,
            saveUnixTime: Date.now(),
            warnedLeave: warnedLeave
        } : {}, commentFormsDataAllPagesJson = localStorage.getItem("convenientDiscussions-commentForms");
        let commentFormsDataAllPages;
        try {
            commentFormsDataAllPages = commentFormsDataAllPagesJson && JSON.parse(commentFormsDataAllPagesJson) || {};
        } catch (e) {
            console.error(e), commentFormsDataAllPages = {};
        }
        commentFormsDataAllPages[mw.config.get("wgPageName")] = commentFormsData, localStorage.setItem("convenientDiscussions-commentForms", JSON.stringify(commentFormsDataAllPages));
    }
    function restoreCommentFormsFromData(commentFormsData) {
        const restored = [], rescue = [];
        commentFormsData.forms.forEach(data => {
            const property = CommentForm_CommentForm.modeToProperty(data.mode);
            if (data.targetData && data.targetData.anchor) {
                const comment = Comment_Comment.getCommentByAnchor(data.targetData.anchor);
                comment && !comment["".concat(property, "Form")] ? (comment[property](data), restored.push(comment["".concat(property, "Form")])) : rescue.push(data);
            } else if (data.targetData && data.targetData.headline) {
                const section = Section_Section.search({
                    headline: data.targetData.headline,
                    firstCommentAnchor: data.targetData.firstCommentAnchor,
                    index: data.targetData.index
                });
                section && !section["".concat(property, "Form")] ? (section[property](data), restored.push(section["".concat(property, "Form")])) : rescue.push(data);
            } else if ("addSection" === data.mode) if (cd.g.addSectionForm) rescue.push(data); else {
                const $fakeA = $("<a>").attr("href", data.addSectionLinkHref);
                cd.g.addSectionForm = new CommentForm_CommentForm({
                    mode: data.mode,
                    $addSectionLink: $fakeA,
                    dataToRestore: data
                }), restored.push(cd.g.addSectionForm);
            }
        }), restored.length && (restored.slice().sort(lastFocused)[0].commentInput.focus(), 
        saveSession()), rescue.length && rescueCommentFormsContent(rescue);
    }
    function restoreCommentForms() {
        if (cd.g.firstRun) {
            const commentFormsDataAllPagesJson = localStorage.getItem("convenientDiscussions-commentForms");
            if (commentFormsDataAllPagesJson) {
                let commentFormsDataAllPages;
                try {
                    commentFormsDataAllPages = JSON.parse(commentFormsDataAllPagesJson) || {};
                } catch (e) {
                    return void console.error(e);
                }
                data = commentFormsDataAllPages, Object.keys(data).forEach(key => {
                    (!data[key].forms || !data[key].forms.length || data[key].saveUnixTime < Date.now() - 1e3 * cd.g.SECONDS_IN_A_DAY * 30) && delete data[key];
                }), commentFormsDataAllPages = data, localStorage.setItem("convenientDiscussions-commentForms", JSON.stringify(commentFormsDataAllPages));
                const commentFormsData = commentFormsDataAllPages[mw.config.get("wgPageName")] || {};
                if (commentFormsData.forms) if (commentFormsData.warnedLeave) {
                    const $text = animateLink(cd.s("restore-suggestion-text"), "cd-notification-restoreCommentForms", asyncToGenerator_default()((function*() {
                        cd.util.isPageOverlayOn() || (notification.close(), restoreCommentFormsFromData(commentFormsData));
                    }))), notification = mw.notification.notify($text, {
                        autoHide: !1
                    });
                } else restoreCommentFormsFromData(commentFormsData), mw.notify(cd.s("restore-restored-text"), {
                    title: cd.s("restore-restored-title")
                });
            }
        } else {
            const rescue = [];
            cd.commentForms.forEach(commentForm => {
                commentForm.checkCodeRequest = null;
                const target = commentForm.target;
                if (target instanceof Comment_Comment) {
                    if (target.anchor) {
                        const comment = Comment_Comment.getCommentByAnchor(target.anchor);
                        comment ? (commentForm.setTargets(comment), comment[CommentForm_CommentForm.modeToProperty(commentForm.mode)](commentForm), 
                        commentForm.addToPage()) : rescue.push({
                            headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
                            comment: commentForm.commentInput.getValue(),
                            summary: commentForm.summaryInput.getValue()
                        });
                    }
                } else if (target instanceof Section_Section) {
                    const section = Section_Section.search({
                        headline: target.headline,
                        firstCommentAnchor: target.comments[0] && target.comments[0].anchor,
                        index: target.id
                    });
                    section ? (commentForm.setTargets(section), section[CommentForm_CommentForm.modeToProperty(commentForm.mode)](commentForm), 
                    commentForm.addToPage()) : rescue.push({
                        headline: commentForm.headlineInput && commentForm.headlineInput.getValue(),
                        comment: commentForm.commentInput.getValue(),
                        summary: commentForm.summaryInput.getValue()
                    });
                } else "addSection" === commentForm.mode && commentForm.addToPage();
            }), rescue.length && rescueCommentFormsContent(rescue);
        }
        var data;
        saveSession(), js_navPanel.updateCommentFormButton();
    }
    let relevantNewCommentAnchor, $navPanel, $refreshButton, $previousButton, $nextButton, $firstUnseenButton, $commentFormButton, lastFirstTimeSeenCommentId = null, newRevisions = [], notifiedAbout = [], navPanel_notifications = [], isBackgroundCheckArranged = !1;
    function setAlarmViaWorker(interval) {
        cd.g.worker.postMessage({
            type: "setAlarm",
            interval: interval
        });
    }
    function removeAlarmViaWorker() {
        cd.g.worker.postMessage({
            type: "removeAlarm"
        });
    }
    function checkForNewComments() {
        return _checkForNewComments.apply(this, arguments);
    }
    function _checkForNewComments() {
        return (_checkForNewComments = asyncToGenerator_default()((function*() {
            if (!cd.g.worker) return;
            if (document.hidden && !isBackgroundCheckArranged) {
                const callback = () => {
                    $(document).off("visibilitychange", callback), isBackgroundCheckArranged = !1, removeAlarmViaWorker(), 
                    checkForNewComments();
                };
                return $(document).on("visibilitychange", callback), setAlarmViaWorker(1e3 * Math.abs(cd.g.BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL - cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL)), 
                void (isBackgroundCheckArranged = !0);
            }
            isBackgroundCheckArranged = !1;
            const rvstartid = newRevisions.length ? newRevisions[newRevisions.length - 1] : mw.config.get("wgRevisionId");
            try {
                const revisionsResp = yield makeRequestNoTimers({
                    action: "query",
                    titles: cd.g.CURRENT_PAGE,
                    prop: "revisions",
                    rvprop: [ "ids", "flags", "size", "comment" ],
                    rvdir: "newer",
                    rvstartid: rvstartid,
                    rvlimit: 500,
                    redirects: !0,
                    formatversion: 2
                }).catch(handleApiReject), revisions = revisionsResp && revisionsResp.query && revisionsResp.query.pages && revisionsResp.query.pages[0] && revisionsResp.query.pages[0].revisions;
                if (!revisions) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                const addedNewRevisions = revisions.filter((revision, i) => 0 !== i && !revision.minor && Math.abs(revision.size - revisions[i - 1].size) >= cd.config.bytesToDeemComment && !isCommentEdit(revision.comment)).map(revision => revision.revid);
                if (newRevisions.push(...addedNewRevisions), newRevisions = removeDuplicates(newRevisions), 
                addedNewRevisions.length) {
                    const {text: text} = (yield getCurrentPageData(!1, !0)) || {};
                    void 0 === text ? console.error("No page text.") : cd.g.worker.postMessage({
                        type: "parse",
                        text: text,
                        g: {
                            TIMESTAMP_REGEXP: cd.g.TIMESTAMP_REGEXP,
                            TIMESTAMP_REGEXP_NO_TIMEZONE: cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE,
                            TIMESTAMP_PARSER: cd.g.TIMESTAMP_PARSER.toString(),
                            TIMESTAMP_MATCHING_GROUPS: cd.g.TIMESTAMP_MATCHING_GROUPS,
                            TIMEZONE_REGEXP: cd.g.TIMEZONE_REGEXP,
                            DIGITS: cd.g.DIGITS,
                            LOCAL_TIMEZONE_OFFSET: cd.g.LOCAL_TIMEZONE_OFFSET,
                            MESSAGES: cd.g.MESSAGES,
                            CONTRIBS_PAGE: cd.g.CONTRIBS_PAGE,
                            CONTRIBS_PAGE_LINK_REGEXP: cd.g.CONTRIBS_PAGE_LINK_REGEXP,
                            ARTICLE_PATH_REGEXP: cd.g.ARTICLE_PATH_REGEXP,
                            USER_NAMESPACES_REGEXP: cd.g.USER_NAMESPACES_REGEXP,
                            UNHIGHLIGHTABLE_ELEMENTS_CLASSES: cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES,
                            CURRENT_USER_NAME: cd.g.CURRENT_USER_NAME,
                            CURRENT_USER_GENDER: cd.g.CURRENT_USER_GENDER,
                            CURRENT_NAMESPACE_NUMBER: cd.g.CURRENT_NAMESPACE_NUMBER
                        },
                        config: {
                            customFloatingElementsSelectors: cd.config.customFloatingElementsSelectors,
                            closedDiscussionsClasses: cd.config.closedDiscussionsClasses,
                            elementsToExcludeClasses: cd.config.elementsToExcludeClasses,
                            signatureScanLimit: cd.config.signatureScanLimit,
                            foreignElementsInHeadlinesClasses: cd.config.foreignElementsInHeadlinesClasses,
                            customForeignComponentChecker: cd.config.customForeignComponentChecker ? cd.config.customForeignComponentChecker.toString() : cd.config.customForeignComponentChecker
                        }
                    });
                }
            } catch (e) {
                console.warn(e);
            }
            document.hidden ? (setAlarmViaWorker(1e3 * cd.g.BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL), 
            isBackgroundCheckArranged = !0) : setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL);
        }))).apply(this, arguments);
    }
    function updateRefreshButton(newComments, areThereInteresting) {
        const newCommentsBySection = {};
        let tooltipText;
        newComments.forEach(comment => {
            newCommentsBySection[comment.sectionAnchor] || (newCommentsBySection[comment.sectionAnchor] = []), 
            newCommentsBySection[comment.sectionAnchor].push(comment);
        }), newComments.length ? (tooltipText = "".concat(cd.s("navpanel-newcomments-count", newComments.length), " (R)"), 
        Object.keys(newCommentsBySection).forEach(anchor => {
            const headline = newCommentsBySection[anchor][0].sectionHeadline ? cd.s("navpanel-newcomments-insection", newCommentsBySection[anchor][0].sectionHeadline) : mw.msg("parentheses", cd.s("navpanel-newcomments-outsideofsections"));
            tooltipText += "\n\n".concat(headline), newCommentsBySection[anchor].forEach(comment => {
                tooltipText += "\n", comment.toMe && (tooltipText += "".concat(cd.s("navpanel-newcomments-toyou"), " "));
                const author = comment.author.name || cd.s("navpanel-newcomments-unknownauthor"), date = comment.date ? cd.util.formatDate(comment.date) : cd.s("navpanel-newcomments-unknowndate");
                tooltipText += "".concat(author, ", ").concat(date);
            });
        })) : tooltipText = "".concat(cd.s("navpanel-refresh"), " (R)"), $refreshButton.text(newComments.length ? "+".concat(newComments.length) : "").attr("title", tooltipText), 
        areThereInteresting ? $refreshButton.addClass("cd-navPanel-refreshButton-interesting") : $refreshButton.removeClass("cd-navPanel-refreshButton-interesting");
    }
    function updatePageTitle(newCommentsCount, areThereInteresting) {
        const interestingMark = areThereInteresting ? "*" : "", s = newCommentsCount ? "(".concat(newCommentsCount).concat(interestingMark, ") ") : "";
        document.title = document.title.replace(/^(?:\(\d+\*?\) )?/, s);
    }
    function addSectionNotifications(newComments) {
        $(".cd-refreshButtonContainer").remove(), removeDuplicates(newComments.map(comment => comment.sectionAnchor)).forEach(anchor => {
            const section = Section_Section.getSectionByAnchor(anchor);
            if (!section) return;
            const button = new OO.ui.ButtonWidget({
                label: "".concat(cd.s("section-newcomments"), ". ").concat(cd.s("navpanel-refresh-tooltip"), "."),
                framed: !1,
                classes: [ "cd-button", "cd-sectionButton" ]
            });
            button.on("click", () => {
                reloadPage({
                    commentAnchor: newComments.find(comment => comment.sectionAnchor === anchor).anchor
                });
            });
            const $lastElement = section.$replyButton ? section.$replyButton.closest("ul, ol") : section.$elements[section.$elements.length - 1];
            $("<div>").addClass("cd-refreshButtonContainer").addClass("cd-sectionButtonContainer").append(button.$element).insertAfter($lastElement);
        });
    }
    function sendNotifications(_x, _x2) {
        return _sendNotifications.apply(this, arguments);
    }
    function _sendNotifications() {
        return (_sendNotifications = asyncToGenerator_default()((function*(comments, thisPageWatchedSections) {
            const notifyAbout = comments.filter(comment => !notifiedAbout.some(commentNotifiedAbout => commentNotifiedAbout.anchor === comment.anchor));
            let notifyAboutDesktop = [];
            "all" === cd.settings.desktopNotifications ? notifyAboutDesktop = notifyAbout : "toMe" === cd.settings.desktopNotifications && (notifyAboutDesktop = notifyAbout.filter(comment => comment.toMe));
            let notifyAboutOrdinary = [];
            "all" === cd.settings.notifications ? notifyAboutOrdinary = notifyAbout : "toMe" === cd.settings.notifications && (notifyAboutOrdinary = notifyAbout.filter(comment => comment.toMe)), 
            "none" !== cd.settings.notifications && notifyAboutOrdinary.length && navPanel_notifications.slice().reverse().some(notification => !notification.notification.isOpen || (notifyAboutOrdinary.push(...notification.comments), 
            !1));
            const authors = removeDuplicates(notifyAboutOrdinary.concat(notifyAboutDesktop)).map(comment => comment.author).filter(defined);
            if (yield getUserGenders(authors, !0), notifyAboutOrdinary.length) {
                let html, href;
                if (1 === notifyAboutOrdinary.length) {
                    const comment = notifyAboutOrdinary[0];
                    if (href = mw.util.getUrl("".concat(cd.g.CURRENT_PAGE).concat(comment.anchor ? "#".concat(comment.anchor) : "")), 
                    comment.toMe) {
                        const formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "", where = comment.watchedSectionHeadline ? " " + cd.s("notification-part-insection", comment.watchedSectionHeadline) : " " + cd.s("notification-part-onthispage");
                        html = cd.s("notification-toyou", comment.author.name, comment.author, where, href, formsDataWillNotBeLost);
                    } else {
                        const formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "";
                        html = cd.s("notification-insection", comment.author.name, comment.author, comment.watchedSectionHeadline, href, formsDataWillNotBeLost);
                    }
                } else {
                    const section = notifyAboutOrdinary.every(comment => comment.watchedSectionHeadline === notifyAboutOrdinary[0].watchedSectionHeadline) ? notifyAboutOrdinary[0].watchedSectionHeadline : void 0;
                    href = mw.util.getUrl("".concat(cd.g.CURRENT_PAGE).concat(section ? "#".concat(section) : ""));
                    const where = section ? " " + cd.s("notification-part-insection", section) : " " + cd.s("notification-part-onthispage");
                    let mayBeInterestingString = cd.s("notification-newcomments-maybeinteresting");
                    mayBeInterestingString.startsWith(",") || (mayBeInterestingString = " " + mayBeInterestingString);
                    const mayBeInteresting = section && thisPageWatchedSections.includes(section) ? "" : mayBeInterestingString, formsDataWillNotBeLost = cd.commentForms.some(commentForm => commentForm.isAltered()) ? " " + mw.msg("parentheses", cd.s("notification-formdata")) : "";
                    html = cd.s("notification-newcomments", notifyAboutOrdinary.length, where, mayBeInteresting, href, formsDataWillNotBeLost);
                }
                navPanel.closeAllNotifications();
                const $body = animateLink(html, "cd-notification-reloadPage", e => {
                    e.preventDefault(), reloadPage({
                        commentAnchor: notifyAboutOrdinary[0].anchor
                    }), notification.close();
                }), notification = mw.notification.notify($body);
                navPanel_notifications.push({
                    notification: notification,
                    comments: notifyAboutOrdinary
                });
            }
            if (!document.hasFocus() && "granted" === Notification.permission && notifyAboutDesktop.length) {
                let body, tag = "convenient-discussions-";
                const comment = notifyAboutDesktop[0];
                if (1 === notifyAboutDesktop.length) if (tag += comment.anchor, comment.toMe) {
                    const where = comment.sectionHeadline ? " " + cd.s("notification-part-insection", comment.sectionHeadline) : "";
                    body = cd.s("notification-toyou-desktop", comment.author.name, comment.author, where, cd.g.CURRENT_PAGE);
                } else body = cd.s("notification-insection-desktop", comment.author.name, comment.author, comment.sectionHeadline, cd.g.CURRENT_PAGE); else {
                    const section = notifyAboutDesktop.every(comment => comment.watchedSectionHeadline === notifyAboutDesktop[0].watchedSectionHeadline) ? notifyAboutDesktop[0].watchedSectionHeadline : void 0, where = section ? " " + cd.s("notification-part-insection", section) : "";
                    let mayBeInterestingString = cd.s("notification-newcomments-maybeinteresting");
                    mayBeInterestingString.startsWith(",") || (mayBeInterestingString = " " + mayBeInterestingString);
                    const mayBeInteresting = section && thisPageWatchedSections.includes(section) ? "" : mayBeInterestingString;
                    body = cd.s("notification-newcomments-desktop", notifyAboutDesktop.length, where, cd.g.CURRENT_PAGE, mayBeInteresting), 
                    tag += notifyAboutDesktop[notifyAboutDesktop.length - 1].anchor;
                }
                new Notification(mw.config.get("wgSiteName"), {
                    body: body,
                    tag: tag
                }).onclick = () => {
                    parent.focus(), window.focus(), reloadPage({
                        commentAnchor: comment.anchor
                    });
                };
            }
            notifiedAbout.push(...notifyAbout);
        }))).apply(this, arguments);
    }
    function navPanel_processComments(_x3) {
        return _processComments.apply(this, arguments);
    }
    function _processComments() {
        return (_processComments = asyncToGenerator_default()((function*(comments) {
            let thisPageWatchedSections;
            try {
                ({thisPageWatchedSections: thisPageWatchedSections} = (yield getWatchedSections(!0)) || {});
            } catch (e) {
                console.warn("Couldn't load the settings from the server.");
            }
            comments.forEach(comment => {
                comment.author = userRegistry.getUser(comment.authorName), delete comment.authorName;
            });
            const newComments = comments.filter(comment => comment.anchor && !Comment_Comment.getCommentByAnchor(comment.anchor)), interestingNewComments = newComments.filter(comment => {
                if (comment.own || cd.settings.notificationsBlacklist.includes(comment.author.name) || !thisPageWatchedSections) return !1;
                if (comment.toMe) return !0;
                const sections = Section_Section.getSectionsByHeadline(comment.sectionHeadline);
                for (const section of sections) {
                    const watchedAncestor = section.getWatchedAncestor(!0);
                    if (watchedAncestor) return comment.watchedSectionHeadline = watchedAncestor.headline, 
                    !0;
                }
            });
            interestingNewComments[0] ? relevantNewCommentAnchor = interestingNewComments[0].anchor : newComments[0] && (relevantNewCommentAnchor = newComments[0].anchor), 
            updateRefreshButton(newComments, interestingNewComments.length), updatePageTitle(newComments.length, interestingNewComments.length), 
            addSectionNotifications(newComments), sendNotifications(interestingNewComments, thisPageWatchedSections);
        }))).apply(this, arguments);
    }
    function onMessageFromWorker(_x4) {
        return _onMessageFromWorker.apply(this, arguments);
    }
    function _onMessageFromWorker() {
        return (_onMessageFromWorker = asyncToGenerator_default()((function*(e) {
            const message = e.data;
            if ("wakeUp" === message.type && checkForNewComments(), "parse" === message.type) {
                const {comments: comments} = message;
                navPanel_processComments(comments);
            }
        }))).apply(this, arguments);
    }
    const navPanel = {
        mouseOverNavPanel: !1,
        mount() {
            var _this = this;
            return asyncToGenerator_default()((function*() {
                $navPanel = $("<div>").attr("id", "cd-navPanel").on("mouseenter", () => {
                    _this.isMouseOver = !0;
                }).on("mouseleave", () => {
                    _this.isMouseOver = !1;
                }).appendTo(document.body), $refreshButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-refreshButton").attr("title", "".concat(cd.s("navpanel-refresh"), " (R)")).on("click", () => {
                    _this.refreshClick();
                }).appendTo($navPanel), $previousButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-previousButton").attr("title", "".concat(cd.s("navpanel-previous"), " (W)")).on("click", () => {
                    _this.goToPreviousNewComment();
                }).hide().appendTo($navPanel), $nextButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-nextButton").attr("title", "".concat(cd.s("navpanel-next"), " (S)")).on("click", () => {
                    _this.goToNextNewComment();
                }).hide().appendTo($navPanel), $firstUnseenButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-firstUnseenButton").attr("title", "".concat(cd.s("navpanel-firstunseen"), " (F)")).on("click", () => {
                    _this.goToFirstUnseenComment();
                }).hide().appendTo($navPanel), $commentFormButton = $("<div>").addClass("cd-navPanel-button").attr("id", "cd-navPanel-commentFormButton").attr("title", cd.s("navpanel-commentform")).on("click", () => {
                    _this.goToNextCommentForm();
                }).hide().appendTo($navPanel), cd.g.worker && (cd.g.worker.onmessage = onMessageFromWorker, 
                setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL));
            }))();
        },
        isMounted: () => Boolean($navPanel),
        processVisits(visitsRequest, memorizedUnseenCommentAnchors = []) {
            var _this2 = this;
            return asyncToGenerator_default()((function*() {
                let visits, thisPageVisits;
                try {
                    ({visits: visits, thisPageVisits: thisPageVisits} = yield visitsRequest);
                } catch (e) {
                    return void console.warn("Couldn't load the settings from the server.", e);
                }
                cd.g.visits = visits, cd.g.thisPageVisits = thisPageVisits;
                const currentUnixTime = Math.floor(Date.now() / 1e3);
                for (let i = thisPageVisits.length - 1; i >= 0; i--) if (thisPageVisits[i] < currentUnixTime - 60 * cd.g.HIGHLIGHT_NEW_COMMENTS_INTERVAL) {
                    thisPageVisits.splice(0, i);
                    break;
                }
                if (thisPageVisits.length) {
                    const newComments = cd.comments.filter(comment => {
                        if (comment.newness = null, !comment.date) return !1;
                        const isUnseen = memorizedUnseenCommentAnchors.some(anchor => anchor === comment.anchor), commentUnixTime = Math.floor(comment.date.getTime() / 1e3);
                        return commentUnixTime > thisPageVisits[0] && (comment.newness = commentUnixTime > thisPageVisits[thisPageVisits.length - 1] && !comment.own || isUnseen ? "unseen" : "new", 
                        !0);
                    }), floatingRects = newComments.length ? cd.g.specialElements.floating.map(el => el.getBoundingClientRect()) : void 0;
                    newComments.forEach(comment => {
                        comment.configureLayers(!1, floatingRects);
                    }), newComments.forEach(comment => {
                        comment.addLayers();
                    });
                }
                thisPageVisits.push(String(currentUnixTime)), setVisits(visits), _this2.fill(), 
                _this2.registerSeenComments(), mw.hook("convenientDiscussions.newCommentsMarked").fire(cd);
            }))();
        },
        reset() {
            lastFirstTimeSeenCommentId = null, newRevisions = [], notifiedAbout = [], relevantNewCommentAnchor = null, 
            removeAlarmViaWorker(), setAlarmViaWorker(1e3 * cd.g.CHECK_FOR_NEW_COMMENTS_INTERVAL), 
            isBackgroundCheckArranged = !1, $refreshButton.empty().attr("title", "".concat(cd.s("navpanel-refresh"), " (R)")), 
            $previousButton.hide(), $nextButton.hide(), $firstUnseenButton.hide(), $commentFormButton.hide();
        },
        fill() {
            newCount = cd.comments.filter(comment => comment.newness).length, unseenCount = cd.comments.filter(comment => "unseen" === comment.newness).length, 
            newCount && ($nextButton.show(), $previousButton.show(), unseenCount && ($firstUnseenButton.show(), 
            this.updateFirstUnseenButton()));
        },
        areAllCommentsSeen: () => 0 === unseenCount,
        decrementUnseenCommentCount() {
            unseenCount--;
        },
        updateFirstUnseenButton() {
            unseenCount ? $firstUnseenButton.text(unseenCount) : $firstUnseenButton.hide();
        },
        refreshClick() {
            reloadPage({
                commentAnchor: relevantNewCommentAnchor
            });
        },
        closeAllNotifications() {
            navPanel_notifications.forEach(notification => {
                notification.notification.$notification.hide(), notification.notification.close();
            }), navPanel_notifications = [];
        },
        goToPreviousNewComment() {
            if (cd.g.autoScrollInProgress) return;
            const foundComment = Comment_Comment.findInViewport("backward");
            if (!foundComment) return;
            const comment = reorderArray(cd.comments, foundComment.id, !0).find(comment => comment.newness && !1 === comment.isInViewport(!0));
            comment && comment.$elements.cdScrollTo("center", !0, () => {
                comment.registerSeen("backward", !0), this.updateFirstUnseenButton();
            });
        },
        goToNextNewComment() {
            if (cd.g.autoScrollInProgress) return;
            const foundComment = Comment_Comment.findInViewport("forward");
            if (!foundComment) return;
            const comment = reorderArray(cd.comments, foundComment.id).find(comment => comment.newness && !1 === comment.isInViewport(!0));
            comment && comment.$elements.cdScrollTo("center", !0, () => {
                comment.registerSeen("forward", !0), this.updateFirstUnseenButton();
            });
        },
        goToFirstUnseenComment() {
            if (!cd.g.autoScrollInProgress && unseenCount) {
                const comment = cd.comments.slice(lastFirstTimeSeenCommentId || 0).find(comment => "unseen" === comment.newness);
                comment && (comment.$elements.cdScrollTo("center", !0, () => {
                    comment.registerSeen("forward", !0), this.updateFirstUnseenButton();
                }), lastFirstTimeSeenCommentId = comment.id);
            }
        },
        goToNextCommentForm() {
            const commentForm = cd.commentForms.filter(commentForm => !commentForm.$element.cdIsInViewport(!0)).sort((commentForm1, commentForm2) => {
                const top1 = commentForm1.$element.get(0).getBoundingClientRect().top, top2 = commentForm2.$element.get(0).getBoundingClientRect().top;
                return top2 > 0 && top1 < 0 || top1 > top2 ? 1 : top1 > 0 && top2 < 0 || top2 > top1 ? -1 : 0;
            })[0];
            commentForm && (commentForm.$element.cdScrollIntoView("center"), commentForm.commentInput.focus());
        },
        registerSeenComments() {
            !unseenCount || cd.g.dontHandleScroll || cd.g.autoScrollInProgress || (cd.g.dontHandleScroll = !0, 
            setTimeout(() => {
                cd.g.dontHandleScroll = !1;
                const foundComment = Comment_Comment.findInViewport();
                if (!foundComment) return;
                const registerSeenIfInViewport = comment => {
                    const isInViewport = comment.isInViewport(!0);
                    if (isInViewport) comment.registerSeen(); else if (!1 === isInViewport) return !0;
                };
                cd.comments.slice(0, foundComment.id).reverse().some(registerSeenIfInViewport), 
                cd.comments.slice(foundComment.id).some(registerSeenIfInViewport), this.updateFirstUnseenButton();
            }, 300));
        },
        updateCommentFormButton() {
            cd.g.autoScrollInProgress || (cd.commentForms.some(commentForm => !commentForm.$element.cdIsInViewport(!0)) ? $commentFormButton.show() : $commentFormButton.hide());
        }
    };
    var js_navPanel = navPanel;
    const beforeUnloadHandlers = {};
    function windowResizeHandler() {
        commentLayers.redrawIfNecessary(!0), js_navPanel.isMounted() && js_navPanel.updateCommentFormButton(), 
        cd.commentForms.forEach(commentForm => {
            commentForm.adjustLabels();
        });
    }
    function addPreventUnloadCondition(name, condition) {
        beforeUnloadHandlers[name] = e => {
            if (condition()) return e.preventDefault(), e.returnValue = "", "";
        }, $(window).on("beforeunload", beforeUnloadHandlers[name]);
    }
    function removePreventUnloadCondition(name) {
        beforeUnloadHandlers[name] && $(window).off("beforeunload", beforeUnloadHandlers[name]);
    }
    function globalKeyDownHandler(e) {
        if (!cd.util.isPageOverlayOn()) {
            if (e.ctrlKey && !e.shiftKey && e.altKey && 81 === e.keyCode || !e.ctrlKey && !e.shiftKey && !e.altKey && 81 === e.keyCode && !isInputFocused()) {
                e.preventDefault();
                const commentForm = CommentForm_CommentForm.getLastActiveCommentForm();
                commentForm && commentForm.quote(!e.ctrlKey);
            }
            js_navPanel.isMounted() && (e.ctrlKey || e.shiftKey || e.altKey || 82 !== e.keyCode || isInputFocused() || js_navPanel.refreshClick(), 
            e.ctrlKey || e.shiftKey || e.altKey || 87 !== e.keyCode || isInputFocused() || js_navPanel.goToPreviousNewComment(), 
            e.ctrlKey || e.shiftKey || e.altKey || 83 !== e.keyCode || isInputFocused() || js_navPanel.goToNextNewComment(), 
            e.ctrlKey || e.shiftKey || e.altKey || 70 !== e.keyCode || isInputFocused() || js_navPanel.goToFirstUnseenComment());
        }
    }
    function highlightFocused(e) {
        if (cd.util.isPageOverlayOn() || cd.g.dontHandleScroll || cd.g.autoScrollInProgress) return;
        const contentLeft = cd.g.rootElement.getBoundingClientRect().left;
        e.pageX < contentLeft - cd.g.COMMENT_UNDERLAY_SIDE_MARGIN ? commentLayers.underlays.filter(underlay => underlay.classList.contains("cd-commentUnderlay-focused")).forEach(underlay => {
            underlay.cdTarget.unhighlightFocused();
        }) : cd.comments.filter(comment => comment.$underlay).forEach(comment => {
            const underlay = comment.$underlay.get(0);
            if (!underlay.classList.contains("cd-commentUnderlay")) return;
            const top = Number(underlay.style.top.replace("px", "")), left = Number(underlay.style.left.replace("px", "")), width = Number(underlay.style.width.replace("px", "")), height = Number(underlay.style.height.replace("px", "")), layersContainerOffset = comment.getLayersContainerOffset();
            !js_navPanel.isMouseOver && e.pageY >= top + layersContainerOffset.top && e.pageY <= top + height + layersContainerOffset.top && e.pageX >= left + layersContainerOffset.left && e.pageX <= left + width + layersContainerOffset.left ? underlay.classList.contains("cd-commentUnderlay-focused") || underlay.cdTarget.highlightFocused() : underlay.classList.contains("cd-commentUnderlay-focused") && underlay.cdTarget.unhighlightFocused();
        });
    }
    function checkboxField({value: value, selected: selected, label: label, help: help, tabIndex: tabIndex, title: title}) {
        const checkbox = new OO.ui.CheckboxInputWidget({
            value: value,
            selected: selected,
            tabIndex: tabIndex
        });
        return [ new OO.ui.FieldLayout(checkbox, {
            label: label,
            align: "inline",
            help: help,
            helpInline: !0,
            title: title
        }), checkbox ];
    }
    function radioField({label: label, selected: selected, help: help, options: options}) {
        const items = options.map(config => new OO.ui.RadioOptionWidget(config)), select = new OO.ui.RadioSelectWidget({
            items: items
        }), field = new OO.ui.FieldLayout(select, {
            label: label,
            align: "top",
            help: help,
            helpInline: !0
        });
        return select.selectItemByData(selected), [ field, select, ...items ];
    }
    var html_entity_decode = __webpack_require__(8), html_entity_decode_default = __webpack_require__.n(html_entity_decode);
    function hideHtmlComments(code) {
        return code.replace(/(<!--)([^]*?)(-->)/g, (s, m1, m2, m3) => m1 + " ".repeat(m2.length) + m3);
    }
    function findFirstTimestamp(code) {
        const signatures = extractSignatures(code);
        return signatures.length ? signatures[0].timestamp : null;
    }
    function removeWikiMarkup(code) {
        return code.replace(/<!--[^]*?-->/g, "").replace(/\[\[:?(?:[^|[\]<>\n]+\|)?(.+?)\]\]/g, "$1").replace(/\{\{:?(?:[^|{}<>\n]+)(?:\|(.+?))?\}\}/g, "$1").replace(/\[https?:\/\/[^[\]<>"\n ]+ *([^\]]*)\]/g, "$1").replace(/'''(.+?)'''/g, "$1").replace(/''(.+?)''/g, "$1").replace(/<br ?\/?>/g, " ").replace(/<\w+(?: [\w ]+?=[^<>]+?| ?\/?)>/g, "").replace(/<\/\w+ ?>/g, "").replace(/ {2,}/g, " ").trim();
    }
    function normalizeCode(text) {
        return text.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&#91;/g, "[").replace(/&#93;/g, "]").replace(/&#123;/g, "{").replace(/&#124;/g, "|").replace(/&#125;/g, "}").replace(/\s+/g, " ");
    }
    function encodeWikilink(link) {
        return link.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\[/g, "&#91;").replace(/\]/g, "&#93;").replace(/\{/g, "&#123;").replace(/\|/g, "&#124;").replace(/\}/g, "&#125;").replace(/\s+/g, " ");
    }
    function extractSignatures(code, generateCommentAnchors) {
        const adjustedCode = hideHtmlComments(code).replace(cd.g.QUOTE_REGEXP, (s, m1, m2, m3) => m1 + " ".repeat(m2.length) + m3).replace(cd.g.COMMENT_ANTIPATTERNS_REGEXP, s => " ".repeat(s.length)), timestampRegexp = new RegExp("^((.*)(".concat(cd.g.TIMESTAMP_REGEXP.source, ")(?:\\}\\}|</small>)?).*(?:\n*|$)"), "igm"), signatureRegexp = new RegExp("^((.*)(".concat(cd.g.CAPTURE_USER_NAME_PATTERN, ".{1,").concat(250, "}((").concat(cd.g.TIMESTAMP_REGEXP.source, ")(?:\\}\\}|</small>)?)).*)(?:\n*|$)"), "igm"), authorLinkRegexp = new RegExp(cd.g.CAPTURE_USER_NAME_PATTERN, "ig");
        let timestampMatch, signatures = [];
        for (;timestampMatch = timestampRegexp.exec(adjustedCode); ) {
            const line = timestampMatch[0];
            signatureRegexp.lastIndex = 0;
            const authorTimestampMatch = signatureRegexp.exec(line);
            let author, timestamp, signatureStartIndex, signatureEndIndex, nextCommentStartIndex, dirtySignature;
            if (authorTimestampMatch) {
                let authorLinkMatch;
                author = userRegistry.getUser(decodeHtmlEntities(authorTimestampMatch[4])), timestamp = authorTimestampMatch[7], 
                signatureStartIndex = timestampMatch.index + authorTimestampMatch[2].length, signatureEndIndex = timestampMatch.index + authorTimestampMatch[1].length, 
                nextCommentStartIndex = timestampMatch.index + authorTimestampMatch[0].length, dirtySignature = authorTimestampMatch[3], 
                authorLinkRegexp.lastIndex = 0;
                const commentEndingStartIndex = Math.max(0, authorTimestampMatch[0].length - authorTimestampMatch[6].length - 250), commentEnding = authorTimestampMatch[0].slice(commentEndingStartIndex);
                for (;authorLinkMatch = authorLinkRegexp.exec(commentEnding); ) {
                    if (authorLinkMatch[2]) continue;
                    if (userRegistry.getUser(decodeHtmlEntities(authorLinkMatch[1])) === author) {
                        signatureStartIndex = timestampMatch.index + commentEndingStartIndex + authorLinkMatch.index, 
                        dirtySignature = code.slice(signatureStartIndex, signatureEndIndex);
                        break;
                    }
                }
            } else timestamp = timestampMatch[3], signatureStartIndex = timestampMatch.index + timestampMatch[2].length, 
            signatureEndIndex = timestampMatch.index + timestampMatch[1].length, nextCommentStartIndex = timestampMatch.index + timestampMatch[0].length, 
            dirtySignature = timestamp;
            signatures.push({
                author: author,
                timestamp: timestamp,
                signatureStartIndex: signatureStartIndex,
                signatureEndIndex: signatureEndIndex,
                dirtySignature: dirtySignature,
                nextCommentStartIndex: nextCommentStartIndex
            });
        }
        if (cd.g.UNSIGNED_TEMPLATES_REGEXP) {
            let match;
            for (;match = cd.g.UNSIGNED_TEMPLATES_REGEXP.exec(adjustedCode); ) {
                let author, timestamp;
                cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[2]) ? (timestamp = match[2], author = match[3]) : cd.g.TIMESTAMP_REGEXP_NO_TIMEZONE.test(match[3]) ? (timestamp = match[3], 
                author = match[2]) : author = match[2], author = userRegistry.getUser(decodeHtmlEntities(author)), 
                signatures.push({
                    author: author,
                    timestamp: timestamp,
                    signatureStartIndex: match.index,
                    signatureEndIndex: match.index + match[1].length,
                    dirtySignature: match[1],
                    nextCommentStartIndex: match.index + match[0].length
                });
            }
            signatures.sort((sig1, sig2) => sig1.signatureStartIndex > sig2.signatureStartIndex ? 1 : -1);
        }
        return signatures.forEach((sig, i) => {
            sig.commentStartIndex = 0 === i ? 0 : signatures[i - 1].nextCommentStartIndex;
        }), signatures = signatures.filter(sig => sig.author), generateCommentAnchors && resetCommentAnchors(), 
        signatures.forEach((sig, i) => {
            const {date: date} = sig.timestamp && parseTimestamp(sig.timestamp) || {};
            if (sig.id = i, sig.date = date, delete sig.nextCommentStartIndex, generateCommentAnchors) {
                const anchor = date ? generateCommentAnchor(date, sig.author.name, !0) : void 0;
                sig.anchor = anchor, registerCommentAnchor(anchor);
            }
        }), signatures;
    }
    function decodeHtmlEntities(s) {
        if (-1 === s.indexOf("&")) return s;
        {
            let result = s;
            return -1 !== result.indexOf("&#38;amp;") && (result = result.replace(/&#38;amp;/g, "&amp;amp;")), 
            result = -1 === result.indexOf("&#") ? result : result.replace(/&#(\d+);/g, (s, m1) => String.fromCharCode(m1)), 
            -1 === result.indexOf("&") ? result : html_entity_decode_default()(result);
        }
    }
    function hideSensitiveCode(code, callback) {
        const hidden = [], hide = (re, isTable) => {
            code = code.replace(re, s => (callback && callback(isTable), (isTable ? "\x03" : "\x01") + hidden.push(s) + (isTable ? "\x04" : "\x02")));
        };
        return (() => {
            hide(/\{\{([^{]\{?)+?\}\}/g);
            let pos = 0;
            const stack = [];
            let template, left, right;
            for (;left = code.indexOf("{{", pos), right = code.indexOf("}}", pos), -1 !== left || -1 !== right || stack.length; ) if (-1 !== left && (left < right || -1 === right)) stack.push(left), 
            pos = left + 2; else {
                if (left = stack.pop(), void 0 === left) {
                    if (-1 === right) {
                        pos += 2;
                        continue;
                    }
                    left = 0;
                }
                -1 === right && (right = code.length), right += 2, template = code.substring(left, right), 
                code = code.substring(0, left) + "\x01" + hidden.push(template) + "\x02" + code.substr(right), 
                pos = right - template.length;
            }
        })(), hide(/^\{\|[^]*?\n\|\}/gm, !0), ((...args) => {
            args.forEach(arg => {
                hide(new RegExp("<".concat(arg, "( [^>]+)?>[\\s\\S]+?<\\/").concat(arg, ">"), "gi"));
            });
        })("nowiki", "pre", "source", "syntaxhighlight"), {
            code: code,
            hidden: hidden
        };
    }
    function unhideSensitiveCode(code, hidden) {
        for (;code.match(/(?:\x01|\x03)\d+(?:\x02|\x04)/); ) code = code.replace(/(?:\x01|\x03)(\d+)(?:\x02|\x04)/g, (s, num) => hidden[num - 1]);
        return code;
    }
    function createWindowManager() {
        cd.g.windowManager || (cd.g.windowManager = new OO.ui.WindowManager, $(document.body).append(cd.g.windowManager.$element));
    }
    function getSelectedItemData(select) {
        const selectedItem = select.findSelectedItem();
        return selectedItem && selectedItem.getData();
    }
    function isUnsaved(dialog) {
        const saveButton = dialog.actions.get({
            actions: "save"
        })[0];
        return saveButton && !saveButton.isDisabled();
    }
    function confirmCloseDialog(_x, _x2) {
        return _confirmCloseDialog.apply(this, arguments);
    }
    function _confirmCloseDialog() {
        return (_confirmCloseDialog = asyncToGenerator_default()((function*(dialog, dialogCode) {
            isUnsaved(dialog) && !(yield confirmDestructive("".concat(dialogCode, "-close-confirm"))) || (dialog.close({
                action: "close"
            }), removePreventUnloadCondition("dialog"));
        }))).apply(this, arguments);
    }
    function handleError(dialog, e, messageName, recoverable) {
        e instanceof CdError ? dialog.showErrors(new OO.ui.Error(cd.s(messageName), {
            recoverable: recoverable
        })) : dialog.showErrors(new OO.ui.Error(cd.s("error-javascript"), {
            recoverable: !1
        })), console.warn(e), recoverable || dialog.$errors.find(".oo-ui-buttonElement-button").on("click", () => {
            dialog.close();
        }), dialog.actions.setAbilities({
            close: !0
        }), cd.g.windowManager.updateWindowSize(dialog), dialog.popPending();
    }
    function settingsDialog() {
        return _settingsDialog.apply(this, arguments);
    }
    function _settingsDialog() {
        return (_settingsDialog = asyncToGenerator_default()((function*() {
            if (cd.util.isPageOverlayOn()) return;
            function SettingsDialog() {
                SettingsDialog.parent.call(this);
            }
            OO.inheritClass(SettingsDialog, OO.ui.ProcessDialog), SettingsDialog.static.name = "settingsDialog", 
            SettingsDialog.static.title = cd.s("sd-title"), SettingsDialog.static.actions = [ {
                action: "close",
                modes: [ "settings", "reload", "dataRemoved" ],
                flags: [ "safe", "close" ],
                disabled: !0
            }, {
                action: "save",
                modes: [ "settings" ],
                label: cd.s("sd-save"),
                flags: [ "primary", "progressive" ],
                disabled: !0
            }, {
                action: "reset",
                modes: [ "settings" ],
                label: cd.s("sd-reset"),
                flags: [ "destructive" ],
                disabled: !0
            }, {
                action: "reload",
                modes: [ "reload" ],
                label: cd.s("sd-reload"),
                flags: [ "primary", "progressive" ]
            } ], SettingsDialog.static.size = "large", SettingsDialog.prototype.getBodyHeight = function() {
                return 600;
            }, SettingsDialog.prototype.initialize = asyncToGenerator_default()((function*() {
                SettingsDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
                const $loading = $("<div>").text(cd.s("loading-ellipsis"));
                this.loadingPanel = new OO.ui.PanelLayout({
                    padded: !0,
                    expanded: !1
                }), this.loadingPanel.$element.append($loading), this.settingsPanel = new OO.ui.PanelLayout({
                    padded: !1,
                    expanded: !0
                });
                const $settingsSaved = $("<p>").html(cd.s("sd-saved"));
                this.reloadPanel = new OO.ui.PanelLayout({
                    padded: !0,
                    expanded: !1
                }), this.reloadPanel.$element.append($settingsSaved);
                const $dataRemoved = $("<p>").html(cd.s("sd-dataremoved"));
                this.dataRemovedPanel = new OO.ui.PanelLayout({
                    padded: !0,
                    expanded: !1
                }), this.dataRemovedPanel.$element.append($dataRemoved), this.stackLayout = new OO.ui.StackLayout({
                    items: [ this.loadingPanel, this.settingsPanel, this.reloadPanel, this.dataRemovedPanel ]
                }), this.$body.append(this.stackLayout.$element);
            })), SettingsDialog.prototype.getSetupProcess = function(data) {
                return SettingsDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
                    this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("settings");
                });
            }, SettingsDialog.prototype.getReadyProcess = function(data) {
                var _this = this;
                return SettingsDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
                    let settings;
                    try {
                        [settings] = yield Promise.all(preparationRequests);
                    } catch (e) {
                        return void handleError(_this, e, "error-settings-load", !1);
                    }
                    _this.settings = Object.assign({}, cd.settings, settings), cd.g.settingsForm = _this, 
                    _this.renderForm(_this.settings), _this.stackLayout.setItem(_this.settingsPanel), 
                    _this.bookletLayout.setPage("general"), _this.actions.setAbilities({
                        close: !0
                    }), cd.g.windowManager.updateWindowSize(_this), _this.popPending(), addPreventUnloadCondition("dialog", () => isUnsaved(dialog));
                })));
            }, SettingsDialog.prototype.getActionProcess = function(action) {
                var _this2 = this;
                return "save" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                    _this2.pushPending();
                    const settings = {};
                    settings.allowEditOthersComments = _this2.allowEditOthersCommentsCheckbox.isSelected(), 
                    settings.alwaysExpandSettings = _this2.alwaysExpandSettingsCheckbox.isSelected(), 
                    settings.autopreview = _this2.autopreviewCheckbox.isSelected(), settings.desktopNotifications = getSelectedItemData(_this2.desktopNotificationsSelect) || "unknown", 
                    settings.defaultCommentLinkType = getSelectedItemData(_this2.defaultCommentLinkTypeSelect), 
                    settings.defaultSectionLinkType = getSelectedItemData(_this2.defaultSectionLinkTypeSelect), 
                    settings.highlightOwnComments = _this2.highlightOwnCommentsCheckbox.isSelected(), 
                    settings.insertButtons = _this2.processInsertButtons(), settings.mySignature = _this2.mySignatureInput.getValue(), 
                    settings.notifications = getSelectedItemData(_this2.notificationsSelect), settings.notificationsBlacklist = _this2.notificationsBlacklistMultiselect.getValue(), 
                    settings.showToolbar = _this2.showToolbarCheckbox.isSelected(), settings.watchSectionOnReply = _this2.watchSectionOnReplyCheckbox.isSelected(), 
                    settings.insertButtonsChanged = JSON.stringify(settings.insertButtons) !== JSON.stringify(cd.defaultSettings.insertButtons);
                    try {
                        yield setSettings(settings);
                    } catch (e) {
                        return void handleError(_this2, e, "error-settings-save", !0);
                    }
                    _this2.stackLayout.setItem(_this2.reloadPanel), _this2.actions.setMode("reload"), 
                    _this2.popPending();
                }))) : "reload" === action ? new OO.ui.Process(() => {
                    this.close({
                        action: action
                    }), location.reload();
                }) : "close" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                    yield confirmCloseDialog(_this2, "sd");
                }))) : "reset" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                    (yield OO.ui.confirm(cd.s("sd-reset-confirm"))) && _this2.renderForm(cd.defaultSettings);
                }))) : SettingsDialog.parent.prototype.getActionProcess.call(this, action);
            }, SettingsDialog.prototype.renderForm = function(settings) {
                [this.allowEditOthersCommentsField, this.allowEditOthersCommentsCheckbox] = checkboxField({
                    value: "allowEditOthersComments",
                    selected: settings.allowEditOthersComments,
                    label: cd.s("sd-alloweditotherscomments")
                }), [this.alwaysExpandSettingsField, this.alwaysExpandSettingsCheckbox] = checkboxField({
                    value: "alwaysExpandSettings",
                    selected: settings.alwaysExpandSettings,
                    label: cd.s("sd-alwaysexpandsettings")
                }), [this.autopreviewField, this.autopreviewCheckbox] = checkboxField({
                    value: "autopreview",
                    selected: settings.autopreview,
                    label: cd.s("sd-autopreview")
                }), [this.desktopNotificationsField, this.desktopNotificationsSelect, this.desktopNotificationsRadioAll, this.desktopNotificationsRadioNone, this.desktopNotificationsRadioToMe] = radioField({
                    options: [ {
                        label: cd.s("sd-desktopnotifications-radio-all"),
                        data: "all"
                    }, {
                        label: cd.s("sd-desktopnotifications-radio-tome"),
                        data: "toMe"
                    }, {
                        label: cd.s("sd-desktopnotifications-radio-none"),
                        data: "none"
                    } ],
                    selected: settings.desktopNotifications,
                    label: cd.s("sd-desktopnotifications"),
                    help: cd.s("sd-desktopnotifications-help", location.host)
                });
                let defaultCommentLinkTypeHelp = cd.s("sd-defaultcommentlinktype-help");
                "diff" === cd.config.defaultCommentLinkType && (defaultCommentLinkTypeHelp += " ".concat(cd.s("sd-defaultcommentlinktype-help-notdifflinks"))), 
                [this.defaultCommentLinkTypeField, this.defaultCommentLinkTypeSelect, this.defaultCommentLinkTypeRadioWikilink, this.defaultCommentLinkTypeRadioLink] = radioField({
                    options: [ {
                        label: cd.s("sd-defaultcommentlinktype-radio-diff"),
                        data: "diff"
                    }, {
                        label: cd.s("sd-defaultcommentlinktype-radio-wikilink"),
                        data: "wikilink"
                    }, {
                        label: cd.s("sd-defaultcommentlinktype-radio-link"),
                        data: "link"
                    } ],
                    selected: settings.defaultCommentLinkType,
                    label: cd.s("sd-defaultcommentlinktype", cd.s("cm-copylink")),
                    help: defaultCommentLinkTypeHelp
                }), [this.defaultSectionLinkTypeField, this.defaultSectionLinkTypeSelect, this.defaultSectionLinkTypeRadioWikilink, this.defaultSectionLinkTypeRadioLink] = radioField({
                    options: [ {
                        label: cd.s("sd-defaultsectionlinktype-radio-wikilink"),
                        data: "wikilink"
                    }, {
                        label: cd.s("sd-defaultsectionlinktype-radio-link"),
                        data: "link"
                    } ],
                    selected: settings.defaultSectionLinkType,
                    label: cd.s("sd-defaultsectionlinktype"),
                    help: cd.s("sd-defaultsectionlinktype-help")
                }), [this.highlightOwnCommentsField, this.highlightOwnCommentsCheckbox] = checkboxField({
                    value: "highlightOwnComments",
                    selected: settings.highlightOwnComments,
                    label: cd.s("sd-highlightowncomments")
                });
                const insertButtonsSelected = settings.insertButtons.map(button => Array.isArray(button) ? button.join(";") : button);
                function GeneralPageLayout(name, config) {
                    GeneralPageLayout.super.call(this, name, config), this.$element.append(dialog.highlightOwnCommentsField.$element, dialog.allowEditOthersCommentsField.$element, dialog.defaultCommentLinkTypeField.$element, dialog.defaultSectionLinkTypeField.$element);
                }
                function CommentFormPageLayout(name, config) {
                    CommentFormPageLayout.super.call(this, name, config), this.$element.append(dialog.autopreviewField.$element, dialog.watchSectionOnReplyField.$element, dialog.showToolbarField.$element, dialog.alwaysExpandSettingsField.$element, dialog.insertButtonsField.$element, dialog.mySignatureField.$element);
                }
                function NotificationsPageLayout(name, config) {
                    NotificationsPageLayout.super.call(this, name, config), this.$element.append(dialog.notificationsField.$element, dialog.desktopNotificationsField.$element, dialog.notificationsBlacklistField.$element);
                }
                function RemoveDataPageLayout(name, config) {
                    RemoveDataPageLayout.super.call(this, name, config), this.$element.append(dialog.removeDataField.$element);
                }
                this.insertButtonsMultiselect = new OO.ui.TagMultiselectWidget({
                    placeholder: cd.s("sd-insertbuttons-multiselect-placeholder"),
                    allowArbitrary: !0,
                    inputPosition: "outline",
                    tagLimit: 100,
                    selected: insertButtonsSelected
                }), this.insertButtonsField = new OO.ui.FieldLayout(this.insertButtonsMultiselect, {
                    label: cd.s("sd-insertbuttons"),
                    align: "top",
                    help: cd.util.wrapInElement(cd.s("sd-insertbuttons-help")),
                    helpInline: !0
                }), this.mySignatureInput = new OO.ui.TextInputWidget({
                    value: settings.mySignature,
                    maxlength: 100,
                    validate: /~~\~~/
                }), this.mySignatureField = new OO.ui.FieldLayout(this.mySignatureInput, {
                    label: cd.s("sd-mysignature"),
                    align: "top",
                    help: cd.util.wrapInElement(cd.s("sd-mysignature-help", cd.g.SIGN_CODE)),
                    helpInline: !0
                }), [this.notificationsField, this.notificationsSelect, this.notificationsRadioAll, this.notificationsRadioNone, this.notificationsRadioToMe] = radioField({
                    options: [ {
                        label: cd.s("sd-notifications-radio-all"),
                        data: "all"
                    }, {
                        label: cd.s("sd-notifications-radio-tome"),
                        data: "toMe"
                    }, {
                        label: cd.s("sd-notifications-radio-none"),
                        data: "none"
                    } ],
                    selected: settings.notifications,
                    label: cd.s("sd-notifications"),
                    help: cd.s("sd-notifications-help")
                }), this.notificationsBlacklistMultiselect = new mw.widgets.UsersMultiselectWidget({
                    placeholder: cd.s("sd-notificationsblacklist-multiselect-placeholder"),
                    tagLimit: 100,
                    selected: settings.notificationsBlacklist
                }), this.notificationsBlacklistField = new OO.ui.FieldLayout(this.notificationsBlacklistMultiselect, {
                    label: cd.s("sd-notificationsblacklist"),
                    align: "top"
                }), [this.showToolbarField, this.showToolbarCheckbox] = checkboxField({
                    value: "showToolbar",
                    selected: settings.showToolbar,
                    label: cd.s("sd-showtoolbar")
                }), [this.watchSectionOnReplyField, this.watchSectionOnReplyCheckbox] = checkboxField({
                    value: "watchSectionOnReply",
                    selected: settings.watchSectionOnReply,
                    label: cd.s("sd-watchsectiononreply")
                }), this.insertButtonsMultiselect.connect(this, {
                    change: "updateActionsAvailability"
                }), this.allowEditOthersCommentsCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.alwaysExpandSettingsCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.autopreviewCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.desktopNotificationsSelect.connect(this, {
                    select: "updateActionsAvailability",
                    choose: "changeDesktopNotifications"
                }), this.defaultCommentLinkTypeSelect.connect(this, {
                    select: "updateActionsAvailability"
                }), this.defaultSectionLinkTypeSelect.connect(this, {
                    select: "updateActionsAvailability"
                }), this.highlightOwnCommentsCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.mySignatureInput.connect(this, {
                    change: "updateActionsAvailability"
                }), this.notificationsSelect.connect(this, {
                    select: "updateActionsAvailability"
                }), this.notificationsBlacklistMultiselect.connect(this, {
                    change: "updateActionsAvailability"
                }), this.showToolbarCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.watchSectionOnReplyCheckbox.connect(this, {
                    change: "updateActionsAvailability"
                }), this.removeDataButton = new OO.ui.ButtonInputWidget({
                    label: cd.s("sd-removedata"),
                    flags: [ "destructive" ]
                }), this.removeDataButton.connect(this, {
                    click: "removeData"
                }), this.removeDataField = new OO.ui.FieldLayout(this.removeDataButton, {
                    label: cd.s("sd-removedata-description"),
                    align: "top",
                    help: cd.util.wrapInElement(cd.s("sd-removedata-help")),
                    helpInline: !0
                }), OO.inheritClass(GeneralPageLayout, OO.ui.PageLayout), GeneralPageLayout.prototype.setupOutlineItem = function(outlineItem) {
                    GeneralPageLayout.super.prototype.setupOutlineItem.call(this, outlineItem), this.outlineItem.setLabel(cd.s("sd-page-talkpage"));
                }, OO.inheritClass(CommentFormPageLayout, OO.ui.PageLayout), CommentFormPageLayout.prototype.setupOutlineItem = function() {
                    this.outlineItem.setLabel(cd.s("sd-page-commentform"));
                }, OO.inheritClass(NotificationsPageLayout, OO.ui.PageLayout), NotificationsPageLayout.prototype.setupOutlineItem = function() {
                    this.outlineItem.setLabel(cd.s("sd-page-notifications"));
                }, OO.inheritClass(RemoveDataPageLayout, OO.ui.PageLayout), RemoveDataPageLayout.prototype.setupOutlineItem = function() {
                    this.outlineItem.setLabel(cd.s("sd-page-dataremoval"));
                };
                const generalPage = new GeneralPageLayout("general"), commentFormPage = new CommentFormPageLayout("commentForm"), notificationsPage = new NotificationsPageLayout("notifications"), removeDataPage = new RemoveDataPageLayout("removeData");
                this.bookletLayout = new OO.ui.BookletLayout({
                    outlined: !0
                }), this.bookletLayout.addPages([ generalPage, commentFormPage, notificationsPage, removeDataPage ]), 
                this.settingsPanel.$element.empty().append(this.bookletLayout.$element), this.updateActionsAvailability();
            }, SettingsDialog.prototype.processInsertButtons = function() {
                return this.insertButtonsMultiselect.getValue().map(value => {
                    let [, text, displayedText] = value.match(/^(.*?[^\\])(?:;(.+))?$/) || [];
                    if (text && text.replace(/^ +$/, "")) return [ text, displayedText ].filter(defined);
                }).filter(defined);
            }, SettingsDialog.prototype.updateActionsAvailability = asyncToGenerator_default()((function*() {
                const insertButtonsJson = JSON.stringify(this.processInsertButtons());
                this.insertButtonsMultiselect.toggleValid(insertButtonsJson.length <= 1e4);
                const notificationsBlacklistJson = JSON.stringify(this.notificationsBlacklistMultiselect.getValue());
                this.notificationsBlacklistMultiselect.toggleValid(notificationsBlacklistJson.length <= 1e4);
                const desktopNotifications = getSelectedItemData(this.desktopNotificationsSelect) || "unknown", defaultCommentLinkType = getSelectedItemData(this.defaultCommentLinkTypeSelect), defaultSectionLinkType = getSelectedItemData(this.defaultSectionLinkTypeSelect), notifications = getSelectedItemData(this.notificationsSelect);
                let save = insertButtonsJson !== JSON.stringify(this.settings.insertButtons) || this.allowEditOthersCommentsCheckbox.isSelected() !== this.settings.allowEditOthersComments || this.alwaysExpandSettingsCheckbox.isSelected() !== this.settings.alwaysExpandSettings || this.autopreviewCheckbox.isSelected() !== this.settings.autopreview || desktopNotifications !== this.settings.desktopNotifications || defaultCommentLinkType !== this.settings.defaultCommentLinkType || defaultSectionLinkType !== this.settings.defaultSectionLinkType || this.highlightOwnCommentsCheckbox.isSelected() !== this.settings.highlightOwnComments || this.mySignatureInput.getValue() !== this.settings.mySignature || notifications !== this.settings.notifications || notificationsBlacklistJson !== JSON.stringify(this.settings.notificationsBlacklist) || this.showToolbarCheckbox.isSelected() !== this.settings.showToolbar || this.watchSectionOnReplyCheckbox.isSelected() !== this.settings.watchSectionOnReply;
                save = save && this.insertButtonsMultiselect.isValid();
                try {
                    yield this.mySignatureInput.getValidity();
                } catch (e) {
                    save = !1;
                }
                const reset = this.allowEditOthersCommentsCheckbox.isSelected() !== cd.defaultSettings.allowEditOthersComments || this.alwaysExpandSettingsCheckbox.isSelected() !== cd.defaultSettings.alwaysExpandSettings || this.autopreviewCheckbox.isSelected() !== cd.defaultSettings.autopreview || desktopNotifications !== cd.defaultSettings.desktopNotifications || defaultCommentLinkType !== cd.defaultSettings.defaultCommentLinkType || defaultSectionLinkType !== cd.defaultSettings.defaultSectionLinkType || this.highlightOwnCommentsCheckbox.isSelected() !== cd.defaultSettings.highlightOwnComments || insertButtonsJson !== JSON.stringify(cd.defaultSettings.insertButtons) || this.mySignatureInput.getValue() !== cd.defaultSettings.mySignature || notifications !== cd.defaultSettings.notifications || notificationsBlacklistJson !== JSON.stringify(cd.defaultSettings.notificationsBlacklist) || this.showToolbarCheckbox.isSelected() !== cd.defaultSettings.showToolbar || this.watchSectionOnReplyCheckbox.isSelected() !== cd.defaultSettings.watchSectionOnReply;
                this.actions.setAbilities({
                    save: save,
                    reset: reset
                });
            })), SettingsDialog.prototype.changeDesktopNotifications = function(option) {
                "none" !== option.data && "granted" !== Notification.permission && (OO.ui.alert(cd.s("dn-grantpermission")), 
                Notification.requestPermission(permission => {
                    "granted" !== permission && this.desktopNotificationsSelect.selectItemByData("none");
                }));
            }, SettingsDialog.prototype.removeData = asyncToGenerator_default()((function*() {
                if (yield confirmDestructive("sd-removedata-confirm", {
                    size: "medium"
                })) {
                    try {
                        this.pushPending();
                        const resp = yield cd.g.api.postWithToken("csrf", {
                            action: "options",
                            change: "".concat(cd.g.SETTINGS_OPTION_FULL_NAME, "|").concat(cd.g.VISITS_OPTION_FULL_NAME, "|").concat(cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME)
                        }).catch(handleApiReject);
                        if (!resp || "success" !== resp.options) throw new CdError({
                            type: "api",
                            code: "noSuccess"
                        });
                    } catch (e) {
                        return void handleError(this, e, "sd-error-removedata", !1);
                    }
                    localStorage.removeItem("convenientDiscussions-commentForms"), this.stackLayout.setItem(this.dataRemovedPanel), 
                    this.actions.setMode("dataRemoved"), this.popPending();
                }
            }));
            const preparationRequests = [ getSettings(), mw.loader.using("mediawiki.widgets.UsersMultiselectWidget") ];
            createWindowManager();
            const dialog = new SettingsDialog;
            cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
                cd.g.windowManager.clearWindows();
            });
        }))).apply(this, arguments);
    }
    function editWatchedSections() {
        return _editWatchedSections.apply(this, arguments);
    }
    function _editWatchedSections() {
        return (_editWatchedSections = asyncToGenerator_default()((function*() {
            if (cd.util.isPageOverlayOn()) return;
            function EditWatchedSectionsDialog() {
                EditWatchedSectionsDialog.parent.call(this);
            }
            OO.inheritClass(EditWatchedSectionsDialog, OO.ui.ProcessDialog), EditWatchedSectionsDialog.static.name = "editWatchedSectionsDialog", 
            EditWatchedSectionsDialog.static.title = cd.s("ewsd-title"), EditWatchedSectionsDialog.static.actions = [ {
                action: "close",
                modes: [ "edit", "saved" ],
                flags: [ "safe", "close" ],
                disabled: !0
            }, {
                action: "save",
                modes: [ "edit" ],
                label: cd.s("ewsd-save"),
                flags: [ "primary", "progressive" ],
                disabled: !0
            } ], EditWatchedSectionsDialog.static.size = "large", EditWatchedSectionsDialog.prototype.getBodyHeight = function() {
                return this.$errorItems ? this.$errors[0].scrollHeight : this.$body[0].scrollHeight;
            }, EditWatchedSectionsDialog.prototype.initialize = asyncToGenerator_default()((function*() {
                EditWatchedSectionsDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
                const $loading = $("<div>").text(cd.s("loading-ellipsis"));
                this.loadingPanel = new OO.ui.PanelLayout({
                    padded: !0,
                    expanded: !1
                }), this.loadingPanel.$element.append($loading), this.sectionsPanel = new OO.ui.PanelLayout({
                    padded: !1,
                    expanded: !1
                });
                const $watchedSectionsSaved = $("<p>").html(cd.s("ewsd-saved"));
                this.savedPanel = new OO.ui.PanelLayout({
                    padded: !0,
                    expanded: !1
                }), this.savedPanel.$element.append($watchedSectionsSaved), this.stackLayout = new OO.ui.StackLayout({
                    items: [ this.loadingPanel, this.sectionsPanel, this.savedPanel ]
                }), this.$body.append(this.stackLayout.$element);
            })), EditWatchedSectionsDialog.prototype.getSetupProcess = function(data) {
                return EditWatchedSectionsDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
                    this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("edit");
                });
            }, EditWatchedSectionsDialog.prototype.getReadyProcess = function(data) {
                var _this3 = this;
                return EditWatchedSectionsDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
                    let watchedSections, pages;
                    try {
                        ({watchedSections: watchedSections} = yield watchedSectionsRequest), pages = yield getPageTitles(Object.keys(watchedSections).filter(pageId => watchedSections[pageId].length));
                    } catch (e) {
                        return void handleError(_this3, e, "ewsd-error-processing", !1);
                    }
                    pages.sort((page1, page2) => page1.title > page2.title ? 1 : -1);
                    const value = pages.filter(page => page.title).map(page => watchedSections[page.pageid].map(section => "".concat(page.title, "#").concat(section)).join("\n")).join("\n");
                    _this3.input = new OO.ui.MultilineTextInputWidget({
                        value: value,
                        rows: 30,
                        classes: [ "cd-editWatchedSections-input" ]
                    }), _this3.input.on("change", newValue => {
                        _this3.actions.setAbilities({
                            save: newValue !== value
                        });
                    }), _this3.sectionsPanel.$element.append(_this3.input.$element), _this3.stackLayout.setItem(_this3.sectionsPanel), 
                    _this3.input.focus(), _this3.actions.setAbilities({
                        close: !0
                    }), dialog.$body.css("overflow", "hidden"), setTimeout(() => {
                        dialog.$body.css("overflow", "");
                    }, 500), cd.g.windowManager.updateWindowSize(_this3), _this3.popPending(), addPreventUnloadCondition("dialog", () => isUnsaved(dialog));
                })));
            }, EditWatchedSectionsDialog.prototype.getActionProcess = function(action) {
                var _this4 = this;
                return "save" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                    _this4.pushPending();
                    const sections = {}, pageTitles = [];
                    let normalized, redirects, pages;
                    _this4.input.getValue().split("\n").forEach(section => {
                        const match = section.match(/^(.+?)#(.+)$/);
                        if (match) {
                            const pageTitle = match[1].trim(), sectionTitle = match[2].trim();
                            sections[pageTitle] || (sections[pageTitle] = [], pageTitles.push(pageTitle)), sections[pageTitle].push(sectionTitle);
                        }
                    });
                    try {
                        ({normalized: normalized, redirects: redirects, pages: pages} = (yield getPageIds(pageTitles)) || {});
                    } catch (e) {
                        return void handleError(_this4, e, "ewsd-error-processing", !0);
                    }
                    normalized.concat(redirects).filter(page => sections[page.from]).forEach(page => {
                        sections[page.to] || (sections[page.to] = []), sections[page.to].push(...sections[page.from]), 
                        delete sections[page.from];
                    });
                    const titleToId = {};
                    pages.filter(page => void 0 !== page.pageid).forEach(page => {
                        titleToId[page.title] = page.pageid;
                    });
                    const newWatchedSections = {};
                    Object.keys(sections).filter(key => titleToId[key]).forEach(key => {
                        newWatchedSections[titleToId[key]] = removeDuplicates(sections[key]);
                    });
                    try {
                        yield setWatchedSections(newWatchedSections);
                    } catch (e) {
                        if (e instanceof CdError) {
                            const {type: type, code: code, apiData: apiData} = e.data;
                            "internal" === type && "sizeLimit" === code ? _this4.showErrors(new OO.ui.Error(cd.s("ewsd-error-maxsize"), {
                                recoverable: !1
                            })) : _this4.showErrors(new OO.ui.Error(cd.s("ewsd-error-processing"), {
                                recoverable: !0
                            })), console.warn(type, code, apiData);
                        } else _this4.showErrors(new OO.ui.Error(cd.s("error-javascript"), {
                            recoverable: !1
                        })), console.warn(e);
                        return void _this4.popPending();
                    }
                    _this4.stackLayout.setItem(_this4.savedPanel), _this4.actions.setMode("saved"), 
                    _this4.popPending();
                }))) : "close" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                    yield confirmCloseDialog(_this4, "ewsd");
                }))) : EditWatchedSectionsDialog.parent.prototype.getActionProcess.call(this, action);
            };
            const watchedSectionsRequest = getWatchedSections();
            createWindowManager();
            const dialog = new EditWatchedSectionsDialog;
            cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
                cd.g.windowManager.clearWindows();
            });
        }))).apply(this, arguments);
    }
    function copyLinkToClipboardAndNotify(text) {
        const $textarea = $("<textarea>").val(text).appendTo(document.body).select(), successful = document.execCommand("copy");
        $textarea.remove(), successful ? text.startsWith("http") ? mw.notify(cd.util.wrapInElement(cd.s("copylink-copied-url", text))) : mw.notify(cd.s("copylink-copied")) : mw.notify(cd.s("copylink-error"), {
            type: "error"
        });
    }
    function copyLink(_x3, _x4, _x5) {
        return _copyLink.apply(this, arguments);
    }
    function _copyLink() {
        return (_copyLink = asyncToGenerator_default()((function*(object, chooseLink, finallyCallback) {
            if (object.linkBeingCopied) return void (finallyCallback && finallyCallback());
            object.linkBeingCopied = !0;
            let anchor = object instanceof Comment_Comment ? object.anchor : underlinesToSpaces(object.anchor);
            anchor = encodeWikilink(anchor);
            const wikilink = "[[".concat(cd.g.CURRENT_PAGE, "#").concat(anchor, "]]");
            let decodedCurrentPageUrl;
            try {
                decodedCurrentPageUrl = decodeURI(mw.util.getUrl(cd.g.CURRENT_PAGE));
            } catch (e) {
                return console.error(e), object.linkBeingCopied = !1, void (finallyCallback && finallyCallback());
            }
            const anchorWithUnderlines = spacesToUnderlines(anchor), url = "https:".concat(mw.config.get("wgServer")).concat(decodedCurrentPageUrl, "#").concat(anchorWithUnderlines);
            if (chooseLink) {
                let diffInput, diffField, wikilinkFieldHelp;
                if (object instanceof Comment_Comment) {
                    let diffLink, value;
                    try {
                        value = diffLink = yield object.getDiffLink(object);
                    } catch (e) {
                        if (e instanceof CdError) {
                            const {type: type} = e.data;
                            "api" === type ? value = cd.s("cld-diff-error") : "network" === type && (value = cd.s("cld-diff-error-network"));
                        } else value = cd.s("cld-diff-error-unknown");
                    }
                    diffInput = new OO.ui.TextInputWidget({
                        value: value || cd.s("cld-diff-error"),
                        disabled: !diffLink
                    });
                    const diffButton = new OO.ui.ButtonWidget({
                        label: cd.s("cld-copy"),
                        icon: "articles",
                        disabled: !diffLink
                    });
                    diffButton.on("click", () => {
                        copyLinkToClipboardAndNotify(diffInput.getValue()), dialog.close();
                    }), diffField = new OO.ui.ActionFieldLayout(diffInput, diffButton, {
                        align: "top",
                        label: cd.s("cld-diff")
                    });
                }
                object instanceof Comment_Comment && "diff" === cd.config.defaultCommentLinkType && (wikilinkFieldHelp = cd.s("cld-wikilink-help-comment"));
                const wikilinkInput = new OO.ui.TextInputWidget({
                    value: wikilink
                }), wikilinkButton = new OO.ui.ButtonWidget({
                    label: cd.s("cld-copy"),
                    icon: "articles"
                });
                wikilinkButton.on("click", () => {
                    copyLinkToClipboardAndNotify(wikilinkInput.getValue()), dialog.close();
                });
                const wikilinkField = new OO.ui.ActionFieldLayout(wikilinkInput, wikilinkButton, {
                    align: "top",
                    label: cd.s("cld-wikilink"),
                    help: wikilinkFieldHelp,
                    helpInline: !0
                }), anchorWikilinkInput = new OO.ui.TextInputWidget({
                    value: "[[#".concat(anchor, "]]")
                }), anchorWikilinkButton = new OO.ui.ButtonWidget({
                    label: cd.s("cld-copy"),
                    icon: "articles"
                });
                anchorWikilinkButton.on("click", () => {
                    copyLinkToClipboardAndNotify(anchorWikilinkInput.getValue()), dialog.close();
                });
                const anchorWikilinkField = new OO.ui.ActionFieldLayout(anchorWikilinkInput, anchorWikilinkButton, {
                    align: "top",
                    label: cd.s("cld-currentpagewikilink")
                }), linkInput = new OO.ui.TextInputWidget({
                    value: url
                }), linkButton = new OO.ui.ButtonWidget({
                    label: cd.s("cld-copy"),
                    icon: "articles"
                });
                linkButton.on("click", () => {
                    copyLinkToClipboardAndNotify(linkInput.getValue()), dialog.close();
                });
                const linkField = new OO.ui.ActionFieldLayout(linkInput, linkButton, {
                    align: "top",
                    label: cd.s("cld-link")
                }), $message = $("<div>").append(diffField && diffField.$element).append(wikilinkField.$element).append(anchorWikilinkField.$element).append(linkField.$element), dialog = new OO.ui.MessageDialog;
                cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog, {
                    message: $message,
                    actions: [ {
                        label: cd.s("cld-close"),
                        action: "close"
                    } ],
                    size: "large"
                }).closed.then(() => {
                    cd.g.windowManager.clearWindows(), object.linkBeingCopied = !1;
                });
            } else {
                let link;
                switch (cd.settings[object instanceof Comment_Comment ? "defaultCommentLinkType" : "defaultSectionLinkType"]) {
                  case "diff":
                    if (!(object instanceof Comment_Comment)) {
                        link = wikilink;
                        break;
                    }
                    try {
                        link = yield object.getDiffLink(object);
                    } catch (e) {
                        let text;
                        if (e instanceof CdError) {
                            const {type: type} = e.data;
                            if ("network" === type) text = cd.s("copylink-error-diffnotfound-network"); else {
                                const url = mw.util.getUrl(this.sourcePage, {
                                    action: "history"
                                });
                                text = cd.util.wrapInElement(cd.s("copylink-error-diffnotfound", url));
                            }
                        } else text = cd.s("copylink-error-diffnotfound-unknown");
                        return mw.notify(text, {
                            type: "error"
                        }), object.linkBeingCopied = !1, void (finallyCallback && finallyCallback());
                    }
                    break;

                  case "link":
                    link = url;
                    break;

                  default:
                    link = wikilink;
                }
                copyLinkToClipboardAndNotify(link), object.linkBeingCopied = !1;
            }
            finallyCallback && finallyCallback();
        }))).apply(this, arguments);
    }
    function rescueCommentFormsContent(content) {
        const text = content.map(data => {
            let text = void 0 !== data.headline ? "".concat(cd.s("cf-headline"), ": ").concat(data.headline, "\n\n") : "";
            return text += "".concat(data.comment, "\n\n").concat(cd.s("cf-summary-placeholder"), ": ").concat(data.summary), 
            text;
        }).join("\n\n----\n"), input = new OO.ui.MultilineTextInputWidget({
            value: text,
            rows: 20
        }), field = new OO.ui.FieldLayout(input, {
            align: "top",
            label: cd.s("rd-intro")
        }), dialog = new OO.ui.MessageDialog;
        cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog, {
            message: field.$element,
            actions: [ {
                label: cd.s("rd-close"),
                action: "close"
            } ],
            size: "large"
        }).closed.then(() => {
            cd.g.windowManager.clearWindows();
        });
    }
    function confirmDialog(_x6) {
        return _confirmDialog.apply(this, arguments);
    }
    function _confirmDialog() {
        return (_confirmDialog = asyncToGenerator_default()((function*(message, options = {}) {
            const defaultOptions = {
                message: message,
                actions: [ {
                    action: "accept",
                    label: OO.ui.deferMsg("ooui-dialog-message-accept"),
                    flags: "primary"
                }, {
                    action: "reject",
                    label: OO.ui.deferMsg("ooui-dialog-message-reject"),
                    flags: "safe"
                } ]
            }, dialog = new OO.ui.MessageDialog;
            cd.g.windowManager.addWindows([ dialog ]);
            const windowInstance = cd.g.windowManager.openWindow(dialog, Object.assign({}, defaultOptions, options)), data = yield windowInstance.closed;
            return cd.g.windowManager.clearWindows(), data && data.action;
        }))).apply(this, arguments);
    }
    function confirmDestructive(messageName, options = {}) {
        const defaultOptions = {
            actions: [ {
                label: cd.s("".concat(messageName, "-yes")),
                action: "accept",
                flags: [ "primary", "destructive" ]
            }, {
                label: cd.s("".concat(messageName, "-no")),
                action: "reject",
                flags: "safe"
            } ]
        };
        return OO.ui.confirm(cd.s(messageName), Object.assign({}, defaultOptions, options));
    }
    function notFound(_x7, _x8) {
        return _notFound.apply(this, arguments);
    }
    function _notFound() {
        return (_notFound = asyncToGenerator_default()((function*(decodedFragment, date) {
            const title = $("<span>").addClass("cd-destructiveText").html(date ? cd.s("deadanchor-comment-title") : cd.s("deadanchor-section-title"));
            let message = date ? cd.s("deadanchor-comment-text") : cd.s("deadanchor-section-text");
            if (!cd.config.pagesWithoutArchivesRegexp || !cd.config.pagesWithoutArchivesRegexp.test(cd.g.CURRENT_PAGE)) {
                if (message += " " + cd.s("deadanchor-searchinarchive"), yield OO.ui.confirm(message, {
                    title: title
                })) {
                    let text;
                    text = date ? cd.util.formatDate(date) : decodedFragment.replace(/_/g, " ").replace(/"/g, "").trim();
                    const archivePrefix = cd.config.getArchivePrefix ? cd.config.getArchivePrefix(mw.config.get("wgTitle")) : mw.config.get("wgTitle"), searchQuery = '"'.concat(text, '" prefix:') + mw.config.get("wgFormattedNamespaces")[cd.g.CURRENT_NAMESPACE_NUMBER] + ":".concat(archivePrefix), url = mw.util.getUrl("Special:Search", {
                        profile: "default",
                        fulltext: "Search",
                        search: searchQuery
                    });
                    location.assign(mw.config.get("wgServer") + url);
                }
            } else OO.ui.alert(message, {
                title: title
            });
        }))).apply(this, arguments);
    }
    class Section_Section extends class {
        constructor(parser, headingElement) {
            if (_parser.set(this, {
                writable: !0,
                value: void 0
            }), classPrivateFieldSet_default()(this, _parser, parser), this.headlineElement = classPrivateFieldGet_default()(this, _parser).context.getElementByClassName(headingElement, "mw-headline"), 
            !this.headlineElement) throw new CdError;
            this.anchor = this.headlineElement.getAttribute("id");
            const classesToFilter = [ "mw-headline-number", ...cd.config.foreignElementsInHeadlinesClasses ], nodes = Array.from(this.headlineElement.childNodes).filter(node => node.nodeType !== Node.ELEMENT_NODE || !Array.from(node.classList).some(name => classesToFilter.includes(name)));
            this.headline = nodes.map(node => node.textContent).join("").trim();
            const levelMatch = headingElement.tagName.match(/^H([2-6])$/);
            this.level = levelMatch && Number(levelMatch[1]);
            const treeWalker = new TreeWalker(cd.g.rootElement, node => ![ "STYLE", "LINK" ].includes(node.tagName) && !node.classList.contains("cd-sectionButtonContainer"), !0, headingElement), elements = [ headingElement ], levelRegexp = new RegExp("^H[1-".concat(this.level, "]$"));
            let firstCommentPart, lastCommentPart, hasSubsections = !1;
            for (;treeWalker.nextSibling() && !levelRegexp.test(treeWalker.currentNode.tagName); ) void 0 === this.lastElementInFirstChunk && /^H[3-6]$/.test(treeWalker.currentNode.tagName) && (hasSubsections = !0, 
            this.lastElementInFirstChunk = elements[elements.length - 1]), elements.push(treeWalker.currentNode);
            if (this.lastElementInFirstChunk = this.lastElementInFirstChunk || elements[elements.length - 1], 
            !elements.length) throw new CdError;
            if (elements[1]) {
                for (treeWalker.currentNode = elements[elements.length - 1]; treeWalker.lastChild(); ) ;
                const lastNode = treeWalker.currentNode;
                treeWalker.currentNode = elements[1];
                do {
                    treeWalker.currentNode.classList.contains("cd-commentPart") && (firstCommentPart = treeWalker.currentNode);
                } while (!firstCommentPart && treeWalker.currentNode !== lastNode && treeWalker.nextNode());
                treeWalker.currentNode = lastNode;
                do {
                    treeWalker.currentNode.classList.contains("cd-commentPart") && (lastCommentPart = treeWalker.currentNode);
                } while (!lastCommentPart && treeWalker.currentNode !== elements[1] && treeWalker.previousNode());
            }
            if (firstCommentPart) {
                const firstCommentPartId = Number(firstCommentPart.getAttribute("data-comment-id")), lastCommentPartId = Number(lastCommentPart.getAttribute("data-comment-id"));
                if (this.comments = cd.comments.slice(firstCommentPartId, lastCommentPartId + 1), 
                hasSubsections) {
                    const endIndex = this.comments.findIndex(comment => !(classPrivateFieldGet_default()(this, _parser).context.follows(this.lastElementInFirstChunk, comment.elements[0]) || this.lastElementInFirstChunk.contains(comment.elements[0])));
                    this.commentsInFirstChunk = this.comments.slice(0, endIndex || 0);
                }
            }
            this.id = cd.sections.length, this.comments = this.comments || [], this.commentsInFirstChunk = this.commentsInFirstChunk || this.comments, 
            this.elements = elements;
        }
    } {
        constructor(parser, headingElement, watchedSectionsRequest) {
            if (super(parser, headingElement), _elementPrototypes.set(this, {
                writable: !0,
                value: void 0
            }), _closingBracketElement.set(this, {
                writable: !0,
                value: void 0
            }), _editSectionElement.set(this, {
                writable: !0,
                value: void 0
            }), _cached$elements.set(this, {
                writable: !0,
                value: void 0
            }), _showAddSubsectionButtonTimeout.set(this, {
                writable: !0,
                value: void 0
            }), _hideAddSubsectionButtonTimeout.set(this, {
                writable: !0,
                value: void 0
            }), classPrivateFieldSet_default()(this, _elementPrototypes, cd.g.SECTION_ELEMENT_PROTOTYPES), 
            this.$headline = $(this.headlineElement), classPrivateFieldSet_default()(this, _editSectionElement, headingElement.querySelector(".mw-editsection")), 
            classPrivateFieldGet_default()(this, _editSectionElement)) {
                classPrivateFieldSet_default()(this, _closingBracketElement, classPrivateFieldGet_default()(this, _editSectionElement).lastElementChild), 
                classPrivateFieldGet_default()(this, _closingBracketElement) && classPrivateFieldGet_default()(this, _closingBracketElement).classList && classPrivateFieldGet_default()(this, _closingBracketElement).classList.contains("mw-editsection-bracket") || classPrivateFieldSet_default()(this, _closingBracketElement, null), 
                this.sourcePage = cd.g.CURRENT_PAGE;
                const editLink = classPrivateFieldGet_default()(this, _editSectionElement).querySelector('a[href*="&action=edit"], a[href*="&veaction=editsource"]');
                if (editLink) {
                    const editLinkUrl = new URL(editLink.href);
                    if (editLinkUrl) {
                        editLinkUrl.searchParams.get("section").startsWith("T-") && (this.sourcePage = underlinesToSpaces(editLinkUrl.searchParams.get("title")));
                    }
                } else console.error("Edit link not found.", this);
                if (this.$heading = $(headingElement), this.frozen = !cd.g.isPageActive || cd.g.specialElements.closedDiscussions.some(el => el.contains(headingElement)), 
                !this.frozen) {
                    classPrivateFieldSet_default()(this, _showAddSubsectionButtonTimeout, void 0), classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, void 0), 
                    this.addAddSubsectionButton();
                    const replyButton = classPrivateFieldGet_default()(this, _elementPrototypes).replyButton.cloneNode(!0);
                    replyButton.firstChild.onclick = () => {
                        this.addReply();
                    };
                    const isVotePlaceholder = "OL" === this.lastElementInFirstChunk.tagName && 1 === this.lastElementInFirstChunk.childElementCount && this.lastElementInFirstChunk.children[0].classList.contains("mw-empty-elt");
                    let tag, createUl = !1;
                    if (this.lastElementInFirstChunk.classList.contains("cd-commentLevel")) {
                        const tagName = this.lastElementInFirstChunk.tagName;
                        "UL" === tagName || "OL" === tagName && (1 === this.lastElementInFirstChunk.querySelectorAll("ol > li").length || this.lastElementInFirstChunk.querySelectorAll("ol > li > .cd-signature").length > 1) ? tag = "li" : "DL" === tagName ? tag = "dd" : (tag = "li", 
                        createUl = !0);
                    } else tag = "li", isVotePlaceholder || (createUl = !0);
                    const replyWrapper = document.createElement(tag);
                    let replyContainer;
                    if (replyWrapper.className = "cd-replyWrapper", replyWrapper.appendChild(replyButton), 
                    createUl) {
                        const replyContainer = document.createElement("ul");
                        replyContainer.className = "cd-commentLevel cd-sectionButtonContainer", replyContainer.appendChild(replyWrapper), 
                        this.lastElementInFirstChunk.parentElement.insertBefore(replyContainer, this.lastElementInFirstChunk.nextElementSibling);
                    } else this.lastElementInFirstChunk.appendChild(replyWrapper);
                    this.$replyButton = $(replyButton), this.$replyButtonLink = $(replyButton.firstChild), 
                    this.$replyWrapper = $(replyWrapper), this.$replyContainer = replyContainer ? $(replyContainer) : void 0, 
                    this.comments.length && this.comments[0].isOpeningSection && this.comments[0].openingSectionOfLevel === this.level && (this.comments[0].own || cd.settings.allowEditOthersComments) && this.comments[0].actionable && this.addMenuItem({
                        label: cd.s("sm-editopeningcomment"),
                        tooltip: cd.s("sm-editopeningcomment-tooltip"),
                        func: () => {
                            this.comments[0].edit();
                        },
                        class: "cd-sectionLink-editOpeningComment"
                    }), this.addMenuItem({
                        label: cd.s("sm-addsubsection"),
                        tooltip: cd.s("sm-addsubsection-tooltip"),
                        func: () => {
                            this.addSubsection();
                        },
                        class: "cd-sectionLink-addSubsection"
                    }), 2 === this.level && this.addMenuItem({
                        label: cd.s("sm-move"),
                        tooltip: cd.s("sm-move-tooltip"),
                        func: () => {
                            this.move();
                        },
                        class: "cd-sectionLink-moveSection"
                    }), watchedSectionsRequest && watchedSectionsRequest.then(({thisPageWatchedSections: thisPageWatchedSections}) => {
                        this.headline && (this.watched = thisPageWatchedSections.includes(this.headline), 
                        this.addMenuItem({
                            label: cd.s("sm-unwatch"),
                            tooltip: cd.s("sm-unwatch-tooltip"),
                            func: () => {
                                this.unwatch();
                            },
                            class: "cd-sectionLink-unwatch",
                            visible: this.watched
                        }), this.addMenuItem({
                            label: cd.s("sm-watch"),
                            tooltip: cd.s("sm-watch-tooltip"),
                            func: () => {
                                this.watch();
                            },
                            class: "cd-sectionLink-watch",
                            visible: !this.watched
                        }));
                        const targetString = "sm-copylink-tooltip-".concat(cd.settings.defaultSectionLinkType.toLowerCase());
                        this.addMenuItem({
                            label: cd.s("sm-copylink"),
                            func: this.copyLink.bind(this),
                            class: "cd-sectionLink-copyLink",
                            tooltip: cd.s("sm-copylink-tooltip", cd.s(targetString)),
                            href: "".concat(mw.util.getUrl(cd.g.CURRENT_PAGE), "#").concat(this.anchor)
                        });
                    }, () => {});
                }
            }
        }
        addAddSubsectionButton() {
            if (2 !== this.level) return;
            const addSubsectionButton = classPrivateFieldGet_default()(this, _elementPrototypes).addSubsectionButton.cloneNode(!0), labelContainer = addSubsectionButton.querySelector(".oo-ui-labelElement-label");
            if (!labelContainer) return;
            labelContainer.innerHTML = "", labelContainer.appendChild(document.createTextNode(cd.s("section-addsubsection-to", this.headline))), 
            addSubsectionButton.firstChild.onclick = () => {
                this.addSubsection();
            };
            const addSubsectionButtonContainer = document.createElement("div");
            addSubsectionButtonContainer.className = "cd-sectionButtonContainer cd-addSubsectionButtonContainer", 
            addSubsectionButtonContainer.style.display = "none", addSubsectionButtonContainer.appendChild(addSubsectionButton);
            const lastElement = this.elements[this.elements.length - 1];
            lastElement.parentElement.insertBefore(addSubsectionButtonContainer, lastElement.nextElementSibling), 
            this.$addSubsectionButtonContainer = $(addSubsectionButtonContainer);
            const deferAddSubsectionButtonHide = () => {
                classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout) || classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, setTimeout(() => {
                    this.$addSubsectionButtonContainer.hide();
                }, 1e3));
            };
            addSubsectionButton.firstChild.onmouseenter = () => {
                clearTimeout(classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout)), 
                classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, null);
            }, addSubsectionButton.firstChild.onmouseleave = () => {
                deferAddSubsectionButtonHide();
            }, this.replyButtonHoverHandler = () => {
                this.addSubsectionForm || (clearTimeout(classPrivateFieldGet_default()(this, _hideAddSubsectionButtonTimeout)), 
                classPrivateFieldSet_default()(this, _hideAddSubsectionButtonTimeout, null), this.showAddSubsectionButtonTimeout || (this.showAddSubsectionButtonTimeout = setTimeout(() => {
                    this.$addSubsectionButtonContainer.show();
                }, 1e3)));
            }, this.replyButtonUnhoverHandler = () => {
                this.addSubsectionForm || (clearTimeout(this.showAddSubsectionButtonTimeout), this.showAddSubsectionButtonTimeout = null, 
                deferAddSubsectionButtonHide());
            };
        }
        addReply(dataToRestore) {
            this.addReplyForm || (this.addReplyForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
                mode: "replyInSection",
                target: this,
                dataToRestore: dataToRestore
            })), this.$replyButton.hide();
            const baseSection = 2 === this.level ? this : this.baseSection;
            baseSection && baseSection.$addSubsectionButtonContainer && (baseSection.$addSubsectionButtonContainer.hide(), 
            clearTimeout(baseSection.showAddSubsectionButtonTimeout), baseSection.showAddSubsectionButtonTimeout = null);
        }
        addSubsection(dataToRestore) {
            this.addSubsectionForm ? (this.addSubsectionForm.$element.cdScrollIntoView("center"), 
            this.addSubsectionForm.headlineInput.focus()) : this.addSubsectionForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
                mode: "addSubsection",
                target: this,
                dataToRestore: dataToRestore,
                scrollIntoView: !0
            }), this.$addSubsectionButtonContainer && this.$addSubsectionButtonContainer.hide();
        }
        move() {
            var _this = this;
            return asyncToGenerator_default()((function*() {
                function MoveSectionDialog() {
                    MoveSectionDialog.parent.call(this);
                }
                OO.inheritClass(MoveSectionDialog, OO.ui.ProcessDialog), MoveSectionDialog.static.name = "moveSectionDialog", 
                MoveSectionDialog.static.title = cd.s("msd-title"), MoveSectionDialog.static.actions = [ {
                    action: "close",
                    modes: [ "move", "reload" ],
                    flags: [ "safe", "close" ],
                    disabled: !0
                }, {
                    action: "move",
                    modes: [ "move" ],
                    label: cd.s("msd-move"),
                    flags: [ "primary", "progressive" ],
                    disabled: !0
                }, {
                    action: "reload",
                    modes: [ "reload" ],
                    label: cd.s("msd-reload"),
                    flags: [ "primary", "progressive" ]
                } ], MoveSectionDialog.prototype.onTitleInputChange = asyncToGenerator_default()((function*() {
                    let move = !0;
                    try {
                        yield this.titleInput.getValidity();
                    } catch (e) {
                        move = !1;
                    }
                    this.actions.setAbilities({
                        move: move
                    });
                })), MoveSectionDialog.prototype.areNewTopicsOnTop = function() {
                    var _ref2 = asyncToGenerator_default()((function*(title, code) {
                        let newTopicsOnTop;
                        cd.config.areNewTopicsOnTop && (newTopicsOnTop = cd.config.areNewTopicsOnTop(title.toText(), code));
                        const adjustedCode = hideHtmlComments(code), sectionHeadingRegexp = /^==[^=].*?==[ \t]*(?:<!--[^]*?-->[ \t]*)*\n/gm;
                        let firstSectionIndex, sectionHeadingMatch, previousDate, higherLowerDifference = 0;
                        for (;(sectionHeadingMatch = sectionHeadingRegexp.exec(adjustedCode)) && (void 0 === newTopicsOnTop || !1 !== newTopicsOnTop && void 0 === firstSectionIndex) && (void 0 === firstSectionIndex && (firstSectionIndex = sectionHeadingMatch.index), 
                        void 0 === newTopicsOnTop); ) {
                            const timestamp = findFirstTimestamp(code.slice(sectionHeadingMatch.index)), {date: date} = timestamp && parseTimestamp(timestamp) || {};
                            date && (previousDate && (higherLowerDifference += date > previousDate ? -1 : 1), 
                            previousDate = date), Math.abs(higherLowerDifference) > 5 && (newTopicsOnTop = higherLowerDifference > 0);
                        }
                        return void 0 === newTopicsOnTop && (newTopicsOnTop = 0 === higherLowerDifference ? !(title.namespace % 2 == 1) : higherLowerDifference > 0), 
                        {
                            newTopicsOnTop: newTopicsOnTop,
                            firstSectionIndex: firstSectionIndex
                        };
                    }));
                    return function(_x, _x2) {
                        return _ref2.apply(this, arguments);
                    };
                }(), MoveSectionDialog.prototype.loadSourcePage = asyncToGenerator_default()((function*() {
                    let page;
                    try {
                        page = yield getLastRevision(section.sourcePage);
                    } catch (e) {
                        if (!(e instanceof CdError)) throw [ cd.s("error-javascript"), !1 ];
                        {
                            const {type: type, code: code} = e.data;
                            if ("api" === type) throw "missing" === code ? [ cd.s("msd-error-sourcepagedeleted"), !0 ] : [ "".concat(cd.s("error-api"), ": ").concat(code, "."), !0 ];
                            if ("network" === type) throw [ cd.s("error-network"), !0 ];
                        }
                    }
                    const code = page.code;
                    try {
                        section.locateInCode(code);
                    } catch (e) {
                        if (e instanceof CdError) {
                            const {code: code} = e.data;
                            let message;
                            throw message = "couldntLocateSection" === code ? cd.s("error-locatesection") : cd.s("error-unknown"), 
                            [ message, !0 ];
                        }
                        throw [ cd.s("error-javascript"), !1 ];
                    }
                    return {
                        code: code,
                        timestamp: page.timestamp,
                        queryTimestamp: page.queryTimestamp,
                        sectionInCode: section.inCode,
                        wikilink: "".concat(section.sourcePage, "#").concat(section.headline)
                    };
                })), MoveSectionDialog.prototype.loadTargetPage = function() {
                    var _ref4 = asyncToGenerator_default()((function*(targetTitle) {
                        let page;
                        try {
                            page = yield getLastRevision(targetTitle);
                        } catch (e) {
                            if (!(e instanceof CdError)) throw [ cd.s("error-javascript"), !1 ];
                            {
                                const {type: type, code: code} = e.data;
                                if ("api" === type) throw "missing" === code ? [ cd.s("msd-error-targetpagedoesntexist"), !0 ] : "invalid" === code ? [ cd.s("msd-error-invalidpagename"), !1 ] : [ "".concat(cd.s("error-api"), ": ").concat(code, "."), !0 ];
                                if ("network" === type) throw [ cd.s("error-network"), !0 ];
                            }
                        }
                        const {code: code, timestamp: timestamp, queryTimestamp: queryTimestamp} = page, title = page.redirectTarget || targetTitle, {newTopicsOnTop: newTopicsOnTop, firstSectionIndex: firstSectionIndex} = this.areNewTopicsOnTop(title, code), wikilink = "".concat(title.toText(), "#").concat(section.headline);
                        return {
                            code: code,
                            timestamp: timestamp,
                            queryTimestamp: queryTimestamp,
                            title: title,
                            newTopicsOnTop: newTopicsOnTop,
                            firstSectionIndex: firstSectionIndex,
                            wikilink: wikilink,
                            sectionUrl: mw.util.getUrl(wikilink)
                        };
                    }));
                    return function(_x3) {
                        return _ref4.apply(this, arguments);
                    };
                }(), MoveSectionDialog.prototype.saveTargetPage = function() {
                    var _ref5 = asyncToGenerator_default()((function*(sourcePage, targetPage) {
                        const endWithTwoNewLines = code => code.replace(/([^\n])\n?$/, "$1\n\n"), targetPageCode = cd.config.getMoveTargetPageCode ? cd.config.getMoveTargetPageCode(sourcePage.wikilink, cd.settings.mySignature) : void 0, targetPageNewSectionCode = endWithTwoNewLines(sourcePage.sectionInCode.code.slice(0, sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex) + (targetPageCode ? targetPageCode + "\n" : "") + sourcePage.sectionInCode.code.slice(sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex));
                        let targetPageNewCode;
                        targetPage.newTopicsOnTop ? (void 0 === targetPage.firstSectionIndex && (targetPage.firstSectionIndex = targetPage.code.length), 
                        targetPageNewCode = endWithTwoNewLines(targetPage.code.slice(0, targetPage.firstSectionIndex)) + targetPageNewSectionCode + targetPage.code.slice(targetPage.firstSectionIndex)) : targetPageNewCode = targetPage.code + "\n\n" + targetPageNewSectionCode;
                        const summaryEnding = this.summaryEndingInput.getValue(), text = cd.s("es-move-from", sourcePage.wikilink) + (summaryEnding ? ": ".concat(summaryEnding) : "");
                        let editTargetPageData;
                        try {
                            editTargetPageData = yield cd.g.api.postWithToken("csrf", {
                                action: "edit",
                                title: targetPage.title.toString(),
                                text: targetPageNewCode,
                                summary: cd.util.buildEditSummary({
                                    text: text,
                                    section: section.headline
                                }),
                                tags: cd.config.tagName,
                                baserevid: targetPage.revisionId,
                                starttimestamp: targetPage.queryTimestamp,
                                formatversion: 2
                            }).catch(handleApiReject);
                        } catch (e) {
                            throw [ cd.s("msd-error-editingtargetpage"), !0 ];
                        }
                        const error = editTargetPageData.error;
                        if (error) throw "editconflict" === error.code ? [ cd.s("msd-error-editconflict"), !0 ] : [ error.code + ": " + error.info, !0 ];
                    }));
                    return function(_x4, _x5) {
                        return _ref5.apply(this, arguments);
                    };
                }(), MoveSectionDialog.prototype.saveSourcePage = function() {
                    var _ref6 = asyncToGenerator_default()((function*(sourcePage, targetPage) {
                        const timestamp = findFirstTimestamp(sourcePage.sectionInCode.code) || cd.g.SIGN_CODE + "~", sourcePageCode = cd.config.getMoveSourcePageCode ? cd.config.getMoveSourcePageCode(targetPage.wikilink, cd.settings.mySignature, timestamp) : void 0, sourcePageNewSectionCode = sourcePageCode ? sourcePage.sectionInCode.code.slice(0, sourcePage.sectionInCode.contentStartIndex - sourcePage.sectionInCode.startIndex) + sourcePageCode + "\n\n" : "", newSourcePageCode = sourcePage.code.slice(0, sourcePage.sectionInCode.startIndex) + sourcePageNewSectionCode + sourcePage.code.slice(sourcePage.sectionInCode.endIndex), summaryEnding = this.summaryEndingInput.getValue(), text = cd.s("es-move-to", targetPage.wikilink) + (summaryEnding ? ": ".concat(summaryEnding) : "");
                        try {
                            yield cd.g.api.postWithToken("csrf", {
                                action: "edit",
                                title: section.sourcePage,
                                text: newSourcePageCode,
                                summary: cd.util.buildEditSummary({
                                    text: text,
                                    section: section.headline
                                }),
                                tags: cd.config.tagName,
                                baserevid: sourcePage.revisionId,
                                starttimestamp: sourcePage.queryTimestamp,
                                formatversion: 2
                            }).catch(handleApiReject);
                        } catch (e) {
                            throw [ cd.s("msd-error-editingsourcepage"), !1 ];
                        }
                    }));
                    return function(_x6, _x7) {
                        return _ref6.apply(this, arguments);
                    };
                }(), MoveSectionDialog.prototype.abort = function(html, recoverable) {
                    const $body = animateLink(html, "cd-message-reloadPage", () => {
                        cd.g.windowManager.clearWindows(), reloadPage();
                    });
                    this.showErrors(new OO.ui.Error($body, {
                        recoverable: recoverable
                    })), recoverable || this.$errors.find(".oo-ui-buttonElement-button").on("click", () => {
                        this.close();
                    }), this.actions.setAbilities({
                        close: !0,
                        move: recoverable
                    }), cd.g.windowManager.updateWindowSize(this), this.popPending();
                }, MoveSectionDialog.prototype.getBodyHeight = function() {
                    return this.$errorItems ? this.$errors[0].scrollHeight : this.$body[0].scrollHeight;
                }, MoveSectionDialog.prototype.initialize = function() {
                    MoveSectionDialog.parent.prototype.initialize.apply(this, arguments), this.pushPending();
                    const $loading = $("<div>").text(cd.s("loading-ellipsis"));
                    this.loadingPanel = new OO.ui.PanelLayout({
                        padded: !0,
                        expanded: !1
                    }), this.loadingPanel.$element.append($loading), this.movePanel = new OO.ui.PanelLayout({
                        padded: !0,
                        expanded: !1
                    }), this.reloadPanel = new OO.ui.PanelLayout({
                        padded: !0,
                        expanded: !1
                    }), this.stackLayout = new OO.ui.StackLayout({
                        items: [ this.loadingPanel, this.movePanel, this.reloadPanel ]
                    }), this.$body.append(this.stackLayout.$element);
                }, MoveSectionDialog.prototype.getSetupProcess = function(data) {
                    return MoveSectionDialog.parent.prototype.getSetupProcess.call(this, data).next(() => {
                        this.stackLayout.setItem(this.loadingPanel), this.actions.setMode("move");
                    });
                }, MoveSectionDialog.prototype.getReadyProcess = function(data) {
                    var _this2 = this;
                    return MoveSectionDialog.parent.prototype.getReadyProcess.call(this, data).next(asyncToGenerator_default()((function*() {
                        let page;
                        try {
                            [page] = yield Promise.all(preparationRequests);
                        } catch (e) {
                            return void _this2.abort(cd.s("cf-error-getpagecode"), !1);
                        }
                        try {
                            section.locateInCode(page.code);
                        } catch (e) {
                            if (e instanceof CdError) {
                                const {data: data} = e.data, message = "couldntLocateSection" === data ? cd.s("error-locatesection") : cd.s("error-unknown");
                                _this2.abort(message, !1);
                            } else _this2.abort(cd.s("error-javascript"), !1);
                            return;
                        }
                        const sectionCode = section.inCode.code;
                        _this2.titleInput = new mw.widgets.TitleInputWidget({
                            $overlay: _this2.$overlay,
                            excludeCurrentPage: !0,
                            validate: () => {
                                let title = _this2.titleInput.getMWTitle();
                                return title && title.toText() !== section.sourcePage && isTalkNamespace(title.namespace);
                            }
                        }), _this2.titleField = new OO.ui.FieldLayout(_this2.titleInput, {
                            label: cd.s("msd-targetpage"),
                            align: "top"
                        }), _this2.titleInput.connect(_this2, {
                            change: "onTitleInputChange"
                        }), _this2.titleInput.connect(_this2, {
                            enter: () => {
                                _this2.actions.get({
                                    actions: "move"
                                })[0].isDisabled() || _this2.executeAction("move");
                            }
                        });
                        let $sectionCodeNote = $("<div>");
                        $("<pre>").text(sectionCode.slice(0, 300) + (sectionCode.length >= 300 ? "..." : "")).appendTo($sectionCodeNote), 
                        $("<p>").css("font-size", "85%").text(cd.s("msd-bottom")).appendTo($sectionCodeNote), 
                        _this2.summaryEndingInput = new OO.ui.TextInputWidget({
                            maxLength: 250
                        }), _this2.summaryEndingField = new OO.ui.FieldLayout(_this2.summaryEndingInput, {
                            label: cd.s("msd-summaryending"),
                            align: "top"
                        }), _this2.movePanel.$element.append(_this2.titleField.$element, $sectionCodeNote, _this2.summaryEndingField.$element), 
                        _this2.stackLayout.setItem(_this2.movePanel), _this2.titleInput.focus(), _this2.actions.setAbilities({
                            close: !0
                        }), dialog.$body.css("overflow", "hidden"), setTimeout(() => {
                            dialog.$body.css("overflow", "");
                        }, 500), cd.g.windowManager.updateWindowSize(_this2), _this2.popPending();
                    })));
                }, MoveSectionDialog.prototype.getActionProcess = function(action) {
                    var _this3 = this;
                    return "move" === action ? new OO.ui.Process(asyncToGenerator_default()((function*() {
                        _this3.pushPending(), _this3.titleInput.$input.blur();
                        const targetPageTitle = _this3.titleInput.getMWTitle();
                        if (!targetPageTitle || targetPageTitle.toText() === section.sourcePage || !isTalkNamespace(targetPageTitle.namespace)) return void _this3.abort(cd.s("msd-error-wrongpage"), !1);
                        let sourcePage, targetPage;
                        try {
                            [sourcePage, targetPage] = yield Promise.all([ _this3.loadSourcePage(), _this3.loadTargetPage(targetPageTitle) ]), 
                            yield _this3.saveTargetPage(sourcePage, targetPage), yield _this3.saveSourcePage(sourcePage, targetPage);
                        } catch (e) {
                            return void _this3.abort(...e);
                        }
                        _this3.reloadPanel.$element.html(cd.s("msd-moved", targetPage.sectionUrl)), _this3.stackLayout.setItem(_this3.reloadPanel), 
                        _this3.actions.setMode("reload"), _this3.popPending();
                    }))) : "reload" === action ? new OO.ui.Process(() => {
                        this.close({
                            action: action
                        }), reloadPage({
                            sectionAnchor: section.anchor
                        });
                    }) : "close" === action ? new OO.ui.Process(() => {
                        this.close();
                    }) : MoveSectionDialog.parent.prototype.getActionProcess.call(this, action);
                };
                const section = _this, preparationRequests = [ getLastRevision(_this.sourcePage), mw.loader.using("mediawiki.widgets") ], dialog = new MoveSectionDialog;
                cd.g.windowManager.addWindows([ dialog ]), cd.g.windowManager.openWindow(dialog).closed.then(() => {
                    cd.g.windowManager.clearWindows();
                });
            }))();
        }
        updateWatchMenuItems() {
            this.watched ? (this.$heading.find(".cd-sectionLink-unwatch").parent().show(), this.$heading.find(".cd-sectionLink-watch").parent().hide()) : (this.$heading.find(".cd-sectionLink-watch").parent().show(), 
            this.$heading.find(".cd-sectionLink-unwatch").parent().hide());
        }
        watch(silent = !1) {
            let $link;
            if (!silent) {
                if ($link = this.$heading.find(".cd-sectionLink-watch"), $link.hasClass("cd-sectionLink-pending")) return;
                $link.addClass("cd-sectionLink-pending");
            }
            Section_Section.watchSection(this.headline, {
                silent: silent,
                successCallback: () => {
                    this.watched = !0, $link && $link.removeClass("cd-sectionLink-pending"), Section_Section.getSectionsByHeadline(this.headline).forEach(section => {
                        section.updateWatchMenuItems();
                    });
                },
                errorCallback: () => {
                    $link && $link.removeClass("cd-sectionLink-pending");
                }
            });
        }
        unwatch(silent = !1) {
            let $link;
            if (!silent) {
                if ($link = this.$heading.find(".cd-sectionLink-unwatch"), $link.hasClass("cd-sectionLink-pending")) return;
                $link.addClass("cd-sectionLink-pending");
            }
            const watchedAncestor = this.getWatchedAncestor();
            Section_Section.unwatchSection(this.headline, {
                silent: silent,
                successCallback: () => {
                    this.watched = !1, $link && $link.removeClass("cd-sectionLink-pending"), Section_Section.getSectionsByHeadline(this.headline).forEach(section => {
                        section.updateWatchMenuItems();
                    });
                },
                errorCallback: () => {
                    $link && $link.removeClass("cd-sectionLink-pending");
                },
                watchedAncestorHeadline: watchedAncestor && watchedAncestor.headline
            });
        }
        copyLink(e) {
            e.preventDefault(), copyLink(this, e.shiftKey);
        }
        locateInCode(pageCode) {
            this.inCode = null;
            const searchInput = {
                firstComment: this.comments[0],
                headline: normalizeCode(this.headline),
                pageCode: pageCode,
                adjustedPageCode: hideHtmlComments(pageCode)
            };
            cd.debug.startTimer("locate section");
            const matches = this.searchInCode(searchInput);
            let bestMatch;
            if (cd.debug.stopTimer("locate section"), matches.forEach(match => {
                (!bestMatch || match.score > bestMatch.score) && (bestMatch = match);
            }), !bestMatch) throw new CdError({
                type: "parse",
                code: "couldntLocateSection"
            });
            this.inCode = bestMatch;
        }
        getWatchedAncestor(includeCurrent) {
            for (let otherSection = includeCurrent ? this : this.parent; otherSection; otherSection = otherSection.parent) if (otherSection.watched) return otherSection;
            return null;
        }
        getCode() {
            var _this4 = this;
            return asyncToGenerator_default()((function*() {
                try {
                    const page = yield getLastRevision(_this4.sourcePage);
                    _this4.locateInCode(page.code);
                } catch (e) {
                    throw e instanceof CdError ? new CdError(Object.assign({}, {
                        message: cd.s("cf-error-getpagecode")
                    }, e.data)) : e;
                }
            }))();
        }
        addMenuItem({label: label, href: href, func: func, class: className, tooltip: tooltip, visible: visible = !0}) {
            if (classPrivateFieldGet_default()(this, _closingBracketElement)) {
                const wrapper = document.createElement("span");
                wrapper.className = "cd-sectionLinkWrapper", visible || (wrapper.style.display = "none");
                const a = document.createElement("a");
                a.textContent = label, href && (a.href = href), func && (a.onclick = func), a.className = "cd-sectionLink", 
                className && (a.className += " " + className), tooltip && (a.title = tooltip), wrapper.appendChild(a), 
                classPrivateFieldGet_default()(this, _editSectionElement).insertBefore(wrapper, classPrivateFieldGet_default()(this, _closingBracketElement));
            }
        }
        get $elements() {
            return void 0 === classPrivateFieldGet_default()(this, _cached$elements) && classPrivateFieldSet_default()(this, _cached$elements, $(this.elements)), 
            classPrivateFieldGet_default()(this, _cached$elements);
        }
        set $elements(value) {
            classPrivateFieldSet_default()(this, _cached$elements, value), this.elements = value.get();
        }
        searchInCode({firstComment: firstComment, headline: headline, pageCode: pageCode, adjustedPageCode: adjustedPageCode}) {
            const sectionHeadingRegexp = /^((=+)(.*?)\2[ \t]*(?:<!--[^]*?-->[ \t]*)*)\n/gm, matches = [], headlines = [];
            let sectionHeadingMatch, sectionIndex = 0;
            for (;sectionHeadingMatch = sectionHeadingRegexp.exec(adjustedPageCode); ) {
                const thisHeadline = normalizeCode(removeWikiMarkup(sectionHeadingMatch[3])), headlineMatched = thisHeadline === headline;
                let numberOfPreviousHeadlinesToCheck = 3;
                const previousHeadlinesInCode = headlines.slice(-numberOfPreviousHeadlinesToCheck).reverse(), previousHeadlinesMatched = cd.sections.slice(Math.max(0, this.id - numberOfPreviousHeadlinesToCheck), this.id).reverse().map(section => section.headline).every((headline, i) => normalizeCode(headline) === previousHeadlinesInCode[i]);
                headlines.push(thisHeadline);
                const sectionIndexMatched = this.id === sectionIndex;
                sectionIndex++;
                const fullHeadingMatch = sectionHeadingMatch[1], equalSigns = sectionHeadingMatch[2], equalSignsPattern = "={1,".concat(equalSigns.length, "}"), codeFromSection = pageCode.slice(sectionHeadingMatch.index), adjustedCodeFromSection = adjustedPageCode.slice(sectionHeadingMatch.index), sectionMatch = adjustedCodeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*?\n)" + equalSignsPattern + "[^=].*?=+[ \t]*(?:\x3c!--[^]*?--\x3e[ \t]*)*\n") || codeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*$)"), firstChunkMatch = adjustedCodeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*?\n)\n*={1,6}[^=].*?=+[ \t]*(?:\x3c!--[^]*?--\x3e[ \t]*)*\n") || codeFromSection.match("(" + mw.util.escapeRegExp(fullHeadingMatch) + "[^]*$)"), code = sectionMatch && codeFromSection.substr(sectionMatch.index, sectionMatch[1].length), firstChunkCode = firstChunkMatch && codeFromSection.substr(firstChunkMatch.index, firstChunkMatch[1].length);
                if (!code || !firstChunkCode) {
                    console.log("Couldn't read the \"".concat(thisHeadline, '" section contents.'));
                    continue;
                }
                const signatures = extractSignatures(code);
                let firstCommentMatched;
                firstCommentMatched = signatures.length ? Boolean(firstComment) && (signatures[0].timestamp === firstComment.timestamp || signatures[0].author === firstComment.author) : !this.comments.length;
                const score = 1 * headlineMatched + 1 * firstCommentMatched + .5 * sectionIndexMatched + .25 * previousHeadlinesMatched;
                if (score <= 1) continue;
                const startIndex = sectionHeadingMatch.index, endIndex = startIndex + code.length, contentStartIndex = sectionHeadingMatch.index + sectionHeadingMatch[0].length, firstChunkEndIndex = startIndex + firstChunkCode.length;
                let firstChunkContentEndIndex = firstChunkEndIndex, contentEndIndex = endIndex;
                if (cd.config.keepInSectionEnding.forEach(regexp => {
                    const firstChunkMatch = firstChunkCode.match(regexp);
                    firstChunkMatch && (firstChunkContentEndIndex -= firstChunkMatch[0].length - 1);
                    const codeMatch = code.match(regexp);
                    codeMatch && (contentEndIndex -= codeMatch[0].length - 1);
                }), !this.comments.length) {
                    const match = firstChunkCode.match(/\n(# *\n+)$/);
                    match && (firstChunkContentEndIndex -= match[1].length);
                }
                if (matches.push({
                    headlineMatched: headlineMatched,
                    firstCommentMatched: firstCommentMatched,
                    sectionIndexMatched: sectionIndexMatched,
                    previousHeadlinesMatched: previousHeadlinesMatched,
                    score: score,
                    startIndex: startIndex,
                    endIndex: endIndex,
                    code: code,
                    contentStartIndex: contentStartIndex,
                    contentEndIndex: contentEndIndex,
                    firstChunkEndIndex: firstChunkEndIndex,
                    firstChunkContentEndIndex: firstChunkContentEndIndex,
                    firstChunkCode: firstChunkCode
                }), 2.75 === score) break;
            }
            return matches;
        }
        static watchSection(headline, {silent: silent = !1, successCallback: successCallback, errorCallback: errorCallback}) {
            return asyncToGenerator_default()((function*() {
                if (!headline) return;
                let watchedSections, thisPageWatchedSections;
                try {
                    ({watchedSections: watchedSections, thisPageWatchedSections: thisPageWatchedSections} = yield getWatchedSections());
                } catch (e) {
                    return mw.notify(cd.s("section-watch-error-load"), {
                        type: "error"
                    }), void (errorCallback && errorCallback());
                }
                thisPageWatchedSections.includes(headline) || thisPageWatchedSections.push(headline);
                try {
                    yield setWatchedSections(watchedSections);
                } catch (e) {
                    if (e instanceof CdError) {
                        const {type: type, code: code} = e.data;
                        if ("internal" === type && "sizeLimit" === code) {
                            const $body = animateLink(cd.s("section-watch-error-maxsize"), "cd-notification-editWatchedSections", e => {
                                e.preventDefault(), editWatchedSections();
                            });
                            mw.notify($body, {
                                type: "error"
                            });
                        } else mw.notify(cd.s("section-watch-error-save"), {
                            type: "error"
                        });
                    } else mw.notify(cd.s("section-watch-error-save"), {
                        type: "error"
                    });
                    return void (errorCallback && errorCallback());
                }
                if (!silent) {
                    let text = cd.s("section-watch-success", headline);
                    $("#ca-watch").length && (text += " ".concat(cd.s("section-watch-pagenotwatched"))), 
                    mw.notify(cd.util.wrapInElement(text));
                }
                successCallback && successCallback();
            }))();
        }
        static unwatchSection(headline, {silent: silent = !1, successCallback: successCallback, errorCallback: errorCallback, watchedAncestorHeadline: watchedAncestorHeadline}) {
            return asyncToGenerator_default()((function*() {
                if (!headline) return;
                let watchedSections, thisPageWatchedSections;
                try {
                    ({watchedSections: watchedSections, thisPageWatchedSections: thisPageWatchedSections} = yield getWatchedSections());
                } catch (e) {
                    return mw.notify(cd.s("section-watch-error-load"), {
                        type: "error"
                    }), void (errorCallback && errorCallback());
                }
                thisPageWatchedSections.includes(headline) && thisPageWatchedSections.splice(thisPageWatchedSections.indexOf(headline), 1), 
                thisPageWatchedSections.length || delete watchedSections[mw.config.get("wgArticleId")];
                try {
                    yield setWatchedSections(watchedSections);
                } catch (e) {
                    return mw.notify(cd.s("section-watch-error-save"), {
                        type: "error"
                    }), void (errorCallback && errorCallback());
                }
                let text = cd.s("section-unwatch-success", headline);
                watchedAncestorHeadline && (text += " ".concat(cd.s("section-unwatch-stillwatched", watchedAncestorHeadline))), 
                silent && !watchedAncestorHeadline || mw.notify(cd.util.wrapInElement(text)), successCallback && successCallback();
            }))();
        }
        static getSectionByAnchor(anchor) {
            return cd.sections && anchor && cd.sections.find(section => section.anchor === anchor) || null;
        }
        static getSectionsByHeadline(headline) {
            return cd.sections.filter(section => section.headline === headline);
        }
        static search({headline: headline, firstCommentAnchor: firstCommentAnchor, index: index}) {
            const matches = [ ...cd.sections.filter(section => section.headline === headline), ...cd.sections.filter(section => section.comments[0] && section.comments[0].anchor === firstCommentAnchor) ];
            cd.sections[index] && matches.push(cd.sections[index]);
            const scores = {};
            matches.forEach(match => {
                scores[match.id] || (scores[match.id] = 0), scores[match.id]++;
            });
            const bestMatchId = Object.keys(scores).reduce((bestMatchId, matchId) => scores[matchId] >= 2 && (null === bestMatchId || scores[matchId] > scores[bestMatchId]) ? matchId : bestMatchId, null);
            return null !== bestMatchId ? cd.sections[bestMatchId] : null;
        }
    }
    var _elementPrototypes = new WeakMap, _closingBracketElement = new WeakMap, _editSectionElement = new WeakMap, _cached$elements = new WeakMap, _showAddSubsectionButtonTimeout = new WeakMap, _hideAddSubsectionButtonTimeout = new WeakMap;
    let commentFormsCounter = 0;
    function lastFocused(commentForm1, commentForm2) {
        const lastFocused1 = commentForm1.lastFocused || new Date(0), lastFocused2 = commentForm2.lastFocused || new Date(0);
        return lastFocused2 > lastFocused1 ? 1 : lastFocused2 < lastFocused1 ? -1 : 0;
    }
    class CommentForm_CommentForm {
        constructor({mode: mode, target: target, $addSectionLink: $addSectionLink, dataToRestore: dataToRestore, scrollIntoView: scrollIntoView, editintro: editintro}) {
            _sectionHeadline.set(this, {
                writable: !0,
                value: void 0
            }), _standardButtonsTotalWidth.set(this, {
                writable: !0,
                value: void 0
            }), _standardSubmitButtonLabel.set(this, {
                writable: !0,
                value: void 0
            }), _shortSubmitButtonLabel.set(this, {
                writable: !0,
                value: void 0
            }), _lastPreviewTimestamp.set(this, {
                writable: !0,
                value: void 0
            }), _previewTimeout.set(this, {
                writable: !0,
                value: void 0
            }), _genderRequestCallbackList.set(this, {
                writable: !0,
                value: void 0
            }), _dontAutopreview.set(this, {
                writable: !0,
                value: void 0
            }), _editingSectionOpeningComment.set(this, {
                writable: !0,
                value: void 0
            }), _headlineInputPurpose.set(this, {
                writable: !0,
                value: void 0
            }), this.mode = mode, this.setTargets(target), this.$addSectionLink = $addSectionLink, 
            this.target instanceof Comment_Comment ? classPrivateFieldSet_default()(this, _sectionHeadline, this.target.section && this.target.section.headline) : this.target instanceof Section_Section && classPrivateFieldSet_default()(this, _sectionHeadline, this.target.headline), 
            this.id = commentFormsCounter++, "edit" !== this.mode || dataToRestore || (this.textLoaded = !1), 
            this.summaryAltered = !!dataToRestore && dataToRestore.summaryAltered, editintro && parseCode("{{".concat(editintro, "}}"), {
                title: cd.g.CURRENT_PAGE
            }).then(result => {
                this.$messageArea.append(result.html).cdAddCloseButton();
            }), this.createContents(dataToRestore), this.addEvents(), this.addToPage(), this.willCommentBeIndented = [ "reply", "replyInSection" ].includes(this.mode), 
            this.operations = [], cd.commentForms.push(this), dataToRestore ? (this.originalComment = dataToRestore.originalComment, 
            this.originalHeadline = dataToRestore.originalHeadline, dataToRestore.lastFocused && (this.lastFocused = new Date(dataToRestore.lastFocused))) : "edit" === this.mode ? (this.pushPending(!0), 
            this.target.getCode(!0).then(({commentText: commentText, headline: headline}) => {
                this.commentInput.setValue(commentText), this.smallCheckbox && this.smallCheckbox.setSelected(this.target.inCode.inSmallFont), 
                this.originalComment = commentText, this.headlineInput && (this.headlineInput.setValue(headline), 
                this.originalHeadline = headline), this.willCommentBeIndented = this.target.inCode.indentationChars, 
                this.popPending(!0), this.textLoaded = !0, saveSession(), this.commentInput.focus();
            }, e => {
                e instanceof CdError ? this.handleError(Object.assign({}, e.data, {
                    retryFunc: this.retryLoad
                })) : this.handleError({
                    type: "javascript",
                    logMessage: e
                });
            })) : (this.originalComment = "", this.headlineInput && (this.originalHeadline = ""), 
            this.target ? this.checkCode() : saveSession(), scrollIntoView && this.$element.cdScrollIntoView("center"), 
            this[this.headlineInput ? "headlineInput" : "commentInput"].focus()), mw.hook("convenientDiscussions.commentFormCreated").fire(this);
        }
        checkCode() {
            if (!this.checkCodeRequest) {
                const deferred = $.Deferred();
                this.checkCodeRequest = deferred.then(() => {
                    saveSession();
                }, e => {
                    e instanceof CdError ? this.handleError(Object.assign({}, e.data)) : this.handleError({
                        type: "javascript",
                        logMessage: e
                    });
                }), this.target.getCode(this).then(() => {
                    deferred.resolve();
                }, e => {
                    deferred.reject(e);
                });
            }
            return this.checkCodeRequest;
        }
        retryLoad() {
            this.$element.hide(), this.destroy(), this.target[CommentForm_CommentForm.modeToProperty(this.mode)]();
        }
        setTargets(target) {
            this.target = target, this.target instanceof Comment_Comment ? this.targetSection = this.target.section : this.target instanceof Section_Section && (this.targetSection = this.target), 
            this.targetPage = this.targetSection ? this.targetSection.sourcePage : cd.g.CURRENT_PAGE, 
            target instanceof Comment_Comment ? this.targetComment = target : target instanceof Section_Section && target.commentsInFirstChunk[0] && target.commentsInFirstChunk[0].isOpeningSection && (this.targetComment = target.commentsInFirstChunk[0]);
        }
        addToolbar() {
            const $toolbarPlaceholder = $("<div>").addClass("cd-toolbarPlaceholder").insertBefore(this.commentInput.$element), modules = [ "ext.wikiEditor" ];
            cd.config.customCommentFormModules.filter(module => !module.checkFunc || module.checkFunc()).forEach(module => {
                modules.push(module.name);
            }), mw.loader.using(modules).then(() => {
                $toolbarPlaceholder.hide();
                const $textarea = this.commentInput.$input;
                $textarea.wikiEditor("addModule", mw.loader.moduleRegistry["ext.wikiEditor"].packageExports["jquery.wikiEditor.toolbar.config.js"]);
                const dialogsConfig = mw.loader.moduleRegistry["ext.wikiEditor"].packageExports["jquery.wikiEditor.dialogs.config.js"];
                dialogsConfig.replaceIcons($textarea), $textarea.wikiEditor("addModule", dialogsConfig.getDefaultConfig()), 
                this.commentInput.$element.find('.tool[rel="redirect"], .tool[rel="signature"], .tool[rel="gallery"], .tool[rel="reference"], .option[rel="heading-2"]').remove(), 
                $textarea.wikiEditor("addToToolbar", {
                    section: "main",
                    groups: {
                        "convenient-discussions": {
                            tools: {
                                quote: {
                                    label: cd.s("cf-quote-tooltip"),
                                    type: "button",
                                    icon: "https://upload.wikimedia.org/wikipedia/commons/c/c0/OOjs_UI_icon_quotes-ltr.svg",
                                    action: {
                                        type: "callback",
                                        execute: () => {
                                            this.quote();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }), this.commentInput.$element.find(".group-convenient-discussions").insertBefore(this.commentInput.$element.find(".section-main .group-insert")), 
                mw.hook("convenientDiscussions.commentFormReady").fire(this);
            });
        }
        addInsertButton(text, displayedText) {
            let [, pre, post] = text.match(/^(.*?(?:^|[^\\]))(?:\+(.*))?$/) || [];
            if (!pre) return;
            post = post || "", displayedText || (displayedText = pre + post);
            const $a = $("<a>").text(displayedText).addClass("cd-insertButtons-item").on("click", e => {
                e.preventDefault(), this.commentInput.$input.textSelection("encapsulateSelection", {
                    pre: pre,
                    peri: "",
                    post: post
                });
            });
            this.$insertButtons.append($a, " ");
        }
        createContents(dataToRestore) {
            this.target ? this.isInNumberedList = this.target instanceof Comment_Comment ? this.target.$elements.last().parent().is("ol") : this.target.$replyWrapper.parent().is("ol") : this.isInNumberedList = !1;
            let tag = "div";
            if ([ "reply", "edit" ].includes(this.mode)) {
                const $lastElementOfTarget = this.target.$elements.last();
                $lastElementOfTarget.is("li") ? this.isInNumberedList && "edit" !== this.mode || (tag = "li") : $lastElementOfTarget.is("dd") ? tag = "dd" : "reply" === this.mode && (tag = "ul");
            }
            if (classPrivateFieldSet_default()(this, _editingSectionOpeningComment, "edit" === this.mode && this.target.isOpeningSection), 
            this.$element = $(document.createElement(tag)).addClass("cd-commentForm").addClass("cd-commentForm-".concat(this.mode)), 
            this.isInNumberedList && this.$element.addClass("cd-commentForm-inNumberedList"), 
            classPrivateFieldGet_default()(this, _editingSectionOpeningComment) && this.$element.addClass("cd-commentForm-sectionOpeningComment"), 
            "addSubsection" === this.mode && this.$element.addClass("cd-commentForm-addSubsection-".concat(this.target.level)), 
            "reply" === this.mode) {
                const $list = "ul" === tag ? this.$element : $("<ul>").appendTo(this.$element);
                this.$innerWrapper = $("<li>").addClass("cd-commentForm-innerWrapper").appendTo($list), 
                $list.addClass("cd-commentLevel");
            } else this.$innerWrapper = $("<div>").addClass("cd-commentForm-innerWrapper").appendTo(this.$element);
            this.$messageArea = $("<div>").addClass("cd-messageArea"), ([ "addSection", "addSubsection" ].includes(this.mode) || classPrivateFieldGet_default()(this, _editingSectionOpeningComment)) && ("addSubsection" === this.mode ? classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-subsection", this.targetSection.headline)) : "edit" === this.mode && this.target.section.level > 2 ? classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-subsection", this.targetSection.parent.headline)) : classPrivateFieldSet_default()(this, _headlineInputPurpose, cd.s("cf-headline-topic")), 
            this.headlineInput = new OO.ui.TextInputWidget({
                value: dataToRestore ? dataToRestore.headline : "",
                placeholder: classPrivateFieldGet_default()(this, _headlineInputPurpose),
                classes: [ "cd-headlineInput" ],
                tabIndex: String(this.id) + "11"
            }));
            let commentInputPlaceholder, rowNumber = this.headlineInput ? 5 : 3;
            if ("firefox" === $.client.profile().name && (rowNumber -= 1), !cd.config.commentInputEmptyPlaceholder) if ("replyInSection" === this.mode || "reply" === this.mode && this.target.isOpeningSection) commentInputPlaceholder = cd.s("cf-comment-placeholder-replytosection", this.targetSection.headline); else if ("reply" === this.mode) {
                const ending = this.formUserName(this.target, {
                    returnUnknown: !1,
                    callback: () => {
                        this.commentInput.$input.attr("placeholder", cd.s("cf-comment-placeholder-replytocomment", this.formUserName(this.target)));
                    }
                });
                ending && (commentInputPlaceholder = cd.s("cf-comment-placeholder-replytocomment", ending));
            } else "addSection" === this.mode ? commentInputPlaceholder = cd.s("cf-comment-placeholder-addsection") : "addSubsection" === this.mode && (commentInputPlaceholder = cd.s("cf-comment-placeholder-addsubsection"));
            this.commentInput = new OO.ui.MultilineTextInputWidget({
                value: dataToRestore ? dataToRestore.comment : "",
                placeholder: commentInputPlaceholder,
                autosize: !0,
                rows: rowNumber,
                maxRows: 30,
                classes: [ "cd-commentInput" ],
                tabIndex: String(this.id) + "12"
            }), this.$settings = $("<div>").addClass("cd-commentFormSettings"), this.summaryInput = new OO.ui.TextInputWidget({
                value: dataToRestore ? dataToRestore.summary : "",
                maxLength: cd.g.SUMMARY_LENGTH_LIMIT,
                placeholder: cd.s("cf-summary-placeholder"),
                classes: [ "cd-summaryInput" ],
                tabIndex: String(this.id) + "13"
            }), this.summaryInput.$input.codePointLimit(cd.g.SUMMARY_LENGTH_LIMIT), mw.widgets.visibleCodePointLimit(this.summaryInput, cd.g.SUMMARY_LENGTH_LIMIT), 
            this.updateAutoSummary(!dataToRestore), this.$summaryPreview = $("<div>").addClass("cd-summaryPreview"), 
            "edit" === this.mode && ([this.minorField, this.minorCheckbox] = checkboxField({
                value: "minor",
                selected: !dataToRestore || dataToRestore.minor,
                label: cd.s("cf-minor"),
                tabIndex: String(this.id) + "20"
            }));
            const watchCheckboxSelected = cd.settings.watchSectionOnReply && "edit" !== this.mode || $("#ca-unwatch").length || mw.user.options.get(mw.config.get("wgArticleId") ? "watchdefault" : "watchcreations");
            if ([this.watchField, this.watchCheckbox] = checkboxField({
                value: "watch",
                selected: dataToRestore ? dataToRestore.watch : watchCheckboxSelected,
                label: cd.s("cf-watch"),
                tabIndex: String(this.id) + "21"
            }), this.targetSection || "addSection" === this.mode) {
                const label = "addSubsection" !== this.mode && (this.targetSection && this.targetSection.level <= 2 || "addSection" === this.mode) ? cd.s("cf-watchsection-topic") : cd.s("cf-watchsection-subsection"), selected = cd.settings.watchSectionOnReply && "edit" !== this.mode || this.targetSection && this.targetSection.watched;
                [this.watchSectionField, this.watchSectionCheckbox] = checkboxField({
                    value: "watchSection",
                    selected: dataToRestore ? dataToRestore.watchSection : selected,
                    label: label,
                    tabIndex: String(this.id) + "22",
                    title: cd.s("cf-watchsection-tooltip")
                });
            }
            if (![ "addSection", "addSubsection", "edit" ].includes(this.mode) && this.targetComment && !this.targetComment.own && cd.config.pingTemplate && ([this.pingField, this.pingCheckbox] = checkboxField({
                value: "ping",
                selected: !!dataToRestore && dataToRestore.ping,
                label: this.targetComment.isOpeningSection ? cd.s("cf-ping-sectionauthor") : cd.s("cf-ping-commentauthor"),
                tabIndex: String(this.id) + "23"
            }), this.targetComment.author.registered ? this.pingField.setTitle(cd.s("cf-ping-tooltip")) : (this.pingCheckbox.setDisabled(!0), 
            this.pingCheckbox.setTitle(cd.s("cf-ping-tooltip-unreg")), this.pingField.setTitle(cd.s("cf-ping-tooltip-unreg")))), 
            this.headlineInput || ([this.smallField, this.smallCheckbox] = checkboxField({
                value: "small",
                selected: !!dataToRestore && dataToRestore.small,
                label: cd.s("cf-small"),
                tabIndex: String(this.id) + "24"
            })), this.headlineInput && ([this.noSignatureField, this.noSignatureCheckbox] = checkboxField({
                value: "noSignature",
                selected: !!dataToRestore && dataToRestore.noSignature,
                label: cd.s("cf-nosignature"),
                tabIndex: String(this.id) + "25"
            })), "edit" === this.mode && (!this.target.isOpeningSection || this.target.section && 1 === this.target.section.comments.length)) {
                const hasReplies = this.target.isOpeningSection ? void 0 : !this.target.section || this.target.section.comments.slice(this.target.section.comments.indexOf(this.target)).some(comment => comment.parent === this.target);
                if (this.target.isOpeningSection || !hasReplies) {
                    const selected = !!dataToRestore && dataToRestore.delete;
                    [this.deleteField, this.deleteCheckbox] = checkboxField({
                        value: "delete",
                        selected: selected,
                        label: cd.s("cf-delete"),
                        tabIndex: String(this.id) + "26"
                    });
                }
            }
            switch (this.scriptSettingsButton = new OO.ui.ButtonWidget({
                framed: !1,
                icon: "settings",
                label: cd.s("cf-settings-tooltip"),
                invisibleLabel: !0,
                title: cd.s("cf-settings-tooltip"),
                classes: [ "cd-button", "cd-scriptSettingsButton" ],
                tabIndex: String(this.id) + "27"
            }), this.horizontalLayout = new OO.ui.HorizontalLayout({
                classes: [ "cd-checkboxesContainer" ]
            }), this.horizontalLayout.addItems([ this.minorField, this.watchField, this.watchSectionField, this.pingField, this.smallField, this.noSignatureField, this.deleteField, this.scriptSettingsButton ].filter(defined)), 
            this.$buttonsContainer = $("<div>").addClass("cd-buttonsContainer"), this.$leftButtonsContainer = $("<div>").addClass("cd-leftButtonsContainer"), 
            this.$rightButtonsContainer = $("<div>").addClass("cd-rightButtonsContainer"), this.mode) {
              case "edit":
                classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-save")), 
                classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-save"));
                break;

              case "addSection":
                classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-addtopic")), 
                classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-addtopic-short"));
                break;

              case "addSubsection":
                classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-addsubsection")), 
                classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-addsubsection-short"));
                break;

              default:
                classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-reply")), 
                classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-reply-short"));
            }
            this.settingsButton = new OO.ui.ButtonWidget({
                label: cd.s("cf-settings"),
                framed: !1,
                classes: [ "cd-button", "cd-settingsButton" ],
                tabIndex: String(this.id) + "30"
            }), cd.g.$popupsOverlay || (cd.g.$popupsOverlay = $("<div>").addClass("cd-popupsOverlay").appendTo(document.body)), 
            this.helpPopupButton = new OO.ui.PopupButtonWidget({
                label: cd.s("cf-help"),
                framed: !1,
                classes: [ "cd-button" ],
                popup: {
                    head: !0,
                    $content: cd.util.wrapInElement(cd.s("cf-help-content"), "div"),
                    padded: !0,
                    align: "center"
                },
                $overlay: cd.g.$popupsOverlay,
                tabIndex: String(this.id) + "31"
            }), this.cancelButton = new OO.ui.ButtonWidget({
                label: cd.s("cf-cancel"),
                flags: "destructive",
                framed: !1,
                classes: [ "cd-button", "cd-cancelButton" ],
                tabIndex: String(this.id) + "32"
            }), this.viewChangesButton = new OO.ui.ButtonWidget({
                label: cd.s("cf-viewchanges"),
                classes: [ "cd-viewChangesButton" ],
                tabIndex: String(this.id) + "33"
            }), cd.settings.autopreview || (this.previewButton = new OO.ui.ButtonWidget({
                label: cd.s("cf-preview"),
                classes: [ "cd-previewButton" ],
                tabIndex: String(this.id) + "34"
            })), this.submitButton = new OO.ui.ButtonInputWidget({
                type: "submit",
                label: classPrivateFieldGet_default()(this, _standardSubmitButtonLabel),
                flags: [ "progressive", "primary" ],
                classes: [ "cd-submitButton" ],
                tabIndex: String(this.id) + "35"
            }), this.deleteCheckbox && this.deleteCheckbox.isSelected() && this.updateFormOnDeleteCheckboxChange(!0), 
            this.$settings.append(this.summaryInput.$element, this.$summaryPreview, this.horizontalLayout.$element), 
            this.$leftButtonsContainer.append(this.settingsButton.$element, this.helpPopupButton.$element), 
            this.$rightButtonsContainer.append(...[ this.cancelButton.$element, this.viewChangesButton && this.viewChangesButton.$element, this.previewButton && this.previewButton.$element, this.submitButton.$element ].filter(defined)), 
            this.$buttonsContainer.append(this.$leftButtonsContainer, this.$rightButtonsContainer), 
            this.$form = $("<form>"), this.$form.append(...[ this.headlineInput && this.headlineInput.$element, this.commentInput.$element, this.$settings, this.$buttonsContainer ].filter(defined)), 
            this.$innerWrapper.append(this.$messageArea, this.$form), "edit" === this.mode || cd.settings.alwaysExpandSettings || this.$settings.hide(), 
            this.$previewArea = $("<div>").addClass("cd-previewArea"), cd.settings.autopreview ? this.$previewArea.addClass("cd-previewArea-below").appendTo(this.$innerWrapper) : this.$previewArea.addClass("cd-previewArea-above").prependTo(this.$innerWrapper), 
            this.target && this.isInNumberedList && "webkit" !== $.client.profile().layout && $("<div>").html("&nbsp;").addClass("cd-commentForm-dummyElement").prependTo(this.$innerWrapper), 
            cd.settings.showToolbar && this.addToolbar(), cd.settings.insertButtons.length && (this.$insertButtons = $("<div>").addClass("cd-insertButtons").insertAfter(this.commentInput.$element), 
            cd.settings.insertButtons.forEach(button => {
                let text, displayedText;
                Array.isArray(button) ? (text = button[0], displayedText = button[1]) : text = button, 
                this.addInsertButton(text, displayedText);
            }));
        }
        addToPage() {
            switch (mw.config.get("wgArticleId") || cd.g.$root.empty(), this.mode) {
              case "reply":
                this.$element.insertAfter(this.target.$elements.last());
                break;

              case "edit":
                this.target.isOpeningSection ? this.$element.insertAfter(this.target.$elements.last()) : this.$element.insertBefore(this.target.$elements.first());
                break;

              case "replyInSection":
                this.$element.appendTo(this.target.$replyWrapper), this.target.$replyWrapper.addClass("cd-replyWrapper-hasCommentForm");
                break;

              case "addSection":
                this.newTopicOnTop = this.$addSectionLink && this.$addSectionLink.is('[href*="section=0"]'), 
                this.newTopicOnTop && cd.sections[0] ? this.$element.insertBefore(cd.sections[0].$heading) : this.$element.appendTo(cd.g.$root);
                break;

              case "addSubsection":
                {
                    const headingLevelRegexp = new RegExp("\\bcd-commentForm-addSubsection-[".concat(this.target.level, "-6]\\b"));
                    let $target, $tested = this.target.$elements.last();
                    do {
                        $target = $tested, $tested = $tested.next();
                    } while ($tested.is(".cd-sectionButtonContainer") || $tested.length && $tested.get(0).className.match(headingLevelRegexp));
                    this.$element.insertAfter($target);
                    break;
                }
            }
            this.adjustLabels();
        }
        addEvents() {
            const saveSessionEventHandler = () => {
                saveSession();
            }, preview = () => {
                this.preview();
            }, previewFalse = () => {
                this.preview(!1);
            }, textReactions = [ {
                pattern: new RegExp(cd.g.SIGN_CODE + "\\s*$"),
                message: cd.s("cf-reaction-signature", cd.g.SIGN_CODE),
                class: "signatureNotNeeded",
                type: "notice"
            }, {
                pattern: /<pre/,
                message: cd.s("cf-reaction-pre"),
                class: "dontUsePre",
                type: "warning"
            } ].concat(cd.config.customTextReactions);
            this.$form.on("submit", e => {
                e.preventDefault(), this.submit();
            }).on("keydown", e => {
                !e.ctrlKey || e.shiftKey || e.altKey || 13 !== e.keyCode || this.submit(), e.ctrlKey || e.shiftKey || e.altKey || 27 !== e.keyCode || this.cancel();
            }).on("focusin", () => {
                this.lastFocused = new Date;
            }), this.headlineInput && this.headlineInput.on("change", headline => {
                this.updateAutoSummary(!0, !0), headline.includes("{{") ? this.showMessage(cd.s("cf-reaction-templateinheadline"), "warning", "templateInHeadline") : this.hideMessage("templateInHeadline");
            }).on("change", preview).on("change", saveSessionEventHandler), this.commentInput.on("change", text => {
                this.updateAutoSummary(!0, !0), textReactions.forEach(reaction => {
                    reaction.pattern.test(text) && ("function" != typeof reaction.checkFunc || reaction.checkFunc()) ? this.showMessage(reaction.message, reaction.type, reaction.class) : this.hideMessage(reaction.class);
                });
            }).on("change", preview).on("change", saveSessionEventHandler), this.summaryInput.on("change", () => {
                classPrivateFieldGet_default()(this, _dontAutopreview) || preview();
            }).on("change", saveSessionEventHandler), this.summaryInput.$element.on("keypress", () => {
                this.summaryAltered = !0, classPrivateFieldSet_default()(this, _dontAutopreview, !1);
            }), this.minorCheckbox && this.minorCheckbox.on("change", saveSessionEventHandler), 
            this.watchCheckbox.on("change", saveSessionEventHandler), this.watchSectionCheckbox && this.watchSectionCheckbox.on("change", saveSessionEventHandler), 
            this.pingCheckbox && this.pingCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler), 
            this.smallCheckbox && this.smallCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler), 
            this.noSignatureCheckbox && this.noSignatureCheckbox.on("change", previewFalse).on("change", saveSessionEventHandler), 
            this.deleteCheckbox && this.deleteCheckbox.on("change", selected => {
                this.updateAutoSummary(), this.updateFormOnDeleteCheckboxChange(selected);
            }).on("change", selected => {
                selected && cd.settings.autopreview && this.$previewArea.empty();
            }).on("change", saveSessionEventHandler), this.scriptSettingsButton.on("click", () => {
                settingsDialog();
            }), this.settingsButton.on("click", () => {
                this.toggleSettings();
            }), this.cancelButton.on("click", () => {
                this.cancel();
            }), this.viewChangesButton.on("click", () => {
                this.viewChanges();
            }), this.previewButton && this.previewButton.on("click", () => {
                this.preview(!0, !1);
            });
        }
        toggleSettings() {
            this.$settings.is(":hidden") ? this.$settings.show() : this.$settings.hide();
        }
        adjustLabels() {
            let formWidth = this.$innerWrapper.width();
            this.$element.hasClass("cd-commentForm-short") ? formWidth >= classPrivateFieldGet_default()(this, _standardButtonsTotalWidth) + 7 && (this.$element.removeClass("cd-commentForm-short"), 
            this.submitButton.setLabel(classPrivateFieldGet_default()(this, _standardSubmitButtonLabel)), 
            this.previewButton && this.previewButton.setLabel(cd.s("cf-preview")), this.viewChangesButton && this.viewChangesButton.setLabel(cd.s("cf-viewchanges")), 
            this.cancelButton.setLabel(cd.s("cf-cancel"))) : (classPrivateFieldSet_default()(this, _standardButtonsTotalWidth, this.submitButton.$element.outerWidth(!0) + (this.previewButton ? this.previewButton.$element.outerWidth(!0) : 0) + (this.viewChangesButton ? this.viewChangesButton.$element.outerWidth(!0) : 0) + this.settingsButton.$element.outerWidth(!0) + this.helpPopupButton.$element.outerWidth(!0) + this.cancelButton.$element.outerWidth(!0)), 
            formWidth < classPrivateFieldGet_default()(this, _standardButtonsTotalWidth) + 7 && (this.$element.addClass("cd-commentForm-short"), 
            this.submitButton.setLabel(classPrivateFieldGet_default()(this, _shortSubmitButtonLabel)), 
            this.previewButton && this.previewButton.setLabel(cd.s("cf-preview-short")), this.viewChangesButton && this.viewChangesButton.setLabel(cd.s("cf-viewchanges-short")), 
            this.cancelButton.setLabel(cd.s("cf-cancel-short"))));
        }
        pushPending(blockButtons = !1) {
            this.commentInput.pushPending(), this.summaryInput.pushPending(), this.headlineInput && this.headlineInput.pushPending(), 
            blockButtons && (this.submitButton.setDisabled(!0), this.previewButton && this.previewButton.setDisabled(!0), 
            this.viewChangesButton && this.viewChangesButton.setDisabled(!0), this.cancelButton.setDisabled(!0));
        }
        popPending(unblockButtons = !1) {
            this.commentInput.popPending(), this.summaryInput.popPending(), this.headlineInput && this.headlineInput.popPending(), 
            unblockButtons && (this.submitButton.setDisabled(!1), this.previewButton && this.previewButton.setDisabled(!1), 
            this.viewChangesButton && this.viewChangesButton.setDisabled(!1), this.cancelButton.setDisabled(!1));
        }
        showMessage(html, type = "notice", className) {
            if (this.destroyed || className && this.$messageArea.children(".cd-message-".concat(className)).length) return;
            const $label = html instanceof $ ? html : cd.util.wrapInElement(html), classes = [ "cd-message" ];
            className && classes.push("cd-message-".concat(className));
            const message = new OO.ui.MessageWidget({
                type: type,
                inline: !0,
                label: $label,
                classes: classes
            });
            this.$messageArea.append(message.$element).cdAddCloseButton().cdScrollIntoView("top");
        }
        hideMessage(className) {
            const $info = this.$messageArea.children(".cd-message-".concat(className));
            $info.length && $info.remove();
        }
        abort({message: message, messageType: messageType = "error", logMessage: logMessage, retryFunc: retryFunc, tearDown: tearDown = !1, isRawMessage: isRawMessage = !1, currentOperation: currentOperation}) {
            if (currentOperation && this.closeOperation(currentOperation), !this.destroyed) {
                if (logMessage && console.warn(logMessage), currentOperation && "preview" === currentOperation.type && cd.settings.autopreview || (isRawMessage ? this.$messageArea.append(message) : this.showMessage(message, messageType)), 
                retryFunc || tearDown) {
                    this.$innerWrapper.children(":not(.cd-messageArea)").remove();
                    const cancelLink = new OO.ui.ButtonWidget({
                        label: cd.s("cf-error-cancel"),
                        framed: !1
                    });
                    cancelLink.on("click", () => {
                        this.cancel(!1);
                    });
                    const $div = $("<div>").append(cancelLink.$element).appendTo(this.$messageArea);
                    if (retryFunc) {
                        const retryLink = new OO.ui.ButtonWidget({
                            label: cd.s("cf-error-tryagain"),
                            framed: !1
                        });
                        retryLink.on("click", () => {
                            this.$messageArea.empty(), retryFunc.call(this);
                        }), $div.append(retryLink.$element);
                    }
                }
                this.$messageArea.cdScrollIntoView("top");
            }
        }
        unknownApiErrorText(errorCode, errorInfo) {
            return asyncToGenerator_default()((function*() {
                let text;
                if (errorCode && (text = "".concat(cd.s("error-api"), ": ").concat(errorCode, ". "), 
                errorInfo)) try {
                    const {html: html} = yield parseCode(errorInfo);
                    text += html;
                } catch (e) {
                    text += errorInfo;
                }
                return text;
            }))();
        }
        handleError({type: type, code: code, apiData: apiData, message: message, messageType: messageType, logMessage: logMessage, retryFunc: retryFunc, tearDown: tearDown = !1, isRawMessage: isRawMessage = !1, currentOperation: currentOperation}) {
            var _this = this;
            return asyncToGenerator_default()((function*() {
                switch (type) {
                  case "parse":
                    {
                        switch (code) {
                          case "couldntLocateComment":
                            message = cd.s("error-locatecomment");
                            break;

                          case "couldntLocateSection":
                            message = cd.s("error-locatesection");
                            break;

                          case "numberedList":
                            message = cd.s("cf-error-numberedlist");
                            break;

                          case "findPlace":
                            message = "".concat(cd.s("cf-error-findplace"), ".");
                            break;

                          case "findPlace-unexpectedHeading":
                            message = "".concat(cd.s("cf-error-findplace"), " (").concat(cd.s("cf-error-findplace-unexpectedheading"), ").");
                            break;

                          case "delete-repliesToComment":
                            message = cd.s("cf-error-delete-repliestocomment");
                            break;

                          case "delete-repliesInSection":
                            message = cd.s("cf-error-delete-repliesinsection");
                        }
                        const $message = animateLink(message, "cd-message-reloadPage", asyncToGenerator_default()((function*() {
                            _this.reloadPage({}, null, !0);
                        })));
                        _this.abort({
                            message: $message,
                            messageType: messageType,
                            retryFunc: retryFunc,
                            tearDown: tearDown,
                            isRawMessage: isRawMessage,
                            currentOperation: currentOperation
                        });
                        break;
                    }

                  case "api":
                    {
                        switch (code) {
                          case "missing":
                            message = cd.s("cf-error-pagedoesntexist");
                            break;

                          case "error":
                            {
                                const {code: errorCode, info: errorInfo} = apiData.error;
                                switch (errorCode) {
                                  case "missingtitle":
                                    message = cd.s("cf-error-pagedoesntexist");
                                    break;

                                  default:
                                    message = yield _this.unknownApiErrorText(errorCode, errorInfo);
                                }
                                break;
                            }
                        }
                        const $message = cd.util.wrapInElement(message);
                        $message.find(".mw-parser-output").css("display", "inline"), _this.abort({
                            message: $message,
                            messageType: messageType,
                            isRawMessage: isRawMessage,
                            logMessage: logMessage || [ code, apiData ],
                            retryFunc: retryFunc,
                            tearDown: tearDown,
                            currentOperation: currentOperation
                        });
                        break;
                    }

                  case "network":
                    message = (message ? "".concat(message, " ") : "") + cd.s("error-network"), _this.abort({
                        message: message,
                        isRawMessage: isRawMessage,
                        logMessage: logMessage,
                        retryFunc: retryFunc,
                        tearDown: tearDown,
                        currentOperation: currentOperation
                    });
                    break;

                  case "javascript":
                    _this.abort({
                        message: cd.s("error-javascript"),
                        logMessage: logMessage,
                        tearDown: tearDown,
                        currentOperation: currentOperation
                    });
                }
            }))();
        }
        commentTextToCode(action) {
            let indentationChars, replyIndentationChars, text = this.commentInput.getValue();
            this.target instanceof Comment_Comment && (indentationChars = this.target.inCode.indentationChars, 
            replyIndentationChars = this.target.inCode.replyIndentationChars), indentationChars = indentationChars || "", 
            "reply" === this.mode ? indentationChars = replyIndentationChars : "replyInSection" === this.mode && (indentationChars = this.target.inCode.lastCommentFirstIndentationChar || cd.config.defaultIndentationChar);
            const isZeroLevel = "preview" === action || [ "addSection", "addSubsection" ].includes(this.mode) || "edit" === this.mode && !indentationChars, newLineIndentationChars = indentationChars.replace(/\*/g, ":");
            let hidden, code = text.trim(), useColonsForNewLines = /^[:*#]/.test(code), hasTable = !1;
            ({code: code, hidden: hidden} = hideSensitiveCode(code, isTable => {
                isTable && this.willCommentBeIndented && (useColonsForNewLines = !0, hasTable = !0);
            }));
            let signature, implicitSmall = !1;
            if (this.smallCheckbox && (code = code.replace(/^<small>([^]*)<\/small>$/i, (s, m1) => (implicitSmall = !0, 
            m1))), code = code.replace(/^ +[\s\uFEFF\xA0]+[^\s\uFEFF\xA0]/gm, s => / [^\s\uFEFF\xA0]$/.test(s) ? s : s.replace(/^ +/gm, "")), 
            signature = this.noSignatureCheckbox && this.noSignatureCheckbox.isSelected() ? "" : "edit" === this.mode ? this.target.inCode.signature : cd.settings.mySignature, 
            !signature || "edit" === this.mode && /^[ \t]*\n/.test(signature) || !/\n[:*#].*$/.test(code) || (code += "\n", 
            "edit" === this.mode && (signature = signature.replace(/^\s+/, ""))), isZeroLevel || (code = code.replace(/\n([:*#]+)/g, (s, m1) => (useColonsForNewLines = !0, 
            "\n" + newLineIndentationChars + m1)), useColonsForNewLines && indentationChars && (code = code.replace(/\n(?![:#\x03])/g, () => {
                if ("#" === newLineIndentationChars) throw new CdError({
                    type: "parse",
                    code: "numberedList"
                });
                return "\n".concat(newLineIndentationChars) + (cd.config.spaceAfterIndentationChar ? " " : "");
            }))), this.willCommentBeIndented) {
                code = code.replace(/^ +/gm, "");
                const replacement = cd.config.paragraphTemplates.length ? "$1{{".concat(cd.config.paragraphTemplates[0], "}}") : "$1<br><br>";
                code = code.replace(/^((?![:*#= ]).+)\n\n(?![:*#=])/gm, replacement);
            }
            const entireLineRegexp = new RegExp("^(?:\\x01.*?\\x02 *|\\[\\[".concat(cd.g.FILE_PREFIX_PATTERN, ".+\\]\\]\\s*)$"), "im"), thisLineEndingRegexp = new RegExp("(?:<".concat(cd.g.PNIE_PATTERN, "(?: [\\w ]+?=[^<>]+?| ?\\/?)>|<\\/").concat(cd.g.PNIE_PATTERN, ">)|\\x04$"), "i"), nextLineBeginningRegexp = new RegExp("^(?:<\\/".concat(cd.g.PNIE_PATTERN, ">|<").concat(cd.g.PNIE_PATTERN, ")"), "i");
            if (code = code.replace(/^((?![:*#= ]).+)\n(?![\n:*#= \x03])(?=(.*))/gm, (s, m1, m2) => m1 + (entireLineRegexp.test(m1) || entireLineRegexp.test(m2) || thisLineEndingRegexp.test(m1) || nextLineBeginningRegexp.test(m2) ? "" : "<br>") + (this.willCommentBeIndented ? "" : "\n")), 
            code = code.replace(/\s*~{3,}$/, ""), this.pingCheckbox && this.pingCheckbox.isSelected()) {
                let separator;
                separator = /^[:*#]/.test(code) ? "\n" + (isZeroLevel ? "" : newLineIndentationChars) : " ", 
                code = "{{" + cd.config.pingTemplate + "|" + this.targetComment.author.name + (code ? "" : "|p=.") + "}}" + separator + code;
            }
            if (!isZeroLevel && /^#/gm.test(code) && (indentationChars = newLineIndentationChars), 
            this.headlineInput) {
                let level;
                level = "addSection" === this.mode ? 2 : "addSubsection" === this.mode ? this.target.level + 1 : this.target.inCode.headingLevel;
                const equalSigns = "=".repeat(level);
                classPrivateFieldGet_default()(this, _editingSectionOpeningComment) && /^\n/.test(this.target.inCode.code) && (code = "\n" + code), 
                code = "".concat(equalSigns, " ").concat(this.headlineInput.getValue().trim(), " ").concat(equalSigns, "\n").concat(code);
            }
            if ("preview" === action && signature && (signature = '<span class="cd-commentForm-signature">'.concat(signature, "</span>")), 
            /^\s/.test(signature) || !code || /[\s>]$/.test(code) || (code += " "), /(?:^|\n) .*$/.test(code) && (code += "\n"), 
            code += signature, this.smallCheckbox && (this.smallCheckbox.isSelected() || implicitSmall)) {
                const indentation = newLineIndentationChars + (/^[:*#]/.test(code) || !cd.config.spaceAfterIndentationChar ? "" : " "), before = /^[:*# ]/.test(code) ? "\n".concat(indentation) : "";
                code = cd.config.blockSmallTemplate && !/^[:*#]/m.test(code) ? "{{".concat(cd.config.blockSmallTemplate, "|1=").concat(code, "}}") : "<small>".concat(before).concat(code, "</small>");
            }
            let imitateList;
            return "edit" !== this.mode && (code += "\n"), "submit" === action && ("reply" !== this.mode && "replyInSection" !== this.mode || (code = indentationChars + (indentationChars && !/^[:*#]/.test(code) && cd.config.spaceAfterIndentationChar ? " " : "") + code), 
            this.willCommentBeIndented && "edit" === this.mode && /^[:*]/.test(this.target.inCode.code) && !/^[:*]/.test(code) && (code = " " + code), 
            "addSubsection" === this.mode && (code += "\n")), "preview" === action && this.willCommentBeIndented && this.commentInput.getValue().trim() && !hasTable ? (code = code.replace(/^/gm, ":"), 
            imitateList = !0) : imitateList = !1, code = unhideSensitiveCode(code, hidden), 
            cd.config.customCodeTransformations && (code = cd.config.customCodeTransformations(code, this)), 
            {
                code: code,
                imitateList: imitateList
            };
        }
        tryPrepareNewPageCode(action) {
            var _this2 = this;
            return asyncToGenerator_default()((function*() {
                let page, newPageCode;
                try {
                    page = yield getLastRevision(_this2.targetPage);
                } catch (e) {
                    return void (e instanceof CdError ? _this2.handleError(Object.assign({}, {
                        message: cd.s("cf-error-getpagecode")
                    }, e.data)) : _this2.handleError({
                        type: "javascript",
                        logMessage: e
                    }));
                }
                try {
                    newPageCode = _this2.prepareNewPageCode(page.code, action);
                } catch (e) {
                    return void (e instanceof CdError ? _this2.handleError(e.data) : _this2.handleError({
                        type: "javascript",
                        logMessage: e
                    }));
                }
                return {
                    page: page,
                    newPageCode: newPageCode
                };
            }))();
        }
        prepareNewPageCode(pageCode, action) {
            let targetInCode, currentIndex;
            if (pageCode += "\n", this.target && (this.target.locateInCode(pageCode), targetInCode = this.target.inCode, 
            "edit" === this.mode && (this.willCommentBeIndented = this.target.inCode.indentationChars)), 
            "reply" === this.mode) {
                currentIndex = targetInCode.endIndex;
                const succeedingText = pageCode.slice(currentIndex), properPlaceMatch = new RegExp("^([^]*?(?:" + mw.util.escapeRegExp(targetInCode.signature) + "|" + cd.g.TIMESTAMP_REGEXP.source + ".*)\\n)\\n*" + (targetInCode.indentationChars.length > 0 ? "[:*#]{0,".concat(targetInCode.indentationChars.length, "}") : "") + "(?![:*#\\n])").exec(succeedingText);
                if (!properPlaceMatch) throw new CdError({
                    type: "parse",
                    code: "findPlace"
                });
                const textBeforeInsertion = properPlaceMatch[1], changedIndentationCharsMatch = textBeforeInsertion.match(/\n([:*#]{2,}).*\n$/), changedIndentationChars = changedIndentationCharsMatch && changedIndentationCharsMatch[1];
                changedIndentationChars && (changedIndentationChars.length > targetInCode.indentationChars.length ? targetInCode.replyIndentationChars = changedIndentationChars.slice(0, targetInCode.replyIndentationChars.length).replace(/:$/, cd.config.defaultIndentationChar) : targetInCode.indentationChars = changedIndentationChars.slice(0, targetInCode.indentationChars.length).replace(/:$/, cd.config.defaultIndentationChar));
                const adjustedTextBeforeInsertion = textBeforeInsertion.replace(/<!--[^]*?-->/g, "");
                if (/\n(=+).*?\1[ \t]*\n/.test(adjustedTextBeforeInsertion)) throw new CdError({
                    type: "parse",
                    code: "findPlace-unexpectedHeading"
                });
                currentIndex += textBeforeInsertion.length;
            }
            "replyInSection" === this.mode && this.isInNumberedList && /\n#.*\n+$/.test(targetInCode.firstChunkCode) && (targetInCode.lastCommentFirstIndentationChar = "#");
            const isDelete = this.deleteCheckbox && this.deleteCheckbox.isSelected();
            let commentCode, newPageCode, before;
            if (!isDelete) try {
                ({code: commentCode} = this.commentTextToCode("submit"));
            } catch (e) {
                return void (e instanceof CdError ? this.handleError(e.data) : this.handleError({
                    type: "javascript",
                    logMessage: e
                }));
            }
            switch (this.mode) {
              case "reply":
                before = pageCode.slice(0, currentIndex), newPageCode = before + commentCode + pageCode.slice(currentIndex);
                break;

              case "edit":
                if (isDelete) {
                    let startIndex, endIndex;
                    if (this.target.isOpeningSection && void 0 !== targetInCode.headingStartIndex) {
                        this.target.section.locateInCode(pageCode);
                        const targetInCode = this.target.section.inCode;
                        if (extractSignatures(targetInCode.code).length > 1) throw new CdError({
                            type: "parse",
                            code: "delete-repliesInSection"
                        });
                        ({startIndex: startIndex, contentEndIndex: endIndex} = targetInCode);
                    } else {
                        endIndex = targetInCode.endIndex + targetInCode.dirtySignature.length + 1;
                        const succeedingText = pageCode.slice(targetInCode.endIndex);
                        if (new RegExp("^.+\\n+[:*#]{".concat(targetInCode.indentationChars.length + 1, ",}")).exec(succeedingText)) throw new CdError({
                            type: "parse",
                            code: "delete-repliesToComment"
                        });
                        startIndex = targetInCode.lineStartIndex;
                    }
                    newPageCode = pageCode.slice(0, startIndex) + pageCode.slice(endIndex);
                } else {
                    const startIndex = this.target.isOpeningSection && void 0 !== targetInCode.headingStartIndex ? targetInCode.headingStartIndex : targetInCode.startIndex;
                    before = pageCode.slice(0, startIndex), newPageCode = before + commentCode + pageCode.slice(targetInCode.endIndex + targetInCode.dirtySignature.length);
                }
                break;

              case "replyInSection":
                before = pageCode.slice(0, targetInCode.firstChunkContentEndIndex), newPageCode = before + commentCode + pageCode.slice(targetInCode.firstChunkContentEndIndex);
                break;

              case "addSection":
                if (this.newTopicOnTop) {
                    const firstSectionIndex = hideHtmlComments(pageCode).search(/^(=+).*?\1/m);
                    before = pageCode.slice(0, firstSectionIndex), newPageCode = before + commentCode + "\n" + pageCode.slice(firstSectionIndex);
                } else before = (pageCode + "\n").trimStart(), newPageCode = before + commentCode;
                break;

              case "addSubsection":
                before = pageCode.slice(0, targetInCode.contentEndIndex).replace(/([^\n])\n$/, "$1\n\n"), 
                newPageCode = before + commentCode + pageCode.slice(targetInCode.contentEndIndex);
            }
            return "submit" !== action || isDelete || extractSignatures(before, !0), newPageCode;
        }
        registerOperation(operation) {
            this.operations.push(operation), operation.closed = !1, "preview" === operation.type && cd.settings.autopreview || (this.$messageArea.empty(), 
            this.pushPending("submit" === operation.type));
        }
        closeOperationIfNecessary(operation, condition) {
            if (operation.closed) return !0;
            const otherOperationIndex = function(arr, callback) {
                for (let i = arr.length - 1; i >= 0; i--) if (callback(arr[i])) return i;
                return null;
            }(this.operations, op => operation !== op && [ "preview", "viewChanges" ].includes(op.type) && !op.delayed);
            return !!(null !== otherOperationIndex && otherOperationIndex > this.operations.indexOf(operation) || condition) && (this.closeOperation(operation), 
            !0);
        }
        closeOperation(operation) {
            operation.closed = !0, "preview" === operation.type && cd.settings.autopreview || this.popPending("submit" === operation.type);
        }
        unregisterOperation(operation) {
            this.operations.includes(operation) && this.operations.splice(this.operations.indexOf(operation), 1);
        }
        isBeingSubmitted() {
            return this.operations.some(op => "submit" === op.type && !op.closed);
        }
        preview(maySummaryHaveChanged = !0, auto = !0, operation) {
            var _this3 = this;
            return asyncToGenerator_default()((function*() {
                if (!1 === _this3.textLoaded || _this3.target && !_this3.target.inCode && _this3.checkCodeRequest && "resolved" === _this3.checkCodeRequest.state() || _this3.isBeingSubmitted() || auto && !cd.settings.autopreview) return void (operation && _this3.closeOperation(operation));
                let currentOperation;
                if (operation ? currentOperation = operation : (currentOperation = {
                    type: "preview"
                }, _this3.registerOperation(currentOperation)), auto) {
                    const isTooEarly = Date.now() - classPrivateFieldGet_default()(_this3, _lastPreviewTimestamp) < 1e3;
                    if (isTooEarly || _this3.operations.some(op => !op.closed && "preview" === op.type && op !== currentOperation)) return void (classPrivateFieldGet_default()(_this3, _previewTimeout) ? _this3.unregisterOperation(currentOperation) : (currentOperation.delayed = !0, 
                    classPrivateFieldSet_default()(_this3, _previewTimeout, setTimeout(() => {
                        classPrivateFieldSet_default()(_this3, _previewTimeout, null), _this3.preview(maySummaryHaveChanged, !0, currentOperation);
                    }, isTooEarly ? 1e3 - (Date.now() - classPrivateFieldGet_default()(_this3, _lastPreviewTimestamp)) : 100))));
                    classPrivateFieldSet_default()(_this3, _lastPreviewTimestamp, Date.now());
                }
                if (_this3.closeOperationIfNecessary(currentOperation)) return;
                if (_this3.target && !_this3.target.inCode && (yield _this3.checkCode(), _this3.closeOperationIfNecessary(currentOperation, !_this3.target.inCode))) return;
                const emptyPreview = !(_this3.commentInput.getValue().trim() || _this3.headlineInput && _this3.headlineInput.getValue().trim());
                if (emptyPreview && !maySummaryHaveChanged) return void _this3.closeOperation(currentOperation);
                const {code: commentCode, imitateList: imitateList} = _this3.commentTextToCode("preview");
                let html, parsedSummary;
                try {
                    ({html: html, parsedSummary: parsedSummary} = yield parseCode(commentCode, {
                        title: _this3.targetPage,
                        summary: cd.util.buildEditSummary({
                            text: _this3.summaryInput.getValue()
                        })
                    }));
                } catch (e) {
                    return void (e instanceof CdError ? _this3.handleError(Object.assign({}, e.data, {
                        message: cd.s("cf-error-preview"),
                        currentOperation: currentOperation
                    })) : _this3.handleError({
                        type: "javascript",
                        logMessage: e,
                        currentOperation: currentOperation
                    }));
                }
                if (!_this3.closeOperationIfNecessary(currentOperation)) {
                    if (html) {
                        if (auto && emptyPreview || _this3.deleteCheckbox && _this3.deleteCheckbox.isSelected()) _this3.$previewArea.empty(); else {
                            const $label = $("<div>").addClass("cd-commentForm-blockLabel").text(cd.s("cf-block-preview"));
                            _this3.$previewArea.html(html).prepend($label).cdAddCloseButton(), imitateList ? _this3.$previewArea.addClass("cd-previewArea-indentedComment") : _this3.$previewArea.removeClass("cd-previewArea-indentedComment");
                        }
                        const $parsedSummary = parsedSummary && cd.util.wrapInElement(parsedSummary);
                        $parsedSummary.length && _this3.$element.find(".cd-summaryPreview").html("".concat(cd.s("cf-summary-preview"), ': <span class="comment">').concat($parsedSummary.html(), "</span>")), 
                        auto || mw.hook("wikipage.content").fire(_this3.$previewArea);
                    }
                    _this3.$previewArea.hasClass("cd-previewArea-above") && _this3.$previewArea.cdScrollIntoView("top"), 
                    _this3.closeOperation(currentOperation);
                }
            }))();
        }
        viewChanges() {
            var _this4 = this;
            return asyncToGenerator_default()((function*() {
                if (_this4.isBeingSubmitted()) return;
                const currentOperation = {
                    type: "viewChanges"
                };
                _this4.registerOperation(currentOperation);
                const {page: page, newPageCode: newPageCode} = (yield _this4.tryPrepareNewPageCode("viewChanges")) || {};
                if (_this4.closeOperationIfNecessary(currentOperation, void 0 === newPageCode)) return;
                let resp;
                mw.loader.load("mediawiki.diff.styles");
                try {
                    const options = {
                        action: "compare",
                        toslots: "main",
                        "totext-main": newPageCode,
                        prop: "diff",
                        formatversion: 2
                    };
                    mw.config.get("wgArticleId") ? options.fromrev = page.revisionId : (options.fromslots = "main", 
                    options["fromtext-main"] = ""), resp = yield cd.g.api.post(options).catch(handleApiReject);
                } catch (e) {
                    return void (e instanceof CdError ? _this4.handleError(Object.assign({}, e.data, {
                        message: cd.s("cf-error-viewchanges"),
                        currentOperation: currentOperation
                    })) : _this4.handleError({
                        type: "javascript",
                        logMessage: e,
                        currentOperation: currentOperation
                    }));
                }
                if (_this4.closeOperationIfNecessary(currentOperation)) return;
                let html = resp && resp.compare && resp.compare.body;
                if (html) {
                    html = cd.util.wrapDiffBody(html);
                    const $label = $("<div>").addClass("cd-commentForm-blockLabel").text(cd.s("cf-block-viewchanges"));
                    _this4.$previewArea.html(html).prepend($label).cdAddCloseButton();
                } else _this4.$previewArea.empty(), void 0 !== html && _this4.showMessage(cd.s("cf-message-nochanges"));
                _this4.$previewArea.cdScrollIntoView(_this4.$previewArea.hasClass("cd-previewArea-above") ? "top" : "bottom"), 
                _this4.closeOperation(currentOperation);
            }))();
        }
        reloadPage(keptData, currentOperation, confirmClose = !1) {
            var _this5 = this;
            return asyncToGenerator_default()((function*() {
                if (!confirmClose || (yield _this5.confirmClose())) {
                    _this5.forget(!1);
                    try {
                        yield reloadPage(keptData);
                    } catch (e) {
                        e instanceof CdError ? _this5.handleError(Object.assign({}, e.data, {
                            message: cd.s("error-reloadpage"),
                            retryFunc: () => {
                                _this5.reloadPage(keptData);
                            },
                            tearDown: !0,
                            currentOperation: currentOperation
                        })) : _this5.handleError({
                            type: "javascript",
                            logMessage: e,
                            tearDown: !0,
                            currentOperation: currentOperation
                        }), removeLoadingOverlay();
                    }
                }
            }))();
        }
        runChecks({isDelete: isDelete}) {
            var _this6 = this;
            return asyncToGenerator_default()((function*() {
                const checks = [ {
                    condition: _this6.headlineInput && "" === _this6.headlineInput.getValue(),
                    confirmation: (_confirmation = asyncToGenerator_default()((function*() {
                        const headingPurpose = classPrivateFieldGet_default()(_this6, _headlineInputPurpose) === cd.s("cf-headline-topic") ? cd.s("cf-headline-topic-lowercase") : cd.s("cf-headline-subsection-lowercase");
                        return yield OO.ui.confirm(cd.s("cf-confirm-noheadline", headingPurpose));
                    })), function() {
                        return _confirmation.apply(this, arguments);
                    })
                }, {
                    condition: !(_this6.commentInput.getValue().trim() || cd.config.noConfirmPostEmptyCommentPageRegexp && cd.config.noConfirmPostEmptyCommentPageRegexp.test(cd.g.CURRENT_PAGE)),
                    confirmation: (_confirmation2 = asyncToGenerator_default()((function*() {
                        return yield OO.ui.confirm(cd.s("cf-confirm-empty"));
                    })), function() {
                        return _confirmation2.apply(this, arguments);
                    })
                }, {
                    condition: _this6.commentInput.getValue().trim().length > cd.config.longCommentThreshold,
                    confirmation: (_confirmation3 = asyncToGenerator_default()((function*() {
                        return yield OO.ui.confirm(cd.s("cf-confirm-long", cd.config.longCommentThreshold));
                    })), function() {
                        return _confirmation3.apply(this, arguments);
                    })
                }, {
                    condition: /^==[^=]/m.test(_this6.commentInput.getValue()) && "edit" !== _this6.mode,
                    confirmation: (_confirmation4 = asyncToGenerator_default()((function*() {
                        return yield OO.ui.confirm(cd.s("cf-confirm-secondlevelheading"));
                    })), function() {
                        return _confirmation4.apply(this, arguments);
                    })
                }, {
                    condition: isDelete,
                    confirmation: (_confirmation5 = asyncToGenerator_default()((function*() {
                        return yield confirmDestructive("cf-confirm-delete");
                    })), function() {
                        return _confirmation5.apply(this, arguments);
                    })
                } ];
                var _confirmation5, _confirmation4, _confirmation3, _confirmation2, _confirmation;
                for (const check of checks) if (check.condition && !(yield check.confirmation())) return _this6.commentInput.focus(), 
                !1;
                return !0;
            }))();
        }
        tryEditPage(page, newPageCode, currentOperation) {
            var _this7 = this;
            return asyncToGenerator_default()((function*() {
                let resp;
                try {
                    resp = yield cd.g.api.postWithToken("csrf", {
                        action: "edit",
                        title: _this7.targetPage,
                        text: newPageCode,
                        summary: cd.util.buildEditSummary({
                            text: _this7.summaryInput.getValue()
                        }),
                        tags: cd.config.tagName,
                        baserevid: page.revisionId,
                        starttimestamp: page.queryTimestamp,
                        minor: _this7.minorCheckbox && _this7.minorCheckbox.isSelected(),
                        watchlist: _this7.watchCheckbox.isSelected() ? "watch" : "unwatch",
                        formatversion: 2
                    }).catch(handleApiReject);
                } catch (e) {
                    if (e instanceof CdError) {
                        const {type: type, apiData: apiData} = e.data;
                        if ("network" === type) _this7.handleError({
                            type: type,
                            message: cd.s("cf-error-couldntedit"),
                            currentOperation: currentOperation
                        }); else {
                            const error = apiData && apiData.error;
                            let message, messageType, logMessage, isRawMessage = !1;
                            if (error) {
                                switch (error.code) {
                                  case "spamblacklist":
                                    message = cd.s("cf-error-spamblacklist", error.spamblacklist.matches[0]);
                                    break;

                                  case "titleblacklist":
                                    message = cd.s("cf-error-titleblacklist");
                                    break;

                                  case "abusefilter-warning":
                                  case "abusefilter-disallowed":
                                    yield cd.g.api.loadMessagesIfMissing([ error.code ]), ({html: message} = (yield parseCode(mw.message(error.code, error.abusefilter.description).plain())) || {}), 
                                    message ? isRawMessage = !0 : message = cd.s("cf-error-abusefilter", error.abusefilter.description);
                                    break;

                                  case "editconflict":
                                    message = cd.s("cf-error-editconflict"), messageType = "notice", _this7.submit();
                                    break;

                                  case "blocked":
                                    message = cd.s("cf-error-blocked");
                                    break;

                                  case "missingtitle":
                                    message = cd.s("cf-error-pagedeleted");
                                    break;

                                  default:
                                    message = cd.s("cf-error-pagenotedited") + " " + (yield _this7.unknownApiErrorText(error.code, error.info));
                                }
                                logMessage = [ error.code, apiData ];
                            } else logMessage = apiData;
                            _this7.handleError({
                                type: type,
                                message: message,
                                messageType: messageType,
                                isRawMessage: isRawMessage,
                                logMessage: logMessage,
                                currentOperation: currentOperation
                            });
                        }
                    } else _this7.handleError({
                        type: "javascript",
                        logMessage: e,
                        currentOperation: currentOperation
                    });
                    return null;
                }
                return resp;
            }))();
        }
        submit() {
            var _this8 = this;
            return asyncToGenerator_default()((function*() {
                const isDelete = _this8.deleteCheckbox && _this8.deleteCheckbox.isSelected();
                if (!(yield _this8.runChecks({
                    isDelete: isDelete
                }))) return;
                const currentOperation = {
                    type: "submit"
                };
                _this8.registerOperation(currentOperation);
                const {page: page, newPageCode: newPageCode} = (yield _this8.tryPrepareNewPageCode("submit")) || {};
                if (void 0 === newPageCode) return void _this8.closeOperation(currentOperation);
                let watchSectionAfterGettingArticleId, keptData = {};
                if (_this8.watchSectionCheckbox) if (_this8.watchSectionCheckbox.isSelected()) {
                    const isHeadlineAltered = classPrivateFieldGet_default()(_this8, _editingSectionOpeningComment) && _this8.headlineInput.getValue() !== _this8.originalHeadline;
                    if ("addSection" === _this8.mode || "addSubsection" === _this8.mode || isHeadlineAltered) {
                        const headline = removeWikiMarkup(_this8.headlineInput.getValue());
                        if (mw.config.get("wgArticleId")) {
                            if (Section_Section.watchSection(headline, !0), isHeadlineAltered) {
                                const originalHeadline = removeWikiMarkup(_this8.originalHeadline);
                                Section_Section.unwatchSection(originalHeadline, !0);
                            }
                        } else watchSectionAfterGettingArticleId = headline;
                        keptData.justWatchedSection = headline;
                    } else {
                        const section = _this8.targetSection;
                        section && !section.watched && (section.watch(!0), keptData.justWatchedSection = section.headline);
                    }
                } else {
                    const section = _this8.targetSection;
                    section && section.watched && (section.unwatch(!0), keptData.justUnwatchedSection = section.headline);
                }
                const resp = yield _this8.tryEditPage(page, newPageCode, currentOperation);
                resp && (_this8.watchCheckbox.isSelected() && $("#ca-watch").length && $("#ca-watch").attr("id", "cd-unwatch"), 
                !_this8.watchCheckbox.isSelected() && $("#ca-unwatch").length && $("#ca-unwatch").attr("id", "cd-watch"), 
                mw.config.get("wgArticleId") || (mw.config.set("wgArticleId", resp.edit.pageid), 
                keptData.wasPageCreated = !0, watchSectionAfterGettingArticleId && Section_Section.watchSection(watchSectionAfterGettingArticleId, !0)), 
                isDelete || (keptData.commentAnchor = "edit" === _this8.mode ? _this8.target.anchor : generateCommentAnchor(new Date(resp.edit.newtimestamp), cd.g.CURRENT_USER_NAME, !0)), 
                _this8.reloadPage(keptData, currentOperation));
            }))();
        }
        confirmClose() {
            var _this9 = this;
            return asyncToGenerator_default()((function*() {
                return !_this9.isAltered() || (yield confirmDestructive("cf-confirm-close"));
            }))();
        }
        cancel(confirmClose = !0) {
            var _this10 = this;
            return asyncToGenerator_default()((function*() {
                if (!_this10.beingCancelled && !_this10.isBeingSubmitted()) {
                    if (_this10.beingCancelled = !0, confirmClose && !(yield _this10.confirmClose())) return _this10.commentInput.focus(), 
                    void (_this10.beingCancelled = !1);
                    _this10.destroy(), _this10.beingCancelled = !1, "reply" === _this10.mode ? _this10.target.scrollIntoView("top") : "replyInSection" === _this10.mode ? (_this10.target.$replyButton.show(), 
                    _this10.target.$replyWrapper.removeClass("cd-replyWrapper-hasCommentForm")) : "edit" === _this10.mode && (_this10.target.$elements.removeClass("cd-hidden"), 
                    _this10.target.scrollIntoView("top"), _this10.target.configureLayers());
                }
            }))();
        }
        destroy() {
            this.operations.filter(op => !op.closed).forEach(this.closeOperation.bind(this)), 
            this.forget(), this.$element.remove(), this.destroyed = !0;
        }
        forget(removeCommentProperty = !0) {
            this.target && removeCommentProperty && delete this.target[CommentForm_CommentForm.modeToProperty(this.mode) + "Form"], 
            cd.commentForms.includes(this) && cd.commentForms.splice(cd.commentForms.indexOf(this), 1), 
            "addSection" === this.mode && (cd.g.addSectionForm = null), saveSession();
        }
        isAltered() {
            return void 0 !== this.originalComment && this.originalComment !== this.commentInput.getValue() || this.autoSummary !== this.summaryInput.getValue() || this.headlineInput && void 0 !== this.originalHeadline && this.originalHeadline !== this.headlineInput.getValue();
        }
        formUserName(targetComment, {genitive: genitive = !1, returnUnknown: returnUnknown = !0, callback: callback = (() => {})} = {}) {
            let toUser;
            if (null === targetComment.author.gender && cd.g.GENDER_AFFECTS_USER_STRING) if (targetComment.author.registered) {
                if (classPrivateFieldSet_default()(this, _genderRequestCallbackList, classPrivateFieldGet_default()(this, _genderRequestCallbackList) || []), 
                callback && (!this.genderRequest || !classPrivateFieldGet_default()(this, _genderRequestCallbackList).includes(callback))) {
                    let errorCallback;
                    this.genderRequest || (this.genderRequest = getUserGenders([ targetComment.author ]), 
                    errorCallback = e => {
                        console.warn("Couldn't find out the gender of user ".concat(targetComment.author.name, "."), e);
                    }), classPrivateFieldGet_default()(this, _genderRequestCallbackList).includes(callback) || (this.genderRequest.then(callback, errorCallback), 
                    classPrivateFieldGet_default()(this, _genderRequestCallbackList).push(callback));
                }
                returnUnknown && (toUser = genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative"));
            } else toUser = genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative"); else toUser = "male" === targetComment.author.gender ? genitive ? cd.s("user-male-genitive") : cd.s("user-male-dative") : "female" === targetComment.author.gender ? genitive ? cd.s("user-female-genitive") : cd.s("user-female-dative") : genitive ? cd.s("user-unknown-genitive") : cd.s("user-unknown-dative");
            return void 0 === toUser ? "" : "".concat(toUser, " ").concat(targetComment.author.name).trim();
        }
        updateAutoSummary(set = !0, dontAutopreview = !1) {
            if (this.summaryAltered) return;
            classPrivateFieldSet_default()(this, _dontAutopreview, dontAutopreview);
            const text = this.autoText(), section = this.headlineInput && "addSubsection" !== this.mode ? removeWikiMarkup(this.headlineInput.getValue()) : classPrivateFieldGet_default()(this, _sectionHeadline);
            let optionalText;
            if ([ "reply", "replyInSection" ].includes(this.mode)) {
                const commentText = this.commentInput.getValue().trim().replace(/\s+/g, " ");
                commentText && commentText.length <= cd.config.summaryCommentTextLengthLimit && (optionalText = ": ".concat(commentText, " (-)"));
            } else if ("addSubsection" === this.mode) {
                const subsection = removeWikiMarkup(this.headlineInput.getValue());
                subsection && (optionalText = ": /* ".concat(subsection, " */"));
            }
            this.autoSummary = cd.util.buildEditSummary({
                text: text,
                section: section,
                optionalText: optionalText,
                addPostfix: !1
            }), set && this.summaryInput.setValue(this.autoSummary);
        }
        autoText() {
            const callback = this.updateAutoSummary.bind(this);
            switch (this.mode) {
              case "reply":
                if (this.target.isOpeningSection) return cd.s("es-reply");
                {
                    const userName = this.formUserName(this.target, {
                        callback: callback
                    });
                    return this.target.own ? cd.s("es-addition") : cd.s("es-reply-to", userName).replace(/  +/g, " ");
                }

              case "edit":
                {
                    const editOrDeleteText = (action, topicGenitive, subsectionGenitive) => {
                        let object;
                        if (this.target.own) if (this.target.parent) if (0 === this.target.parent.level) object = cd.s("es-reply-genitive"); else {
                            const userName = this.formUserName(this.target.parent, {
                                callback: callback
                            });
                            object = this.target.parent.own ? cd.s("es-addition") : cd.s("es-reply-by-genitive", userName);
                        } else object = this.target.isOpeningSection ? this.target.section.level <= 2 ? cd.s("es-topic-genitive") : cd.s("es-subsection-genitive") : cd.s("es-comment-genitive"); else if (this.target.isOpeningSection) object = this.target.section.level <= 2 ? topicGenitive : subsectionGenitive; else {
                            const userName = this.formUserName(this.target, {
                                callback: callback,
                                genitive: !0
                            });
                            object = cd.s("es-comment-by-genitive", userName);
                        }
                        return cd.s("es-action-to", action, object);
                    };
                    return this.deleteCheckbox && this.deleteCheckbox.isSelected() ? editOrDeleteText(cd.s("es-delete"), cd.s("es-topic-genitive"), cd.s("es-subsection-genitive")) : editOrDeleteText(cd.s("es-edit"), cd.s("es-topic-openingcomment-genitive"), cd.s("es-subsection-openingcomment-genitive"));
                }

              case "replyInSection":
                return cd.s("es-reply");

              case "addSection":
                {
                    let newTopicSummary;
                    if (this.$addSectionLink) {
                        const summary = new mw.Uri(this.$addSectionLink.attr("href")).query.summary;
                        newTopicSummary = summary && summary.replace(/^.+?\*\/ */, "");
                    }
                    return newTopicSummary || cd.s("es-new-topic");
                }

              case "addSubsection":
                return cd.s("es-new-subsection");
            }
        }
        updateFormOnDeleteCheckboxChange(selected) {
            selected ? (this.initialMinorCheckboxSelected = this.minorCheckbox.isSelected(), 
            this.minorCheckbox.setSelected(!1), this.commentInput.setDisabled(!0), this.headlineInput && this.headlineInput.setDisabled(!0), 
            this.minorCheckbox.setDisabled(!0), this.smallCheckbox && this.smallCheckbox.setDisabled(!0), 
            this.noSignatureCheckbox && this.noSignatureCheckbox.setDisabled(!0), this.$element.addClass("cd-commentForm-disabled"), 
            classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-delete-button")), 
            classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-delete-button-short")), 
            this.submitButton.clearFlags().setFlags([ "destructive", "primary" ]).setLabel(this.$element.hasClass("cd-commentForm-short") ? classPrivateFieldGet_default()(this, _standardSubmitButtonLabel) : classPrivateFieldGet_default()(this, _shortSubmitButtonLabel))) : (this.minorCheckbox.setSelected(this.initialMinorCheckboxSelected), 
            this.commentInput.setDisabled(!1), this.headlineInput && this.headlineInput.setDisabled(!1), 
            this.minorCheckbox.setDisabled(!1), this.smallCheckbox && this.smallCheckbox.setDisabled(!1), 
            this.noSignatureCheckbox && this.noSignatureCheckbox.setDisabled(!1), this.$element.removeClass("cd-commentForm-disabled"), 
            classPrivateFieldSet_default()(this, _standardSubmitButtonLabel, cd.s("cf-save")), 
            classPrivateFieldSet_default()(this, _shortSubmitButtonLabel, cd.s("cf-save-short")), 
            this.submitButton.clearFlags().setFlags([ "progressive", "primary" ]).setLabel(this.$element.hasClass("cd-commentForm-short") ? classPrivateFieldGet_default()(this, _standardSubmitButtonLabel) : classPrivateFieldGet_default()(this, _shortSubmitButtonLabel)));
        }
        quote(ignoreEmptySelection = !1) {
            const selectionText = isInputFocused() ? document.activeElement.value.substring(document.activeElement.selectionStart, document.activeElement.selectionEnd) : window.getSelection().toString().trim();
            if (selectionText || !ignoreEmptySelection) {
                const isCommentInputFocused = this.commentInput.$input.is(":focus"), range = this.commentInput.getRange(), cursorIndex = range.to, rangeStart = Math.min(range.to, range.from), rangeEnd = Math.max(range.to, range.from), value = this.commentInput.getValue(), quotePre = cd.config.quoteFormatting[0], quotePost = cd.config.quoteFormatting[1], quotation = quotePre + (selectionText || cd.s("cf-quote-placeholder")) + quotePost, newRangeStart = (isCommentInputFocused ? rangeStart : cursorIndex) + (selectionText ? quotation.length : quotePre.length), newRangeEnd = selectionText ? newRangeStart : newRangeStart + cd.s("cf-quote-placeholder").length, newValue = isCommentInputFocused ? value.slice(0, rangeStart) + quotation + value.slice(rangeEnd) : value.slice(0, cursorIndex) + quotation + value.slice(cursorIndex);
                this.commentInput.setValue(newValue), this.commentInput.selectRange(newRangeStart, newRangeEnd);
            }
        }
        static modeToProperty(mode) {
            return "replyInSection" === mode ? "addReply" : mode;
        }
        static getLastActiveCommentForm() {
            return cd.commentForms.slice().sort(lastFocused)[0] || null;
        }
        static getLastActiveAlteredCommentForm() {
            return cd.commentForms.slice().sort(lastFocused).find(commentForm => commentForm.isAltered()) || null;
        }
    }
    var _sectionHeadline = new WeakMap, _standardButtonsTotalWidth = new WeakMap, _standardSubmitButtonLabel = new WeakMap, _shortSubmitButtonLabel = new WeakMap, _lastPreviewTimestamp = new WeakMap, _previewTimeout = new WeakMap, _genderRequestCallbackList = new WeakMap, _dontAutopreview = new WeakMap, _editingSectionOpeningComment = new WeakMap, _headlineInputPurpose = new WeakMap;
    var CommentSkeleton_parser = new WeakMap, _cachedSection = new WeakMap;
    function calculateWordsOverlap(s1, s2) {
        const regexp = new RegExp("[".concat(cd.g.LETTER_PATTERN, "]{3,}"), "g"), words1 = removeDuplicates(s1.match(regexp)), words2 = removeDuplicates(s2.match(regexp));
        if (!words1 || !words2) return 0;
        let total = words2.length, overlap = 0;
        return words1.forEach(word1 => {
            words2.some(word2 => word2 === word1) ? overlap++ : total++;
        }), overlap / total;
    }
    class Comment_Comment extends class {
        constructor(parser, signature) {
            CommentSkeleton_parser.set(this, {
                writable: !0,
                value: void 0
            }), _cachedSection.set(this, {
                writable: !0,
                value: void 0
            }), classPrivateFieldSet_default()(this, CommentSkeleton_parser, parser);
            let parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).collectParts(signature.element);
            parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).removeNestedParts(parts), 
            parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).encloseInlineParts(parts, signature.element), 
            parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).filterParts(parts), 
            parts.reverse(), parts = classPrivateFieldGet_default()(this, CommentSkeleton_parser).replaceListsWithItems(parts, signature.element), 
            this.id = cd.comments.length, this.date = signature.date || null, this.timestamp = signature.timestampText, 
            this.authorName = signature.authorName, this.own = this.authorName === cd.g.CURRENT_USER_NAME, 
            this.anchor = signature.anchor, this.unsigned = signature.unsigned, this.parts = parts, 
            this.elements = this.parts.map(part => part.node);
            if (this.highlightables = this.elements.filter(el => !/^H[1-6]$/.test(el.tagName) && !cd.g.UNHIGHLIGHTABLE_ELEMENTS_CLASSES.some(name => el.classList.contains(name)) && !/float: *(?:left|right)/.test(el.getAttribute("style"))), 
            !this.highlightables.length) throw new CdError;
            if (this.addAttributes(), this.setLevels(), this.parts[0].isHeading ? (this.followsHeading = !0, 
            0 !== this.level && (this.parts.splice(0, 1), this.elements.splice(0, 1))) : this.followsHeading = !0, 
            this.parts[0].isHeading) {
                this.isOpeningSection = !0;
                const headingLevelMatch = this.parts[0].node.tagName.match(/^H([1-6])$/);
                this.openingSectionOfLevel = headingLevelMatch && Number(headingLevelMatch[1]);
            } else this.isOpeningSection = !1;
        }
        addAttributes() {
            this.anchor && !this.elements[0].getAttribute("id") && this.elements[0].setAttribute("id", this.anchor), 
            this.elements[0].classList.add("cd-commentPart-first"), this.elements[this.elements.length - 1].classList.add("cd-commentPart-last"), 
            this.elements.forEach(el => {
                el.classList.add("cd-commentPart"), el.setAttribute("data-comment-id", String(this.id));
            });
        }
        setLevels() {
            const levelElements = {};
            levelElements.top = classPrivateFieldGet_default()(this, CommentSkeleton_parser).getLevelsUpTree(this.highlightables[0]), 
            levelElements.bottom = this.highlightables.length > 1 ? classPrivateFieldGet_default()(this, CommentSkeleton_parser).getLevelsUpTree(this.highlightables[this.highlightables.length - 1]) : levelElements.top, 
            this.level = Math.min(levelElements.top.length, levelElements.bottom.length);
            for (let i = 0; i < this.level; i++) levelElements.top[i] && levelElements.top[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1)), 
            levelElements.bottom[i] && levelElements.bottom[i] !== levelElements.top[i] && levelElements.bottom[i].classList.add("cd-commentLevel", "cd-commentLevel-".concat(i + 1));
        }
        getSection() {
            return cd.sections.slice().reverse().find(section => section.comments.includes(this)) || null;
        }
        get section() {
            return void 0 === classPrivateFieldGet_default()(this, _cachedSection) && classPrivateFieldSet_default()(this, _cachedSection, this.getSection()), 
            classPrivateFieldGet_default()(this, _cachedSection);
        }
        get sourcePage() {
            return this.section ? this.section.sourcePage : cd.g.CURRENT_PAGE;
        }
    } {
        constructor(parser, signature) {
            super(parser, signature), Comment_elementPrototypes.set(this, {
                writable: !0,
                value: void 0
            }), _firstWidth.set(this, {
                writable: !0,
                value: void 0
            }), _underlay.set(this, {
                writable: !0,
                value: void 0
            }), _layersTop.set(this, {
                writable: !0,
                value: void 0
            }), _layersLeft.set(this, {
                writable: !0,
                value: void 0
            }), _layersWidth.set(this, {
                writable: !0,
                value: void 0
            }), _layersHeight.set(this, {
                writable: !0,
                value: void 0
            }), _overlay.set(this, {
                writable: !0,
                value: void 0
            }), _overlayInnerWrapper.set(this, {
                writable: !0,
                value: void 0
            }), _overlayContent.set(this, {
                writable: !0,
                value: void 0
            }), _overlayGradient.set(this, {
                writable: !0,
                value: void 0
            }), _unhighlightTimeout.set(this, {
                writable: !0,
                value: void 0
            }), Comment_cached$elements.set(this, {
                writable: !0,
                value: void 0
            }), _cachedCommentText.set(this, {
                writable: !0,
                value: void 0
            }), _cachedParent.set(this, {
                writable: !0,
                value: void 0
            }), _cachedUnderlayContainer.set(this, {
                writable: !0,
                value: void 0
            }), classPrivateFieldSet_default()(this, Comment_elementPrototypes, cd.g.COMMENT_ELEMENT_PROTOTYPES), 
            this.author = userRegistry.getUser(this.authorName), delete this.authorName, this.signatureElement = signature.element, 
            this.timestampElement = signature.timestampElement;
            const frozen = !cd.g.isPageActive || cd.g.specialElements.closedDiscussions.some(el => el.contains(this.elements[0]));
            this.actionable = !frozen, this.highlightables.forEach(el => {
                this.bindEvents(el);
            });
        }
        bindEvents(el) {
            el.onmouseenter = this.highlightFocused.bind(this), el.onmouseleave = this.unhighlightFocused.bind(this), 
            el.ontouchstart = this.highlightFocused.bind(this);
        }
        getPositions(config = {}) {
            if (void 0 === config.considerFloating && (config.considerFloating = !1), this.positions = null, 
            this.editForm) return;
            let rectTop = config.rectTop || this.highlightables[0].getBoundingClientRect(), rectBottom = config.rectBottom || (1 === this.elements.length ? rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect());
            if (0 === rectTop.left) return;
            const top = window.pageYOffset + rectTop.top, bottom = window.pageYOffset + rectBottom.bottom;
            if (config.considerFloating) {
                const intersectsFloating = (config.floatingRects || cd.g.specialElements.floating.map(el => {
                    const nativeRect = el.getBoundingClientRect();
                    return {
                        top: nativeRect.top - Number(el.getAttribute("data-margin-top")),
                        bottom: nativeRect.bottom + Number(el.getAttribute("data-margin-bottom"))
                    };
                })).some(rect => {
                    const floatingTop = window.pageYOffset + rect.top, floatingBottom = window.pageYOffset + rect.bottom;
                    return bottom > floatingTop && bottom < floatingBottom + cd.g.REGULAR_LINE_HEIGHT;
                }), initialOverflows = [];
                if (intersectsFloating) for (let i = 0; i < this.elements.length; i++) initialOverflows[i] = this.elements[i].style.overflow, 
                this.elements[i].style.overflow = "hidden";
                if (rectTop = this.highlightables[0].getBoundingClientRect(), rectBottom = 1 === this.elements.length ? rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect(), 
                intersectsFloating) for (let i = 0; i < this.elements.length; i++) this.elements[i].style.overflow = initialOverflows[i];
            }
            const left = window.pageXOffset + Math.min(rectTop.left, rectBottom.left), right = window.pageXOffset + Math.max(rectTop.right, rectBottom.right), downplayedBottom = bottom - top > window.innerHeight - 200 ? top + (window.innerHeight - 200) : bottom;
            this.positions = {
                top: top,
                bottom: bottom,
                left: left,
                right: right,
                downplayedBottom: downplayedBottom
            };
        }
        calculateLayersPositions(config = {}) {
            if (this.getPositions(Object.assign({}, config, {
                considerFloating: !0
            })), !this.positions) return null;
            classPrivateFieldSet_default()(this, _firstWidth, this.highlightables[0].offsetWidth);
            const layersContainerOffset = this.getLayersContainerOffset();
            return {
                underlayTop: -layersContainerOffset.top + this.positions.top,
                underlayLeft: -layersContainerOffset.left + this.positions.left - cd.g.COMMENT_UNDERLAY_SIDE_MARGIN,
                underlayWidth: this.positions.right - this.positions.left + 2 * cd.g.COMMENT_UNDERLAY_SIDE_MARGIN,
                underlayHeight: this.positions.bottom - this.positions.top
            };
        }
        createLayers() {
            if (classPrivateFieldSet_default()(this, _underlay, classPrivateFieldGet_default()(this, Comment_elementPrototypes).underlay.cloneNode(!0)), 
            this.newness && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-new"), 
            cd.settings.highlightOwnComments && this.own && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-own"), 
            classPrivateFieldGet_default()(this, _underlay).cdTarget = this, commentLayers.underlays.push(classPrivateFieldGet_default()(this, _underlay)), 
            classPrivateFieldSet_default()(this, _overlay, classPrivateFieldGet_default()(this, Comment_elementPrototypes).overlay.cloneNode(!0)), 
            classPrivateFieldSet_default()(this, _overlayInnerWrapper, classPrivateFieldGet_default()(this, _overlay).firstChild), 
            classPrivateFieldGet_default()(this, _overlayInnerWrapper).oncontextmenu = e => {
                e.preventDefault(), classPrivateFieldGet_default()(this, _overlay).style.display = "none";
            }, classPrivateFieldSet_default()(this, _overlayGradient, classPrivateFieldGet_default()(this, _overlayInnerWrapper).firstChild), 
            classPrivateFieldSet_default()(this, _overlayContent, classPrivateFieldGet_default()(this, _overlayInnerWrapper).lastChild), 
            this.parent && (this.goToParentButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).goToParentButton.cloneNode(!0), 
            this.goToParentButton.firstChild.onclick = () => {
                this.goToParent();
            }, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.goToParentButton)), 
            !this.anchor || cd.g.IS_ARCHIVE_PAGE && "diff" === cd.settings.defaultCommentLinkType || (this.linkButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).linkButton.cloneNode(!0), 
            this.linkButton.firstChild.onclick = this.copyLink.bind(this), classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.linkButton)), 
            this.author.registered && this.date && !this.own && !cd.g.IS_ARCHIVE_PAGE && (this.thankButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).thankButton.cloneNode(!0), 
            this.thankButton.firstChild.onclick = () => {
                this.thank();
            }, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.thankButton)), 
            this.actionable) (this.own || cd.settings.allowEditOthersComments) && (this.editButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).editButton.cloneNode(!0), 
            this.editButton.firstChild.onclick = () => {
                this.edit();
            }, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.editButton)), 
            this.replyButton = classPrivateFieldGet_default()(this, Comment_elementPrototypes).replyButton.cloneNode(!0), 
            this.replyButton.firstChild.onclick = () => {
                this.replyForm ? this.replyForm.cancel() : this.reply();
            }, classPrivateFieldGet_default()(this, _overlayContent).appendChild(this.replyButton); else {
                const treeWalker = new treeWalker_ElementsTreeWalker(this.elements[this.elements.length - 1]);
                for (;treeWalker.parentNode(); ) {
                    const backgroundColor = window.getComputedStyle(treeWalker.currentNode).backgroundColor;
                    if (backgroundColor.includes("rgb(")) {
                        this.backgroundColor = backgroundColor;
                        break;
                    }
                }
            }
            this.$underlay = $(classPrivateFieldGet_default()(this, _underlay)), this.$overlay = $(classPrivateFieldGet_default()(this, _overlay)), 
            this.$overlayContent = $(classPrivateFieldGet_default()(this, _overlayContent)), 
            this.$overlayGradient = $(classPrivateFieldGet_default()(this, _overlayGradient));
        }
        configureLayers(doSet = !0, floatingRects) {
            if (this.editForm) return null;
            const config = {
                doSet: doSet,
                floatingRects: floatingRects
            };
            config.rectTop = this.highlightables[0].getBoundingClientRect(), config.rectBottom = 1 === this.elements.length ? config.rectTop : this.highlightables[this.highlightables.length - 1].getBoundingClientRect();
            const layersContainerOffset = this.getLayersContainerOffset(), isMoved = classPrivateFieldGet_default()(this, _underlay) && (-layersContainerOffset.top + window.pageYOffset + config.rectTop.top !== classPrivateFieldGet_default()(this, _layersTop) || config.rectBottom.bottom - config.rectTop.top !== classPrivateFieldGet_default()(this, _layersHeight) || this.highlightables[0].offsetWidth !== classPrivateFieldGet_default()(this, _firstWidth));
            if (!classPrivateFieldGet_default()(this, _underlay) || isMoved) {
                const positions = this.calculateLayersPositions(config);
                positions && (classPrivateFieldSet_default()(this, _layersTop, positions.underlayTop), 
                classPrivateFieldSet_default()(this, _layersLeft, positions.underlayLeft), classPrivateFieldSet_default()(this, _layersWidth, positions.underlayWidth), 
                classPrivateFieldSet_default()(this, _layersHeight, positions.underlayHeight));
            }
            return void 0 === classPrivateFieldGet_default()(this, _layersLeft) ? null : classPrivateFieldGet_default()(this, _underlay) ? (this.newness && !classPrivateFieldGet_default()(this, _underlay).classList.contains("cd-commentUnderlay-new") && classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-new"), 
            isMoved && config.doSet && this.updateLayersPositions(), isMoved) : (this.createLayers(), 
            config.doSet && this.addLayers(), !1);
        }
        addLayers() {
            classPrivateFieldGet_default()(this, _underlay) && (this.updateLayersPositions(), 
            this.getLayersContainer().appendChild(classPrivateFieldGet_default()(this, _underlay)), 
            this.getLayersContainer().appendChild(classPrivateFieldGet_default()(this, _overlay)));
        }
        updateLayersPositions() {
            classPrivateFieldGet_default()(this, _underlay).style.top = classPrivateFieldGet_default()(this, _overlay).style.top = classPrivateFieldGet_default()(this, _layersTop) + "px", 
            classPrivateFieldGet_default()(this, _underlay).style.left = classPrivateFieldGet_default()(this, _overlay).style.left = classPrivateFieldGet_default()(this, _layersLeft) + "px", 
            classPrivateFieldGet_default()(this, _underlay).style.width = classPrivateFieldGet_default()(this, _overlay).style.width = classPrivateFieldGet_default()(this, _layersWidth) + "px", 
            classPrivateFieldGet_default()(this, _underlay).style.height = classPrivateFieldGet_default()(this, _overlay).style.height = classPrivateFieldGet_default()(this, _layersHeight) + "px";
        }
        highlightFocused() {
            cd.util.isPageOverlayOn() || !this.configureLayers() && classPrivateFieldGet_default()(this, _underlay) && (classPrivateFieldGet_default()(this, _underlay).classList.add("cd-commentUnderlay-focused"), 
            classPrivateFieldGet_default()(this, _overlay).classList.add("cd-commentOverlay-focused"));
        }
        unhighlightFocused() {
            classPrivateFieldGet_default()(this, _underlay) && (classPrivateFieldGet_default()(this, _underlay).classList.remove("cd-commentUnderlay-focused"), 
            classPrivateFieldGet_default()(this, _overlay).classList.remove("cd-commentOverlay-focused"), 
            classPrivateFieldGet_default()(this, _overlay).style.display = "");
        }
        highlightTarget() {
            if (this.configureLayers(), !this.$underlay) return;
            const $elementsToAnimate = this.$underlay.add(this.$overlayContent).add(this.$overlayGradient).css("background-image", "none").css("background-color", "");
            let initialColor = window.getComputedStyle(this.$underlay.get(0)).backgroundColor;
            "rgba(0, 0, 0, 0)" === initialColor && this.backgroundColor && (initialColor = this.backgroundColor), 
            this.$underlay.addClass("cd-commentUnderlay-target");
            const targetColor = window.getComputedStyle(this.$underlay.get(0)).backgroundColor;
            this.$underlay.removeClass("cd-commentUnderlay-target"), $elementsToAnimate.stop().css("background-color", targetColor), 
            clearTimeout(classPrivateFieldGet_default()(this, _unhighlightTimeout)), classPrivateFieldSet_default()(this, _unhighlightTimeout, setTimeout(() => {
                this.newness && (initialColor = cd.g.COMMENT_UNDERLAY_NEW_COLOR), $elementsToAnimate.animate({
                    backgroundColor: initialColor
                }, 400, "swing", (function() {
                    $(this).css("background-image", "").css("background-color", "");
                }));
            }, 1500));
        }
        scrollIntoView(alignment) {
            (this.editForm ? this.editForm.$element : this.$elements).cdScrollIntoView(alignment);
        }
        scrollToAndHighlightTarget(smooth = !0) {
            (this.editForm ? this.editForm.$element : this.$elements).cdScrollTo(this.isOpeningSection || this.editForm ? "top" : "center", smooth), 
            this.highlightTarget();
        }
        replaceButton(button, replacement, buttonName) {
            classPrivateFieldGet_default()(this, _overlayContent).insertBefore(replacement, button), 
            button.parentNode.removeChild(button), this[buttonName + "Button"] = replacement;
        }
        goToParent() {
            if (!this.parent) return void console.error("This comment has no parent.");
            this.parent.scrollToAndHighlightTarget("center");
            const goToChildButton = new OO.ui.ButtonWidget({
                label: cd.s("cm-gotochild"),
                title: cd.s("cm-gotochild-tooltip"),
                framed: !1,
                classes: [ "cd-button", "cd-commentButton" ]
            });
            goToChildButton.on("click", () => {
                this.parent.goToChild();
            }), this.parent.$underlay || this.parent.configureLayers(), this.parent.goToChildButton && this.parent.goToChildButton.$element.remove(), 
            this.parent.$overlayContent.prepend(goToChildButton.$element), this.parent.goToChildButton = goToChildButton, 
            this.parent.childToScrollBackTo = this;
        }
        goToChild() {
            this.childToScrollBackTo ? this.childToScrollBackTo.scrollToAndHighlightTarget("center") : console.error("This comment has no child from which the user has navigated earlier.");
        }
        copyLink(e) {
            const linkButton = this.linkButton;
            this.replaceButton(this.linkButton, classPrivateFieldGet_default()(this, Comment_elementPrototypes).pendingLinkButton.cloneNode(!0), "link"), 
            copyLink(this, e.shiftKey, () => {
                this.replaceButton(this.linkButton, linkButton, "link");
            });
        }
        findAddingEdit(singleTimestamp = !1, requestGender = !1) {
            var _this = this;
            return asyncToGenerator_default()((function*() {
                if (singleTimestamp && _this.addingEditOneTimestamp) return _this.addingEditOneTimestamp;
                if (!singleTimestamp && _this.addingEdit) return _this.addingEdit;
                const rvstart = new Date(_this.date.getTime() - 2 * cd.g.MILLISECONDS_IN_A_MINUTE).toISOString(), rvend = new Date(_this.date.getTime() + 2 * cd.g.MILLISECONDS_IN_A_MINUTE).toISOString(), revisionsRequest = cd.g.api.get({
                    action: "query",
                    titles: _this.sourcePage,
                    prop: "revisions",
                    rvprop: [ "ids", "flags", "comment", "timestamp" ],
                    rvdir: "newer",
                    rvstart: rvstart,
                    rvend: rvend,
                    rvuser: _this.author.name,
                    rvlimit: 500,
                    redirects: !0,
                    formatversion: 2
                }).catch(handleApiReject);
                let [revisionsResp] = yield Promise.all([ revisionsRequest, requestGender && _this.author.registered ? getUserGenders([ _this.author ]) : void 0 ].filter(defined));
                const revisions = revisionsResp && revisionsResp.query && revisionsResp.query.pages && revisionsResp.query.pages[0] && revisionsResp.query.pages[0].revisions;
                if (!revisions) throw new CdError({
                    type: "api",
                    code: "noData"
                });
                const compareRequests = revisions.map(revision => cd.g.api.get({
                    action: "compare",
                    fromtitle: _this.sourcePage,
                    fromrev: revision.revid,
                    torelative: "prev",
                    prop: "diff|diffsize",
                    formatversion: 2
                }).catch(handleApiReject)), compareData = yield Promise.all(compareRequests), regexp = /<td colspan="2" class="diff-empty">&#160;<\/td>\s*<td class="diff-marker">\+<\/td>\s*<td class="diff-addedline"><div>(?!=)(.+?)<\/div><\/td>\s*<\/tr>/g, thisTextAndSignature = _this.getText(!1) + " ".concat(_this.signatureElement.innerText);
                let bestMatch;
                if (compareData.map((data, i) => {
                    const body = data && data.compare && data.compare.body;
                    if (!body) return null;
                    let match, text = "", bestDiffPartOverlap = 0;
                    for (;match = regexp.exec(body); ) {
                        const diffPartText = removeWikiMarkup(decodeHtmlEntities(match[1])), diffPartOverlap = calculateWordsOverlap(diffPartText, thisTextAndSignature);
                        diffPartOverlap > .66 && (!bestDiffPartOverlap || diffPartOverlap > bestDiffPartOverlap) && (bestDiffPartOverlap = diffPartOverlap), 
                        text += diffPartText + "\n";
                    }
                    if (text = text.trim(), !text) return null;
                    revisions[i].diffBody = body;
                    const timestamp = new Date(revisions[i].timestamp).getTime(), thisCommentTimestamp = _this.date.getTime() + 3e4, overlap = calculateWordsOverlap(text, thisTextAndSignature), timezoneMatch = text.match(cd.g.TIMEZONE_REGEXP);
                    return {
                        revision: revisions[i],
                        overlap: Math.max(bestDiffPartOverlap, overlap),
                        dateProximity: Math.abs(thisCommentTimestamp - timestamp),
                        minor: revisions[i].minor,
                        moreThanOneTimestamp: text.includes("\n") && timezoneMatch && timezoneMatch.length > 1
                    };
                }).filter(notNull).forEach(match => {
                    match.overlap < .66 || ((!bestMatch || match.overlap > bestMatch.overlap) && (bestMatch = match), 
                    bestMatch && match.overlap === bestMatch.overlap && (match.dateProximity > bestMatch.dateProximity && (bestMatch = match), 
                    match.dateProximity === bestMatch.dateProximity && !match.minor && bestMatch.minor && (bestMatch = match)));
                }), singleTimestamp && bestMatch && bestMatch.moreThanOneTimestamp) throw new CdError({
                    type: "parse",
                    code: "moreThanOneTimestamp",
                    data: {
                        edit: bestMatch.revision
                    }
                });
                if (!bestMatch) throw new CdError({
                    type: "parse"
                });
                const result = bestMatch.revision;
                return singleTimestamp ? _this.addingEditOneTimestamp = result : _this.addingEdit = result, 
                result;
            }))();
        }
        getDiffLink() {
            var _this2 = this;
            return asyncToGenerator_default()((function*() {
                const edit = yield _this2.findAddingEdit(), urlEnding = decodeURI(mw.util.getUrl(cd.g.CURRENT_PAGE, {
                    diff: edit.revid
                }));
                return "https:".concat(mw.config.get("wgServer")).concat(urlEnding);
            }))();
        }
        thank() {
            var _this3 = this;
            return asyncToGenerator_default()((function*() {
                const thankButton = _this3.thankButton;
                _this3.replaceButton(_this3.thankButton, classPrivateFieldGet_default()(_this3, Comment_elementPrototypes).pendingThankButton.cloneNode(!0), "thank");
                const thankFail = e => {
                    const {type: type, code: code, data: data} = e.data;
                    let text;
                    switch (type) {
                      case "parse":
                        if ("moreThanOneTimestamp" === code) {
                            const url = mw.util.getUrl(_this3.sourcePage, {
                                diff: data.edit.revid
                            });
                            return text = cd.util.wrapInElement(cd.s("thank-error-multipletimestamps", url)), 
                            void OO.ui.alert(text);
                        }
                        {
                            const url = mw.util.getUrl(_this3.sourcePage, {
                                action: "history"
                            });
                            text = cd.s("thank-error-diffnotfound", url);
                        }
                        break;

                      case "api":
                      default:
                        if ("noData" === code) {
                            const url = mw.util.getUrl(_this3.sourcePage, {
                                action: "history"
                            });
                            text = cd.s("thank-error-diffnotfound", url);
                        } else text = cd.s("thank-error"), console.warn(e);
                        break;

                      case "network":
                        text = cd.s("thank-error-network");
                    }
                    mw.notify(cd.util.wrapInElement(text), {
                        type: "error"
                    }), _this3.replaceButton(_this3.thankButton, thankButton, "thank");
                };
                let edit;
                try {
                    edit = yield _this3.findAddingEdit(!0, cd.g.GENDER_AFFECTS_USER_STRING);
                } catch (e) {
                    return void thankFail(e);
                }
                mw.loader.load("mediawiki.diff.styles");
                const url = mw.util.getUrl(_this3.sourcePage, {
                    diff: edit.revid
                }), $question = cd.util.wrapInElement(cd.s("thank-confirm", _this3.author.name, _this3.author, url), "div"), $text = $("<div>").append($question, cd.util.wrapDiffBody(edit.diffBody));
                if (yield OO.ui.confirm($text, {
                    size: "larger"
                })) {
                    try {
                        yield cd.g.api.postWithEditToken({
                            action: "thank",
                            rev: edit.revid,
                            source: cd.config.scriptCodeName
                        }).catch(handleApiReject);
                    } catch (e) {
                        return void thankFail(e);
                    }
                    mw.notify(cd.s("thank-success")), _this3.replaceButton(_this3.thankButton, classPrivateFieldGet_default()(_this3, Comment_elementPrototypes).disabledThankButton.cloneNode(!0), "thank");
                } else _this3.replaceButton(_this3.thankButton, thankButton, "thank");
            }))();
        }
        locateInCode(pageCode) {
            this.inCode = null, cd.debug.startTimer("locate comment");
            const matches = this.searchInCode(pageCode);
            let bestMatch;
            if (matches.forEach(match => {
                (match.overlap > .66 || 0 === this.id && match.previousCommentsMatched && match.headlineMatched) && (!bestMatch || match.overlap > bestMatch.overlap || !bestMatch.headlineMatched && match.headlineMatched || bestMatch.headlineMatched === match.headlineMatched && !bestMatch.previousCommentMatched && match.previousCommentMatched) && (bestMatch = match);
            }), bestMatch || (bestMatch = matches.find(match => 0 !== this.id && match.previousCommentsMatched)), 
            !bestMatch) throw new CdError({
                type: "parse",
                code: "couldntLocateComment"
            });
            this.inCode = this.adjustCommentCodeData({
                lineStartIndex: bestMatch.lineStartIndex,
                startIndex: bestMatch.commentStartIndex,
                endIndex: bestMatch.signatureStartIndex,
                code: bestMatch.commentCode,
                dirtySignature: bestMatch.dirtySignature,
                indentationChars: bestMatch.indentationChars,
                headingStartIndex: bestMatch.headingStartIndex,
                headingLevel: bestMatch.headingLevel,
                headlineCode: bestMatch.headlineCode
            }), cd.debug.stopTimer("locate comment");
        }
        reply(dataToRestore) {
            this.replyForm || (this.replyForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
                mode: "reply",
                target: this,
                dataToRestore: dataToRestore
            }));
        }
        edit(dataToRestore) {
            this.editForm || (this.editForm = dataToRestore instanceof CommentForm_CommentForm ? dataToRestore : new CommentForm_CommentForm({
                mode: "edit",
                target: this,
                dataToRestore: dataToRestore
            })), this.$elements.addClass("cd-hidden"), this.removeLayers();
        }
        codeToText() {
            if (!this.inCode) return void console.error("The Comment.prototype.inCode property should contain an object with the comment code data.");
            let hidden, {code: code, indentationChars: indentationChars} = this.inCode;
            if (void 0 === code || void 0 === indentationChars) return void console.error('No "code" or "indentationChars" property is set for Comment.prototype.inCode.');
            ({code: code, hidden: hidden} = hideSensitiveCode(code));
            let text = code;
            if (0 === this.level && (text = text.replace(/^(.*[^}|>\n\x02\x04] *)\n(?![{|<:*# \n\x01\x03])/gm, (s, m1) => m1 + (/^[:*# ]/.test(m1) || /(?:\x02|<\w+(?: [\w ]+?=[^<>]+?| ?\/?)>|<\/\w+ ?>)$/.test(m1) ? "\n" : " "))), 
            text = text.replace(/^(?![:*# ]).*<br[ \n]*\/?>.*$/gim, s => s.replace(/<br[ \n]*\/?>\n? */gi, () => "\n")).replace(/\n([:*#]*[:*])([ \t]*)/g, (s, m1, m2) => "\n" + (m1.length >= indentationChars.length ? m1.slice(indentationChars.length) + (m1.length > indentationChars.length ? m2 : "") : m1 + m2)), 
            text = unhideSensitiveCode(text, hidden), cd.config.paragraphTemplates.length) {
                const pattern = cd.config.paragraphTemplates.map(caseInsensitiveFirstCharPattern).join("|"), regexp = new RegExp("^((?!:|\\*|#).*)\\{\\{(?:".concat(pattern, ")\\}\\}"), "gm");
                text = text.replace(regexp, "$1\n\n");
            }
            return text.trim();
        }
        getCode() {
            var _this4 = this;
            return asyncToGenerator_default()((function*() {
                try {
                    const page = yield getLastRevision(_this4.sourcePage);
                    _this4.locateInCode(page.code);
                } catch (e) {
                    throw e instanceof CdError ? new CdError(Object.assign({}, {
                        message: cd.s("cf-error-getpagecode")
                    }, e.data)) : e;
                }
                return {
                    commentText: _this4.codeToText(),
                    headline: _this4.inCode.headlineCode
                };
            }))();
        }
        registerSeen(registerAllInDirection, highlight = !1) {
            if ("unseen" === this.newness && (this.newness = "new", js_navPanel.decrementUnseenCommentCount(), 
            highlight && this.highlightTarget()), registerAllInDirection && !js_navPanel.areAllCommentsSeen()) {
                const nextComment = cd.comments[this.id + ("forward" === registerAllInDirection ? 1 : -1)];
                nextComment && nextComment.isInViewport(!0) && nextComment.registerSeen(registerAllInDirection, highlight);
            }
        }
        isInViewport(updatePositions = !1, partially = !1) {
            const viewportTop = window.pageYOffset, viewportBottom = viewportTop + window.innerHeight;
            return !updatePositions && this.positions || this.getPositions(), this.positions ? partially ? this.positions.downplayedBottom > viewportTop && this.positions.top < viewportBottom : this.positions.top >= viewportTop && this.positions.downplayedBottom <= viewportBottom : null;
        }
        removeLayers() {
            classPrivateFieldGet_default()(this, _underlay) && (commentLayers.underlays.splice(commentLayers.underlays.indexOf(classPrivateFieldGet_default()(this, _underlay)), 1), 
            classPrivateFieldGet_default()(this, _underlay).parentElement.removeChild(classPrivateFieldGet_default()(this, _underlay)), 
            classPrivateFieldSet_default()(this, _underlay, null), this.$underlay = null, classPrivateFieldGet_default()(this, _overlay).parentElement.removeChild(classPrivateFieldGet_default()(this, _overlay)), 
            classPrivateFieldSet_default()(this, _overlay, null), this.$overlay = null);
        }
        get $elements() {
            return void 0 === classPrivateFieldGet_default()(this, Comment_cached$elements) && classPrivateFieldSet_default()(this, Comment_cached$elements, $(this.elements)), 
            classPrivateFieldGet_default()(this, Comment_cached$elements);
        }
        get text() {
            return void 0 === classPrivateFieldGet_default()(this, _cachedCommentText) && classPrivateFieldSet_default()(this, _cachedCommentText, this.getText()), 
            classPrivateFieldGet_default()(this, _cachedCommentText);
        }
        get parent() {
            return void 0 === classPrivateFieldGet_default()(this, _cachedParent) && classPrivateFieldSet_default()(this, _cachedParent, this.getParent()), 
            classPrivateFieldGet_default()(this, _cachedParent);
        }
        getParent() {
            let level = this.level;
            if (cd.g.specialElements.pageHasOutdents) {
                const treeWalker = new treeWalker_ElementsTreeWalker(this.elements[0]);
                let found;
                for (;!found && treeWalker.previousNode() && !treeWalker.currentNode.classList.contains("cd-commentPart"); ) found = treeWalker.currentNode.classList.contains("outdent-template");
                if (found && cd.comments[this.id - 1]) return cd.comments[this.id - 1];
            }
            return 0 === level ? null : cd.comments.slice(0, this.id).reverse().find(comment => comment.section === this.section && comment.level < level) || null;
        }
        getText(doCleanUp = !0) {
            const $clone = this.$elements.not("h1, h2, h3, h4, h5, h6").clone().removeClass("cd-hidden"), $dummy = $("<div>").append($clone), selector = [ ".cd-signature", cd.config.unsignedClass ? ".".concat(cd.config.unsignedClass) : void 0 ].filter(defined).join(", ");
            $dummy.find(selector).remove();
            let text = $dummy.cdGetText();
            return doCleanUp && (cd.config.signatureEndingRegexp && (text = text.replace(cd.config.signatureEndingRegexp, "")), 
            cd.config.signaturePrefixRegexp && (text = text.replace(cd.config.signaturePrefixRegexp, ""))), 
            text;
        }
        adjustCommentBeginning(commentCode, commentStartIndex) {
            let indentationChars = "", lineStartIndex = commentStartIndex;
            const headingMatch = commentCode.match(/(^[^]*(?:^|\n))(=+)(.*?)\2[ \t]*(?:<!--[^]*?-->[ \t]*)*\n/);
            let headingStartIndex, headingLevel, headlineCode;
            if (headingMatch && (headingStartIndex = commentStartIndex + headingMatch[1].length, 
            headingLevel = headingMatch[2].length, headlineCode = headingMatch[3].trim(), commentStartIndex += headingMatch[0].length, 
            commentCode = commentCode.slice(headingMatch[0].length)), cd.config.signatureEndingRegexp) {
                const regexp = new RegExp(cd.config.signatureEndingRegexp.source, "m"), linesRegexp = /^(.+)\n/gm;
                let line, indent;
                for (;line = linesRegexp.exec(commentCode); ) if (regexp.test(removeWikiMarkup(line[1]))) {
                    const testIndent = line.index + line[0].length;
                    if (testIndent === commentCode.length) break;
                    indent = testIndent;
                }
                indent && (commentCode = commentCode.slice(indent), lineStartIndex += indent, commentStartIndex += indent);
            }
            if (this.level > 0) {
                const replaceIndentationChars = (s, m1, m2) => (indentationChars = m2, lineStartIndex += m1.length, 
                commentStartIndex += s.length, ""), indentationCharsPattern = cd.config.customIndentationCharsPattern || "\\n*([:*#]*) *";
                commentCode = commentCode.replace(new RegExp("^()".concat(indentationCharsPattern)), replaceIndentationChars), 
                "" === indentationChars && (commentCode = commentCode.replace(new RegExp("(^[^]*?(?:^|\n))".concat(indentationCharsPattern, "(?![^]*\\n[^:*#])")), replaceIndentationChars));
            }
            return cd.g.BAD_COMMENT_BEGINNINGS.forEach(pattern => {
                "^" !== pattern.source[0] && console.debug('Regexps in cd.config.customBadCommentBeginnings should have "^" as the first character.');
                const match = commentCode.match(pattern);
                match && (commentStartIndex += match[0].length, commentCode = commentCode.slice(match[0].length));
            }), {
                commentCode: commentCode,
                lineStartIndex: lineStartIndex,
                commentStartIndex: commentStartIndex,
                headingMatch: headingMatch,
                headingStartIndex: headingStartIndex,
                headingLevel: headingLevel,
                headlineCode: headlineCode,
                indentationChars: indentationChars
            };
        }
        adjustCommentCodeData(originalData) {
            const data = Object.assign({}, originalData), movePartToSignature = s => (data.dirtySignature = s + data.dirtySignature, 
            data.endIndex -= s.length, "");
            this.own && cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP && (data.code = data.code.replace(cd.g.CURRENT_USER_SIGNATURE_PREFIX_REGEXP, movePartToSignature));
            const tagRegexp = /(<(?:small|span|sup|sub)(?: [\w ]+?=[^<>]+?)?> *)+$/i;
            var code;
            data.code = (code = data.code, [ cd.config.signaturePrefixRegexp, tagRegexp, cd.config.signaturePrefixRegexp, tagRegexp, /<small class="autosigned">.*$/, /<!-- *Template:Unsigned.*$/, cd.config.signaturePrefixRegexp ].forEach(regexp => {
                code = code.replace(regexp, movePartToSignature);
            }), code);
            const smallWrappers = [ {
                start: /^<small>/,
                end: /<\/small>[ \u00A0\t]*$/
            } ];
            if (cd.config.blockSmallTemplate && smallWrappers.push({
                start: new RegExp("^(?:\\{\\{".concat(cd.config.blockSmallTemplate, "\\|1=)")),
                end: /\}\}[ \u00A0\t]*$/
            }), data.signature = data.dirtySignature, data.inSmallFont = !1, smallWrappers.some(wrapper => {
                if (wrapper.start.test(data.code) && wrapper.end.test(data.signature)) return data.inSmallFont = !0, 
                data.code = data.code.replace(wrapper.start, ""), data.signature = data.signature.replace(wrapper.end, ""), 
                !0;
            }), data.replyIndentationChars = data.indentationChars, !this.isOpeningSection) {
                const match = data.code.match(/\n([:*#]*[:*]).*$/);
                if (match && (data.replyIndentationChars = match[1], data.replyIndentationChars.length < data.indentationChars.length)) {
                    const prefix = data.indentationChars.slice(data.replyIndentationChars.length) + " ";
                    data.code = prefix + data.code, data.indentationChars = data.indentationChars.slice(0, data.replyIndentationChars.length), 
                    data.startIndex -= prefix.length;
                }
            }
            return data.replyIndentationChars += cd.config.defaultIndentationChar, data;
        }
        searchInCode(pageCode) {
            const signatures = extractSignatures(pageCode), matches = signatures.filter(sig => sig.author === this.author && (this.timestamp === sig.timestamp || this.timestamp && this.timestamp.startsWith(sig.timestamp)));
            const previousComments = cd.comments.slice(Math.max(0, this.id - 2), this.id).reverse();
            return matches.forEach(match => {
                if (match.commentCode = pageCode.slice(match.commentStartIndex, match.signatureStartIndex), 
                previousComments.length) for (let i = 0; i < previousComments.length; i++) {
                    const signature = signatures[match.id - 1 - i];
                    if (match.previousCommentsMatched = signature && signature.timestamp === previousComments[i].timestamp && signature.author === previousComments[i].author, 
                    0 === i && (match.previousCommentMatched = match.previousCommentsMatched), !match.previousCommentsMatched) break;
                } else match.previousCommentsMatched = 0 === match.id, match.previousCommentMatched = 0 === match.id;
                Object.assign(match, this.adjustCommentBeginning(match.commentCode, match.commentStartIndex)), 
                match.headlineMatched = this.followsHeading ? match.headingMatch && this.section && this.section.headline && normalizeCode(removeWikiMarkup(match.headlineCode)) === normalizeCode(this.section.headline) : !match.headingMatch;
                const commentCodeToCompare = removeWikiMarkup(match.commentCode);
                match.overlap = calculateWordsOverlap(this.text, commentCodeToCompare);
            }), matches;
        }
        getLayersContainer() {
            if (void 0 === classPrivateFieldGet_default()(this, _cachedUnderlayContainer)) {
                let offsetParent;
                const treeWalker = new TreeWalker(document.body, null, !0, this.elements[0]);
                for (;treeWalker.parentNode(); ) {
                    let style = treeWalker.currentNode.cdStyle;
                    if (style || (style = window.getComputedStyle(treeWalker.currentNode), treeWalker.currentNode.cdStyle = style), 
                    [ "absolute", "relative" ].includes(style.position)) {
                        offsetParent = treeWalker.currentNode;
                        break;
                    }
                    if (style.backgroundColor.includes("rgb(")) {
                        offsetParent = treeWalker.currentNode, offsetParent.classList.add("cd-commentLayersContainerParent");
                        break;
                    }
                }
                offsetParent || (offsetParent = document.body);
                let container = offsetParent.firstElementChild;
                container.classList.contains("cd-commentLayersContainer") || (container = document.createElement("div"), 
                container.classList.add("cd-commentLayersContainer"), offsetParent.insertBefore(container, offsetParent.firstChild)), 
                classPrivateFieldSet_default()(this, _cachedUnderlayContainer, container), commentLayers.layersContainers.includes(container) || commentLayers.layersContainers.push(container);
            }
            return classPrivateFieldGet_default()(this, _cachedUnderlayContainer);
        }
        getLayersContainerOffset() {
            let offsetParent, el = this.getLayersContainer(), top = 0, left = 0;
            for (;offsetParent = el.offsetParent; ) top += offsetParent.offsetTop, left += offsetParent.offsetLeft, 
            el = offsetParent;
            return {
                top: top,
                left: left
            };
        }
        static findInViewport(findClosestDirection) {
            const viewportTop = window.pageYOffset, viewportBottom = viewportTop + window.innerHeight, isVisible = comment => (comment.getPositions(), 
            comment.positions), findVisible = (direction, startIndex = 0) => reorderArray(cd.comments, startIndex, "backward" === direction).find(isVisible) || null, firstVisibleComment = findVisible("forward"), lastVisibleComment = findVisible("backward", cd.comments.length - 1);
            if (!firstVisibleComment) return null;
            let foundComment, searchArea = {
                top: firstVisibleComment,
                bottom: lastVisibleComment
            }, currentComment = searchArea.top;
            const findClosest = (direction, searchArea, reverse = !1) => "forward" === direction ? findVisible(direction, reverse ? searchArea.top.id : searchArea.bottom.id) : "backward" === direction ? findVisible(direction, reverse ? searchArea.bottom.id : searchArea.top.id) : null;
            for (let i = 0; i < cd.comments.length; i++) {
                if (currentComment.isInViewport(!0)) {
                    foundComment = currentComment;
                    break;
                }
                if (currentComment.positions && currentComment === firstVisibleComment && viewportBottom < currentComment.positions.downplayedBottom || currentComment === lastVisibleComment && viewportTop > currentComment.positions.top) {
                    foundComment = findClosest(findClosestDirection, searchArea, !0);
                    break;
                }
                if (searchArea.top === searchArea.bottom) {
                    foundComment = findClosest(findClosestDirection, searchArea);
                    break;
                }
                if (currentComment.positions) if (currentComment === firstVisibleComment) currentComment = searchArea.bottom; else {
                    if (searchArea[viewportTop > currentComment.positions.top ? "top" : "bottom"] = currentComment, 
                    searchArea.bottom.id - searchArea.top.id <= 1) {
                        foundComment = findClosest(findClosestDirection, searchArea);
                        break;
                    }
                    const higherTop = searchArea.top.positions.top, proportion = (viewportTop - higherTop) / (searchArea.bottom.positions.downplayedBottom - viewportBottom + (viewportTop - higherTop));
                    (proportion < 0 || proportion >= 1) && console.warn("The proportion shouldn't be more than 0 or less or equal to 1.", "proportion", proportion, "searchArea", searchArea), 
                    currentComment = cd.comments[Math.round((searchArea.bottom.id - searchArea.top.id - 1) * proportion + searchArea.top.id + .5)];
                } else currentComment = cd.comments[searchArea.top.id + 1], searchArea.top = currentComment;
            }
            return foundComment || null;
        }
        static getCommentByAnchor(anchor) {
            return cd.comments && anchor && cd.comments.find(comment => comment.anchor === anchor) || null;
        }
    }
    var Comment_elementPrototypes = new WeakMap, _firstWidth = new WeakMap, _underlay = new WeakMap, _layersTop = new WeakMap, _layersLeft = new WeakMap, _layersWidth = new WeakMap, _layersHeight = new WeakMap, _overlay = new WeakMap, _overlayInnerWrapper = new WeakMap, _overlayContent = new WeakMap, _overlayGradient = new WeakMap, _unhighlightTimeout = new WeakMap, Comment_cached$elements = new WeakMap, _cachedCommentText = new WeakMap, _cachedParent = new WeakMap, _cachedUnderlayContainer = new WeakMap, worker = __webpack_require__(9), worker_default = __webpack_require__.n(worker);
    let colonMoved, goToCommentToYou, goToCommentWatchedSection, currentUserRegexp, $wrapperRegularPrototype, $wrapperInterestingPrototype, commentLinks_watchedSections, commentLinks_thisPageWatchedSections, switchInterestingButton, processDiffFirstRun = !0;
    function commentLinks_prepare(_x) {
        return js_commentLinks_prepare.apply(this, arguments);
    }
    function js_commentLinks_prepare() {
        return (js_commentLinks_prepare = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
            cd.g.api = cd.g.api || new mw.Api;
            const watchedSectionsRequest = getWatchedSections(!0).catch(e => {
                console.warn("Couldn't load the settings from the server.", e);
            });
            let watchedSectionsResult;
            messagesRequest = messagesRequest || loadMessages();
            try {
                [watchedSectionsResult] = yield Promise.all([ watchedSectionsRequest, messagesRequest ]);
            } catch (e) {
                throw [ "Couldn't load the messages required for the script.", e ];
            }
            ({watchedSections: commentLinks_watchedSections, thisPageWatchedSections: commentLinks_thisPageWatchedSections} = watchedSectionsResult || {}), 
            initTimestampParsingTools(), cd.g.nanoCss = Object(nano_css.create)(), cd.g.nanoCss.put(".cd-commentLink-innerWrapper", {
                "::before": {
                    content: '"'.concat(mw.msg("parentheses-start"), '"')
                },
                "::after": {
                    content: '"'.concat(mw.msg("parentheses-end"), '"')
                }
            }), cd.g.QQX_MODE = "qqx" === mw.util.getParamValue("uselang"), colonMoved = ":  ".concat(cd.s("es-move")), 
            goToCommentToYou = "".concat(cd.s("lp-comment-tooltip"), " ").concat(mw.msg("parentheses", cd.s("lp-comment-toyou"))), 
            goToCommentWatchedSection = "".concat(cd.s("lp-comment-tooltip"), " ").concat(mw.msg("parentheses", cd.s("lp-comment-watchedsection")));
            const $aRegularPrototype = $("<a>").text(cd.s("lp-comment")).attr("title", cd.s("lp-comment-tooltip")), $spanRegularPrototype = $("<span>").addClass("cd-commentLink-innerWrapper").append($aRegularPrototype);
            $wrapperRegularPrototype = $("<span>").addClass("cd-commentLink").append($spanRegularPrototype)[cd.g.IS_DIFF_PAGE ? "append" : "prepend"](document.createTextNode(" ")), 
            $wrapperInterestingPrototype = $wrapperRegularPrototype.clone().addClass("cd-commentLink-interesting");
            const currentUserNamePattern = caseInsensitiveFirstCharPattern(cd.g.CURRENT_USER_NAME).replace(/ /g, "[ _]");
            currentUserRegexp = new RegExp("(?:^|[^".concat(cd.g.LETTER_PATTERN, "])").concat(currentUserNamePattern, "(?![").concat(cd.g.LETTER_PATTERN, "])"));
        }))).apply(this, arguments);
    }
    function addWatchlistMenu() {
        mw.hook("wikipage.content").add(() => {
            switchInterestingButton && switchInterestingButton.setFlags({
                progressive: !1
            });
        });
        const $menu = $("<fieldset>").addClass("cd-watchlistMenu"), $legend = $("<legend>").addClass("cd-watchlistMenu-legend").appendTo($menu);
        $("<a>").attr("href", mw.util.getUrl(cd.config.helpWikilink)).html(cd.s("script-name-short")).appendTo($legend), 
        switchInterestingButton = new OO.ui.ButtonWidget({
            framed: !1,
            icon: "speechBubble",
            label: cd.s("wl-button-switchinteresting-tooltip"),
            invisibleLabel: !0,
            title: cd.s("wl-button-switchinteresting-tooltip"),
            classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-switchInteresting" ],
            disabled: !commentLinks_watchedSections
        }), switchInterestingButton.on("click", () => {
            !function() {
                const isEnhanced = !$(".mw-changeslist").find("ul.special").length, $collapsibles = cd.g.$content.find(".mw-changeslist .mw-collapsible:not(.mw-changeslist-legend)"), $lines = cd.g.$content.find(".mw-changeslist-line:not(.mw-collapsible)");
                switchInterestingButton.hasFlag("progressive") ? (isEnhanced ? $lines.filter("table").show() : $lines.not(":has(.cd-commentLink-interesting)").show(), 
                $collapsibles.not(":has(.cd-commentLink-interesting)").find(".mw-rcfilters-ui-highlights-enhanced-toplevel").show(), 
                $collapsibles.not(".mw-collapsed").find(".mw-enhancedchanges-arrow").click()) : ($collapsibles.not(".mw-collapsed").find(".mw-enhancedchanges-arrow").click(), 
                $collapsibles.has(".cd-commentLink-interesting").find(".mw-enhancedchanges-arrow").click(), 
                $collapsibles.not(":has(.cd-commentLink-interesting)").find(".mw-rcfilters-ui-highlights-enhanced-toplevel").hide(), 
                $lines.not(":has(.cd-commentLink-interesting)").hide()), switchInterestingButton.setFlags({
                    progressive: !switchInterestingButton.hasFlag("progressive")
                });
            }();
        }), switchInterestingButton.$element.appendTo($menu);
        const editWatchedSectionsButton = new OO.ui.ButtonWidget({
            framed: !1,
            icon: "listBullet",
            label: cd.s("wl-button-editwatchedsections-tooltip"),
            invisibleLabel: !0,
            title: cd.s("wl-button-editwatchedsections-tooltip"),
            classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-editWatchedSections" ]
        });
        editWatchedSectionsButton.on("click", editWatchedSections), editWatchedSectionsButton.$element.appendTo($menu);
        const scriptSettingsButton = new OO.ui.ButtonWidget({
            framed: !1,
            icon: "settings",
            label: cd.s("wl-button-scriptsettings-tooltip"),
            invisibleLabel: !0,
            title: cd.s("wl-button-scriptsettings-tooltip"),
            classes: [ "cd-watchlistMenu-button", "cd-watchlistMenu-button-scriptSettings" ]
        });
        scriptSettingsButton.on("click", () => {
            settingsDialog();
        }), scriptSettingsButton.$element.appendTo($menu), cd.g.$content.find(".mw-rcfilters-ui-changesLimitAndDateButtonWidget").prepend($menu), 
        cd.g.$content.find("#mw-watchlist-options .mw-changeslist-legend").after($menu);
    }
    function extractAuthor(line) {
        const authorElement = line.querySelector(".mw-userlink");
        if (!authorElement) return null;
        let author = authorElement.textContent;
        return "MediaWiki message delivery" === author ? null : (mw.util.isIPv6Address(author) && (author = author.toUpperCase()), 
        author);
    }
    function processWatchlist($content) {
        "Watchlist" !== mw.config.get("wgCanonicalSpecialPageName") || cd.g.$content.find(".cd-watchlistMenu").length || (initSettings(), 
        mw.user.options.get("wlenhancedfilters-disable") ? addWatchlistMenu() : mw.hook("structuredChangeFilters.ui.initialized").add(() => {
            addWatchlistMenu();
        }), $(".mw-rcfilters-ui-filterWrapperWidget-showNewChanges a").on("click", asyncToGenerator_default()((function*() {
            try {
                ({watchedSections: commentLinks_watchedSections} = yield getWatchedSections());
            } catch (e) {
                console.warn("Couldn't load the settings from the server.", e);
            }
        })))), $content.get(0).querySelectorAll(".mw-changeslist-line:not(.mw-collapsible)").forEach(line => {
            const nsMatch = line.className.match(/mw-changeslist-ns(\d+)/), nsNumber = nsMatch && Number(nsMatch[1]);
            if (null === nsNumber) return;
            const linkElement = ("TR" === line.tagName ? line.parentElement : line).querySelector(".mw-changeslist-title");
            if (!linkElement) return;
            if (!isProbablyTalkPage(linkElement.textContent, nsNumber)) return;
            if (line.querySelector(".minoredit")) return;
            const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
            if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
            const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
            if (!bytesAddedElement) return;
            if ("STRONG" !== bytesAddedElement.tagName) {
                const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
                if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
            }
            let timestamp = line.getAttribute("data-mw-ts");
            if (timestamp = timestamp && timestamp.slice(0, 12), !timestamp) return;
            const author = extractAuthor(line);
            if (!author) return;
            const anchor = timestamp + "_" + spacesToUnderlines(author), link = linkElement.href;
            if (!link) return;
            let wrapper;
            if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), 
            wrapper.lastChild.lastChild.title = goToCommentToYou; else {
                let watched = !1;
                if (summary) {
                    const curLink = line.querySelector(".mw-changeslist-diff-cur") || line.querySelector(".mw-changeslist-history"), curIdMatch = curLink && curLink.href && curLink.href.match(/[&?]curid=(\d+)/), curId = curIdMatch && Number(curIdMatch[1]);
                    if (curId) {
                        const thisPageWatchedSections = commentLinks_watchedSections && commentLinks_watchedSections[curId] || [];
                        if (thisPageWatchedSections.length) {
                            for (let j = 0; j < thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + thisPageWatchedSections[j])) {
                                watched = !0;
                                break;
                            }
                            watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.lastChild.lastChild.title = goToCommentWatchedSection);
                        }
                    }
                }
                watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
            }
            wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor);
            const destination = line.querySelector(".mw-usertoollinks");
            destination && destination.parentElement.insertBefore(wrapper, destination.nextSibling);
        });
    }
    function processContributions($content) {
        const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
        if (null == timezoneOffset || isNaN(timezoneOffset)) return;
        const list = $content.get(0).querySelector(".mw-contributions-list");
        Array.from(list.children).forEach(line => {
            const linkElement = line.querySelector(".mw-contributions-title");
            if (!linkElement) return;
            if (!isProbablyTalkPage(linkElement.textContent)) return;
            const link = linkElement.href;
            if (!link) return;
            if (line.querySelector(".minoredit")) return;
            const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
            if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
            const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
            if (!bytesAddedElement) return;
            if ("STRONG" !== bytesAddedElement.tagName) {
                const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
                if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
            }
            const dateElement = line.querySelector(".mw-changeslist-date");
            if (!dateElement) return;
            const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
            if (!date) return;
            const anchor = generateCommentAnchor(date, mw.config.get("wgRelevantUserName"));
            let wrapper;
            summary && currentUserRegexp.test(" ".concat(summary, " ")) ? (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), 
            wrapper.lastChild.lastChild.title = goToCommentToYou) : wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0), 
            wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor), linkElement.nextSibling && (linkElement.nextSibling.textContent = linkElement.nextSibling.textContent.replace(/^\s/, "")), 
            linkElement.parentElement.insertBefore(wrapper, linkElement.nextSibling);
        });
    }
    function processHistory($content) {
        const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
        if (null == timezoneOffset || isNaN(timezoneOffset)) return;
        const list = $content.get(0).querySelector("#pagehistory"), lines = Array.from(list.children), link = mw.util.getUrl(cd.g.CURRENT_PAGE);
        lines.forEach(line => {
            if (line.querySelector(".minoredit")) return;
            const summaryElement = line.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
            if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved))) return;
            const bytesAddedElement = line.querySelector(".mw-plusminus-pos");
            if (!bytesAddedElement) return;
            if ("STRONG" !== bytesAddedElement.tagName) {
                const bytesAddedMatch = bytesAddedElement.textContent.match(/\d+/), bytesAdded = bytesAddedMatch && Number(bytesAddedMatch[0]);
                if (!bytesAdded || bytesAdded < cd.config.bytesToDeemComment) return;
            }
            const dateElement = line.querySelector(".mw-changeslist-date");
            if (!dateElement) return;
            const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
            if (!date) return;
            const author = extractAuthor(line);
            if (!author) return;
            const anchor = generateCommentAnchor(date, author);
            let wrapper;
            if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), 
            wrapper.lastChild.lastChild.title = goToCommentToYou; else {
                let watched = !1;
                if (summary) {
                    const thisPageWatchedSections = commentLinks_watchedSections && commentLinks_watchedSections[mw.config.get("wgArticleId")] || [];
                    if (thisPageWatchedSections.length) {
                        for (let j = 0; j < thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + thisPageWatchedSections[j])) {
                            watched = !0;
                            break;
                        }
                        watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.lastChild.lastChild.title = goToCommentWatchedSection);
                    }
                }
                watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
            }
            wrapper.lastChild.lastChild.href = "".concat(link, "#").concat(anchor);
            const separators = line.querySelectorAll(".mw-changeslist-separator"), destination = separators && separators[separators.length - 1];
            destination && destination.parentElement.insertBefore(wrapper, destination.nextSibling);
        });
    }
    function processDiff() {
        return _processDiff.apply(this, arguments);
    }
    function _processDiff() {
        return (_processDiff = asyncToGenerator_default()((function*() {
            if (!processDiffFirstRun) return;
            const timezone = mw.user.options.get("timecorrection"), timezoneParts = timezone && timezone.split("|"), timezoneOffset = timezoneParts && Number(timezoneParts[1]);
            null == timezoneOffset || isNaN(timezoneOffset) || ([ document.querySelector(".diff-otitle"), document.querySelector(".diff-ntitle") ].filter(notNull).forEach(area => {
                if (area.querySelector(".minoredit")) return;
                const summaryElement = area.querySelector(".comment"), summary = summaryElement && summaryElement.textContent;
                if (summary && (isCommentEdit(summary) || isUndo(summary) || summary.includes(colonMoved) || summary.includes("Archiving"))) return;
                const dateElement = area.querySelector("#mw-diff-otitle1 a, #mw-diff-ntitle1 a");
                if (!dateElement) return;
                const {date: date} = parseTimestamp(dateElement.textContent, timezoneOffset) || {};
                if (!date) return;
                const author = extractAuthor(area);
                if (!author) return;
                const anchor = generateCommentAnchor(date, author);
                let comment = Comment_Comment.getCommentByAnchor(anchor);
                if (!comment) {
                    let commentAnchorToCheck;
                    for (let gap = 1; !comment && gap <= 5; gap++) {
                        commentAnchorToCheck = generateCommentAnchor(new Date(date.getTime() - cd.g.MILLISECONDS_IN_A_MINUTE * gap), author), 
                        comment = Comment_Comment.getCommentByAnchor(commentAnchorToCheck);
                    }
                }
                if (comment) {
                    let wrapper;
                    if (summary && currentUserRegexp.test(" ".concat(summary, " "))) wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), 
                    wrapper.firstChild.lastChild.title = goToCommentToYou; else {
                        let watched = !1;
                        if (summary && commentLinks_thisPageWatchedSections.length) {
                            for (let j = 0; j < commentLinks_thisPageWatchedSections.length; j++) if (summary.includes("\u2192\u200e" + commentLinks_thisPageWatchedSections[j])) {
                                watched = !0;
                                break;
                            }
                            watched && (wrapper = $wrapperInterestingPrototype.get(0).cloneNode(!0), wrapper.firstChild.lastChild.title = goToCommentWatchedSection);
                        }
                        watched || (wrapper = $wrapperRegularPrototype.get(0).cloneNode(!0));
                    }
                    wrapper.firstChild.lastChild.href = "#".concat(anchor), wrapper.onclick = function(e) {
                        e.preventDefault(), comment.scrollToAndHighlightTarget(!1);
                    };
                    const destination = area.querySelector("#mw-diff-otitle3, #mw-diff-ntitle3");
                    if (!destination) return;
                    destination.insertBefore(wrapper, destination.firstChild);
                }
            }), mw.hook("convenientDiscussions.commentLinksCreated").fire(cd), processDiffFirstRun = !1);
        }))).apply(this, arguments);
    }
    function addCommentLinks(_x2) {
        return _addCommentLinks.apply(this, arguments);
    }
    function _addCommentLinks() {
        return (_addCommentLinks = asyncToGenerator_default()((function*($content) {
            $content.parent().length && ([ "Recentchanges", "Watchlist" ].includes(mw.config.get("wgCanonicalSpecialPageName")) ? processWatchlist($content) : "Contributions" === mw.config.get("wgCanonicalSpecialPageName") ? processContributions($content) : "history" === mw.config.get("wgAction") && isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) && processHistory($content), 
            mw.hook("convenientDiscussions.commentLinksCreated").fire(cd));
        }))).apply(this, arguments);
    }
    function _commentLinks() {
        return (_commentLinks = asyncToGenerator_default()((function*({messagesRequest: messagesRequest}) {
            try {
                yield commentLinks_prepare({
                    messagesRequest: messagesRequest
                });
            } catch (e) {
                return void console.warn(...e);
            }
            cd.g.IS_DIFF_PAGE ? mw.hook("convenientDiscussions.pageReady").add(processDiff) : mw.hook("wikipage.content").add(addCommentLinks);
        }))).apply(this, arguments);
    }
    var debug = {
        init() {
            this.timerTotal = {}, this.timerStartTimestamps = {}, this.timerRunCount = {}, this.timerAllRunsTotal = {}, 
            this.initCounters(), this.array = [], this.object = {};
        },
        initCounters() {
            this.counters = "undefined" == typeof Proxy ? {} : new Proxy({}, {
                get: (obj, prop) => prop in obj ? obj[prop] : 0
            });
        },
        startTimer(label) {
            this.timerStartTimestamps[label] = Date.now();
        },
        stopTimer(label) {
            if (void 0 === this.timerStartTimestamps[label]) return;
            void 0 === this.timerTotal[label] && (this.timerTotal[label] = 0);
            const thisTime = Date.now() - this.timerStartTimestamps[label];
            this.timerTotal[label] += thisTime, delete this.timerStartTimestamps[label], void 0 === this.timerAllRunsTotal[label] && (this.timerAllRunsTotal[label] = 0, 
            this.timerRunCount[label] = 0), this.timerAllRunsTotal[label] += thisTime, this.timerRunCount[label]++;
        },
        resetTimer(label) {
            void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), delete this.timerTotal[label];
        },
        fullResetTimer(label) {
            this.resetTimer(label), delete this.timerAllRunsTotal[label], delete this.timerRunCount[label];
        },
        logAndResetTimer(label) {
            void 0 !== this.timerStartTimestamps[label] && this.stopTimer(label), void 0 !== this.timerTotal[label] && (console.debug("".concat(label, ": ").concat(this.timerTotal[label])), 
            this.resetTimer(label));
        },
        logAndResetEverything(sort) {
            const timerLabels = Object.keys(this.timerTotal);
            sort && timerLabels.sort(), timerLabels.forEach(label => {
                this.logAndResetTimer(label);
            });
            const counterLabels = Object.keys(this.counters);
            sort && counterLabels.sort(), counterLabels.forEach(label => {
                console.debug("counter ".concat(label, ": ").concat(this.counters[label]));
            }), this.initCounters(), this.array.length && (console.debug("array: ", this.array), 
            this.array = []), Object.keys(this.object).length && (console.debug("object: ", this.object), 
            this.object = {});
        },
        averageTimerTime(label) {
            if (!this.timerAllRunsTotal[label]) return void console.error("No data for timer ".concat(label));
            const average = this.timerAllRunsTotal[label] / this.timerRunCount[label];
            console.debug("".concat(label, ": ").concat(average.toFixed(1), " average for ").concat(this.timerRunCount[label], " runs"));
        },
        incrementCounter(label) {
            this.counters[label]++;
        }
    }, defaultConfig = {
        messages: {},
        contribsPage: null,
        localTimezoneOffset: null,
        customTalkNamespaces: null,
        pageWhiteListRegexp: null,
        pageBlackListRegexp: null,
        archivePathRegexp: null,
        pagesWithoutArchivesRegexp: null,
        idleFragments: [],
        defaultIndentationChar: ":",
        spaceAfterIndentationChar: !0,
        signaturePrefixRegexp: /(?:\s+>+)?(?:\xb7|-|\u2013|\u2014|~|\/|\u2192|\u21d2|\s|&mdash;|&ndash;|&rarr;|&middot;|&nbsp;|&#32;)*'*$/,
        signatureEndingRegexp: null,
        tagName: null,
        scriptCodeName: "convenient-discussions",
        optionsPrefix: "convenientDiscussions",
        helpWikilink: "mw:User:JWBTH/CD",
        unsignedTemplates: [],
        unsignedClass: "autosigned",
        pairQuoteTemplates: [],
        blockSmallTemplate: null,
        paragraphTemplates: [],
        pingTemplate: "ping",
        quoteFormatting: [ "> ''", "''\n" ],
        elementsToExcludeClasses: [],
        templatesToExclude: [],
        commentAntipatterns: [],
        customBadCommentBeginnings: [],
        keepInSectionEnding: [ /\n+(?:<!--[^]*?-->\s*)+$/ ],
        signatureScanLimit: 80,
        foreignElementsInHeadlinesClasses: [],
        customFloatingElementsSelectors: [],
        closedDiscussionsClasses: [],
        customUnhighlightableElementsClasses: [],
        customAddTopicLinkSelectors: [],
        defaultInsertButtons: [ [ "{{ping|+}}" ], [ "{{tl|+}}" ], [ "{{+}}" ], [ "[[+]]" ], [ "<+></>", "</>" ], [ "<blockquote>+</blockquote>", "<blockquote />" ], [ "<code>+</code>", "<code />" ], [ "<nowiki>+</nowiki>", "<nowiki />" ], [ '<syntaxhighlight lang="+"></syntaxhighlight>', "<syntaxhighlight />" ], [ "<small>+</small>", "<small />" ] ],
        logoDataUrl: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAAAoCAYAAACGq4NTAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAT10lEQVR42u2deXwURdrHvz1JSEIiYAiEcClXQEFFPAAVJeAtgrd4rYIrnoDvrqKsimE55N3Xa5WFdfF2d1UQxINVWRRkBaMcwSiKHC+CEIgJhCMhIVfvH/U0qdT0TCaTGQkf+vf55CN9TPdTVU/96rmqtQBysx46t2mr5W8lpOS08cUWW4QIG5gfC1/EEjISwT6uig0d4MqRV/A9Hjx48NBI4Bt7u31uecUxi5q2/k96fcgQwAKuqISzK0P/TSlY62LIWGmxZtZsOnlD4MGDh0ZDiF1KeKsw95G4/NwJYT3AAq6sJykCFPmI+6UJf/eGwIMHD42GEI8rpQ1A/pqJ5Oc+1iBSPKeqfr8r9HGKNwQePHhoNIQYX80hNzl/zR/Jz300bFK8ogLOrgcpVkCcNwRHJCygB3Cc1xW1EA+cAhzrdQUAzYHeQMKRIrBfOiR/zSQA0k6eDMDBfRll5SUddia2+KF9bGJebJ2WYrnFMSRt35RQXLXFR4dyG6uRtPUY4DLgYqAzkALsAbYCnwLvAYWeDoekM+8CQ+R4OjD6CG1LS2BmkOvFwC/AOuATYEeQezsCi0W3SoERwNtHsZ5cBrwFJAM/AxcBPzT6lf7jy23b7UKbUx8lMWX1D3l7+p6cmZVVuTwrK6VN+vzNCSlrmgV74O6Nd0zvNX7WaICX3iNzmcWnpZY7Kba0KZ8+lPhfwZoZDTwKtKpD+Z8GJivj1UMAXAnMM871AXIOs1zpQCKwF9gV4m/ay2QNBTbwETABWOVy/S/APdpxIdBafnc04gfxIhzMAa5r9C5zoAs7cyaTvel3N2VmZVUCnJWVtbuksN/zwR52cH+XcocMAW4fxuLONrmHsX0JwGzgz3WQIbKSTZBVzUNgNHU5l3SYZboayAM2AY9EcWG9FPgKeEiOg/VLYrD5dRTqSdMj0mXWkV16fq2IYDVW8AG2fX6rYacDrUrXJhcE/dlf5zHs8zjmAyTZVHeo5seOlQwbcQ0bGti+mcA1Luc3AFvEbT6J2rFML/MdHPOBb6XfEFfyy8Ms06URfNZnmoWZBHQHumjXY4BpQBNgknb+OeAqoJlYhZOAqqNYT6YCM2RROAD86UgQOijBdSrlH1nYPoCVWVmpyanZ9wa7P77Zhvi1U0Y96RyvnjBu8IDqyr5n1UMtSix862I4YXUTvn3jY9Ib6NrdZpz7BjgdyAAuAE4TV+v/gHLgSVR8zEOQIQL6Sv9eJGR0uCf+gAg+6xFx7a5DxcG6Av2B74z7soBM7TgHOAEYLiGE/z3K9eQFVELlBllUlh7xFuLJ++i141qKn4qz86oqprRNTMlJrOuBLTJe/P2Gmf1utSsTypqmzmjniy22rqpQS+aXMaELVmgRv72U14W4wsHjxvFPosBFxvldwDjgD0BlkH7qJ1ZRM4kPrRKCdYsRnS0uUwWQDRxEZR4vQAXfdwELge2aOzZIc8MK5NlubtvpqOydI3uOcb2P/KWInMtQSQETvYA2In8OsBuVJR0kClwBfO5CBD5pX7EcnxNE2U8ReVNF1myX5yFE0k5btArEas+Ua1XSDjNOGS9k1U071xE4XyPvSFiv2cC5wEpU0sTph2miF7a08URpZ6r073cuoYVMsTh9qPjlEoIn806UBShV2vOttEnX1cGa7lShkjs6BmnGj41KIppj2l/GKwnIB5YDGwPI1Fl0IB3YLzJlGzJlAGnSth7y3u0Bwi3nSp8koJJYyyT84TYPB2pjmy3PbS9tbINKkn6MSpgGCqOdJzoeK6GWxdJm6tx0l15GYnoZXYpyHyEhtphWvabVEWipJik1O9WcxVdLmqI+pLjLx+lhKnAvGVxz5S8K8ptAZDhKyLWty7XvgN8B/zbOvwGHduE8KYo/BRWndHBQSPhpGdQJohgOrkBlvnWMAF4y2uSQxHmojG8vFzk/BX4ri4KD8cCN8u8vxMV7Eehg/PZV6QMn0dTEaG8BKnmgox8qydDHRZZlwEhgvXZuLHCnRohjgFc08nEwW6z+UpnAn+NfunW1/AGsDdAf4aAIeBCYq507U/Rsjcjzvnbtn8BN2vFo6ePmLnr3GvCAMYlPkz7s6yLLVrl/jhwv1AivxNAzgAXUlL5UyBii6c2LYgmbWALcJ/2IkPIsYBj+MdTtos+vy/FdwP9o1++Q9ziIAx4D7kdVgLiFLsZo73bikLrujZT+v09CGfpY3WaMB8CtMh9TjfPVqIqA++sV9N2x+gkKvnsoLG1ySPGM+tQpWrUGrj443zguD9MVni6mf9sgxPuRdHQgjEUldZJdrJungKFy/LJx/UaXZ92i/btKiBdx7xYFmfyDZcVvF+D62TJpOrhcuw34Yz36bIhMpD5B3rXchex0q3JRgOvXSXjDsWp+7TrW98Ui0nFJCL8bJTHG5gGsntu1BcGx6JYGIEPHCp4t49oQnCT62zXA9YHAM1rsdIEs1G5VI+3qmCs6mogV91gAMnT64EvgrDrc8rEGGSLe2NtiBTq4RhbZ1AChwxuA3we0EEt92BuS/V2t3I3T6FPWubRD+vzEUHo8Nn5XWmLq1ykOKV4v7vPKmKgq7vHG8Y9iVdQHNwL3GqQ6V0z5MyR+5ijKC2K+/+jynDhZgRaiShEuE3fCwTiZaLOBZ4EWcv5SIc2D2up8jva7j8Xy7CwDHatZCNO0eOnDooDpYo1eH2C9ihWX8Av5nf6u+8S6OVCXQ4FKSjmlVGWoYPpK4GSxaBNR9X/TCZwMiROra6mQ/CDt2m9lIq0Qq2ugZhE61u6HTuQlwnpVCeQKqTvoFoItoG8B2y/HhWJh3iLW1Z/lejOxLvWs7BrRvUTgWnnnQhfXuL54QJ7p4BlUFj1D5EoXCw7R9zONfp4pJD8MuFA8qbwQ3jvJGNMiaV+BLDC95fwxYgVniF676UmpjHeeWOSpmms8RpvDEzQiLxNZtwGnAr+R508JSIgJ1Vg7E3j86ZesOQ3p8fXPD/xZ4lnopAiwOXpFCS2N4z1hPMPc3H2nuI8O/qqt6vFCbLcHeNZlQmCIhbNFs276CmGVCimOkvPJMtk/0Vxofbxe1pS6qeGavSL//kCe+4TmTqZIvNDERFSiwCH5tdoKmyxKuryOPhtrWEEPiWXkyLJHiNCxrNqLUpp4Wtpli8qsEBfS6eszpV+mS/t0QlxBdBMaZt/VVc7VQtqpy+eQ3z8k5GJpIZsREntzsFrc8XI5zpI45HJZaBtqIZohnDKNtPQF2fQ+/kJNidpM495gSKF2Ib8tlm6OpoeLpc2IxXm7pkc69oku/Kjp2CLt+jmaBdhTO7+Omqz3P0VPY4AKX7Blrec+Xhl9k90s3N7+ZsrdU5PTPm/vZp9eXwEnVjQ5GCWlNS2Z+tZAZRjm9m7pONOd1nF5AFcCsZAORR4kBqS7TCkB3OZh2r+v0v5dKO4LmsvtWDAbhDycP313RYxYt25YZbjjZvFx6xD6baih6GsNWX4x7u8fRBZbe86KMGSJFpJcJmUwlBrx6UwJdQyQqVBlXDet5uc0MnRigAupSWo1BPuMEM5n4lomaiQZqJ3PyaLV3uXeYBhsWKVmsuwgqlwnkF5hWNu6V/Z1AD2pNvqrN/COyBIj1ysAfO+lBZa8XRlJPSvZfO8ddkZ9e/q7qaOeadnl1fFY7oX6PuDive2bRElp843jri5xhroIUcdGQykdN7zasBRC3cNq7oRxZPtKXDKdEC2xuvR40WuiOIlGXDAW+I8QsPP3qvGu1BBlLA8gY7A1tItxvMiQZfavJEs0Ycbb6nIRy6i9s8cCbpZwwFbUDip9we5h2hVRbMubLgvUHHFd/0btveofGPHTVuLtbBWL7qIw55bbdj4zVNe9gfMKF4PmatHPPFTCs9khQnw/CCkef4CUwQWsm3yL/dmYUXZmMGly7s9qsXby3RM3zOxXkNLtb/f7YkrrmEGWBdCmuEd1hAc62zhujsqmhQrToiwO0PllxrnkCMiuE1hbsawupnZm8JUwiSFQ6UMkYIUhzzaOLJyESmjoCCWON8bwEg7ZHOKarnAmpIvu7Y9ie2ZpumRawXfI4ux4FNvFnS9xGfeBEhJ6PEJza28dVnk4GI97eVhrCRWsAVrHAswXQhyaH6AFVVin7yGTPWSefaVdtS+WA6UxHKjwsd9XTZNE204+tftEX+ueU1tYvvJ6S9p58yW+05qtY1Xk1v2l0tHJRoxsSYhxl90hWDJJLoO7KwKyv0HNTgjHhepkkP1aTZlKNRekFJVQCrQXuzKKE6xaXPk07V2dcA+GR1uWaGGicVwYIiHmoxIx1wmpnGcsHieKpThOdE/Xt3Tca/IiNWYjxeO4U8I++pxphoqVO/HbueKW3oXKypofeJ6Ayu6ua+Dcah2FebUHlci5Sto8mNpVCp2AqYdiiPPT4IMQIjPNK4npUMYxGSWk9dxP1xNK6Hj8ASulaM3jLXatvyNMWWMYXgF9IrffoZjaNU+gAqyzcP8UUVsZbCeRstogzu74J2rM+Nf3QSZ/fVBI7fqpQagMnoOXjPv1wuNEVDa3KMBftAko23DfzziMskQSsagg/JXG+WmEXr1QjsrADxbL8FnjulOmZBafn1/PkEICIdQXG/gcVVXRWizDEiPepucafkZVCzjF2TlGJKx3He8yLeV++Mfezbm1IkLjWCUhgUtkoZlkjkGtpMq7beDDtDBfZVvkrXiewh/vCf0nVU0r9J68IbKkOBX/zzWNlJjFVFR93V2obNn3snJMlJV6Nypw7SBe4iWOoh3r0plvRnAC6qQ3gJrarhL8PyllxkZmGHGodFTWdTlE/YO8pizPCkHrK/8kIfF+EXqnmUBzymDC1eRBqNKWa1GlJxNRBfgPunghz4X4zA5iGbbULMaHDUve2TRgVnWM1iw0UFUJn1G7bnGrETcbrhH5A0a4BYM8b0PtBnI8jBeNRXavZhxciKqYcAhsOf4JkN119MVyQ95u1C7g7oqqVoj03EqTMUjXrM4sam/WKPJbSeaJGg3JD5MUv1bJ19TuM+q8/eDejG/Urp/apAiwuuHuc4EoxgLDDThe4gmBMBxVMD1eYiOORTkCle36f1Eg/Zk/Ac9HkFgWitJ0NFbnOS6W1euoWqtTNQX7lpptV101Ip+PqjHcFSVCfAdVn+aUO3QUa3uTuMjdNDflXbGKdjTwneuN4yFiZTcXS2NlPZ83JYR7VghhhvKZuCao4ueeqEztO6jY6QDDZftQ65eVMk6gKhC+lHherMQxfahdTRtRu5AWUDtZ8Zos7O0IHtd+RoyCKnnGGpkfg13kypQ4oSWyLJTfjTBIfVkd/VEhoQH9q1JPoeodC1DlPTqBL9ZkCBc+6df+YlTMAzaLB6MnQhe4mtbz0gAbhvwSPVIsLz6+Yt+eE26WPmptkqJtQV7DPy27VEjtLQJX4+tYhio7KBXluEliek6ssKWL67xNiHJvhGM7r4tSE8RddhTsClHWEzTLoIfLvYupu0ykoXJfKwTQW7NYMgKMTVEE3rkGFVPV68ycMZolSl8ZofaVocqtHiX0MpMLJUboxORGutzzCTVfWXL68FNqduvEGVaisxA4X4P6k+hqa20addfcxJ/x36zQCpXtdsZoKP7lLT9rxsNYzTI82bD8HbnvCTFs9LbE7KZoC34H/HdKrRQDpaHflOxPza6fJGrv+NIt1xkB6xDntYEPw632ElLctf5ufye+PKV6f95F60u23NC77+TJmwHimu4YbtL5jeWQUZEQiTrFVTJZ7kOVpJhO+UFZ7W6WVXun3g1ieb3hQng7ZWU7Fd3MjRxeNuKY64OsvltRBaoT8f/g6UEhwmEyGaP98dudqO1Wf5BV2CTvL2TCD8c/Sx9uXGioPFfHFlThc0NQKv25UFzmrvLf+ujlh2JdvedCFltQRcGXG3r5k4zn8y6LxmYh5L6a67kTlaj5wsWSvUA8iAMuHlRvVNLE9Af3onZfnU5NVcINqCLyXIOgKsWFH0j9viU6TebbRy56sFH6eQD+tavhYJno5GwXg2C7zJvBQJnV9hE7MPvaPJw31YrqZ4xyJoy7oFWPFz7xxe31swcry1ts7HjTnm4RfmWCrKQpohQF+Ne5uSFWXJBjxSXbTuP9GnJbaWOxTJrywyhLushyQMilLIrvSpO/LRG22COFOAkjJAsJ7QxR7zqJ3uaHQBBOH+wQ3Q4FlqYzu2WcglVjtEAVZFfKvQ1NJsajah7jQ2xjQxArsreQ99SqIw1GiOPzpljToiVVbtb4Hr74neObd3j/5pj4Xb4AhLy67XV+roIHDx48RI0t3ZaLx7ZPsaa1zbKbUqHY/+odcFlBmG+xbNr1vZuWGS9oJ5/wet+DBw+NCr4AZDjZPD83HRY0IKa4/auZ7Fp/p9fjHjx4ODII0STDPBXvORSEn9sG/tUqzDfZFnnZMyjadKvX6x48eGjchGjZTPCzDLOsaoytSe+kh0+KNj62LXuZok2/8XregwcPjZYQH98+1ZrkeoPNgxgbsOemw6LU8F5o42Pbco8UPXjw0BgJ0SYrb4oV8BPx26ZauVU2/VH1VMWK1ODNtg0gRTtGkeLmm21vCDx48NBYYB3Olw8caMc+cFvmE32SljwQwJz0ym48ePDwq7vMhwVLlliVQxYsfnh1ycAnvaHw4MHDUU2IAMyxqjxS9ODBg0eIJinuH/iUNyQePHg4ugnRIcWPFj+0qnjA096wePDg4egmRCHFy/+1dJxHih48ePDg4Fo75qNXznkqb7bf/wrTgwcPHo4+nDbKjpv38oVjvJ7w4MHDr4X/AvfYW5jJb2uQAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTA1LTIyVDE3OjQwOjUyKzAwOjAw7lDVDQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0wNS0yMlQxNzo0MDo1MiswMDowMJ8NbbEAAAAASUVORK5CYII=",
        logoWidth: "324px",
        logoHeight: "40px",
        longCommentThreshold: 1e4,
        bytesToDeemComment: 50,
        summaryCommentTextLengthLimit: 50,
        noConfirmPostEmptyCommentPageRegexp: null,
        customIndentationCharsPattern: null,
        undoTexts: [],
        customTextReactions: [],
        customCommentFormModules: [],
        defaultCommentLinkType: "diff",
        commentInputEmptyPlaceholder: !1,
        getArchivePrefix: null,
        transformSummary: null,
        customCodeTransformations: null,
        customBeforeParse: null,
        customForeignComponentChecker: null,
        areNewTopicsOnTop: null,
        getMoveSourcePageCode: function(targetPageWikilink, signature, timestamp) {
            return cd.s("move-sourcepagecode", targetPageWikilink, signature, timestamp);
        },
        getMoveTargetPageCode: function(targetPageWikilink, signature) {
            return cd.s("move-targetpagecode", targetPageWikilink, signature);
        }
    }, staticGlobals = {
        LETTER_PATTERN: "A-Za-z\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC",
        COMMENT_UNDERLAY_FOCUSED_COLOR: "#eaf3ff",
        COMMENT_UNDERLAY_TARGET_COLOR: "#ffedb8",
        COMMENT_UNDERLAY_NEW_COLOR: "#e8ffd1",
        COMMENT_UNDERLAY_OWN_COLOR: "#f7ebff",
        COMMENT_UNDERLAY_SIDE_MARGIN: 5,
        HIGHLIGHT_NEW_COMMENTS_INTERVAL: 15,
        CHECK_FOR_NEW_COMMENTS_INTERVAL: 15,
        BACKGROUND_CHECK_FOR_NEW_COMMENTS_INTERVAL: 60,
        SECONDS_IN_A_DAY: 86400,
        MILLISECONDS_IN_A_MINUTE: 6e4,
        POPULAR_NOT_INLINE_ELEMENTS: [ "BLOCKQUOTE", "DD", "DIV", "DL", "FORM", "H2", "H3", "H4", "H5", "H6", "HR", "INPUT", "LI", "OL", "P", "PRE", "TABLE", "TBODY", "TR", "TH", "TD", "UL" ],
        POPULAR_INLINE_ELEMENTS: [ "A", "ABBR", "B", "BIG", "BR", "CITE", "CODE", "EM", "FONT", "I", "IMG", "KBD", "S", "SMALL", "SPAN", "STRIKE", "STRONG", "SUB", "SUP", "TT", "U", "VAR" ],
        UNHIGHLIGHTABLE_ELEMENTS_CLASSES: [ "mw-empty-elt", "tleft", "tright", "floatleft", "floatright" ],
        BAD_COMMENT_BEGINNINGS: [ /^<!--[^]*?--> *\n*/, /^(?:----+|<hr>) *\n*/, /^\{\|.*?\|\} *\n*(?=[*:#])/ ],
        FLOATING_ELEMENTS_SELECTORS: [ ".cd-floating", ".tright", ".floatright", '*[style*="float:right"]', '*[style*="float: right"]', '*[style*="float:left"]', '*[style*="float: left"]' ],
        SIGN_CODE: "~~".concat("~~")
    }, globalUtil = {
        wrapInElement: (html, tagName = "span") => $($.parseHTML(html)).wrapAll("<".concat(tagName, ">")).parent(),
        buildEditSummary(options) {
            void 0 === options.addPostfix && (options.addPostfix = !0);
            let wasOptionalTextAdded, text = (options.section ? "/* ".concat(options.section, " */ ") : "") + options.text.trim();
            if (options.optionalText) {
                let projectedText = text + options.optionalText;
                cd.config.transformSummary && (projectedText = cd.config.transformSummary(projectedText)), 
                projectedText.length <= cd.g.SUMMARY_LENGTH_LIMIT && (text = projectedText, wasOptionalTextAdded = !0);
            }
            return wasOptionalTextAdded || (cd.config.transformSummary && (text = cd.config.transformSummary(text)), 
            text.length > cd.g.SUMMARY_LENGTH_LIMIT && (text = text.slice(0, cd.g.SUMMARY_LENGTH_LIMIT - 1) + "\u2026")), 
            options.addPostfix && (text += cd.g.SUMMARY_POSTFIX), text;
        },
        isPageOverlayOn: () => document.body.classList.contains("oo-ui-windowManager-modal-active") || Boolean($loadingPopup && $loadingPopup[0] && "block" === $loadingPopup[0].style.display),
        wrapDiffBody: body => '<table class="diff"><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content">' + body + "</table>"
    };
    function app_s(name, ...params) {
        if (!name) return null;
        const fullName = "convenientdiscussions-".concat(name);
        if (cd.g.QQX_MODE || "string" != typeof mw.messages.get(fullName)) {
            const paramsString = params.length ? ": ".concat(params.join(", ")) : "";
            return "(".concat(fullName).concat(paramsString, ")");
        }
        return mw.message(fullName, ...params).toString();
    }
    function go() {
        Object.keys(cd.strings).forEach(name => {
            mw.messages.set("convenientdiscussions-".concat(name), cd.strings[name]);
        }), cd.g.SETTINGS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-settings"), 
        cd.g.VISITS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-visits");
        const watchedSectionsOptionName = "ru.wikipedia.org" === location.host ? "watchedTopics" : "watchedSections";
        if (cd.g.WATCHED_SECTIONS_OPTION_FULL_NAME = "userjs-".concat(cd.config.optionsPrefix, "-").concat(watchedSectionsOptionName), 
        cd.g.IS_DIFF_PAGE = mw.config.get("wgIsArticle") && /[?&]diff=[^&]/.test(location.search), 
        cd.g.CURRENT_PAGE = underlinesToSpaces(mw.config.get("wgPageName")), cd.g.CURRENT_NAMESPACE_NUMBER = mw.config.get("wgNamespaceNumber"), 
        cd.g.CURRENT_USER_NAME = mw.config.get("wgUserName"), cd.g.$content = $("#mw-content-text"), 
        cd.config.customTalkNamespaces || (cd.config.customTalkNamespaces = mw.config.get("wgExtraSignatureNamespaces"), 
        cd.config.customTalkNamespaces.includes(0) && cd.config.customTalkNamespaces.splice(cd.config.customTalkNamespaces.indexOf(0))), 
        mw.config.get("wgIsArticle") && (isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) || cd.g.$content.find(".cd-talkPage").length)) {
            let messagesRequest;
            cd.g.firstRun = !0, cd.g.nanoCss = Object(nano_css.create)(), cd.g.nanoCss.put(".cd-loadingPopup", {
                width: cd.config.logoWidth
            }), cd.g.nanoCss.put(".cd-loadingPopup-logo", {
                width: cd.config.logoWidth,
                height: cd.config.logoHeight
            }), setLoadingOverlay(), cd.debug.stopTimer("start"), cd.debug.startTimer("loading data"), 
            cd.g.worker = new worker_default.a, "ready" === mw.loader.getState("mediawiki.api") && (cd.g.api = new mw.Api, 
            messagesRequest = loadMessages(), getUserInfo().catch(e => {
                console.warn(e);
            }));
            const modulesRequest = $.when(...[ mw.loader.using([ "jquery.color", "jquery.client", "mediawiki.Title", "mediawiki.api", "mediawiki.cookie", "mediawiki.jqueryMsg", "mediawiki.notification", "mediawiki.user", "mediawiki.util", "mediawiki.widgets.visibleLengthLimit", "oojs", "oojs-ui", "oojs-ui.styles.icons-alerts", "oojs-ui.styles.icons-content", "oojs-ui.styles.icons-interactions", "user.options" ]), messagesRequest ].filter(defined)).then(() => {
                try {
                    processPage({
                        messagesRequest: messagesRequest
                    });
                } catch (e) {
                    mw.notify(cd.s("error-processpage"), {
                        type: "error"
                    }), removeLoadingOverlay(), console.error(e);
                }
            }, e => {
                mw.notify(cd.s("error-loaddata"), {
                    type: "error"
                }), removeLoadingOverlay(), console.warn(e);
            });
            setTimeout(() => {
                "resolved" !== modulesRequest.state() && (removeLoadingOverlay(), console.warn('The promise is in the "pending" state for 10 seconds; removing the loading overlay.'));
            }, 1e4), cd.g.REGULAR_LINE_HEIGHT = parseFloat(window.getComputedStyle(cd.g.$content.get(0)).lineHeight), 
            initTalkPageCss(), __webpack_require__(7), __webpack_require__(13), __webpack_require__(15), 
            __webpack_require__(17), __webpack_require__(19), __webpack_require__(21), __webpack_require__(23), 
            __webpack_require__(25);
        }
        if ([ "Watchlist", "Contributions", "Recentchanges" ].includes(mw.config.get("wgCanonicalSpecialPageName")) || "history" === mw.config.get("wgAction") && isProbablyTalkPage(cd.g.CURRENT_PAGE, cd.g.CURRENT_NAMESPACE_NUMBER) || cd.g.IS_DIFF_PAGE) {
            let messagesRequest;
            "ready" === mw.loader.getState("mediawiki.api") && (cd.g.api = new mw.Api, messagesRequest = loadMessages(), 
            getUserInfo().catch(e => {
                console.warn(e);
            })), mw.loader.using([ "user.options", "mediawiki.Title", "mediawiki.api", "mediawiki.jqueryMsg", "mediawiki.util", "mediawiki.user", "oojs", "oojs-ui", "oojs-ui.styles.icons-interactions", "oojs-ui.styles.icons-editing-list", "oojs-ui.styles.icons-alerts" ]).then(() => {
                !function(_x3) {
                    _commentLinks.apply(this, arguments);
                }({
                    messagesRequest: messagesRequest
                }), __webpack_require__(7), __webpack_require__(27);
            }, e => {
                console.warn(e);
            });
        }
    }
    $((function() {
        if (!location.host.endsWith(".m.wikipedia.org") && !$(".flow-board-page").length) if (cd.running) console.warn("One instance of Convenient Discussions is already running."); else if (cd.running = !0, 
        cd.config = Object.assign(defaultConfig, cd.config), cd.debug = debug, cd.g = staticGlobals, 
        cd.s = app_s, cd.util = globalUtil, cd.getCommentByAnchor = Comment_Comment.getCommentByAnchor, 
        cd.getSectionByAnchor = Section_Section.getSectionByAnchor, cd.getSectionsByHeadline = Section_Section.getSectionsByHeadline, 
        cd.getLastActiveCommentForm = CommentForm_CommentForm.getLastActiveCommentForm, 
        cd.getLastActiveAlteredCommentForm = CommentForm_CommentForm.getLastActiveAlteredCommentForm, 
        cd.util.parseCommentAnchor = parseCommentAnchor, cd.util.formatDate = formatDate, 
        cd.util.setVisits = setVisits, cd.debug.init(), cd.debug.startTimer("total time"), 
        cd.debug.startTimer("start"), mw.hook("convenientDiscussions.launched").fire(cd), 
        cd.strings) go(); else {
            let match = location.host.match(/^([a-z-]+)\.(?:wikipedia|wikibooks|wikinews|wikiquote|wikisource|wikiversity|wikivoyage|wiktionary)\.org$/);
            match || (match = location.host.match(/^([a-z]{2})\.wikimedia\.org$/)), function loadStrings(lang) {
                mw.loader.getScript("https://www.mediawiki.org/w/index.php?title=User:Jack_who_built_the_house/convenientDiscussions/strings-".concat(lang, ".js&action=raw&ctype=text/javascript")).then(() => {
                    cd.strings ? go() : "en" !== lang ? loadStrings("en") : console.warn("Convenient Discussions can't run: localization strings couldn't be found.");
                }, e => {
                    console.warn(e);
                });
            }(match ? match[1] : "en");
        }
    }));
} ]);