/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/charenc/charenc.js":
/*!*****************************************!*\
  !*** ./node_modules/charenc/charenc.js ***!
  \*****************************************/
/***/ ((module) => {

eval("var charenc = {\n  // UTF-8 encoding\n  utf8: {\n    // Convert a string to a byte array\n    stringToBytes: function(str) {\n      return charenc.bin.stringToBytes(unescape(encodeURIComponent(str)));\n    },\n\n    // Convert a byte array to a string\n    bytesToString: function(bytes) {\n      return decodeURIComponent(escape(charenc.bin.bytesToString(bytes)));\n    }\n  },\n\n  // Binary encoding\n  bin: {\n    // Convert a string to a byte array\n    stringToBytes: function(str) {\n      for (var bytes = [], i = 0; i < str.length; i++)\n        bytes.push(str.charCodeAt(i) & 0xFF);\n      return bytes;\n    },\n\n    // Convert a byte array to a string\n    bytesToString: function(bytes) {\n      for (var str = [], i = 0; i < bytes.length; i++)\n        str.push(String.fromCharCode(bytes[i]));\n      return str.join('');\n    }\n  }\n};\n\nmodule.exports = charenc;\n\n\n//# sourceURL=webpack://anuvadak/./node_modules/charenc/charenc.js?");

/***/ }),

/***/ "./node_modules/crypt/crypt.js":
/*!*************************************!*\
  !*** ./node_modules/crypt/crypt.js ***!
  \*************************************/
/***/ ((module) => {

eval("(function() {\n  var base64map\n      = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n\n  crypt = {\n    // Bit-wise rotation left\n    rotl: function(n, b) {\n      return (n << b) | (n >>> (32 - b));\n    },\n\n    // Bit-wise rotation right\n    rotr: function(n, b) {\n      return (n << (32 - b)) | (n >>> b);\n    },\n\n    // Swap big-endian to little-endian and vice versa\n    endian: function(n) {\n      // If number given, swap endian\n      if (n.constructor == Number) {\n        return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00;\n      }\n\n      // Else, assume array and swap all items\n      for (var i = 0; i < n.length; i++)\n        n[i] = crypt.endian(n[i]);\n      return n;\n    },\n\n    // Generate an array of any length of random bytes\n    randomBytes: function(n) {\n      for (var bytes = []; n > 0; n--)\n        bytes.push(Math.floor(Math.random() * 256));\n      return bytes;\n    },\n\n    // Convert a byte array to big-endian 32-bit words\n    bytesToWords: function(bytes) {\n      for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)\n        words[b >>> 5] |= bytes[i] << (24 - b % 32);\n      return words;\n    },\n\n    // Convert big-endian 32-bit words to a byte array\n    wordsToBytes: function(words) {\n      for (var bytes = [], b = 0; b < words.length * 32; b += 8)\n        bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);\n      return bytes;\n    },\n\n    // Convert a byte array to a hex string\n    bytesToHex: function(bytes) {\n      for (var hex = [], i = 0; i < bytes.length; i++) {\n        hex.push((bytes[i] >>> 4).toString(16));\n        hex.push((bytes[i] & 0xF).toString(16));\n      }\n      return hex.join('');\n    },\n\n    // Convert a hex string to a byte array\n    hexToBytes: function(hex) {\n      for (var bytes = [], c = 0; c < hex.length; c += 2)\n        bytes.push(parseInt(hex.substr(c, 2), 16));\n      return bytes;\n    },\n\n    // Convert a byte array to a base-64 string\n    bytesToBase64: function(bytes) {\n      for (var base64 = [], i = 0; i < bytes.length; i += 3) {\n        var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n        for (var j = 0; j < 4; j++)\n          if (i * 8 + j * 6 <= bytes.length * 8)\n            base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));\n          else\n            base64.push('=');\n      }\n      return base64.join('');\n    },\n\n    // Convert a base-64 string to a byte array\n    base64ToBytes: function(base64) {\n      // Remove non-base-64 characters\n      base64 = base64.replace(/[^A-Z0-9+\\/]/ig, '');\n\n      for (var bytes = [], i = 0, imod4 = 0; i < base64.length;\n          imod4 = ++i % 4) {\n        if (imod4 == 0) continue;\n        bytes.push(((base64map.indexOf(base64.charAt(i - 1))\n            & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2))\n            | (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));\n      }\n      return bytes;\n    }\n  };\n\n  module.exports = crypt;\n})();\n\n\n//# sourceURL=webpack://anuvadak/./node_modules/crypt/crypt.js?");

/***/ }),

/***/ "./node_modules/is-buffer/index.js":
/*!*****************************************!*\
  !*** ./node_modules/is-buffer/index.js ***!
  \*****************************************/
/***/ ((module) => {

eval("/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n//# sourceURL=webpack://anuvadak/./node_modules/is-buffer/index.js?");

/***/ }),

/***/ "./node_modules/md5/md5.js":
/*!*********************************!*\
  !*** ./node_modules/md5/md5.js ***!
  \*********************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("(function(){\r\n  var crypt = __webpack_require__(/*! crypt */ \"./node_modules/crypt/crypt.js\"),\r\n      utf8 = (__webpack_require__(/*! charenc */ \"./node_modules/charenc/charenc.js\").utf8),\r\n      isBuffer = __webpack_require__(/*! is-buffer */ \"./node_modules/is-buffer/index.js\"),\r\n      bin = (__webpack_require__(/*! charenc */ \"./node_modules/charenc/charenc.js\").bin),\r\n\r\n  // The core\r\n  md5 = function (message, options) {\r\n    // Convert to byte array\r\n    if (message.constructor == String)\r\n      if (options && options.encoding === 'binary')\r\n        message = bin.stringToBytes(message);\r\n      else\r\n        message = utf8.stringToBytes(message);\r\n    else if (isBuffer(message))\r\n      message = Array.prototype.slice.call(message, 0);\r\n    else if (!Array.isArray(message) && message.constructor !== Uint8Array)\r\n      message = message.toString();\r\n    // else, assume byte array already\r\n\r\n    var m = crypt.bytesToWords(message),\r\n        l = message.length * 8,\r\n        a =  1732584193,\r\n        b = -271733879,\r\n        c = -1732584194,\r\n        d =  271733878;\r\n\r\n    // Swap endian\r\n    for (var i = 0; i < m.length; i++) {\r\n      m[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |\r\n             ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;\r\n    }\r\n\r\n    // Padding\r\n    m[l >>> 5] |= 0x80 << (l % 32);\r\n    m[(((l + 64) >>> 9) << 4) + 14] = l;\r\n\r\n    // Method shortcuts\r\n    var FF = md5._ff,\r\n        GG = md5._gg,\r\n        HH = md5._hh,\r\n        II = md5._ii;\r\n\r\n    for (var i = 0; i < m.length; i += 16) {\r\n\r\n      var aa = a,\r\n          bb = b,\r\n          cc = c,\r\n          dd = d;\r\n\r\n      a = FF(a, b, c, d, m[i+ 0],  7, -680876936);\r\n      d = FF(d, a, b, c, m[i+ 1], 12, -389564586);\r\n      c = FF(c, d, a, b, m[i+ 2], 17,  606105819);\r\n      b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);\r\n      a = FF(a, b, c, d, m[i+ 4],  7, -176418897);\r\n      d = FF(d, a, b, c, m[i+ 5], 12,  1200080426);\r\n      c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);\r\n      b = FF(b, c, d, a, m[i+ 7], 22, -45705983);\r\n      a = FF(a, b, c, d, m[i+ 8],  7,  1770035416);\r\n      d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);\r\n      c = FF(c, d, a, b, m[i+10], 17, -42063);\r\n      b = FF(b, c, d, a, m[i+11], 22, -1990404162);\r\n      a = FF(a, b, c, d, m[i+12],  7,  1804603682);\r\n      d = FF(d, a, b, c, m[i+13], 12, -40341101);\r\n      c = FF(c, d, a, b, m[i+14], 17, -1502002290);\r\n      b = FF(b, c, d, a, m[i+15], 22,  1236535329);\r\n\r\n      a = GG(a, b, c, d, m[i+ 1],  5, -165796510);\r\n      d = GG(d, a, b, c, m[i+ 6],  9, -1069501632);\r\n      c = GG(c, d, a, b, m[i+11], 14,  643717713);\r\n      b = GG(b, c, d, a, m[i+ 0], 20, -373897302);\r\n      a = GG(a, b, c, d, m[i+ 5],  5, -701558691);\r\n      d = GG(d, a, b, c, m[i+10],  9,  38016083);\r\n      c = GG(c, d, a, b, m[i+15], 14, -660478335);\r\n      b = GG(b, c, d, a, m[i+ 4], 20, -405537848);\r\n      a = GG(a, b, c, d, m[i+ 9],  5,  568446438);\r\n      d = GG(d, a, b, c, m[i+14],  9, -1019803690);\r\n      c = GG(c, d, a, b, m[i+ 3], 14, -187363961);\r\n      b = GG(b, c, d, a, m[i+ 8], 20,  1163531501);\r\n      a = GG(a, b, c, d, m[i+13],  5, -1444681467);\r\n      d = GG(d, a, b, c, m[i+ 2],  9, -51403784);\r\n      c = GG(c, d, a, b, m[i+ 7], 14,  1735328473);\r\n      b = GG(b, c, d, a, m[i+12], 20, -1926607734);\r\n\r\n      a = HH(a, b, c, d, m[i+ 5],  4, -378558);\r\n      d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);\r\n      c = HH(c, d, a, b, m[i+11], 16,  1839030562);\r\n      b = HH(b, c, d, a, m[i+14], 23, -35309556);\r\n      a = HH(a, b, c, d, m[i+ 1],  4, -1530992060);\r\n      d = HH(d, a, b, c, m[i+ 4], 11,  1272893353);\r\n      c = HH(c, d, a, b, m[i+ 7], 16, -155497632);\r\n      b = HH(b, c, d, a, m[i+10], 23, -1094730640);\r\n      a = HH(a, b, c, d, m[i+13],  4,  681279174);\r\n      d = HH(d, a, b, c, m[i+ 0], 11, -358537222);\r\n      c = HH(c, d, a, b, m[i+ 3], 16, -722521979);\r\n      b = HH(b, c, d, a, m[i+ 6], 23,  76029189);\r\n      a = HH(a, b, c, d, m[i+ 9],  4, -640364487);\r\n      d = HH(d, a, b, c, m[i+12], 11, -421815835);\r\n      c = HH(c, d, a, b, m[i+15], 16,  530742520);\r\n      b = HH(b, c, d, a, m[i+ 2], 23, -995338651);\r\n\r\n      a = II(a, b, c, d, m[i+ 0],  6, -198630844);\r\n      d = II(d, a, b, c, m[i+ 7], 10,  1126891415);\r\n      c = II(c, d, a, b, m[i+14], 15, -1416354905);\r\n      b = II(b, c, d, a, m[i+ 5], 21, -57434055);\r\n      a = II(a, b, c, d, m[i+12],  6,  1700485571);\r\n      d = II(d, a, b, c, m[i+ 3], 10, -1894986606);\r\n      c = II(c, d, a, b, m[i+10], 15, -1051523);\r\n      b = II(b, c, d, a, m[i+ 1], 21, -2054922799);\r\n      a = II(a, b, c, d, m[i+ 8],  6,  1873313359);\r\n      d = II(d, a, b, c, m[i+15], 10, -30611744);\r\n      c = II(c, d, a, b, m[i+ 6], 15, -1560198380);\r\n      b = II(b, c, d, a, m[i+13], 21,  1309151649);\r\n      a = II(a, b, c, d, m[i+ 4],  6, -145523070);\r\n      d = II(d, a, b, c, m[i+11], 10, -1120210379);\r\n      c = II(c, d, a, b, m[i+ 2], 15,  718787259);\r\n      b = II(b, c, d, a, m[i+ 9], 21, -343485551);\r\n\r\n      a = (a + aa) >>> 0;\r\n      b = (b + bb) >>> 0;\r\n      c = (c + cc) >>> 0;\r\n      d = (d + dd) >>> 0;\r\n    }\r\n\r\n    return crypt.endian([a, b, c, d]);\r\n  };\r\n\r\n  // Auxiliary functions\r\n  md5._ff  = function (a, b, c, d, x, s, t) {\r\n    var n = a + (b & c | ~b & d) + (x >>> 0) + t;\r\n    return ((n << s) | (n >>> (32 - s))) + b;\r\n  };\r\n  md5._gg  = function (a, b, c, d, x, s, t) {\r\n    var n = a + (b & d | c & ~d) + (x >>> 0) + t;\r\n    return ((n << s) | (n >>> (32 - s))) + b;\r\n  };\r\n  md5._hh  = function (a, b, c, d, x, s, t) {\r\n    var n = a + (b ^ c ^ d) + (x >>> 0) + t;\r\n    return ((n << s) | (n >>> (32 - s))) + b;\r\n  };\r\n  md5._ii  = function (a, b, c, d, x, s, t) {\r\n    var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;\r\n    return ((n << s) | (n >>> (32 - s))) + b;\r\n  };\r\n\r\n  // Package private blocksize\r\n  md5._blocksize = 16;\r\n  md5._digestsize = 16;\r\n\r\n  module.exports = function (message, options) {\r\n    if (message === undefined || message === null)\r\n      throw new Error('Illegal argument ' + message);\r\n\r\n    var digestbytes = crypt.wordsToBytes(md5(message, options));\r\n    return options && options.asBytes ? digestbytes :\r\n        options && options.asString ? bin.bytesToString(digestbytes) :\r\n        crypt.bytesToHex(digestbytes);\r\n  };\r\n\r\n})();\r\n\n\n//# sourceURL=webpack://anuvadak/./node_modules/md5/md5.js?");

/***/ }),

/***/ "./src/Constants.js":
/*!**************************!*\
  !*** ./src/Constants.js ***!
  \**************************/
/***/ ((module) => {

eval("const BLOCK_ELEMENT = [\"address\",\n\"area\",\n\"article\",\n\"aside\",\n\"audio\",\n\"base\",\n\"blockquote\",\n\"body\",\n\"button\",\n\"canvas\",\n\"caption\",\n\"center\",\n\"col\",\n\"colgroup\",\n\"command\",\n\"datalist\",\n\"dd\",\n\"details\",\n\"dir\",\n\"div\",\n\"dl\",\n\"dt\",\n\"embed\",\n\"fieldset\",\n\"figcaption\",\n\"figure\",\n\"footer\",\n\"form\",\n\"frame\",\n\"frameset\",\n\"h1\",\n\"h2\",\n\"h3\",\n\"h4\",\n\"h5\",\n\"h6\",\n\"head\",\n\"header\",\n\"hgroup\",\n\"hr\",\n\"html\",\n\"input\",\n\"isindex\",\n\"keygen\",\n\"label\",\n\"legend\",\n\"li\",\n\"link\",\n\"menu\",\n\"meta\",\n\"meter\",\n\"nav\",\n\"noframes\",\n\"noscript\",\n\"ol\",\n\"optgroup\",\n\"option\",\n\"output\",\n\"p\",\n\"param\",\n\"pre\",\n\"progress\",\n\"ruby\",\n\"section\",\n\"select\",\n\"sly\",\n\"source\",\n\"style\",\n\"summary\",\n\"table\",\n\"tbody\",\n\"td\",\n\"textarea\",\n\"tfoot\",\n\"th\",\n\"thead\",\n\"title\",\n\"tr\",\n\"track\",\n\"ul\",\n\"video\",\n\"root\",\n\"html\",\n\"main\",\n\"app-root\"];\n\nconst IGNORE = [\n    \"script\",\n    \"img\",\n    \"noscript\",\n    \"iframe\",\n    \"css\",\n    \"style\",\n    \"!doctype\",\n    \"comment\",\n    // \"head\"\n]\n\nconst INLINE_ELEMENTS = [\n    \"a\",\n    \"abbr\",\n    \"acronym\",\n    \"audio\",\n    \"b\",\n    \"bdi\",\n    \"bdo\",\n    \"big\",\n    \"br\",\n    \"button\",\n    \"canvas\",\n    \"cite\",\n    \"code\",\n    \"data\",\n    \"datalist\",\n    \"del\",\n    \"dfn\",\n    \"em\",\n    \"embed\",\n    \"i\",\n    \"iframe\",\n    \"img\",\n    \"input\",\n    \"ins\",\n    \"kbd\",\n    \"label\",\n    \"map\",\n    \"mark\",\n    \"meter\",\n    \"noscript\",\n    \"object\",\n    \"output\",\n    \"picture\",\n    \"progress\",\n    \"q\",\n    \"ruby\",\n    \"s\",\n    \"samp\",\n    \"script\",\n    \"select\",\n    \"slot\",\n    \"small\",\n    \"span\",\n    \"strong\",\n    \"sub\",\n    \"sup\",\n    \"svg\",\n    \"template\",\n    \"time\",\n    \"u\",\n    \"tt\",\n    \"var\",\n    \"video\",\n    \"wbr\"\n    ];\n\nconst META_ALLOWED = [\n    \"description\",\n    \"keywords\"\n]\n\nconst META_FOR_SEO = {\n    \"title\":\"meta:title\",\n    \"keywords\":\"meta:keywords\",\n    \"desciption\":\"meta:description\",\n    \"twitter:title\":\"twitter:title\",\n    \"twitter:description\":\"twitter:description\",\n    \"og:title\":\"og:title\",\n    \"og:description\":\"og:description\",\n    \"linkedin:title\":\"linkedin:title\",\n    \"linkedin:description\":\"linkedin:description\",\n    \"facebook:title\":\"facebook:description\",\n    \"facebook:description\":\"facebook:description\",\n    \"pinterest:title\":\"pinterest:title\",\n    \"pinterest:description\":\"pinterest:description\"\n}\n\nconst INPUT_ALLOWED_TYPED = [\n    \"text\",\n    \"number\",\n    \"email\",\n    \"password\",\n    \"search\",\n    \"tel\",\n    \"url\"\n];\n\nconst INPUT_ALLOWED_CLICK = [\n    \"button\",\n    \"submit\",\n    \"reset\"\n];\n\nconst WIDGET_POSITIONS = {\n    TOP_RIGHT: \"TOP_RIGHT\",\n    RIGHT_CENTER: \"RIGHT_CENTER\",\n    LEFT_CENTER:\"LEFT_CENTER\",\n    RIGHT_BOTTOM:\"RIGHT_BOTTOM\",\n    LEFT_BOTTOM:\"LEFT_BOTTOM\",\n    MPL_HEADER:\"MPL_HEADER\",\n    NOWFLOATS_POSITION: \"NOWFLOATS_POSITION\",\n    LOKSABHA_POSITION: \"LOKSABHA_POSITION\"\n}\n\nconst WIDGET_POSITION_CLASS_MAPPER = {\n    TOP_RIGHT: \"anuvadak-fixed-top\",\n    RIGHT_CENTER: \"anuvadak-fixed-right-center\",\n    RIGHT_BOTTOM:\"anuvadak-fixed-right-bottom\",\n    LEFT_CENTER: \"anuvadak-fixed-left-center\",\n    LEFT_BOTTOM:\"anuvadak-fixed-left-bottom\",\n    MPL_HEADER: \"anuvadak-fixed-mpl-header\",\n    NOWFLOATS_POSITION: \"anuvadak-fixed-nowfloats-position\",\n    LOKSABHA_POSITION:\"anuvadak-fixed-loksabha-position\"\n}\n\nconst LANGUAGE_CONSTANTS = {\n    SOURCE_LANGUAGE:\"english\"\n}\n\nconst REVERSE_LANGUAGE_MAP ={\n  \"en\": \"english\",\n  \"hi\": \"hindi\",\n  \"od\": \"odia\",\n  \"pa\": \"punjabi\",\n  \"gu\": \"gujarati\",\n  \"mr\": \"marathi\",\n  \"te\": \"telugu\",\n  \"ta\": \"tamil\",\n  \"as\": \"assamese\",\n  \"bn\": \"bengali\",\n  \"ml\": \"malayalam\",\n  \"kn\": \"kannada\",\n  \"ur\": \"urdu\",\n  \"bh\": \"maithili\",\n  \"sa\": \"sanskrit\",\n  \"kok\": \"konkani\",\n  \"ks\": \"kashmiri\",\n  \"mni\": \"manipuri\",\n  \"af\": \"afrikaans\",\n  \"sq\": \"albanian\",\n  \"am\": \"amharic\",\n  \"brx\": \"bodo\",\n  \"bg\": \"bulgarian\",\n  \"my\": \"burmese\",\n  \"km\": \"cambodian\",\n  \"hr\": \"croatian\",\n  \"cs\": \"czech\",\n  \"da\": \"danish\",\n  \"doi\": \"dogri\",\n  \"nl\": \"dutch\",\n  \"et\": \"estonian\",\n  \"fa\": \"farsi\",\n  \"fi\": \"finnish\",\n  \"fr\": \"french\",\n  \"de\": \"german\",\n  \"el\": \"greek\",\n  \"hu\": \"hungarian\",\n  \"is\": \"icelandic\",\n  \"id\": \"indonesia\",\n  \"it\": \"italian\",\n  \"ku\": \"kurdish\",\n  \"lo\": \"lao\",\n  \"ln\": \"lingala\",\n  \"mg\": \"malagasy\",\n  \"ms\": \"malay\",\n  \"mt\": \"maltese\",\n  \"mn\": \"mongolian\",\n  \"ne\": \"nepali\",\n  \"no\": \"norwegian\",\n  \"ps\": \"pashto\",\n  \"pl\": \"polish\",\n  \"pt\": \"portuguese\",\n  \"ro\": \"romanian\",\n  \"ru\": \"russian\",\n  \"sat\": \"santali\",\n  \"sr\": \"serbian\",\n  \"sd\": \"sindhi\",\n  \"si\": \"sinhalese\",\n  \"sk\": \"slovak\",\n  \"sl\": \"slovenian\",\n  \"so\": \"somali\",\n  \"ckb\": \"sorani\",\n  \"es\": \"spanish\",\n  \"sw\": \"swahili\",\n  \"sv\": \"swedish\",\n  \"syl\": \"sylheti\",\n  \"tg\": \"tajik\",\n  \"th\": \"thai\",\n  \"tr\": \"turkish\",\n  \"tw\": \"twi\",\n  \"uk\": \"ukrainian\",\n  \"uz\": \"uzbek\",\n  \"vi\": \"vietnamese\",\n  \"zu\": \"zulu\",\n  \"ar\": \"arabic\",\n  \"az\": \"azeri\",\n  \"dv\": \"dhivehi\",\n  \"iw\": \"hebrew\"\n  }\n\nconst LANGUAGE_MAP={\n    english: \"en\",\n    hindi: \"hi\",\n    odia: \"od\",\n    punjabi: \"pa\",\n    gujarati: \"gu\",\n    marathi: \"mr\",\n    telugu: \"te\",\n    tamil: \"ta\",\n    assamese: \"as\",\n    bengali: \"bn\",\n    malayalam: \"ml\",\n    kannada: \"kn\",\n    urdu: \"ur\",\n    maithili: \"bh\",\n    sanskrit: \"sa\",\n    konkani: \"kok\",\n    kashmiri: \"ks\",\n    manipuri: \"mni\",\n    afrikaans: \"af\",\n    albanian: \"sq\",\n    amharic: \"am\",\n    bodo: \"brx\",\n    bulgarian: \"bg\",\n    burmese: \"my\",\n    cambodian: \"km\",\n    croatian: \"hr\",\n    czech: \"cs\",\n    danish: \"da\",\n    dogri: \"doi\",\n    dutch: \"nl\",\n    estonian: \"et\",\n    farsi: \"fa\",\n    finnish: \"fi\",\n    french: \"fr\",\n    german: \"de\",\n    greek: \"el\",\n    hungarian: \"hu\",\n    icelandic: \"is\",\n    indonesia: \"id\",\n    italian: \"it\",\n    kurdish: \"ku\",\n    lao: \"lo\",\n    lingala: \"ln\",\n    malagasy: \"mg\",\n    malay: \"ms\",\n    maltese: \"mt\",\n    mongolian: \"mn\",\n    nepali: \"ne\",\n    norwegian: \"no\",\n    pashto: \"ps\",\n    polish: \"pl\",\n    portuguese: \"pt\",\n    romanian: \"ro\",\n    russian: \"ru\",\n    santali: \"sat\",\n    serbian: \"sr\",\n    sindhi: \"sd\",\n    sinhalese: \"si\",\n    slovak: \"sk\",\n    slovenian: \"sl\",\n    somali: \"so\",\n    sorani: \"ckb\",\n    spanish: \"es\",\n    swahili: \"sw\",\n    swedish: \"sv\",\n    sylheti: \"syl\",\n    tajik: \"tg\",\n    thai: \"th\",\n    turkish: \"tr\",\n    twi: \"tw\",\n    ukrainian: \"uk\",\n    uzbek: \"uz\",\n    vietnamese: \"vi\",\n    zulu: \"zu\",\n    arabic: \"ar\",\n    azeri: \"az\",\n    dhivehi: \"dv\",\n    hebrew: \"iw\"\n}\n\nconst CACHE_CONFIG_CONSTANT = {\n    JS_SNIPPET:\"js_snippet\",\n    GET_TRANSLATION:\"get_translation\",\n    SCOPE_CHECK:\"scope_check\",\n    CUSTOM_FONT:\"custom_font\",\n    NO_TRANSLATION:\"no_translation\",\n    IGNORE_PATTERN:\"ignore_pattern\"\n}\n\nmodule.exports = {\n    BLOCK_ELEMENT,IGNORE, \n    INLINE_ELEMENTS, \n    META_ALLOWED, \n    INPUT_ALLOWED_CLICK, \n    INPUT_ALLOWED_TYPED,\n    WIDGET_POSITIONS,\n    WIDGET_POSITION_CLASS_MAPPER,\n    LANGUAGE_CONSTANTS,\n    REVERSE_LANGUAGE_MAP,\n    CACHE_CONFIG_CONSTANT,\n    LANGUAGE_MAP,\n    META_FOR_SEO\n};\n\n//# sourceURL=webpack://anuvadak/./src/Constants.js?");

/***/ }),

/***/ "./src/backend.js":
/*!************************!*\
  !*** ./src/backend.js ***!
  \************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("const { getConfig, setConfig, setIgnorePatternRegex, setNoTranslationNode } = __webpack_require__(/*! ./config */ \"./src/config.js\");\nconst { LANGUAGE_CONSTANTS,CACHE_CONFIG_CONSTANT,REVERSE_LANGUAGE_MAP,LANGUAGE_MAP } = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\nconst { getCurrentLanguage, setTranslationDictionary, normalStringify, getSourceFontDictionary, setSourceFontDictionary } = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\n// const tmWithTarget = require('./tmWithTarget.json');\n\nconst urlRectify = (url,websiteMapping,hostname)=>{\n    // const {  } = getConfig();\n    let currUrl = cleanUrl(actualUrl(url));\n    switch (websiteMapping) {\n        case \"NONE\":\n            return currUrl;\n        case \"SUBDIRECTORY\":\n            return rectifyForSubdirectory(url,hostname);\n        case \"SUBDOMAIN\":\n            return rectifyForSubdomain(url,hostname);\n    }\n}\n\n// gives the actual url of the page\n// Ex-> url:\"https://www.example.com/hi/abc\" returns: \"https://www.example.com/abc\"\n// Ex-> url:\"https://www.example.com/abc\" returns: \"https://www.example.com/abc\"\nconst rectifyForSubdirectory = (url,hostname)=>{\n    const { pathname } = new URL(url)\n    const path_split = pathname.split(\"/\");\n    const language = path_split[1];\n    let actualUrl = url;\n    if (language.length === 2 && REVERSE_LANGUAGE_MAP[language]) {\n        actualUrl = actualUrl.replace(`/${language}`,\"\");\n    }\n    return cleanUrl(actualUrl);\n}\n\nconst urlForSubdirectory = (url,language)=>{\n    if (language === \"english\") {\n        return getConfig().url;\n    }\n    let { pathname,origin } = new URL(url);\n    pathname = `/${LANGUAGE_MAP[language]}${pathname}`\n    const subDirectoryUrl = new URL(pathname,origin).href;\n    return subDirectoryUrl;\n}\n\n// gives the actual url of the page\n// Ex -> https://hi.example.com/abc returns: https://www.example.com\nconst rectifyForSubdomain = (url,hostnameProj)=>{\n    const { hostname } = new URL(url);\n    let actualUrl = url;\n    if (hostname !== hostnameProj) {\n        actualUrl = actualUrl.replace(hostname,hostnameProj);\n    }\n    return actualUrl;\n}\n\nconst urlForSubdomain = (url,language) => {\n    if (language === \"english\") {\n        return getConfig().url;\n    }\n    const { hostname } = new URL(url);\n    const splitHostname = hostname.split(\".\");\n    splitHostname[0] = LANGUAGE_MAP[language];\n    const newHostname = splitHostname.join(\".\");\n    return url.replace(hostname,newHostname);\n}\n\nconst hostnameRectify = (hostname, multiOrigin) => {\n    if (multiOrigin) {\n        return window.location.hostname\n    } else {\n        return hostname;\n    }\n}\n\nconst fetchTranslation = async(targetLang)=>{\n    const translationUrl = getConfig().getLanguageTranslationUrl;\n    const url = getConfig().url;\n    const cache = getConfig().cacheConfig[CACHE_CONFIG_CONSTANT.GET_TRANSLATION] || false;\n    const projectId = getConfig().projectKey;\n    const result = await fetch(translationUrl,{\n        method: \"POST\",\n        headers: { \"Content-Type\":\"application/json\" },\n        body: JSON.stringify({\n            targetLang,\n            url,\n            cache,\n            projectId\n        })\n    })\n    .then(res=>res.json())\n    .then(res=>{\n        if (res.success) {\n            return res.data\n        } else {\n            return {}\n        }\n    });\n\n    return result;\n}\n\nconst callBackendForConfig = async(projectKey,loadInitVariableUrl)=>{\n    const {hostname} = new URL(window.location.href)\n    const data = await fetch(loadInitVariableUrl,{\n        method: \"POST\",\n        headers: { \"Content-Type\":\"application/json\" },\n        body: JSON.stringify({\n            projectId:projectKey,\n            hostname:hostname\n        })\n    })\n    .then(res=>res.json())\n    .then(res=>{\n        if (res.success) {\n            res.data.url = cleanUrl(window.location.href);\n            return res.data;\n        } else {\n            return false;\n        }\n    })\n    .catch(err=>{\n        console.log(err);\n    });\n    return data;\n\n}\n\n\n/**\n * return structure\n * {\n *  allowedLanguage\n *  visibility\n *  inclusionList\n *  exclusionList\n *  websiteMapping\n *  wscope\n * }\n */\nconst loadInitVariables = async () =>{\n    try {\n\n        // call server to get project config\n        let config = getConfig();\n        const projectConfig = await callBackendForConfig(config.projectKey,config.loadInitVariableUrl);\n        projectConfig.websiteMapping = projectConfig.websiteMapping.toUpperCase();\n        // need to rectify url reason on SUBDIRECTORY or SUBDOMAIN mapping type \n        // original url and location url may vary\n        projectConfig.hostname = hostnameRectify(projectConfig.hostname, projectConfig.multiOrigin);\n        projectConfig.url = urlRectify(projectConfig.url,projectConfig.websiteMapping,projectConfig.hostname);\n        config = {...config,...projectConfig}\n        // update config with new values\n        setConfig(config);\n        // set config value\n        config = getConfig();\n        return Promise.resolve({...config});   \n    } catch (error) {\n        return Promise.reject();\n    }\n}\n\nconst getTranslations = async ()=>{\n    try {\n        const language = getCurrentLanguage();\n        if (language === LANGUAGE_CONSTANTS.SOURCE_LANGUAGE) {\n            // we could use prefetch option here to prefetch all tm before hand\n            return Promise.resolve({});\n        } else {\n            // fetch specified language only\n            // const tm = tmWithTarget\n            const tmToStore = await fetchTranslation(language);\n            \n            // setTranslationDictionary(language,tmToStore);\n            setTranslationDictionary(language,tmToStore);\n            return Promise.resolve(tmToStore);\n        }\n    } catch (error) {\n        return Promise.reject({});   \n    }\n}\n\n// false means not fit for anuvadak\nconst filterForAnuvadak = (string) => {\n    try {\n        if (string.match(/^[\\d\\,\\-\\_\\.$!@#%^&*()+=:;\"'~\\`\\s\\|₹]+$/g)) {\n            return false;\n        }\n\n        if (string.match(/^[\\x00-\\x7F\\xA0“”’‘«»‹›©÷– ₹…°⭐é½¼¾—×→ ‍™®]*$/g)) {\n            return true;\n        }\n\n        return false;\n    } catch (error) {\n        return false;\n    }\n}\n\nconst sendMissingTranslations = async (newTm,language)=>{\n    try {\n\n        const { projectKey,missingTranslationUrl,url,ignorePatternRegex,hostname, multiOrigin } = getConfig();\n        const regex = new RegExp(ignorePatternRegex, \"gm\");\n        let classExtractorRegex = /\\sclass=\"(.*?)\"/g\n        const tmToSend = Object.keys(newTm).map(hash=>{\n            if (!hash) {\n                return false;\n            }\n            if (ignorePatternRegex !== \"\" && newTm[hash].textContent.match(regex)) {\n                return false;\n            }\n            newTm[hash].projectId = projectKey;\n            newTm[hash].url = cleanUrl(url);\n            newTm[hash].hostname = hostname;\n            // if (\n            //     !newTm[hash][\"classList\"] ||\n            //     newTm[hash][\"classList\"] === []\n            // ){\n            //     let classes =\n            //       newTm[hash].styledSource.match(classExtractorRegex);\n            //     if (classes && classes[0]) {\n            //       let extractedClasses = classes[0];\n            //       extractedClasses = extractedClasses.match(/\"([^\"]+)\"/)[1];\n            //       newTm[hash].classList = extractedClasses.split(\" \");\n            //     } else {\n            //       newTm[hash].classList = [];\n            //     }\n            // }\n            \n\n            if (!filterForAnuvadak(newTm[hash].preProcessedSource)) {\n                return false;\n            }\n            return {...newTm[hash]};\n        }).filter(Boolean);\n\n        if (!tmToSend.length > 0) {\n            return;\n        }\n\n        const res = await fetch(missingTranslationUrl,{\n            method: \"POST\",\n            headers: { \"Content-Type\":\"application/json\" },\n            body: JSON.stringify({\n                newTm:tmToSend,\n                language,\n                projectId: projectKey,\n                url,\n                multiDomain: multiOrigin\n            })\n        });\n        \n    } catch (error) {\n        return Promise.reject({});\n    }\n}\n\nconst getVisitorIP = async ()=>{\n    return fetch(\"https://api.ipify.org/?format=json\")\n        .then(response => response.json())\n        .then(data => data.ip)\n        .catch(() => \"127.0.0.1\")\n}\n\nconst createSiteVisitImpression = async (language)=>{\n    const { projectKey,sendSiteVisitImpressionUrl,hostname,url } = getConfig();\n    const ip = await getVisitorIP() || \"\";\n    const res = await fetch(sendSiteVisitImpressionUrl,{\n        method: \"POST\",\n        headers: { \"Content-Type\":\"application/json\" },\n        body: normalStringify({\n            language,\n            projectId: projectKey,\n            hostname,\n            impressions:[{\n                ip,\n                url\n            }]\n        })\n    })\n}\n\nconst checkInScope = async ()=>{\n    try {\n        const { checkScopeUrl,projectKey,url,cacheConfig, languageOption } = getConfig();\n        const cache = cacheConfig[CACHE_CONFIG_CONSTANT.SCOPE_CHECK] || false\n\n        // use when languageOption has values like [\"hindi\", \"marathi\"]\n        let language = languageOption.map(item => {\n            return LANGUAGE_MAP[item];\n        });\n\n        const res = await fetch(checkScopeUrl,{\n            method:\"POST\",\n            headers: { \"Content-Type\":\"application/json\" },\n            body: normalStringify({\n                url,\n                projectId: projectKey,\n                cache,\n                domainLanguages: language  // replace languageOption with language variable\n            })\n        })\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nconst getCustomFontSize = async ()=>{\n    try {\n        const config = getConfig();\n        const lang = getCurrentLanguage();\n        const { url, projectKey } = config;\n        const cache = config.cacheConfig[CACHE_CONFIG_CONSTANT.CUSTOM_FONT] || false;\n        const res = await (await fetch(`${config.getCustomFontSizeUrl}?url=${deAmpUrl(cleanUrl(url))}&lang=${lang}&cache=${cache}&projectId=${projectKey}`)).json();\n        resetFontSize();\n        if (res.success === true ) {\n            const customFonts = res.data;\n            if (Object.keys(customFonts).length > 0) {\n                Object.keys(customFonts).forEach(element=>{\n                    const obj = {};\n                    document.querySelectorAll(element).forEach(node => {\n                        obj[element] = window.getComputedStyle(node).getPropertyValue(\"font-size\");\n                    });\n                    setSourceFontDictionary(obj);\n                    changeFontStyle(element,customFonts[element]);\n                })\n            }\n        } else {\n            resetFontSize();\n        }\n    } catch (error) {\n        console.log(\"Error on custom font\",error);\n        resetFontSize();\n    }\n}\n\nconst changeFontStyle = (element, size)=>{\n    document.querySelectorAll(element).forEach(node => {\n        node.style.fontSize = `${size}`;\n    });\n}\n\nconst resetFontSize = ()=>{\n    const dict = getSourceFontDictionary();\n    for (const element in dict) {\n        document.querySelectorAll(element).forEach(node => node.style.fontSize = dict[element]);\n    }\n}\n\n//fetch ignore pattern regex\nconst fetchIgnorePattern = async () => {\n    const {getIgnorePatternUrl, projectKey, cacheConfig } = getConfig()\n    const cache = cacheConfig[CACHE_CONFIG_CONSTANT.IGNORE_PATTERN] || false;\n    const res = await (await fetch(`${getIgnorePatternUrl}?projectId=${projectKey}&cache=${cache}`)).json();\n    setIgnorePatternRegex(res.data)\n}\n\nconst getNoTranslationNodes = async()=>{\n    try {\n        const { url,getNoTranslationNodeUrl,projectKey,cacheConfig } = getConfig();\n        const lang = getCurrentLanguage();\n        const cache = cacheConfig[CACHE_CONFIG_CONSTANT.NO_TRANSLATION] || false;\n        const res = await (await fetch(`${getNoTranslationNodeUrl}?url=${deAmpUrl(cleanUrl(url))}&lang=${lang}&projectId=${projectKey}&cache=${cache}`)).json();\n        if (res.success === true) {\n            const noTranslationNodes = res.data;\n            setNoTranslationNode(noTranslationNodes)\n        }\n    } catch (error) {\n        console.log(error);\n    }\n    return;\n}\n\nconst applyNoTranslation = ()=>{\n    const { noTranslationNodes,noLocalizationClass } = getConfig();\n    noTranslationNodes.forEach(element => {\n        try{\n            document.querySelectorAll(element).forEach(item => recursivelyAddNoTranslationClass(item,noLocalizationClass))\n        }\n        catch(error){\n            console.log(error)\n        }\n    });\n}\n\nconst recursivelyAddNoTranslationClass = (jsElement,noLocalizationClass)=>{\n    for (const child of jsElement.children) {\n        // child.classList.add(\"\")\n        child.setAttribute(noLocalizationClass,true);\n        recursivelyAddNoTranslationClass(child,noLocalizationClass);\n    }\n    jsElement.setAttribute(noLocalizationClass,true);\n}\n\nconst cleanUrl = (url)=>{\n    url = url.replace(/\\/#(\\w*)$/gm,\"\")\n\turl = url.replace(/\\/$/, \"\");\n\treturn url;\n};\n\n// remove & with <ampersand>\nconst deAmpUrl = (url)=>{\n    const newUrl = url.replace(\"&\",\"<ampersand>\");\n    return newUrl;\n};\n\n// create actual url from current location href like \n// remove private query\n// remove subdirectory from url\nconst actualUrl = (url)=>{\n    let currUrl = removePrivateFromHref(url);\n    currUrl = removeLangFromHref(currUrl);\n    return currUrl;\n}\n\nconst removeLangFromHref = (url) => {\n    let currHref = url;\n    const urlObj = new URL(url);\n    const lang = urlObj.searchParams.get(\"lg-anv\")\n    if (urlObj.searchParams.has(\"lg-anv\")) {\n        const langQuery = `lg-anv=${lang}`;\n        if(currHref.match(langQuery)){\n            currHref = currHref.replace(`?${langQuery}`,\"\");\n            currHref = currHref.replace(`&${langQuery}`,\"\");\n        }\n    }\n    return currHref;\n}\n\nconst removePrivateFromHref = (url)=>{\n    let currHref = url;\n    // i need to create a url that does not have v=private in it\n    //  different ways v=private can exist is \n    //  ?v=private& -> ?\n    //  ?v=private -> \n    //  &v=private -> \n    //  &v=private& -> &\n    if (currHref.match(\"v=private&\")) {\n        currHref = currHref.replace(\"v=private&\",\"\");\n    }\n    if (currHref.match(\"v=private\")) {\n        currHref = currHref.replace(\"?v=private\",\"\");\n        currHref = currHref.replace(\"&v=private\",\"\");\n    }\n    return currHref;\n}\n\nconst addImageUrls = async({imageUrlsObj, urls, targetLang})=>{\n    try {\n        const { addImageUrl } = getConfig();\n        const res = await fetch(addImageUrl,{\n            method: \"POST\",\n            headers: { \"Content-Type\":\"application/json\" },\n            body: JSON.stringify({\n                imageUrlsObj, \n                urls, \n                targetLang\n            })\n        })\n        console.log(res);\n        if (res.success === true) {\n\n        }\n    } catch (error) {\n        console.log(error);\n    }\n    return;\n}\n\nconst sendFaultyTranslation = (sourcehashes)=>{\n    try {\n        // currently sending all sourceHashes in a single get request\n        // better from nginx caching perspective\n        const { faultyTranslationUrl,projectKey } = getConfig();\n        const targetLang = LANGUAGE_MAP[getCurrentLanguage()];\n        let reqUrl = `${faultyTranslationUrl}?projectId=${projectKey}&targetLang=${targetLang}`;\n        for (const sourceHash of sourcehashes) {\n            reqUrl = `${reqUrl}&sourceHash=${sourceHash}`;\n        }\n\n        fetch(reqUrl)\n        .then(res=>{\n            \n        })\n        .catch(err=>{\n            console.log(err);\n        });\n\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nconst checkDomainActive = async () => {\n    const { hostname,projectKey,checkDomainUrl,cacheConfig } = getConfig();\n    const cache = cacheConfig[CACHE_CONFIG_CONSTANT.SCOPE_CHECK] || false;\n    const res = await (await fetch(`${checkDomainUrl}?hostname=${hostname}&projectId=${projectKey}&cache=${cache}`)).json();\n    if (res.success) {\n        if (res.data.active) {\n            return true;\n        } else {\n            return false;\n        }\n    } else {\n        return \"DOMAIN_NOT_EXIST\";\n    }\n}\n\nconst getMetaTypeData = async ()=>{\n    try {\n        const { projectKey,url,getMetaTypeUrl } = getConfig();\n        const currLang = getCurrentLanguage();\n\n        const response = await (await fetch(getMetaTypeUrl,{\n            method:\"POST\",\n            headers: { \"Content-Type\":\"application/json\" },\n            body:JSON.stringify({\n                projectId: projectKey,\n                url,\n                targetLang: LANGUAGE_MAP[currLang]\n            }),\n        })).json();\n\n        const metaTypeData = response.data;\n        return metaTypeData;\n    } catch (error) {\n        return {};\n    }\n}\n\nconst storeMetaTypeData = async (sourceHashWithMetaType)=>{\n    try {\n        const { projectKey,url,hostname,storeMetaTypeUrl } = getConfig();\n        const request = await (await fetch(storeMetaTypeUrl, {\n            method: \"POST\",\n            headers: { \"Content-Type\":\"application/json\" },\n            body: JSON.stringify({\n                projectId: projectKey,\n                hostname,\n                url,\n                sourceHashWithMetaType\n            })\n        })).json()\n        console.log(request.data);\n        return { success: true };\n    } catch (error) {\n        console.log(error);\n        return { success: false };\n    }\n}\n\nmodule.exports = {\n    loadInitVariables,\n    getTranslations,\n    sendMissingTranslations,\n    cleanUrl,\n    createSiteVisitImpression,\n    checkInScope,\n    getCustomFontSize,\n    resetFontSize,\n    actualUrl,\n    fetchIgnorePattern,\n    applyNoTranslation,\n    getNoTranslationNodes,\n    urlRectify,\n    urlForSubdomain,\n    urlForSubdirectory,\n    addImageUrls,\n    sendFaultyTranslation,\n    checkDomainActive,\n    getMetaTypeData,\n    storeMetaTypeData,\n}\n\n//# sourceURL=webpack://anuvadak/./src/backend.js?");

/***/ }),

/***/ "./src/config.js":
/*!***********************!*\
  !*** ./src/config.js ***!
  \***********************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("const { WIDGET_POSITIONS } = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\n\nlet config = {\n    hostname:\"\",\n    wscope:\"\",\n    inclusionList:[],\n    exclusionList:[],\n    languageSelectorVisible:false,\n    noLocalizationClass:\"anuvadak-no-localization\",\n    serverURL:\"http://localhost:3001\",\n    allowedLanguage:{},\n    projectKey:\"\",\n    websiteMapping:\"NONE\",\n    url: \"\",\n    loadInitVariableUrl:\"\",\n    getLanguageTranslationUrl:\"\",\n    missingTranslationUrl:\"\",\n    sendSiteVisitImpressionUrl:\"\",\n    checkScopeUrl:\"\",\n    isVisible:true,\n    getCustomFontSizeUrl:\"\",\n    getIgnorePatternUrl:\"\",\n    ignorePatternRegex:\"\",\n    getNoTranslationNodeUrl:\"\",\n    noTranslationNodes:[],\n    disableWidget: false,\n    cacheConfig:{},\n    position: \"\",\n    multiOrigin: false,\n    disableWidget: false,\n    metaTags:{},\n    customWidget:false,\n    faultyTranslationUrl: \"\",\n    rtlDirective: true,\n    languageOption:[],\n    checkDomainUrl:\"\",\n    addImageUrl: \"\",\n    storeMetaTypeUrl:\"\",\n    getMetaTypeUrl:\"\",\n};\n\nconst getConfig = ()=>{\n    return config;\n}\n\nconst setConfig = (aconfig)=>{\n    config = {...aconfig}\n}\n\nconst setProjectKey = (projectKey) => {\n    config.projectKey = projectKey;\n}\n\nconst setCustomWidget = (customWidget) => {\n    config.customWidget = customWidget;\n}\n\nconst setIgnorePatternRegex = (ignorePatternRegex) => {\n    config.ignorePatternRegex = ignorePatternRegex\n}\n\nconst setNoTranslationNode = (nodes)=>{\n    config.noTranslationNodes = nodes;\n}\n\nconst setLanguageOption = (option) => {\n    config.languageOption = option\n}\n\nconst setBackendUrl = (url)=>{\n    config.loadInitVariableUrl = url.loadInitVariableUrl;\n    config.getLanguageTranslationUrl = url.getLanguageTranslationUrl;\n    config.missingTranslationUrl = url.missingTranslationUrl;\n    config.sendSiteVisitImpressionUrl = url.sendSiteVisitImpressionUrl;\n    config.checkScopeUrl = url.checkScopeUrl;\n    config.getCustomFontSizeUrl = url.getCustomFontSizeUrl;\n    config.getIgnorePatternUrl = url.getIgnorePatternUrl;\n    config.getNoTranslationNodeUrl = url.getNoTranslationNodeUrl;\n    config.faultyTranslationUrl = url.faultyTranslationUrl;\n    config.checkDomainUrl = url.checkDomainUrl;\n    config.addImageUrl = url.addImageUrl;\n    config.getMetaTypeUrl = url.getMetaTypeUrl;\n    config.storeMetaTypeUrl = url.storeMetaTypeUrl;\n}\n\nconst setWidgetPosition = (position)=>{\n    if (position) {\n        config.position = position;\n    }else {\n        config.position = WIDGET_POSITIONS.RIGHT_CENTER;\n    }\n}\n\n// if disable true then disable the widget or else don't\nconst setDisableWidget = (disable)=>{\n    config.disableWidget = !!disable;\n}\n\nmodule.exports = {\n    getConfig,\n    setProjectKey,\n    setConfig,\n    setBackendUrl,\n    setIgnorePatternRegex,\n    setCustomWidget,\n    setNoTranslationNode,\n    setWidgetPosition,\n    setDisableWidget,\n    setLanguageOption\n}\n\n//# sourceURL=webpack://anuvadak/./src/config.js?");

/***/ }),

/***/ "./src/doc-ready.js":
/*!**************************!*\
  !*** ./src/doc-ready.js ***!
  \**************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// https://github.com/jfriend00/docReady\n\n// (function(funcName, baseObj) {\n//     \"use strict\";\n//     // The public function name defaults to window.docReady\n//     // but you can modify the last line of this function to pass in a different object or method name\n//     // if you want to put them in a different namespace and those will be used instead of\n//     // window.docReady(...)\n//     funcName = funcName || \"docReady\";\n//     baseObj = baseObj || window;\nvar readyList = [];\nvar readyFired = false;\nvar readyEventHandlersInstalled = false;\n\n// call this when the document is ready\n// this function protects itself against being called more than once\nfunction ready() {\n    if (!readyFired) {\n        // this must be set to true before we start calling callbacks\n        readyFired = true;\n        for (var i = 0; i < readyList.length; i++) {\n            // if a callback here happens to add new ready handlers,\n            // the docReady() function will see that it already fired\n            // and will schedule the callback to run right after\n            // this event loop finishes so all handlers will still execute\n            // in order and no new ones will be added to the readyList\n            // while we are processing the list\n            readyList[i].fn.call(window, readyList[i].ctx);\n        }\n        // allow any closures held by these functions to free\n        readyList = [];\n    }\n}\n\nfunction readyStateChange() {\n    if ( document.readyState === \"complete\" ) {\n        ready();\n    }\n}\n\n// This is the one public interface\n// docReady(fn, context);\n// the context argument is optional - if present, it will be passed\n// as an argument to the callback\n// baseObj[funcName] = function(callback, context) {\n/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(callback, context) {\n    // if ready has already fired, then just schedule the callback\n    // to fire asynchronously, but right away\n    if (readyFired) {\n        setTimeout(function() {callback(context);}, 1);\n        return;\n    } else {\n        // add the function and context to the list\n        readyList.push({fn: callback, ctx: context});\n    }\n    // if document already ready to go, schedule the ready function to run\n    // IE only safe when readyState is \"complete\", others safe when readyState is \"interactive\"\n    if (document.readyState === \"complete\" || (!document.attachEvent && document.readyState === \"interactive\")) {\n        setTimeout(ready, 1);\n    } else if (!readyEventHandlersInstalled) {\n        // otherwise if we don't have event handlers installed, install them\n        if (document.addEventListener) {\n            // first choice is DOMContentLoaded event\n            document.addEventListener(\"DOMContentLoaded\", ready, false);\n            // backup is window load event\n            window.addEventListener(\"load\", ready, false);\n        } else {\n            // must be IE\n            document.attachEvent(\"onreadystatechange\", readyStateChange);\n            window.attachEvent(\"onload\", ready);\n        }\n        readyEventHandlersInstalled = true;\n    }\n}\n// })(\"docReady\", window);\n// modify this previous line to pass in your own method name\n// and object for the method to be attached to\n\n\n//# sourceURL=webpack://anuvadak/./src/doc-ready.js?");

/***/ }),

/***/ "./src/imageTranslation.js":
/*!*********************************!*\
  !*** ./src/imageTranslation.js ***!
  \*********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"findAllImages\": () => (/* binding */ findAllImages)\n/* harmony export */ });\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./backend */ \"./src/backend.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_backend__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config */ \"./src/config.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_Constants__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_storage__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\nconst md5 = __webpack_require__(/*! md5 */ \"./node_modules/md5/md5.js\");\n\nasync function findAllImages() {\n    try {\n        let imagesTagArray = document.querySelectorAll(\"img[src]\");\n        let imageUrlsObj = {};\n        let urls = [];\n        let { url } = (0,_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)(); \n         imagesTagArray.forEach(item => {\n            let srcHash = md5(item.src);\n            // add regex to ignore gif file\n            imageUrlsObj[srcHash] = {\n                srcHash,\n                url,\n                sourceSrc: item.src,\n                targetSrc: item.src,\n                targetLang: _Constants__WEBPACK_IMPORTED_MODULE_2__.LANGUAGE_MAP[(0,_storage__WEBPACK_IMPORTED_MODULE_3__.getCurrentLanguage)()],\n                hostname: (0,_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)().hostname,\n                projectId: (0,_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)().projectKey\n            };\n            urls.push(item.src);\n        })\n        ;(0,_backend__WEBPACK_IMPORTED_MODULE_0__.addImageUrls)({imageUrlsObj, urls, targetLang: _Constants__WEBPACK_IMPORTED_MODULE_2__.LANGUAGE_MAP[(0,_storage__WEBPACK_IMPORTED_MODULE_3__.getCurrentLanguage)()]});\n    } catch (error) {\n        \n    }\n}\n\n//# sourceURL=webpack://anuvadak/./src/imageTranslation.js?");

/***/ }),

/***/ "./src/index.js":
/*!**********************!*\
  !*** ./src/index.js ***!
  \**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _doc_ready__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./doc-ready */ \"./src/doc-ready.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./backend */ \"./src/backend.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_backend__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mutationObserver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutationObserver */ \"./src/mutationObserver.js\");\n/* harmony import */ var _mutationObserver__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_mutationObserver__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser */ \"./src/parser.js\");\n/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _widget__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./widget */ \"./src/widget.js\");\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_storage__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./config */ \"./src/config.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_config__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _imageTranslation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./imageTranslation */ \"./src/imageTranslation.js\");\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_Constants__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\n// define structure for config option\n// any change in config please change here too\n\nasync function onDomReady() {\n    try {\n        // initialized = true;\n\n        // get configuration from backend and stored in config.js\n        const config = await (0,_backend__WEBPACK_IMPORTED_MODULE_1__.loadInitVariables)({});\n\n        // check if any lang is provided in query params\n        // if provided and language in scope make it current language\n        const urlObj = new URL(window.location.href);\n        if (urlObj.searchParams.has(\"lg-anv\")) {\n            const lang = urlObj.searchParams.get(\"lg-anv\");\n            const currLang = _Constants__WEBPACK_IMPORTED_MODULE_8__.REVERSE_LANGUAGE_MAP[lang];\n            if (currLang && config.allowedLanguage.hasOwnProperty(currLang)) {\n                (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setCurrentLanguage)(currLang);\n            }\n        }\n\n\n        // all decision making should be done here \n        // whether to enable widget in this page or not\n        if (config.disableWidget) {\n            throw new Error(\"Your widget has been disabled\");\n        }\n\n        if (config.hostname !== window.location.hostname && !config.multiOrigin) {\n            throw new Error(\"invalid or wrong hostname\");\n        }\n\n        if (config.multiOrigin) {\n            // check if domain is active or not\n            const active = await (0,_backend__WEBPACK_IMPORTED_MODULE_1__.checkDomainActive)();\n            if (active !== \"DOMAIN_NOT_EXIST\" && !active) {\n                throw new Error(\"Domain not active\");\n            }\n        }\n\n        (0,_widget__WEBPACK_IMPORTED_MODULE_4__.setWidgetConfig)(config);\n\n        if (!(0,_widget__WEBPACK_IMPORTED_MODULE_4__.isVisible)()) {\n            throw new Error(\"Widget disabled by client\");\n        }\n\n        let currHref = config.url;\n\n        if (config.wscope === \"COMPLETE\") {\n            // if complete check if exclusion exists\n            if (config.exclusionList.includes((0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)().url)) {\n                if (config.customWidget) {\n                    document.getElementById(\"anuvadak-language-selector-container\").style.display = \"none\";\n                }\n                throw new Error(\"Url in exclusion scope\");\n            }\n\n            // if scope is complete make a network call that checks whether this url \n            // is in scope or not else add it to scope\n\n            (0,_backend__WEBPACK_IMPORTED_MODULE_1__.checkInScope)();\n        } else {\n            // if partial check if it is on inclusion\n            if (!config.inclusionList.includes((0,_backend__WEBPACK_IMPORTED_MODULE_1__.cleanUrl)(currHref))) {\n                if (config.customWidget) {\n                    document.getElementById(\"anuvadak-language-selector-container\").style.display = \"none\";\n                }\n                throw new Error(\"Url not in inclusion scope\");\n            }\n        }\n\n        // get all config from loadInitVariables\n        // if everything is alright then use this method\n\n        // made this method thenable so we dont need to block the execution cycle\n        onDomContentLoaded()\n            .then(val => {\n\n            })\n            .catch(err => {\n                console.log(\"Error on onDomContentLoaded \", err);\n            });\n\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nconst onDomContentLoaded = async () => {\n\n    // load lang widget\n    const config = (0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)();\n    if (config.metaTags) {\n        if (config.metaTags[\"og\"]) {\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"og:title\");\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"og:description\");\n        }\n\n        if (config.metaTags[\"twitter\"]) {\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"twitter:title\");\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"twitter:description\");\n        }\n\n        if (config.metaTags[\"facebook\"]) {\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"facebook:title\");\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"facebook:description\");\n        }\n        if (config.metaTags[\"linkedin\"]) {\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"linkedin:title\");\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"linkedin:description\");\n        }\n        if (config.metaTags[\"pinterest\"]) {\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"pinterest:title\");\n            _Constants__WEBPACK_IMPORTED_MODULE_8__.META_ALLOWED.push(\"pinterest:description\");\n        }\n    }\n    // check if any selected lanuage was there or not\n    let lang = (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)();\n    const { hostname, pathname } = new URL(window.location.href);\n    let checkLang = \"\";\n    switch (config.websiteMapping) {\n        case \"SUBDIRECTORY\":\n            checkLang = pathname.split(\"/\")[1];\n            if (_Constants__WEBPACK_IMPORTED_MODULE_8__.REVERSE_LANGUAGE_MAP[checkLang]) {\n                lang = _Constants__WEBPACK_IMPORTED_MODULE_8__.REVERSE_LANGUAGE_MAP[checkLang];\n                // ${lang} contains a valid language code \n                // but check whether this project contains that language or not\n                // if language is not found disable widget execution\n                if (!config.allowedLanguage[lang]) {\n                    throw new Error(\"Language not allowed, disabling widget!!\");\n                }\n            } else {\n                // else move forward with lang as english\n                lang = \"english\";\n                // if no current language found then set lang as english\n            }\n            break;\n        case \"SUBDOMAIN\":\n            checkLang = hostname.split(\".\")[0];\n            if (_Constants__WEBPACK_IMPORTED_MODULE_8__.REVERSE_LANGUAGE_MAP[checkLang]) {\n                lang = _Constants__WEBPACK_IMPORTED_MODULE_8__.REVERSE_LANGUAGE_MAP[checkLang];\n            } else {\n                lang = \"english\";\n            }\n            break;\n    }\n\n    // language was not defined or it was english \n    if (!lang || lang === \"english\") {\n        (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setCurrentLanguage)(\"english\");\n    } else {\n        // if valid non-english language is found on startup set that langauge to body\n        (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setCurrentLanguage)(lang);\n        document.querySelector(\"body\").classList.add(`avk-${lang}`);\n    }\n\n    (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setPrevLanguage)(\"english\");\n\n    (0,_widget__WEBPACK_IMPORTED_MODULE_4__.setWidgetConfig)(config);\n    (0,_widget__WEBPACK_IMPORTED_MODULE_4__.createWidget)(config);\n\n    // languageSelectorDOM\n    const langSelectorDOMRoot = (0,_widget__WEBPACK_IMPORTED_MODULE_4__.getLangSelectorDOMRoot)();\n\n    // initialize what happens on language selected\n    initializeLanguageClickHandler(langSelectorDOMRoot, config);\n\n    //fetch ignore pattern\n    await (0,_backend__WEBPACK_IMPORTED_MODULE_1__.fetchIgnorePattern)();\n\n    // fetch and apply no translation nodes\n    await (0,_backend__WEBPACK_IMPORTED_MODULE_1__.getNoTranslationNodes)();\n    (0,_backend__WEBPACK_IMPORTED_MODULE_1__.applyNoTranslation)();\n\n    // before anything lets first get all content\n    const tms = (0,_parser__WEBPACK_IMPORTED_MODULE_3__.findAllTextTag)();\n\n    (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setTranslationDictionary)(\"english\", tms);\n\n    (0,_mutationObserver__WEBPACK_IMPORTED_MODULE_2__.mObserver)();\n    (0,_storage__WEBPACK_IMPORTED_MODULE_5__.removeSourceFontDictionary)();\n\n    if ((0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)() !== _Constants__WEBPACK_IMPORTED_MODULE_8__.LANGUAGE_CONSTANTS.SOURCE_LANGUAGE) {\n        performTransformation();\n        (0,_imageTranslation__WEBPACK_IMPORTED_MODULE_7__.findAllImages)();\n    } else {\n        const newEv = new CustomEvent(\"languageToggle\", {\n            detail: {\n                currentLanguage: (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)(),\n                checkScopeFn:(url)=>{\n                    let checkUrl = (0,_backend__WEBPACK_IMPORTED_MODULE_1__.cleanUrl)(url);\n                    let scope = false;\n                    if ((0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)().wscope === \"COMPLETE\" || (0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)().inclusionList.includes(checkUrl)) {\n                        scope = true;\n                    }\n                    return {\n                        scope,\n                        language: (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)(),\n                    }\n                }\n            },\n        });\n        document.dispatchEvent(newEv);\n    }\n}\n\n// call this function whenever we are switching language or we are \n// initializing script for the first time\nconst performTransformation = async () => {\n\n    if ((0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)() === _Constants__WEBPACK_IMPORTED_MODULE_8__.LANGUAGE_CONSTANTS.SOURCE_LANGUAGE) {\n        window.location.reload();\n        return;\n    }\n\n    // trigger this event whenever language changes for client to capture \n    // and use the current language feature\n    const newEv = new CustomEvent(\"languageToggle\", {\n        detail: {\n            currentLanguage: (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)(),\n            checkScopeFn:(url)=>{\n                let checkUrl = (0,_backend__WEBPACK_IMPORTED_MODULE_1__.cleanUrl)(url);\n                let scope = false;\n                if ((0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)().wscope === \"COMPLETE\" || (0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)().inclusionList.includes(checkUrl)) {\n                    scope = true;\n                }\n                return {\n                    scope,\n                    language: (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)(),\n                }\n            }\n        },\n    });\n\n    document.dispatchEvent(newEv);\n\n    // find all missing text tag if any\n    const newStrings = (0,_parser__WEBPACK_IMPORTED_MODULE_3__.findAllTextTag)();\n    if (Object.keys(newStrings).length !== 0) {\n        (0,_storage__WEBPACK_IMPORTED_MODULE_5__.appendToTranslationDictionary)(\"english\", newStrings);\n    }\n    // fetch tm present from backend and store in local storage\n    (0,_mutationObserver__WEBPACK_IMPORTED_MODULE_2__.disconnectObserver)();\n    await (0,_backend__WEBPACK_IMPORTED_MODULE_1__.getTranslations)();\n\n\n    // transform textTags whose tms are present\n    (0,_parser__WEBPACK_IMPORTED_MODULE_3__.transformAllTextTag)();\n\n    (0,_mutationObserver__WEBPACK_IMPORTED_MODULE_2__.reconnectObserver)();\n\n    // apply custom font size\n    (0,_backend__WEBPACK_IMPORTED_MODULE_1__.getCustomFontSize)();\n\n    // no need to await this function\n    (0,_backend__WEBPACK_IMPORTED_MODULE_1__.createSiteVisitImpression)((0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)());\n\n    // metaTag transformation\n    (0,_parser__WEBPACK_IMPORTED_MODULE_3__.checkAllMetaTags)();\n\n}\n\n// this method handles showing page content in selected language\nconst loadLanguage = (event) => {\n    event.preventDefault();\n    const language = event.currentTarget.getAttribute(\"value\");\n    if (!language) {\n        window.alert(\"Attribute value not set properly\")\n    }\n\n    if (language === (0,_storage__WEBPACK_IMPORTED_MODULE_5__.getCurrentLanguage)()) {\n        return;\n    }\n    (0,_storage__WEBPACK_IMPORTED_MODULE_5__.setCurrentLanguage)(language);\n    const config = (0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)()\n    // do not call highlight selected language method if opted for custom widget\n    if (!config.customWidget) {\n        (0,_widget__WEBPACK_IMPORTED_MODULE_4__.highlightSelectedLanguage)();\n    }\n    else {\n        if (!config.allowedLanguage.hasOwnProperty(language) && language !== \"english\") {\n            window.alert(`${language} language not in scope`)\n            console.log(`${language} language not in scope`);\n            return\n        }\n    }\n    performTransformation();\n}\n\nconst loadLanguageAsSubDomain = (e) => {\n\n}\n\nconst loadLanguageAsSubDirectory = (e) => {\n\n}\n\nconst initializeLanguageClickHandler = (langSelectorDOMRoot, config) => {\n    langSelectorDOMRoot.querySelectorAll(\"#anuvadak-language-selector-list li\").forEach(item => {\n        item.addEventListener(\"click\", onLanguageClick);\n    });\n}\n\nconst onLanguageClick = (e) => {\n    const config = (0,_config__WEBPACK_IMPORTED_MODULE_6__.getConfig)()\n    if (!config.customWidget) {\n        const svgContainer = (0,_widget__WEBPACK_IMPORTED_MODULE_4__.getLangSelectorDOMRoot)().getElementById(\"anuvadak-language-svg\");\n        const langSelector = (0,_widget__WEBPACK_IMPORTED_MODULE_4__.getLangSelectorDOMRoot)().getElementById(\"anuvadak-language-selector\");\n        if (langSelector.classList.contains(\"anuvadak-dnone\")) {\n            langSelector.classList.remove(\"anuvadak-dnone\");\n            langSelector.classList.add(\"animate__animated\", \"animate__fadeIn\");\n            svgContainer.innerHTML = (0,_widget__WEBPACK_IMPORTED_MODULE_4__.getCloseSVG)();\n        } else {\n            langSelector.classList.add(\"anuvadak-dnone\");\n            langSelector.classList.remove(\"animate__animated\", \"animate__fadeIn\")\n            svgContainer.innerHTML = (0,_widget__WEBPACK_IMPORTED_MODULE_4__.getLanguageSVG)();\n        }\n    }\n    const websiteMappingType = config.websiteMapping;\n    if (websiteMappingType === \"NONE\") {\n        loadLanguage(e);\n    } else if (websiteMappingType === \"SUBDOMAIN\") {\n        loadLanguageAsSubDomain(e);\n    } else if (websiteMappingType === \"SUBDIRECTORY\") {\n        loadLanguageAsSubDirectory(e);\n    }\n}\n\nfunction anuvadak(options) {\n    const { origin, pathname } = new URL(document.location.href)\n    const { project, customWidget, position, disableWidget,languageOption } = options;\n    const projectKey = project.key;\n    // set all config variables\n    (0,_config__WEBPACK_IMPORTED_MODULE_6__.setProjectKey)(projectKey);\n    (0,_config__WEBPACK_IMPORTED_MODULE_6__.setCustomWidget)(customWidget);\n    (0,_config__WEBPACK_IMPORTED_MODULE_6__.setWidgetPosition)(position);\n    (0,_config__WEBPACK_IMPORTED_MODULE_6__.setDisableWidget)(disableWidget);\n    if (languageOption) {\n        (0,_config__WEBPACK_IMPORTED_MODULE_6__.setLanguageOption)(languageOption);    \n    }\n    // set backend urls\n    const url = {\n        loadInitVariableUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/create\",\n        getLanguageTranslationUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/get/translations\",\n        missingTranslationUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/post/translations\",\n        sendSiteVisitImpressionUrl: \"https://prod-anuvadak.reverieinc.com/api/website/site-visit/create\",\n        checkScopeUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/scope/check\",\n        getCustomFontSizeUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/custom-font/get\",\n        getIgnorePatternUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/ignore-pattern/get\",\n        getNoTranslationNodeUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/no-translation-node/get\",\n        faultyTranslationUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/faulty/update\",\n        checkDomainUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/domain/check\",\n        addImageUrl: \"https://prod-anuvadak.reverieinc.com/api/image/create\",\n        getMetaTypeUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/get/meta\",\n        storeMetaTypeUrl: \"https://prod-anuvadak.reverieinc.com/api/snippet/store/meta\",\n    }\n    ;(0,_config__WEBPACK_IMPORTED_MODULE_6__.setBackendUrl)(url);\n}\n\n\n// this function is initialzed when onDomContentLoaded event is called\n(0,_doc_ready__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(() => {\n    // domReady = true;\n    // if (!initialized) \n    onDomReady();\n});\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (anuvadak);\n\n//# sourceURL=webpack://anuvadak/./src/index.js?");

/***/ }),

/***/ "./src/mutationObserver.js":
/*!*********************************!*\
  !*** ./src/mutationObserver.js ***!
  \*********************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("const { sendMissingTranslations, getCustomFontSize, applyNoTranslation, urlRectify, getTranslations } = __webpack_require__(/*! ./backend */ \"./src/backend.js\");\nconst { getConfig, setConfig } = __webpack_require__(/*! ./config */ \"./src/config.js\");\nconst { findAllTextTagOnMutation, transformAllTextTagToEnglish } = __webpack_require__(/*! ./parser */ \"./src/parser.js\");\nconst { appendToTranslationDictionary, getCurrentLanguage, getTransDict } = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\nconst { getLangSelectorDOMRoot } = __webpack_require__(/*! ./widget */ \"./src/widget.js\");\n\nconst mutationObserverConfig = {\n    childList: true,\n    subtree: true,\n    characterData: true,\n}\n\nlet allowMutation = true;\nlet myObserver = null;\n\nconst mObserver = ()=>{\n    myObserver = new MutationObserver(onMutate);\n    myObserver.observe(document.body, mutationObserverConfig);\n};\n\nconst disconnectObserver = ()=>{\n    myObserver.disconnect();\n}\n\nconst reconnectObserver = ()=>{\n    myObserver.observe(document.body, mutationObserverConfig);\n}\n\nconst onMutate = (mutationList, observer)=>{\n    // need to add condition which triggers the whole\n    // parsing steps again , don't want to trigger this on every mutation\n    // if (true) {\n    //     const englishStrings = findAllTextTag();\n    //     if (Object.keys(englishStrings).length !== 0) {\n    //         appendToTranslationDictionary(\"english\",englishStrings);\n    //     }\n\n    // }\n\n    if (!myObserver) {\n        return;\n    }\n\n    myObserver.disconnect();\n    applyNoTranslation();\n    let newStrings = {};\n    try {\n        const config = getConfig();\n        const currUrl = urlRectify(window.location.href,config.websiteMapping,config.hostname);\n        // showWidget which tells us at the end whether to show widget or not\n        let showWidget = true;\n        if (currUrl !== config.url) {\n            setConfig({...config, url: currUrl});\n            // check for validity of url\n            if (config.wscope === \"COMPLETE\") {\n                if (config.exclusionList.includes(currUrl)) {\n                    showWidget = false;\n                }\n            } else if (config.wscope === \"PARTIAL\") {\n                if (!config.inclusionList.includes(currUrl)) {\n                    showWidget = false;\n                }\n            }\n\n            if (showWidget) {\n                // enable widget visibility\n                disableWidget(false);\n                getTranslations().then(()=>{\n                    checkAllMutation();\n                });\n            } else {\n                // disable the widget visibility\n                disableWidget(true);\n            }\n            \n        } else {\n            if (!config.disableWidget) {\n                checkAllMutation();    \n            }\n        }\n    } catch (error) {\n        console.log(error);\n    } finally {\n        myObserver.observe(document.body, mutationObserverConfig);\n    }\n    \n};\n\nconst checkAllMutation = ()=>{\n    let newStrings = {};\n    newStrings = findAllTextTagOnMutation();\n    if (Object.keys(newStrings).length === 0) {\n        return;\n    }\n    const currLang = getCurrentLanguage();\n    const getTranslatedTms = getTransDict(currLang);\n    const newTranslationString = {};\n    Object.keys(newStrings).forEach((hash)=>{\n        if (!getTranslatedTms[hash]) {\n            newTranslationString[hash] = newStrings[hash][\"preProcessedSource\"];    \n        }\n    })\n    if (Object.keys(newStrings).length !== 0) {\n\t\tgetCustomFontSize();\n        appendToTranslationDictionary(\"english\",newStrings);\n        appendToTranslationDictionary(currLang,newTranslationString);\n        sendMissingTranslations(newStrings,currLang).then(()=>{\n        })\n        .catch(err=>{\n            console.log(err, \"In sendMissingTranslation mutation observer\");\n        });\n    }\n    \n}\n\nconst disableWidget = (status)=>{\n    \n    // status === true means hide the widget\n    // status === false means show the widgets\n    const config = getConfig();\n    const widget = getLangSelectorDOMRoot().children[0];\n    if (status) {\n        // call transformTextTagsToEnglish if widget enabled from before\n        if (config.disableWidget === false) {\n            transformAllTextTagToEnglish();\n        }\n        setConfig({ ...config, disableWidget: true });\n        widget.style.display = \"none\";        \n    } else {\n        setConfig({ ...config, disableWidget: false });\n        widget.style.display = \"\";\n    }\n\n}\n\nmodule.exports = {\n    mObserver,\n    disconnectObserver,\n    reconnectObserver,\n}\n\n//# sourceURL=webpack://anuvadak/./src/mutationObserver.js?");

/***/ }),

/***/ "./src/parser.js":
/*!***********************!*\
  !*** ./src/parser.js ***!
  \***********************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("const md5 = __webpack_require__(/*! md5 */ \"./node_modules/md5/md5.js\");\nconst { sendMissingTranslations, sendFaultyTranslation, storeMetaTypeData, getMetaTypeData } = __webpack_require__(/*! ./backend */ \"./src/backend.js\");\nconst { getConfig } = __webpack_require__(/*! ./config */ \"./src/config.js\");\nconst {BLOCK_ELEMENT,IGNORE,META_ALLOWED, INPUT_ALLOWED_CLICK, INPUT_ALLOWED_TYPED, INLINE_ELEMENTS, LANGUAGE_CONSTANTS, META_FOR_SEO} = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\nconst { getTransDict, getCurrentLanguage, getPrevLanguage, getReverseTranslationHash } = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\n\nconst findAllTextTagOnMutation = ()=>{\n\n    // this gets all the translation pairs which is in cheerio nodes\n    const translationPairs = dfsTraversal(document);\n    const currLang = getCurrentLanguage();\n    if (currLang === \"english\") {\n        return {};\n    }\n    const getTranslatedTms = getTransDict(currLang);\n    const getOriginalTms = getTransDict(\"english\");\n    const reverseObject = obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));\n    const reverseTranslationMap = reverseObject(getTranslatedTms);\n\n\n    // we would store our tm in this object \n    const preProcessedResult = {};\n\n    translationPairs.forEach((elem,i)=>{\n        \n        const parent = elem[0];\n        // load elem which is a node in cheerio\n        const node = document.createElement(\"div\");\n        for (const el of elem) {\n            node.appendChild( el.cloneNode(true) );\n        }\n\n        const styledSource = node.innerHTML;\n        let textContent = \"\";\n        let sourceHash = \"\";\n        // for type meta tags use content attribute for text\n        switch (parent.localName) {\n          case \"meta\":\n            return;\n            if (META_ALLOWED.includes(parent.getAttribute(\"name\"))) {\n              textContent = parent\n                .getAttribute(\"content\")\n                .trim()\n                .replace(/\\s\\s+|\\\\n/g, \" \");\n            }\n            const hashMeta = md5(textContent);\n            if (!getOriginalTms[hashMeta]) {\n              preProcessedResult[hashMeta] = {\n                sourceHash: hashMeta,\n                styledSource: textContent,\n                preProcessedSource: textContent,\n                domInfo: {},\n                textContent: textContent,\n              };\n            }\n            break;\n          case \"input\":\n            // return;\n            // check if input is of type typed or clicked\n            if (INPUT_ALLOWED_TYPED.includes(parent.getAttribute(\"type\"))) {\n              let hash = parent.getAttribute(\"avt-org-inp\");\n              textContent = parent\n                .getAttribute(\"placeholder\")\n                .trim()\n                .replace(/\\s\\s+|\\\\n/g, \" \");\n              if (!hash) {\n                hash = md5(textContent);\n                parent.setAttribute(\"avt-org-inp\", hash);\n              }\n              if (!getOriginalTms[hash]) {\n                preProcessedResult[hash] = {\n                  sourceHash: hash,\n                  styledSource: textContent,\n                  preProcessedSource: textContent,\n                  domInfo: {},\n                  textContent: textContent,\n                  classList: elem[0].parentElement[\"classList\"]\n                    ? [...elem[0].parentElement[\"classList\"]]\n                    : [],\n                };\n              }\n              if (getTranslatedTms[hash]) {\n                parent.setAttribute(\"placeholder\", getTranslatedTms[hash]);\n              } else {\n                parent.setAttribute(\n                  \"placeholder\",\n                  getOriginalTms[hash][\"preProcessedSource\"]\n                );\n              }\n            }\n\n            if (INPUT_ALLOWED_CLICK.includes(parent.getAttribute(\"type\"))) {\n              let hash = parent.getAttribute(\"avt-org-inp\");\n              textContent = parent\n                .getAttribute(\"value\")\n                .trim()\n                .replace(/\\s\\s+|\\\\n/g, \" \");\n              if (!hash) {\n                hash = md5(textContent);\n                parent.setAttribute(\"avt-org-inp\", hash);\n              }\n              if (!getOriginalTms[hash]) {\n                preProcessedResult[hash] = {\n                  sourceHash: hash,\n                  styledSource: textContent,\n                  preProcessedSource: textContent,\n                  domInfo: {},\n                  textContent: textContent,\n                  classList: elem[0].parentElement[\"classList\"]\n                    ? [...elem[0].parentElement[\"classList\"]]\n                    : [],\n                };\n              }\n              if (getTranslatedTms[hash]) {\n                parent.setAttribute(\"value\", getTranslatedTms[hash]);\n              } else {\n                parent.setAttribute(\n                  \"value\",\n                  getOriginalTms[hash][\"preProcessedSource\"]\n                );\n              }\n            }\n            if (elem.length === 1) {\n              return;\n            }\n            break;\n          case \"textarea\":\n            let hash = parent.getAttribute(\"avt-org-inp\");\n            textContent = parent\n              .getAttribute(\"placeholder\")\n              .trim()\n              .replace(/\\s\\s+|\\\\n/g, \" \");\n\n            if (!hash) {\n              hash = md5(textContent);\n              parent.setAttribute(\"avt-org-inp\", hash);\n            }\n            if (!getOriginalTms[hash]) {\n              preProcessedResult[hash] = {\n                sourceHash: hash,\n                styledSource: textContent,\n                preProcessedSource: textContent,\n                domInfo: {},\n                textContent: textContent,\n                classList: elem[0].parentElement[\"classList\"]\n                    ? [...elem[0].parentElement[\"classList\"]]\n                    : [],\n              };\n            }\n            if (getTranslatedTms[hash]) {\n              parent.setAttribute(\"placeholder\", getTranslatedTms[hash]);\n            } else {\n              parent.setAttribute(\n                \"placeholder\",\n                getOriginalTms[hash][\"preProcessedSource\"]\n              );\n            }\n\n            if (elem.length === 1) {\n              return;\n            }\n            break;\n          default:\n            textContent = node.textContent.trim().replace(/\\s\\s+|\\\\n/g, \" \");\n            break;\n        }\n        \n        let htmlTags = styledSource.match(/<(\\w+)\\s+\\w+.*?>/g);\n       \n        let preProcessedString = styledSource.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n        let attributeRegex = /\\s([a-zA-Z0-9._-]+?)=\"(.*?)\"/g;\n        let domInfo = {};\n        let attrId = 1;\n\n        if(htmlTags){\n            for(let i = 0 ; i < htmlTags.length; i++){\n                while( true ) {\n\n                    let res = attributeRegex.exec( htmlTags[i] );\n                    // console.log(res);\n                    if( res !== null ) {\n                        let escapedReplaceRegexExpression = res[0].replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n                        // console.log(cleanedReplaceRegexExpression);\n                        let replaceRegex = new RegExp(escapedReplaceRegexExpression);                \n                        preProcessedString = preProcessedString.replace(replaceRegex, ` attrId=${attrId}`);\n                        domInfo[attrId] = res[0];\n                        attrId++;\n                        \n                    } else {\n                        break;\n                    }\n                }\n            }\n        }\n\n        // let end = Date.now();\n        // console.log(end-start);\n        \n        sourceHash = md5(preProcessedString);\n\n        const childNo = 0;\n\n        let prevSourceHash = elem[0].parentNode.getAttribute(`avt-sourcehash-${childNo}`);\n\n        if (prevSourceHash === \"c24502da71ffab4bd2aa42596082e35a\" || prevSourceHash === \"39dcfebc412c911a4ec2bb8d6d5c06c0\") {\n            if (reverseTranslationMap[preProcessedString]) {\n                prevSourceHash = reverseTranslationMap[preProcessedString];\n            }\n            if (elem[0].classList.contains(\"show_hide\")) {\n                prevSourceHash = \"c24502da71ffab4bd2aa42596082e35a\";\n            } else {\n                prevSourceHash = \"39dcfebc412c911a4ec2bb8d6d5c06c0\"\n            }\n        }\n\n        if (prevSourceHash === \"f544293e2391200b1f778069e304ac7d\" || prevSourceHash === \"9b267bcca242f0dedf7e4fbf9c7bc05b\") {\n            if (reverseTranslationMap[preProcessedString]) {\n                prevSourceHash = reverseTranslationMap[preProcessedString];\n            }\n            if (elem[0].localName === \"a\") {\n                prevSourceHash = \"9b267bcca242f0dedf7e4fbf9c7bc05b\";\n            } else {\n                prevSourceHash = \"f544293e2391200b1f778069e304ac7d\";\n            }\n        }\n\n        let prevPreprocessedString = \"\";\n        if (currLang === \"english\") {\n            prevPreprocessedString = getTranslatedTms[prevSourceHash] ? getTranslatedTms[prevSourceHash].preProcessedSource : \"\";\n        } else {\n            prevPreprocessedString = getTranslatedTms[prevSourceHash];\n        }\n\n        const prevNode = document.createElement(\"div\");\n        \n        prevNode.innerHTML = prevPreprocessedString;\n\n        if (prevNode.textContent.trim().replace(/\\s+/g, \"\") === node.textContent.trim().replace(/\\s+/g, \"\")) {\n            return\n        }\n\n        elem[0].parentNode.setAttribute(`avt-sourcehash-${childNo}`,sourceHash);\n\n        if (getTranslatedTms[sourceHash]) {\n            const tm = { \n                preProcessedSource: preProcessedString,\n                styledSource,\n                preProcessedTarget: getTranslatedTms[sourceHash],\n                domInfo\n            };\n\n            const nodeTarget = document.createElement(\"div\");\n            const {styledTarget} = createStyledTarget(tm);\n            nodeTarget.innerHTML = styledTarget;\n\n            const targetElem = dfsTraversal(nodeTarget)[0];\n            let nodeReplacement = false;\n            if (targetElem && elem && targetElem.length === elem.length) {\n                for (let i = 0; i < elem.length; i++) {\n                    try {\n                        const elemTexts = [];\n                        const targetElemTexts = [];\n                        diver(elem[i],elemTexts);\n                        diver(targetElem[i],targetElemTexts);\n                        if (targetElemTexts && elemTexts && elemTexts.length === targetElemTexts.length) {\n                            for (let j = 0; j < elemTexts.length; j++) {\n                                // const startSpaces = elemTexts[j].textContent.match(/^[\\s\\n\\t]*/)[0];\n                                // const endSpaces = elemTexts[j].textContent.match(/[\\s\\n\\t]*$/)[0];\n                                elemTexts[j].textContent =  targetElemTexts[j].textContent;\n                            }\n                        } else {\n                            nodeReplacement = true;\n                            break;\n                        }\n                        \n                    } catch (error) {\n                        console.log(elem[i].textContent);\n                    }\n                }    \n            } else {\n                nodeReplacement = true;\n            }\n\n            if (nodeReplacement && false) {}\n            // return;\n        }\n\n        if(preProcessedResult[sourceHash]){\n            preProcessedResult[sourceHash] = {\n              sourceHash: sourceHash,\n              styledSource: styledSource,\n              preProcessedSource: preProcessedString,\n              domInfo: domInfo,\n              textContent: textContent.trim(),\n              classList: elem[0].parentElement[\"classList\"]\n                ? [\n                    ...preProcessedResult[sourceHash][\"classList\"],\n                    ...[...elem[0].parentElement.classList],\n                  ]\n                : [],\n            };\n        }\n        else{\n            preProcessedResult[sourceHash] = {\n              sourceHash: sourceHash,\n              styledSource: styledSource,\n              preProcessedSource: preProcessedString,\n              domInfo: domInfo,\n              textContent: textContent.trim(),\n              classList: elem[0].parentElement[\"classList\"]\n                ? [...elem[0].parentElement[\"classList\"]]\n                : [],\n            };\n        }\n\n    })\n\n    return preProcessedResult;\n}\n\nconst findAllTextTag = ()=>{\n    // const $ = cheerio.load(html);\n\n    // this gets all the translation pairs which is in cheerio nodes\n    const translationPairs = dfsTraversal(document);\n\n    // we would store our tm in this object \n    const preProcessedResult = {};\n\n    translationPairs.forEach((elem,i)=>{\n        // if avt-sourcehash-0 present in parent of elem then that means it was added\n        // skip this element\n        const parent = elem[0];\n        if(elem[0].parentNode.getAttribute(\"avt-sourcehash-0\") !== \"c24502da71ffab4bd2aa42596082e35a\"){\n            if (elem[0].parentNode.getAttribute(\"avt-sourcehash-0\") && (parent.localName !== \"meta\" && parent.localName !== \"input\")) {\n                return;\n            }\n        }\n        \n        // load elem which is a node in cheerio\n        const node = document.createElement(\"div\");\n        for (const el of elem) {\n            node.appendChild( el.cloneNode(true) );\n        }\n\n        const styledSource = node.innerHTML;\n        let textContent = \"\";\n        let sourceHash = \"\";\n        // for type meta tags use content attribute for text\n        switch (parent.localName) {\n            case \"meta\":\n                if(!(parent.getAttribute(\"content\"))){\n                    break;\n                }\n                if (META_ALLOWED.includes(parent.getAttribute(\"name\")) || META_ALLOWED.includes(parent.getAttribute(\"property\"))) {\n                    textContent = parent.getAttribute(\"content\").trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                }\n\n                if (!parent.hasAttribute(\"avt-org-meta\")) {\n                    const hashMeta = md5(textContent)\n                    parent.setAttribute(\"avt-org-meta\",hashMeta);\n                    let metaType='';\n                    if(parent.getAttribute(\"name\")){\n                        metaType = parent.getAttribute(\"name\")\n                    }\n                    if(parent.getAttribute(\"property\")){\n                        metaType= parent.getAttribute(\"property\")\n                    }\n                    preProcessedResult[hashMeta] = {\n                        \"sourceHash\": hashMeta,\n                        \"styledSource\" : textContent,\n                        \"preProcessedSource\" : textContent,\n                        \"domInfo\" : {\n                            meta: true,\n                            metaType\n                        },\n                        \"textContent\":textContent\n                    }\n                }\n                if (elem.length === 1) {\n                    return ;\n                }\n                break;\n            case \"input\":\n                // check if input is of type typed or clicked\n                if (INPUT_ALLOWED_TYPED.includes(parent.getAttribute(\"type\"))) {\n                    textContent = parent.getAttribute(\"placeholder\").trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                }\n\n                if (INPUT_ALLOWED_CLICK.includes(parent.getAttribute(\"type\"))) {\n                    textContent = parent.getAttribute(\"value\").trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                }\n\n                if (!parent.hasAttribute(\"avt-org-inp\")) {\n                    const hashInput = md5(textContent);\n                    parent.setAttribute(\"avt-org-inp\",hashInput);\n                    preProcessedResult[hashInput] = {\n                        \"sourceHash\": hashInput,\n                        \"styledSource\" : textContent,\n                        \"preProcessedSource\" : textContent,\n                        \"domInfo\" : {},\n                        \"textContent\":textContent,\n                        \"classList\": elem[0].parentElement[\"classList\"]\n                        ? [...elem[0].parentElement[\"classList\"]]\n                        : [],\n                    }\n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            case \"textarea\":\n                if (parent.hasAttribute(\"placeholder\")) {\n                    textContent = parent.getAttribute(\"placeholder\").trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                    if (!parent.hasAttribute(\"avt-org-inp\")) {\n                        const hashInput = md5(textContent);\n                        parent.setAttribute(\"avt-org-inp\", hashInput);\n                        preProcessedResult[hashInput] = {\n                            \"sourceHash\": hashInput,\n                            \"styledSource\" : textContent,\n                            \"preProcessedSource\" : textContent,\n                            \"domInfo\" : {},\n                            \"textContent\":textContent,\n                            \"classList\": elem[0].parentElement[\"classList\"]\n                            ? [...elem[0].parentElement[\"classList\"]]\n                            : [],\n                        }\n                        if (elem.length === 1) {\n                            return;\n                        }\n                    }\n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            default:\n                textContent = node.textContent.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                break;\n        }\n        \n        let htmlTags = styledSource.match(/<(\\w+)\\s+\\w+.*?>/g);\n       \n        let preProcessedString = styledSource.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n\n        let attributeRegex = /\\s([a-zA-Z0-9._-]+?)=\"(.*?)\"/g;\n        let domInfo = {};\n        let attrId = 1;\n\n        if(htmlTags){\n            for(let i = 0 ; i < htmlTags.length; i++){\n                while( true ) {\n\n                    let res = attributeRegex.exec( htmlTags[i] );\n                    // console.log(res);\n                    if( res !== null ) {\n                        let escapedReplaceRegexExpression = res[0].replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n                        // console.log(cleanedReplaceRegexExpression);\n                        let replaceRegex = new RegExp(escapedReplaceRegexExpression);                \n                        preProcessedString = preProcessedString.replace(replaceRegex, ` attrId=${attrId}`);\n                        domInfo[attrId] = res[0];\n                        attrId++;\n                        \n                    } else {\n                        break;\n                    }\n                }\n            }\n        }\n\n        // let end = Date.now();\n        // console.log(end-start);\n        \n        sourceHash = md5(preProcessedString)\n\n        let childNo = 0;\n        while (true) {\n            if (!elem[0].parentNode.getAttribute(`avt-sourcehash-${childNo}`)) {\n                break;\n            } else {\n                childNo++;\n            }\n        }\n        elem[0].parentNode.setAttribute(`avt-sourceHash-${childNo}`,sourceHash);\n\n        if(preProcessedResult[sourceHash]){\n            preProcessedResult[sourceHash] = {\n              sourceHash: sourceHash,\n              styledSource: styledSource,\n              preProcessedSource: preProcessedString,\n              domInfo: domInfo,\n              textContent: textContent.trim(),\n              classList: elem[0].parentElement[\"classList\"]\n                ? [\n                    ...preProcessedResult[sourceHash][\"classList\"],\n                    ...[...elem[0].parentElement.classList],\n                  ]\n                : [],\n            };\n        }\n        else{\n            preProcessedResult[sourceHash] = {\n              sourceHash: sourceHash,\n              styledSource: styledSource,\n              preProcessedSource: preProcessedString,\n              domInfo: domInfo,\n              textContent: textContent.trim(),\n              classList: elem[0].parentElement[\"classList\"]\n                ? [...elem[0].parentElement[\"classList\"]]\n                : [],\n            };\n        }\n\n        // if(elem[0].classList){\n        //     preProcessedResult[sourceHash][\"classList\"] = [...preProcessedResult[sourceHash][\"classList\"], ...[...elem[0].classList]]\n        // }\n\n        \n\n    })\n\n    return preProcessedResult;\n}\n\nconst getElementRank = (elem)=>{\n        // inline element\n        // valid text inside\n        // not beside any inline element\n\n        // text\n        // inline\n        // text\n        // inline\n        // block\n        // text\n        // block\n        // inline\n        // inline\n\n\n    let currRank = 0;\n    let startFrom = elem[0];\n    while(true){\n        if (startFrom.previousSibling === null) {\n            break;\n        }\n\n        if ( BLOCK_ELEMENT.includes(startFrom.localName) ) {\n            startFrom = startFrom.previousSibling;\n            currRank++;\n        }\n\n        const divCheck = document.createElement(\"div\");\n        if ( INLINE_ELEMENTS.includes(startFrom.localName) || startFrom.nodeType === Node.TEXT_NODE ) {\n            while (true) {\n                if ( startFrom === null || BLOCK_ELEMENT.includes(startFrom.localName) ) {\n                    break;\n                }\n                divCheck.appendChild(startFrom);\n                startFrom = startFrom.previousSibling;\n            }\n\n            if(addSingleString(divCheck)){\n                currRank++;\n            }\n        }\n        \n    }\n\n    return currRank;\n}\n\n// returns boolean value for whether to add or not\nconst addSingleString = (node)=>{\n    // exit case would be if we get a text node\n    if (node.nodeType === Node.TEXT_NODE) {\n        if (node.textContent.trim() !== \"\") {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    // check if child nodes exists or not \n    if (node.childNodes) {\n        for (const child of node.childNodes) {\n            if (addSingleString(child)) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\n/**\n * This function returns an array of string \n * @param {*} el  root node\n */\n const dfsTraversal = (el) => {\n    let singleString = [];\n    let currStringArr = [];\n    for (const child of el.childNodes) {\n\n        let takeAnchorAsBlock = false;\n\n        if (getConfig().hostname === \"anuvadak-test.youkraft.vercel.app\") {\n            if (child.localName === \"a\") {\n                for (const child_a of child.children) {\n                    if (child_a.localName && (BLOCK_ELEMENT.includes(child_a.localName) || checkForCustomBlockTag(child_a.localName || \"\") )) {\n                        takeAnchorAsBlock = true;\n                        break;\n                    }\n                }\n                // if (child.children.length === 1 && BLOCK_ELEMENT.includes(child.children[0].localName)) {\n                //     takeAnchorAsBlock = true;\n                // }\n            }\n        }\n\n        // a tag operation\n        // if a block has continous <a> tag i.e. all sibling are <a> tag,\n        // consider all those as block element\n\n        // dont do anything if it is from IGNORE list\n        // name property replace with localName\n        // type property replace with nodeType \n        // attribs property replace with attributes\n        if (IGNORE.includes(child.localName) || IGNORE.includes(child.nodeType)) {\n            continue;\n        }\n        if (child.getAttribute && child.getAttribute(getConfig().noLocalizationClass) === \"true\") {\n            continue;\n        }\n        // current element is a block level element dive into it\n        if (BLOCK_ELEMENT.includes(child.localName) || checkForCustomBlockTag(child.localName || \"\") || takeAnchorAsBlock) {\n            if (singleString.length>0) {\n                currStringArr.push(singleString);\n                singleString = [];\n            }\n            // check for meta tags\n            // check for input element\n            if (\n                (child.localName === \"meta\" && (META_ALLOWED.includes(child.getAttribute(\"name\")) || META_ALLOWED.includes(child.getAttribute(\"property\"))) && child.getAttribute(\"content\") && child.getAttribute(\"content\").trim() ) ||\n                (child.localName === \"input\" && INPUT_ALLOWED_CLICK.includes(child.getAttribute(\"type\")) && child.getAttribute(\"value\")) ||\n                (child.localName === \"input\" && INPUT_ALLOWED_TYPED.includes(child.getAttribute(\"type\")) && child.getAttribute(\"placeholder\") ) ||\n                (child.localName === \"textarea\" && child.getAttribute(\"placeholder\"))\n            ) {\n                currStringArr.push([child]);                \n            }\n            \n            currStringArr.push(...(dfsTraversal(child)));\n            continue;\n        } \n        \n        // non breaking elements or we can say they are inline elements\n        if (child.nodeType === 3 && child.textContent.trim() === \"\"  ) {\n            continue;\n        }\n        \n        // add br tag if singleString array is not empty\n        if (child.localName === \"br\" && singleString.length !== 0) {\n            singleString.push(child);            \n        }\n\n        // if no text is found in innerText then dont add it\n        if (addSingleString(child)) {\n            singleString.push(child);    \n        } \n        \n    }\n    if (singleString.length > 0) {\n        currStringArr.push(singleString);    \n    }\n    return currStringArr;\n\n}\n\n// put or remove directive\n// if flag true put directive else remove directive\nconst htmlDirTransformation = (flag)=>{\n    try {\n        if (flag) {\n            if (!document.documentElement.hasAttribute(\"dir\")) {\n                document.documentElement.setAttribute(\"dir\", \"rtl\");\n            }\n        } else {\n            document.documentElement.removeAttribute(\"dir\");\n        }\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nconst transformAllTextTag = ()=>{\n    // this gets all the translation pairs which is in cheerio nodes\n    const translationPairs = dfsTraversal(document);\n    const currLang = getCurrentLanguage();\n\n    const getOriginalTms = getTransDict(\"english\");\n    const getTranslatedTms = getTransDict(currLang);\n    const reverseObject = obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));\n    const reverseTranslationMap = reverseObject(getTranslatedTms);\n    \n    const missingTranslationTm = {};\n    const faultyTranslationHashes = {};\n    const { rtlDirective } = getConfig();\n\n    // if curr language is equal rtl languages then do the following\n    if (rtlDirective) {\n        if ([\"urdu\"].includes(currLang)) {\n            htmlDirTransformation(true);\n        } else {\n            htmlDirTransformation(false);\n        }\n    }\n\n    translationPairs.forEach((elem)=>{\n        \n        // get parent of each element\n        const parent = elem[0];\n\n        // load elem which is a node in cheerio\n        const node = document.createElement(\"div\");\n        for (const el of elem) {\n            node.appendChild(el.cloneNode(true));\n        }\n\n        const styledSource = node.innerHTML;\n        let textContent = \"\";\n        let sourceHash = \"\";\n        // for type meta tags use content attribute for text\n        switch (parent.localName) {\n            case \"meta\":\n                if (parent.getAttribute(\"property\") && parent.getAttribute(\"property\").trim() && (META_ALLOWED.includes(parent.getAttribute(\"name\")) || META_ALLOWED.includes(parent.getAttribute(\"property\")))) {\n                    const hashMeta = parent.getAttribute(\"avt-org-meta\");\n                    if (getTranslatedTms[hashMeta]) {\n                        parent.setAttribute(\"content\", getTranslatedTms[hashMeta]);\n                    } else {\n                        parent.setAttribute(\"content\", getOriginalTms[hashMeta][\"preProcessedSource\"]);\n                        missingTranslationTm[hashMeta] = getOriginalTms[hashMeta];\n                    }          \n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            case \"input\":\n                // check if input is of type typed or clicked\n                if (INPUT_ALLOWED_TYPED.includes(parent.getAttribute(\"type\"))) {\n                    let hash = parent.getAttribute(\"avt-org-inp\");\n                    if (!hash) {\n                        hash = md5(parent.getAttribute(\"placeholder\").trim().replace(/\\s\\s+|\\\\n/g,\" \"));\n                        parent.setAttribute(\"avt-org-inp\",hash);\n                    }\n                    if (getTranslatedTms[hash]) {\n                        parent.setAttribute(\"placeholder\", getTranslatedTms[hash]);\n                    } else {\n                        parent.setAttribute(\"placeholder\", getOriginalTms[hash][\"preProcessedSource\"]);\n                        missingTranslationTm[hash] = getOriginalTms[hash];\n                    }\n                }\n\n                if (INPUT_ALLOWED_CLICK.includes(parent.getAttribute(\"type\"))) {\n                    let hash = parent.getAttribute(\"avt-org-inp\");\n                    if (!hash) {\n                        hash = md5(parent.getAttribute(\"value\").trim().replace(/\\s\\s+|\\\\n/g,\" \"));\n                        parent.setAttribute(\"avt-org-inp\",hash);\n                    }\n                    if (getTranslatedTms[hash]) {\n                        parent.setAttribute(\"value\", getTranslatedTms[hash]);\n                    } else {\n                        parent.setAttribute(\"value\", getOriginalTms[hash][\"preProcessedSource\"]);\n                        missingTranslationTm[hash] = getOriginalTms[hash];\n                    }\n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            case \"textarea\":\n                let hash = parent.getAttribute(\"avt-org-inp\");\n                if (!hash) {\n                    hash = md5(parent.getAttribute(\"placeholder\").trim().replace(/\\s\\s+|\\\\n/g,\" \"));\n                    parent.setAttribute(\"avt-org-inp\",hash);\n                }\n                if (getTranslatedTms[hash]) {\n                    parent.setAttribute(\"placeholder\", getTranslatedTms[hash]);\n                } else {\n                    parent.setAttribute(\"placeholder\", getOriginalTms[hash][\"preProcessedSource\"]);\n                    missingTranslationTm[hash] = getOriginalTms[hash];\n                }\n            \n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            default:\n                textContent = node.textContent.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                break;\n        }\n        \n        let htmlTags = styledSource.match(/<(\\w+)\\s+\\w+.*?>/g);\n       \n        let preProcessedString = styledSource.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n        let attributeRegex = /\\s([a-zA-Z0-9._-]+?)=\"(.*?)\"/g;\n        let domInfo = {};\n        let attrId = 1;\n\n        if(htmlTags){\n            for(let i = 0 ; i < htmlTags.length; i++){\n                while( true ) {\n\n                    let res = attributeRegex.exec( htmlTags[i] );\n                    // console.log(res);\n                    if( res !== null ) {\n                        let escapedReplaceRegexExpression = res[0].replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n                        // console.log(cleanedReplaceRegexExpression);\n                        let replaceRegex = new RegExp(escapedReplaceRegexExpression);                \n                        preProcessedString = preProcessedString.replace(replaceRegex, ` attrId=${attrId}`);\n                        domInfo[attrId] = res[0];\n                        attrId++;\n                        \n                    } else {\n                        break;\n                    }\n                }\n            }\n        }\n        \n        sourceHash = md5(preProcessedString);\n        // const currentEnglishSourceHash = reverseTranslationMap[preProcessedString];\n\n        let englishSourceHash = parent.parentNode.getAttribute(\"avt-sourcehash-0\");\n\n        \n        if (englishSourceHash === \"c24502da71ffab4bd2aa42596082e35a\" || englishSourceHash === \"39dcfebc412c911a4ec2bb8d6d5c06c0\") {\n            if (reverseTranslationMap[preProcessedString]) {\n                englishSourceHash = reverseTranslationMap[preProcessedString];\n            }\n            if (elem[0].classList.contains(\"show_hide\")) {\n                englishSourceHash = \"c24502da71ffab4bd2aa42596082e35a\";\n            } else {\n                englishSourceHash = \"39dcfebc412c911a4ec2bb8d6d5c06c0\"\n            }\n        }\n\n        if (englishSourceHash === \"f544293e2391200b1f778069e304ac7d\" || englishSourceHash === \"9b267bcca242f0dedf7e4fbf9c7bc05b\") {\n            if (reverseTranslationMap[preProcessedString]) {\n                englishSourceHash = reverseTranslationMap[preProcessedString];\n            }\n            if (elem[0].localName === \"a\") {\n                englishSourceHash = \"9b267bcca242f0dedf7e4fbf9c7bc05b\";\n            } else {\n                englishSourceHash = \"f544293e2391200b1f778069e304ac7d\";\n            }\n        }\n\n\n        // if (currentEnglishSourceHash !== englishSourceHash) {\n        //     console.log({\n        //         tm:getOriginalTms[currentEnglishSourceHash],\n        //         preProcessedString\n        //     });\n        // }\n\n\n\n        // replacing innerHTML with translations\n        if (getOriginalTms[englishSourceHash]) {\n            const tm = { \n                ...getOriginalTms[englishSourceHash],\n                preProcessedTarget: getTranslatedTms[englishSourceHash] || getOriginalTms[englishSourceHash].preProcessedSource,\n                domInfo\n            };\n\n            const nodeTarget = document.createElement(\"div\");\n            const {styledTarget} = createStyledTarget(tm);\n            nodeTarget.innerHTML = styledTarget;\n\n            const targetElem = dfsTraversal(nodeTarget)[0];\n            let nodeReplacement = false;\n            if (targetElem && elem && targetElem.length === elem.length) {\n                for (let i = 0; i < elem.length; i++) {\n                    try {\n                        const elemTexts = [];\n                        const targetElemTexts = [];\n                        diver(elem[i],elemTexts);\n                        diver(targetElem[i],targetElemTexts);\n                        if (targetElemTexts && elemTexts && elemTexts.length === targetElemTexts.length) {\n                            for (let j = 0; j < elemTexts.length; j++) {\n                                // const startSpaces = elemTexts[j].textContent.match(/^[\\s\\n\\t]*/)[0];\n                                // const endSpaces = elemTexts[j].textContent.match(/[\\s\\n\\t]*$/)[0];\n                                elemTexts[j].textContent =  targetElemTexts[j].textContent;\n                            }\n                        } else {\n                            nodeReplacement = true;\n                            break;\n                        }\n                        \n                    } catch (error) {\n                        console.log(elem[i].textContent);\n                    }\n                }    \n            } else {\n                nodeReplacement = true;\n            }\n\n            if (nodeReplacement) {\n                faultyTranslationHashes[sourceHash] = true;\n                console.log(`faulty translation - ${sourceHash}`);\n                for (const el of elem) {\n                    if (el !== parent) {\n                        el.remove();\n                    }\n                }\n                try {\n                    // its a text node then use parent.textContent\n                    // create a new node with innerHTML = styledTarget\n                    // iterate through each element of this new node and insertBefore parent node created above\n                    const reverseStyledTargetNodes = createReverseStyledTargetNodes(styledTarget);\n                    reverseStyledTargetNodes.forEach((e)=>{\n                        parent.parentNode.insertBefore(e,parent);\n                    })\n                    parent.remove();\n                    // if (parent.nodeType === 3) {\n                    //     parent.textContent = styledTarget;\n                    // } else {\n                    //     parent.outerHTML = styledTarget;\n                    // }\n                } catch (error) {\n                    console.log(error);\n                }  \n            }\n            \n        } \n        if (!getTranslatedTms[englishSourceHash]) {\n            // if translation was not found \n            missingTranslationTm[englishSourceHash] = getOriginalTms[englishSourceHash]\n        }\n    })\n\n    // call for add translation\n    sendMissingTranslations(missingTranslationTm,currLang);\n    // console.log(missingTranslationTm);\n\n    // collect faulty translation tm\n    if (Object.keys(faultyTranslationHashes).length > 0) {\n        sendFaultyTranslation(Object.keys(faultyTranslationHashes));    \n    }\n\n}\n\nconst transformAllTextTagToEnglish = ()=>{\n    // this gets all the translation pairs which is in cheerio nodes\n    const translationPairs = dfsTraversal(document);\n    const getOriginalTms = getTransDict(\"english\");\n    \n    translationPairs.forEach((elem)=>{\n        \n        // get parent of each element\n        const parent = elem[0];\n\n        // load elem which is a node in cheerio\n        const node = document.createElement(\"div\");\n        for (const el of elem) {\n            node.appendChild(el.cloneNode(true));\n        }\n\n        let textContent = \"\";\n        const styledSource = node.innerHTML;\n        // for type meta tags use content attribute for text\n        switch (parent.localName) {\n            case \"meta\":\n                if (META_ALLOWED.includes(parent.getAttribute(\"name\"))) {\n                    const hashMeta = parent.getAttribute(\"avt-org-meta\");\n                    parent.setAttribute(\"content\", getOriginalTms[hashMeta][\"preProcessedSource\"]);\n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            case \"input\":\n                // check if input is of type typed or clicked\n                if (INPUT_ALLOWED_TYPED.includes(parent.getAttribute(\"type\"))) {\n                    const hash = parent.getAttribute(\"avt-org-inp\");\n                    parent.setAttribute(\"placeholder\", getOriginalTms[hash][\"preProcessedSource\"]);\n                }\n\n                if (INPUT_ALLOWED_CLICK.includes(parent.getAttribute(\"type\"))) {\n                    const hash = parent.getAttribute(\"avt-org-inp\");\n                    parent.setAttribute(\"value\", getOriginalTms[hash][\"preProcessedSource\"]);\n                }\n                if (elem.length === 1) {\n                    return;\n                }\n                break;\n            default:\n                textContent = node.textContent.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n                break;\n        }\n\n        let htmlTags = styledSource.match(/<(\\w+)\\s+\\w+.*?>/g);\n       \n        let preProcessedString = styledSource.trim().replace(/\\s\\s+|\\\\n/g,\" \");\n        let attributeRegex = /\\s([a-zA-Z0-9._-]+?)=\"(.*?)\"/g;\n        let domInfo = {};\n        let attrId = 1;\n\n        if(htmlTags){\n            for(let i = 0 ; i < htmlTags.length; i++){\n                while( true ) {\n\n                    let res = attributeRegex.exec( htmlTags[i] );\n                    // console.log(res);\n                    if( res !== null ) {\n                        let escapedReplaceRegexExpression = res[0].replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n                        // console.log(cleanedReplaceRegexExpression);\n                        let replaceRegex = new RegExp(escapedReplaceRegexExpression);                \n                        preProcessedString = preProcessedString.replace(replaceRegex, ` attrId=${attrId}`);\n                        domInfo[attrId] = res[0];\n                        attrId++;\n                        \n                    } else {\n                        break;\n                    }\n                }\n            }\n        }\n        \n        // const currentEnglishSourceHash = reverseTranslationMap[preProcessedString];\n\n        let englishSourceHash = parent.parentNode.getAttribute(\"avt-sourcehash-0\");\n\n        // replacing innerHTML with translations\n        if (getOriginalTms[englishSourceHash]) {\n            const tm = { \n                ...getOriginalTms[englishSourceHash],\n                preProcessedTarget: getOriginalTms[englishSourceHash][\"preProcessedSource\"],\n                domInfo\n            };\n\n            const nodeTarget = document.createElement(\"div\");\n            const {styledTarget} = createStyledTarget(tm);\n            nodeTarget.innerHTML = styledTarget;\n\n            const targetElem = dfsTraversal(nodeTarget)[0];\n            let nodeReplacement = false;\n            if (targetElem && elem && targetElem.length === elem.length) {\n                for (let i = 0; i < elem.length; i++) {\n                    try {\n                        const elemTexts = [];\n                        const targetElemTexts = [];\n                        diver(elem[i],elemTexts);\n                        diver(targetElem[i],targetElemTexts);\n                        if (targetElemTexts && elemTexts && elemTexts.length === targetElemTexts.length) {\n                            for (let j = 0; j < elemTexts.length; j++) {\n                                // const startSpaces = elemTexts[j].textContent.match(/^[\\s\\n\\t]*/)[0];\n                                // const endSpaces = elemTexts[j].textContent.match(/[\\s\\n\\t]*$/)[0];\n                                elemTexts[j].textContent =  targetElemTexts[j].textContent;\n                            }\n                        } else {\n                            nodeReplacement = true;\n                            break;\n                        }\n                        \n                    } catch (error) {\n                        console.log(elem[i].textContent);\n                    }\n                }    \n            } else {\n                nodeReplacement = true;\n            }\n\n            if (nodeReplacement) {\n                console.log(`faulty translation - ${englishSourceHash}`);\n                for (const el of elem) {\n                    if (el !== parent) {\n                        el.remove();\n                    }\n                }\n                try {\n                    // its a text node then use parent.textContent\n                    // create a new node with innerHTML = styledTarget\n                    // iterate through each element of this new node and insertBefore parent node created above\n                    const reverseStyledTargetNodes = createReverseStyledTargetNodes(styledTarget);\n                    reverseStyledTargetNodes.forEach((e)=>{\n                        parent.parentNode.insertBefore(e,parent);\n                    })\n                    parent.remove();\n                    // if (parent.nodeType === 3) {\n                    //     parent.textContent = styledTarget;\n                    // } else {\n                    //     parent.outerHTML = styledTarget;\n                    // }\n                } catch (error) {\n                    console.log(error);\n                }  \n            }\n            \n        }\n    })\n\n}\n\nconst diver = (node,textNodes)=>{\n    const children = node.childNodes;\n    if (node.nodeType === 3) {\n        textNodes.push(node);\n    }\n    if (!(Symbol.iterator in Object(children))) {\n        return ;\n    }\n    for (const child of children) {\n        if (child.nodeType === 3) {\n            const text = child.data.trim().replace(/\\s+/g, \" \");\n            if (text) {\n                textNodes.push(child);      \n            }\n            \n        }\n        else {\n            diver(child,textNodes);\n        }\n    }\n}\n\nconst createReverseStyledTargetNodes = (styledTarget)=>{\n    const newNode = document.createElement(\"div\");\n    newNode.innerHTML = styledTarget;\n    const reverseArray = [];\n    newNode.childNodes.forEach((value)=>{\n        reverseArray.push(value);\n    })\n    return reverseArray;\n}\n\nconst renderLanguageContent = () =>{\n    \n}\n\nconst addSpacesInTargetString = (sourceString, targetString) => {\n    // const startSpaces = sourceString.match(/^[\\s\\n\\t]*/)[0];\n    // const endSpaces = sourceString.match(/[\\s\\n\\t]*$/)[0];\n    // try {\n    //     return (startSpaces + targetString.trim() + endSpaces);\n    // } catch (error) {\n    //     console.log(targetString);\n    // }\n    return targetString;\n}\n\n\nconst addSpacesToSource = (preProcessedTarget,styledSource)=>{\n    // const regexSource = new RegExp(/((<(\\w+)\\s+\\w+.*?>)|<\\/(\\w+)>)/g);\n    // // const regexSource = new RegExp(/([\\s\\n\\t]*(<(\\w+)\\s+\\w+.*?>)|<\\/(\\w+)>)[\\s\\n\\t]*/g);\n    // // const regexTarget = new RegExp(/<(\\w+)\\s+\\w+.*?>/g)\n    // const regexTarget = new RegExp(/((<(\\w+)\\s+\\w+.*?>)|<\\/(\\w+)>)/g);\n    // let styledTarget = preProcessedTarget;\n    // let target,source\n    // while (\n    //     ((target=regexTarget.exec(preProcessedTarget))!== null) && \n    //     ((source=regexSource.exec(styledSource)) !== null)\n    //     ) {\n    //         styledTarget = styledTarget.replace(target[0],source[0]);\n    // }\n\n    let styledTarget = preProcessedTarget;\n\n    return (addSpacesInTargetString(styledSource,styledTarget));\n\n}\n\n/**\n * \n * 1. loop through the tm\n * 2. loop through each object of domInfo \n * 3. replace item in dom info with preProcessed target\n * 4. use reg1 for getting item in preprocTar and reg2 for getting item in styledSource\n * 5. replace each item got through reg1 with item we got through reg2\n * 6. add starting and ending spaces \n * \n */\n const createStyledTarget = (translation)=>{\n    let tm,styledSource, preProcessedSource,domInfo,preProcessedTarget;\n\n    ({styledSource, preProcessedSource, domInfo, preProcessedTarget} = translation);\n    // preProcessedTarget = preProcessedSource;\n\n    // STEP 2\n    for (const id in domInfo) {\n        const element = domInfo[id];\n        preProcessedTarget = preProcessedTarget.replace(`attrId=${id}`, element);\n    }\n\n    // STEP 3\n\n    translation.styledTarget = addSpacesToSource(preProcessedTarget,styledSource);\n    return translation;\n}\n\nconst checkForCustomBlockTag = (nodeName)=>{\n    if (nodeName.startsWith(\"app-\") || nodeName.startsWith(\"owl-\") || nodeName.startsWith(\"modal-\") ) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nconst checkAllMetaTags = async ()=>{\n    try {\n        const storedMeta = await getMetaTypeData();\n        const metaTypeList = Object.keys(META_FOR_SEO);\n        const missingMeta = {};\n        for (const metaType of metaTypeList) {\n            let element;\n            const metaTypeName = META_FOR_SEO[metaType];\n            let hashAttribute = \"avt-org-meta\";\n            let sourceHash = \"\";\n            if (metaType === \"title\") {\n                element = document.querySelector(metaType);\n                hashAttribute = \"avt-sourcehash-0\";\n                // get original hash from attribute\n                // else nodeValue is in original form\n                if (element.getAttribute(hashAttribute)) {\n                    sourceHash = element.getAttribute(hashAttribute);\n                } else {\n                    sourceHash = md5(element.nodeValue);\n                }\n\n                if (!(storedMeta[metaTypeName])) {\n                    if (!missingMeta[metaTypeName]) {\n                        missingMeta[metaTypeName] = {};\n                    }                    \n                    missingMeta[metaTypeName][\"sourceHash\"] = sourceHash;\n                    const copyElement = document.createElement(\"div\");\n                    copyElement.appendChild(element.cloneNode(true));\n                    copyElement.childNodes[0].textContent = \"avt-text-replace\";\n                    copyElement.children[0].removeAttribute(hashAttribute)\n                    missingMeta[metaTypeName][\"metaText\"] = copyElement.innerHTML;\n                }\n            } else {\n                element = document.querySelectorAll(`meta[property='${metaType}'],meta[name='${metaType}']`);\n                element.forEach(el=>{\n                    if (el.getAttribute(hashAttribute)) {\n                        sourceHash = el.getAttribute(hashAttribute);\n                    } else {\n                        const content = el.getAttribute(\"content\");\n                        if (!(content.match(/^[\\x00-\\x7F\\xA0“”’‘«»‹›©÷– ₹…°⭐é½¼¾—×]*$/g))) {\n                            return true;\n                        }\n                        sourceHash = md5(content);\n                    }\n                    if (!(storedMeta[metaTypeName])) {\n                        if (!missingMeta[metaTypeName]) {\n                            missingMeta[metaTypeName] = {};\n                        }                    \n                        missingMeta[metaTypeName][\"sourceHash\"] = sourceHash;\n                        const copyElement = document.createElement(\"div\");\n                        copyElement.appendChild(el.cloneNode(true));\n                        copyElement.children[0].setAttribute(\"content\",\"avt-text-replace\");\n                        copyElement.children[0].removeAttribute(hashAttribute);\n                        missingMeta[metaTypeName][\"metaText\"] = copyElement.innerHTML;\n                    }\n                })\n            }\n        }\n        if (Object.keys(missingMeta).length > 0) {\n            // call backend to update metaType\n            storeMetaTypeData(missingMeta);   \n        }\n    } catch (error) {\n        console.log(error);\n    }\n}\n\nmodule.exports = {\n    findAllTextTag,\n    transformAllTextTag,\n    findAllTextTagOnMutation,\n    transformAllTextTagToEnglish,\n    checkAllMetaTags,\n}\n\n//# sourceURL=webpack://anuvadak/./src/parser.js?");

/***/ }),

/***/ "./src/storage.js":
/*!************************!*\
  !*** ./src/storage.js ***!
  \************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

eval("\nconst {getConfig} = __webpack_require__(/*! ./config */ \"./src/config.js\")\nconst storageVersion = \"v1\";\nconst storagePrefix = `av-${storageVersion}`;\nconst sourceFontKey = \"source-fonts\";\nconst activeLanguageKey = \"active-language\";\nconst prevActiveLanguageKey = \"prev-language\";\n\nfunction setCurrentLanguage(language){\n    const prevLang = getCurrentLanguage() || \"english\";\n    const prevLangClass = `avk-${prevLang}`;\n    const newLangClass = `avk-${language}`;\n    localStorage.setItem(activeLanguageKey, language);\n    if (language === \"english\") {\n        // remove added language class from body\n        document.querySelector(\"body\").classList.remove(prevLangClass);        \n        localStorage.setItem(prevActiveLanguageKey, language);\n    } else {\n        document.querySelector(\"body\").classList.add(newLangClass);\n        document.querySelector(\"body\").classList.remove(prevLangClass);\n        localStorage.setItem(prevActiveLanguageKey, prevLang);\n    }\n}\n\nfunction setPrevLanguage(language) {\n    localStorage.setItem(prevActiveLanguageKey,language);\n}\n\nfunction getPrevLanguage() {\n    return localStorage.getItem(prevActiveLanguageKey);\n}\n\nfunction getCurrentLanguage(){\n    return localStorage.getItem(activeLanguageKey);\n}\n\nfunction transformStorageKey(key) {\n    return `${storagePrefix}-${key}`;\n}\n\nfunction clearAll() {\n    localStorage.clear();\n}\n\nfunction write(key, value) {\n    try {\n        // let newDict= typeof(value)!==\"string\" ? value : JSON.parse(value);\n        // check if that div exists\n        if (!document.getElementById(transformStorageKey(key))) {\n            const div = document.createElement(\"div\");\n            div.classList.add(getConfig().noLocalizationClass);\n            div.setAttribute(getConfig().noLocalizationClass,\"true\");\n            div.id = transformStorageKey(key);\n            div.style.display = \"none\";\n            document.body.appendChild(div);\n        }\n        const div = document.getElementById(transformStorageKey(key));\n        div.textContent=value;\n        // localStorage.setItem(transformStorageKey(key), value);\n    } catch (err) {\n        if (err.name === \"QuotaExceededError\") {\n            clearAll();\n            window.location.reload();\n        }\n    }\n}\n\nfunction read(key) {\n    if (document.getElementById(transformStorageKey(key))) {\n        return document.getElementById(transformStorageKey(key)).textContent\n    } else {\n        return \"\";\n    }\n    // return localStorage.getItem(transformStorageKey(key));\n}\n\nfunction del(key) {\n    localStorage.removeItem(transformStorageKey(key));\n}\n\nfunction getTransDict(language, interim = false) {\n    try {\n        let key = language;\n        if (interim) key += \"-interim\";\n\n        return JSON.parse(read(key)) || {};\n    } catch (err) {\n        return {};\n    }\n}\n\nfunction isLanguageDictionaryPresent(language) {\n    let present = false;\n    const dict = getTransDict(language);\n    if (Object.keys(dict).length > 0) present = true;\n\n    return present;\n}\n\nfunction setTranslationDictionary(language, dict, interim = false) {\n    let key = language;\n    if (interim) key += \"-interim\";\n    write(key, normalStringify(dict));\n}\n\nfunction appendToTranslationDictionary(language, dict){\n    let key = language;\n    write(key, normalStringify({...getTransDict(language),...dict}));\n}\n\nfunction setReverseTranslationHash(langauge, dict) {\n    const key = `${langauge}-reverse-map`;\n    write(key, normalStringify(dict));\n}\n\nfunction getReverseTranslationHash(langauge){\n    const key = `${langauge}-reverse-map`;\n    return JSON.parse(read(key)) || {}; \n}\n\nfunction updateTranslationDictionary(language, bundle = {}) {\n    const existingDict = storageJS.getTranslationDictionary(language);\n    const updatedDict = { ...existingDict, ...bundle };\n    storageJS.setTranslationDictionary(language, updatedDict);\n}\n\nfunction getLocallyStoredSourceStrings() {\n    try {\n        return JSON.parse(transformStorageKey(commonJS.sourceLanguage)) || [];\n    } catch (err) {\n        return [];\n    }\n}\n\nfunction clearAllCachedTMs() {\n    for (const language in commonJS.allowedLanguageMap) {\n        storageJS.removeTranslationDictionary(language);\n    }\n}\n\nfunction setSourceFontDictionary(items){\n    const existingDict = getSourceFontDictionary() || {};\n            const newDict = {\n                ...existingDict,\n                ...items\n            };\n    write(sourceFontKey, normalStringify(newDict));\n}\n\nfunction getSourceFontDictionary(){\n    return JSON.parse(read(sourceFontKey)||\"{}\");\n}\n\nfunction removeSourceFontDictionary() {\n    del(sourceFontKey)\n}\n\n/**\n * Website may have Array.prototype.toJSON prototype option that \n * would affect JSON.stringify() method response ,\n * so we need to remove toJSON() property for some moment while we use JSON.stringify()\n * then reapply that property\n */\n function normalStringify(object){\n    if(Array.prototype.toJSON){\n      const toJSONProps = Array.prototype.toJSON;\n      delete Array.prototype.toJSON;\n      const returnString = JSON.stringify(object);\n      Array.prototype.toJSON = toJSONProps;\n      return returnString;\n    } else {\n      return JSON.stringify(object);\n    }\n  }\n\nmodule.exports = {\n    getCurrentLanguage,\n    setCurrentLanguage,\n    write,\n    setTranslationDictionary,\n    getTransDict,\n    setReverseTranslationHash,\n    getReverseTranslationHash,\n    getPrevLanguage,\n    setPrevLanguage,\n    appendToTranslationDictionary,\n    normalStringify,\n    getSourceFontDictionary,\n    setSourceFontDictionary,\n    removeSourceFontDictionary\n}\n\n//# sourceURL=webpack://anuvadak/./src/storage.js?");

/***/ }),

/***/ "./src/widget.js":
/*!***********************!*\
  !*** ./src/widget.js ***!
  \***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"createWidget\": () => (/* binding */ createWidget),\n/* harmony export */   \"getCloseSVG\": () => (/* binding */ getCloseSVG),\n/* harmony export */   \"getLangSelectorDOMRoot\": () => (/* binding */ getLangSelectorDOMRoot),\n/* harmony export */   \"getLanguageSVG\": () => (/* binding */ getLanguageSVG),\n/* harmony export */   \"highlightSelectedLanguage\": () => (/* binding */ highlightSelectedLanguage),\n/* harmony export */   \"isVisible\": () => (/* binding */ isVisible),\n/* harmony export */   \"setCurrLanguage\": () => (/* binding */ setCurrLanguage),\n/* harmony export */   \"setWidgetConfig\": () => (/* binding */ setWidgetConfig)\n/* harmony export */ });\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./backend */ \"./src/backend.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_backend__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config */ \"./src/config.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Constants */ \"./src/Constants.js\");\n/* harmony import */ var _Constants__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_Constants__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./storage */ \"./src/storage.js\");\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_storage__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\n\n// languages available\n// visibility\n// currently selected languages\nlet languagesAllowed = [];\nlet visibility = false;\nlet currLanguage = \"english\";\nlet langSelectorDOMRoot = null;\nlet publicVisibility = undefined;\nlet wscope = null;\nlet sourceLanguage = \"english\";\n\nconst setWidgetConfig = (config)=>{\n    setlanguagesAllowed(config.allowedLanguage);\n    setPublicVisibility(config.isVisible);\n    wscope = config.wscope;\n};\n\nconst setlanguagesAllowed = (params) =>{\n    languagesAllowed = params;\n};\n\nconst setCurrLanguage = (params)=>{\n    currLanguage = params;\n};\n\nconst setPublicVisibility = (visibility)=>{\n    publicVisibility = visibility;\n};\n\nconst isVisible = () => {\n    return publicVisibility || privateVisibility();\n};\n\nconst privateVisibility = () => {\n\n    // const queryParams = new URL(window.location.href).searchParams;\n    // return queryParams.get(\"v\") === \"private\"\n    return window.location.href.includes(\"v=private\");\n};\n\nconst highlightSelectedLanguage = () => {\n    let selectedLanguage = (0,_storage__WEBPACK_IMPORTED_MODULE_3__.getCurrentLanguage)();\n    if (!selectedLanguage) {\n        selectedLanguage = sourceLanguage;\n    }\n\n    const langList = langSelectorDOMRoot.getElementById(\"anuvadak-language-selector-list\").children;\n    for (const item of langList) {\n        if (item.getAttribute(\"value\") === selectedLanguage) {\n            item.classList.add(\"anuvadak-li-hover\");\n        } else {\n            item.classList.remove(\"anuvadak-li-hover\");\n        }\n    }\n};\n\nconst getCloseSVG = () => {\n    return `<svg fill=\"#ffffff\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" width=\"28px\" height=\"40px\">\n    <path\n        d=\"M 12 8 L 8 12 L 24.666016 32 L 8 52 L 12 56 L 32 39.333984 L 52 56 L 56 52 L 39.333984 32 L 56 12 L 52 8 L 32 24.666016 L 12 8 z\" />\n    </svg>`;\n}\n\nconst getLanguageSVG = () => {\n    return `<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"40px\"\n            height=\"40px\" viewBox=\"0 0 1469 1024\">\n            <g id=\"icomoon-ignore\">\n            </g>\n            <path fill=\"#ffffff\"\n                d=\"M413.945 115.202c-1.283 3.416-52.107 136.896-113.19 296.85-60.863 159.954-110.834 291.51-110.834 292.148s25.63 0.854 57.022 0.638l57.238-0.638 21.782-59.8c12.172-32.885 25.84-70.686 30.754-83.928l8.756-23.922h101.018c94.176 0 101.018 0.216 102.51 3.632 0.638 2.139 13.242 38.44 27.76 80.728s27.122 78.588 27.76 80.512c1.070 2.994 4.054 3.848 11.318 3.848h10.039l-30.97 31.176-30.97 30.97 13.88 12.81c33.1 30.538 62.362 47.834 100.802 60.438 30.538 10.039 52.32 12.81 89.484 11.318 48.050-1.708 81.797-12.604 113.398-36.516 37.802-28.406 57.66-60.863 65.14-105.926l3.416-21.36 10.894 1.492c14.096 2.139 57.444 2.139 68.978 0l9.184-1.492 0.428 112.543 0.638 112.758 54.028 0.638 53.818 0.428v-518.95h111.050v-96.1h-318.205v96.1h98.24l-0.428 95.462-0.638 95.246-11.75 4.27c-8.328 2.778-19.65 4.486-38.44 5.124-41.434 1.708-65.14-4.908-98.662-27.551l-14.312-9.61 5.34-5.124c10.248-9.61 28.192-39.294 34.17-56.384 4.486-13.242 6.194-22.214 6.832-39.726 1.708-45.488-11.102-80.086-41.002-109.558-33.74-33.532-71.756-48.050-126.432-48.266-52.752 0-101.018 19.22-134.756 53.818-8.972 9.184-16.442 16.442-16.658 16.229-0.216-0.428-21.782-58.946-48.050-130.486l-47.628-129.632h-110.412l-2.346 5.762zM499.797 350.122c17.084 49.12 30.754 89.906 30.322 90.76-0.428 1.070-29.684 1.708-64.924 1.708-48.482 0-63.854-0.638-63.854-2.562 0-3.632 64.924-178.967 66.2-178.967 0.638 0 15.166 40.148 32.246 89.052zM665.736 419.532c15.588 13.88 29.046 25.198 30.116 25.198 0.854 0 5.762-5.762 10.894-12.81 16.229-22.42 32.885-31.824 59.584-33.532 41.641-2.994 66.416 18.366 66.416 57.238 0 22.214-4.702 34.596-17.939 47.834-16.442 16.442-30.322 20.29-72.826 20.29h-33.1v39.932l-0.216 40.148-39.294-106.78c-21.782-58.73-39.51-107.209-39.51-107.634 0-1.283 5.978 3.848 35.878 30.116zM817.791 627.109c16.658 5.34 30.538 15.804 36.516 28.406 7.473 15.166 7.264 41.641-0.428 58.514-11.102 23.49-30.116 36.307-60.863 40.58-40.364 5.556-81.366-8.54-110.834-38.44l-10.464-10.894h36.732c20.29 0 36.732-0.428 36.732-0.854 0-0.638-2.994-8.972-6.617-18.795s-10.248-28.192-14.95-40.786l-8.328-23.274 45.272 1.070c34.808 0.638 48.266 1.708 57.238 4.486z\">\n            </path>\n        </svg>`;\n};\n\nconst englishLangSelectorElement = () => {\n    const { websiteMapping,url } = (0,_config__WEBPACK_IMPORTED_MODULE_1__.getConfig)();\n    let hrefLink = \"#\";\n    if (websiteMapping !== \"NONE\") {\n        hrefLink = url;\n    }\n    return `<li value=\"english\" class=\"anuvadak-dflex anuvadak-justify-content-center\">\n    <a href=${hrefLink} anuvadak-no-localization=true class=\"anuvadak-language-selector-anchor anuvadak-no-localization\">English</a>\n    </li>`;\n};\n\nconst transformLinksToPrivate = () => {\n    if (privateVisibility()) {\n        // if the private mode is on for the website, append private\n        // query parameter to all the website hyperlinks\n        const { hostname } = new URL(window.location.href);\n        document.querySelectorAll(\"a\").forEach(item => {\n            const href = item.getAttribute(\"href\");\n            try {\n                if (href.match(/^\\//)) {\n                    if (href.split(\"?\").length > 1) {\n                        item.setAttribute(\"href\", `${href}&v=private`);\n                    } else {\n                        item.setAttribute(\"href\", `${href}?v=private`);\n                    }\n                } else {\n                    const qURL = new URL(href);\n                    if (href && qURL.hostname === hostname) {\n                        let qParams = \"\";\n                        if (qURL.search) { qParams = \"&v=private\"; }\n                        else { qParams = \"?v=private\"; }\n                        item.setAttribute(\"href\", `${qURL.protocol}//${qURL.hostname}${qURL.pathname}${qParams}`);\n                    }\n                }\n            } catch (err) { }\n        });\n    }\n}\n\nconst createWidget = (widgetConfig)=>{\n    if(widgetConfig.customWidget){\n        langSelectorDOMRoot = document.getElementById(\"anuvadak-language-selector-container\")\n        transformLinksToPrivate();\n        return\n    }\n    const mainContainer = document.createElement(\"div\");\n    const fixedPosition = widgetConfig.position || _Constants__WEBPACK_IMPORTED_MODULE_2__.WIDGET_POSITIONS.RIGHT_CENTER;\n    const fixedPositionClass = _Constants__WEBPACK_IMPORTED_MODULE_2__.WIDGET_POSITION_CLASS_MAPPER[fixedPosition];\n    mainContainer.classList.add(\"anuvadak-dflex\", \"anuvadak-flex-column\", \"anuvadak-justify-content-center\", fixedPositionClass);\n\n    const svgContainer = document.createElement(\"div\");\n    svgContainer.classList.add(\"anuvadak-dflex\", \"anuvadak-justify-content-center\");\n    svgContainer.id = \"anuvadak-language-svg\";\n    svgContainer.innerHTML = getLanguageSVG();\n    mainContainer.append(svgContainer);\n\n    const languageMenuContainer = document.createElement(\"div\");\n    languageMenuContainer.classList.add(\"anuvadak-dnone\");\n    languageMenuContainer.id = \"anuvadak-language-selector\";\n    const languageSelectorList = document.createElement(\"ul\");\n    languageSelectorList.id = \"anuvadak-language-selector-list\";\n    const languageTags = languagesAllowed;\n    let liString = englishLangSelectorElement();\n    for (const language in languageTags) {\n        if (widgetConfig.languageOption.length !== 0 && !widgetConfig.languageOption.includes(language)) {\n            continue;\n        }\n        const actualUrl = widgetConfig.url;\n        let hrefLink = \"\";\n        switch (widgetConfig.websiteMapping) {\n            case \"NONE\":\n                hrefLink = \"#\";\n                break;\n            case \"SUBDIRECTORY\":\n                hrefLink = (0,_backend__WEBPACK_IMPORTED_MODULE_0__.urlForSubdirectory)(actualUrl,language);\n                break;\n            case \"SUBDOMAIN\":\n                hrefLink = (0,_backend__WEBPACK_IMPORTED_MODULE_0__.urlForSubdomain)(actualUrl,language);\n                break;\n        }\n        liString += `<li value=\"${language}\" data-wmap=\"${wscope}\" class=\"anuvadak-dflex anuvadak-justify-content-center\">\n    <a href=${hrefLink} =true class=\"anuvadak-language-selector-anchor \">${languageTags[language]}</a>\n            </li>`;\n    }\n    languageSelectorList.innerHTML = liString;\n    languageMenuContainer.append(languageSelectorList);\n\n    mainContainer.append(languageMenuContainer);\n\n    const shadowHost = document.createElement(\"div\");\n    shadowHost.id = \"anuvadak-div-outer\";\n    document.getElementsByTagName(\"body\")[0].append(shadowHost);\n    let shadowMode = \"closed\"\n    if (widgetConfig.projectKey === \"03fe9c44-e9e4-428b-9058-bd8910843db0\" ||\n    widgetConfig.projectKey === \"ddcfe1e0-7614-4f37-a626-ca4abd17f2ec\") {\n        shadowMode = \"open\"\n    }\n    const shadowRoot = shadowHost.attachShadow({ mode: shadowMode });\n    shadowRoot.appendChild(mainContainer);\n    shadowRoot.getElementById(\"anuvadak-language-svg\").onclick = function (event) {\n        const svgContainer = shadowRoot.getElementById(\"anuvadak-language-svg\");\n        const langSelector = shadowRoot.getElementById(\"anuvadak-language-selector\");\n        if (langSelector.classList.contains(\"anuvadak-dnone\")) {\n            langSelector.classList.remove(\"anuvadak-dnone\");\n            langSelector.classList.add(\"animate__animated\", \"animate__fadeIn\");\n            svgContainer.innerHTML = getCloseSVG();\n        } else {\n            langSelector.classList.add(\"anuvadak-dnone\");\n            langSelector.classList.remove(\"animate__animated\", \"animate__fadeIn\")\n            svgContainer.innerHTML = getLanguageSVG();\n        }\n    }\n\n    const blinkerDiv = document.createElement('div');\n    blinkerDiv.classList.add(\"anuvadak-blinker\", fixedPositionClass);\n    \n    mainContainer.appendChild(blinkerDiv);\n\n    langSelectorDOMRoot = shadowRoot;\n    widgetStyleSheet();\n    highlightSelectedLanguage();\n    transformLinksToPrivate();\n}\n\nconst getLangSelectorDOMRoot = () => langSelectorDOMRoot\n\nconst widgetStyleSheet = ()=>{\n    const link = document.createElement(\"link\");\n    link.rel = \"stylesheet\";\n    link.href = \"https://anuvadak.blob.core.windows.net/static/language.selector.css\";\n    langSelectorDOMRoot.append(link);\n};\n\n\n\n\n//# sourceURL=webpack://anuvadak/./src/widget.js?");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	(() => {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = (module) => {
/******/ 			var getter = module && module.__esModule ?
/******/ 				() => (module['default']) :
/******/ 				() => (module);
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = __webpack_require__("./src/index.js");
/******/ 	window.anuvadak = __webpack_exports__["default"];
/******/ 	
/******/ })()
;