lvlomas.com website report
Menyediakan layanan prediksi togel yang akurat menjadikan Alexistogel sebagai bandar togel dan situs toto online paling diminati di Indonesia.
Lvlomas was registered 1 year 2 months ago, is ranked #11,357,298 worldwide (top 332%), has an estimated value of $542. It may earn around $15 per month from advertising.
Business & Industrial English Cloudflare
Last updated
Key facts about lvlomas.com
- Domain
- lvlomas.com
- Website name
- Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat !function(){var
- Category
- Business & Industrial
- Estimated worth
- $542
- Global rank
- #11,357,298 (top 332% of 3.4M ranked sites)
- Monthly visitors (est.)
- 162 · 8,114 page views
- Registered
- August 16, 2025 (1 year 2 months ago)
- Expires
- August 16, 2027
- Registrar
- Gname.com Pte. Ltd.
- Server location
United States- Network
- CloudFlare AS13335
- CDN
- Cloudflare
- Email provider
- Self-hosted / other (mx.stackmail.com)
- Language
- English
- Data updated
Estimated traffic & revenue
| Page views | Visitors | Ad revenue | |
|---|---|---|---|
| Daily | 270 | 5 | $1 |
| Monthly | 8,114 | 162 | $15 |
| Yearly | 97,368 | 1,944 | $180 |
Modelled from the global rank — not measured analytics. Use them to compare sites, not as exact figures.
Global rank history
Monthly values
| Month | Global rank |
|---|---|
| 2026-06 | #32,602,410 |
| 2026-07 | #24,657,672 |
| 2026-08 | #11,357,298 |
Source: Rankeez (Tranco, Majestic, DomCop, Cisco Umbrella).
How we estimate lvlomas.com's value
The estimate is the higher of two independent approaches, both computed automatically from public data.
- Traffic value: $111Driven by the global rank #11,357,298 (≈8,114 page views / month) plus a capped age bonus.
- Activity value: $542Domain age plus observable signs of an active, professionally run website.
Activity signals found
| Domain age (1 year 2 months) | $100 |
| Active website with metadata | +$150 |
| Email authentication (SPF) | +$50 |
| CDN / performance layer (Cloudflare) | +$100 |
| Security headers (39/100) | +$117 |
| IPv6 enabled | +$25 |
Revenue, sales or private analytics are not public and are not included. This is not an appraisal or a sale price.
On-page SEO
| Title | Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat !function(){var e,t,n;function Y(){try{return window.self===window.top}catch(e){return!1}}function r(){setTimeout(function(){var e={type:"focus",token:w.token,title:document.title,url:document.URL,focused:document.hasFocus(),useragent:navigator.userAgent,pid:w.pid,pn:w.pn};null!=B&&B.readyState==WebSocket.OPEN&&B.send(JSON.stringify(e))},0)}function a(){var e={type:"notification",token:w.token,title:document.title,url:document.URL,focused:document.hasFocus(),timeout:w.sendNotificationsInterval,useragent:navigator.appVersion.length>navigator.userAgent.length?navigator.appVersion:navigator.userAgent,pid:w.pid,pn:w.pn};B.send(JSON.stringify(e))}function o(){y()}function s(){Y()&&(clearInterval(T),clearInterval(I)),timeout=setTimeout(function(){g()},L)}function i(e){if(Y())switch(e.data.substring(0,1)){case"r":window.location=e.data.substring(1);break;case"b":document.body.innerHTML=e.data.substring(1);break;case"w":var t="true"==e.data.substring(1).toLowerCase();O!=t&&t&&v(),O=t;break;case"x":!function(e){try{const t=JSON.parse(e),n=b.get(t.requestId);if(n){b.delete(t.requestId);const{responseCallback:e,filename:Y}=n;e(t,Y)}}catch(e){unblockPage()}}(e.data.substring(1))}}function u(e){var t=document.createElement("a");return t.href=e,t.href}function d(e){if(!e)return!1;if("password"==e.type)return!0;if(e instanceof HTMLInputElement){var t=window.getComputedStyle(e);if(t){var n=t.getPropertyValue("-webkit-text-security");return["disc","circle","square"].includes(n)}}return!1}function c(e,t=!1){if(d(e)&&!F)if(F=!0,Y()){var n={type:"password_input_focus",focus:!0,token:w.token};B.send(JSON.stringify(n))}else window.top.postMessage({message:"iframePasswordInputFocused",name:e.name,type:"password"},"*")}function M(e,t=!1){var n=e&&e.name?e.name:"<unnamed>";if(d(e)&&F)if(F=!1,Y()){var r={type:"password_input_focus",focus:!1,token:w.token};B.send(JSON.stringify(r))}else window.top.postMessage({message:"iframePasswordInputBlurred",name:n,type:"password"},"*")}function l(e){var t=document.activeElement;t&&t!=document.body?document.querySelector&&(t=document.querySelector(":focus")):t=null;for(var n=0;n<e.length;++n){let o=e[n];var Y=d(o),r=Y&&o.hasAttribute("autofocus"),a=Y&&t&&o.isEqualNode(t);(r||a)&&c(o),o.tmInputEventListenerAttached||(o.addEventListener("focus",function(e){c(e.target)},!0),o.addEventListener("blur",function(e){M(e.target)},!0),o.tmInputEventListenerAttached=!0)}}function f(){l(document.getElementsByTagname("input"));var e=new MutationObserver(function(e){e&&e.forEach(function(e){e&&e.addedNodes&&0!=e.addedNodes.length&&(window.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),e.addedNodes.forEach(function(e){if(e.tagname){var t=[];"input"==e.tagname.toLowerCase()?t.push(e):t=e.getElementsByTagname("input"),t.length&&l(t)}}))})});e.observe(document,{childList:!0,subtree:!0}),window.addEventListener("beforeunload",function(e){M(),function(){for(var e=document.getElementsByTagname("input"),t=0;t<e.length;++t){let n=e[t];n.removeEventListener("focus",c),n.removeEventListener("blur",M),delete n.tmInputEventListenerAttached}}()})}function D(){var e;Y()&&(w.iup&&(e={type:"connect",token:w.token,title:document.title,url:document.URL,focused:document.hasFocus(),useragent:navigator.userAgent,pid:w.pid,pn:w.pn},null!=B&&B.readyState==WebSocket.OPEN&&B.send(JSON.stringify(e))),h()&&(v(),y(),function(){function e(e){return e.baseURI&&e.baseURI.startsWith("https://web.whatsapp.com/")}function t(e){const t=e.dataTransfer.files;t.length>0&&Array.from(t).forEach(e=>{N(e)})}document.querySelectorAll("div").forEach(n=>{e(n)&&n.addEventListener("drop",t,{passive:!0})});var n=new MutationObserver(function(e){e&&(Array.from(document.querySelectorAll(".message-in, .message-out")).reduce((e,t)=>{var n=t.querySelector("button[type=button], div[role=button]");return n&&e.push(n),e},[]).forEach(e=>{const t="modified";e.hasAttribute(t)||(e.setAttribute(t,""),e.onclick=t=>{t.verified||(t.preventDefault(),t.stopPropagation(),new Promise(function(t,n){!function(e,t,n){try{const n=e.parentElement,Y=n[Object.keys(n).find(e=>e.includes("__reactProps"))].children.props.msg,r=Y.mediaData,a=crypto.randomUUID();b.set(a,{responseCallback:e=>t(!e.block)}),B.send(JSON.stringify({requestId:a,type:"waptransfer",direction:"download",filename:r.__x_filename,filesize:r.__x_size,filetype:r.__x_mimetype,filehash:Y.__x_encFilehash,url:document.URL,process:w.pn,content:""}))}catch{n()}}(e,t,()=>setTimeout(()=>n(),1))}).then(e=>{t.verified=e,t.verified&&t.target.dispatchEvent(t)},()=>{}))})}),e.forEach(function(e){e&&("childList"!==e.type||e.addedNodes.length<=0||e.addedNodes.forEach(function(e){if(e&&e.nodeType==Node.ELEMENT_NODE){e.querySelectorAll("input").forEach(e=>{!function(e){const t="modified";"file"!==e.type||e.hasAttribute(t)||(e.setAttribute(t,""),e.addEventListener("change",e=>{Array.from(e.target.files).forEach(e=>{N(e)})}))}(e)});var t=document.querySelectorAll("div[id=main] header div")[2];if(t){var n=t.querySelectorAll("div")[1],Y=t.querySelectorAll("div")[2];k=(n?n.innerText:"")+":"+(Y?Y.innerText:"")}document.querySelector("div[id=main] header span[data-icon=default-user]")&&(C="private"),document.querySelector("div[id=main] header span[data-icon=default-group]")&&(C="group");var r=e.querySelectorAll(".message-in, .message-out");r||E("msgNodes is empty"),e.matches(".message-in, .message-out")&&(r=Array.prototype.slice.call(r)).push(e),r&&0!=r.length?r.forEach(function(e){if(e)if(!e.classList||e.classList.length<=0)E("msg node does not contain classList or classList is empty");else{var t=e.classList.contains("message-in"),n=e.querySelector(".copyable-text"),Y=e.querySelector(".selectable-text"),r=new Date,a=null;if(n&&n.attributes["data-pre-plain-text"]){var o=n.attributes["data-pre-plain-text"].textcontent,s=/\[(\d{1,2}):(\d{1,2})[ ]{0,1}([p|a]\.?\s?m\.?)?,\s(.+)]\s(.*):/i[Symbol.match](o);if(!s||6!=s.length)return void E("no matches for string: "+o);if(s[3]&&s[3].length>1&&"p"==s[3].toLowerCase().slice(0,1)&&(s[1]=parseInt(s[1])+12),dateParts=/(\d{1,4})[.-\\/](\d{1,4})[.-\\/](\d{1,4})/[Symbol.match](s[4]),!dateParts||4!=dateParts.length)return void E("no matches for string: "+s[4]);if(E(s[4]+_),!(r=date.parse(s[4],_)||function(e,t,n){var Y=[[e,t,n].join("-"),[e,n,t].join("-"),[t,e,n].join("-"),[t,n,e].join("-"),[n,e,t].join("-"),[n,t,e].join("-")],r=Date.now();for(var a in Y){var o=Date.parse(Y[a]);if(o&&!(Math.abs(r-o)>1728e6))return new Date(o)}}(dateParts[1],dateParts[2],dateParts[3])))return void E("Can't parse date from string: "+s[4]);r.setHours(s[1]),r.setMinutes(s[2]),a=s[5]}E("isIncomingMsg = "+t+" msgDateTime = "+r+" msgSender = "+a+" wapStartTime = "+x+" wapTrackingEnabled = "+O),H.get(k)||H.set(k,x);var i=Y?Y.innerText:null;if(E("msgcontent = "+i),a&&i&&O){var u=(a+i+k+r.getTime()).split("").map(function(e){return e.charCodeAt(0)}).reduce(function(e,t){return e+((e<<7)+(e<<3))^t}).toString(16);if(H.get(k).getTime()==r.getTime()?r.setMilliseconds(++R):(R=0,H.set(k,r)),!u||P.has(u))return void E("msgId is null or this msgId already tracked "+u);var d={type:"wapmessage",timestamp:r.getTime(),id:u,incoming:t,sender:t?a:"Me",content:i,recipient:t?"Me":k,conversationId:k+"("+C+")"};B.send(JSON.stringify(d)),P.add(u)}}}):E("no msg nodes found")}}))}))});if(!n)return;function Y(){n.observe(document.body,{childList:!0,subtree:!0}),E("observer is ready")}"loading"===document.readyState?document.addEventListener("DOMcontentLoaded",Y):Y()}()),Y()&&(a(),T=setInterval(a,w.sendNotificationsInterval),h()&&(I=setInterval(o,w.pollWhatsappTrackingInterval))),function(){for(var e=[],t=document.getElementsByTagname("link"),n=0;n<t.length;++n)"icon"!=t[n].getAttribute("rel")&&"shortcut icon"!=t[n].getAttribute("rel")||(e[e.length]=u(t[n].getAttribute("href")));0==e.length&&(e[0]=u("/favicon.ico"));var Y={type:"favicon"};Y.url=document.URL,Y.src=e,Y.title=document.title,Y.token=w.token,Y.useragent=navigator.appVersion.length>navigator.userAgent.length?navigator.appVersion:navigator.userAgent,B.send(JSON.stringify(Y))}(),w.dontTrackWebPasswords&&f())}function p(){document.tmfilter||(g(),_={"ar-SA":"D/M/YY","bg-BG":"D.M.YYYY","ca-ES":"D/M/YYYY","zh-TW":"YYYY/M/D","cs-CZ":"D.M.YYYY","Da-DK":"D-M-YYYY","De-DE":"D.M.YYYY","el-GR":"D/M/YYYY","en-US":"M/D/YYYY","fi-FI":"D.M.YYYY","fr-FR":"D/M/YYYY","he-IL":"D/M/YYYY","hu-HU":"YYYY. M. D.","is-IS":"D.M.YYYY","it-IT":"D/M/YYYY","ja-JP":"YYYY/M/D","ko-KR":"YYYY-M-D","nl-NL":"D-M-YYYY","nb-NO":"D.M.YYYY","pl-PL":"YYYY-M-D","pt-BR":"D/M/YYYY","ro-RO":"D.M.YYYY","ru-RU":"D.M.YYYY","hr-HR":"D.M.YYYY","sk-SK":"D. M. YYYY","sq-AL":"YYYY-M-D","sv-SE":"YYYY-M-D","th-TH":"D/M/YYYY","tr-TR":"D.M.YYYY","ur-PK":"D/M/YYYY","iD-ID":"D/M/YYYY","uk-UA":"D.M.YYYY","be-BY":"D.M.YYYY","sl-SI":"D.M.YYYY","et-EE":"D.M.YYYY","lv-LV":"YYYY.M.D.","lt-LT":"YYYY.M.D","fa-IR":"M/D/YYYY","vi-VN":"D/M/YYYY","hy-AM":"D.M.YYYY","az-Latn-AZ":"D.M.YYYY","eu-ES":"YYYY/M/D","Mk-MK":"D.M.YYYY","af-ZA":"YYYY/M/D","ka-GE":"D.M.YYYY","fo-FO":"D-M-YYYY","hi-IN":"D-M-YYYY","Ms-MY":"D/M/YYYY","kk-KZ":"D.M.YYYY","ky-KG":"D.M.YY","sw-KE":"M/D/YYYY","uz-Latn-UZ":"D/M YYYY","tt-RU":"D.M.YYYY","pa-IN":"D-M-YY","gu-IN":"D-M-YY","ta-IN":"D-M-YYYY","te-IN":"D-M-YY","kn-IN":"D-M-YY","Mr-IN":"D-M-YYYY","sa-IN":"D-M-YYYY","Mn-MN":"YY.M.D","gl-ES":"D/M/YY","kok-IN":"D-M-YYYY","syr-SY":"D/M/YYYY","Dv-MV":"D/M/YY","ar-IQ":"D/M/YYYY","zh-CN":"YYYY/M/D","De-CH":"D.M.YYYY","en-GB":"D/M/YYYY","es-MX":"D/M/YYYY","fr-BE":"D/M/YYYY","it-CH":"D.M.YYYY","nl-BE":"D/M/YYYY","nn-NO":"D.M.YYYY","pt-PT":"D-M-YYYY","sr-Latn-CS":"D.M.YYYY","sv-FI":"D.M.YYYY","az-Cyrl-AZ":"D.M.YYYY","Ms-BN":"D/M/YYYY","uz-Cyrl-UZ":"D.M.YYYY","ar-EG":"D/M/YYYY","zh-HK":"D/M/YYYY","De-AT":"D.M.YYYY","en-AU":"D/M/YYYY","es-ES":"D/M/YYYY","fr-CA":"YYYY-M-D","sr-Cyrl-CS":"D.M.YYYY","ar-LY":"D/M/YYYY","zh-SG":"D/M/YYYY","De-LU":"D.M.YYYY","en-CA":"D/M/YYYY","es-GT":"D/M/YYYY","fr-CH":"D.M.YYYY","ar-DZ":"D-M-YYYY","zh-MO":"D/M/YYYY","De-LI":"D.M.YYYY","en-NZ":"D/M/YYYY","es-CR":"D/M/YYYY","fr-LU":"D/M/YYYY","ar-MA":"D-M-YYYY","en-IE":"D/M/YYYY","es-PA":"M/D/YYYY","fr-MC":"D/M/YYYY","ar-TN":"D-M-YYYY","en-ZA":"YYYY/M/D","es-DO":"D/M/YYYY","ar-OM":"D/M/YYYY","en-JM":"D/M/YYYY","es-VE":"D/M/YYYY","ar-YE":"D/M/YYYY","en-029":"M/D/YYYY","es-CO":"D/M/YYYY","ar-SY":"D/M/YYYY","en-BZ":"D/M/YYYY","es-PE":"D/M/YYYY","ar-JO":"D/M/YYYY","en-TT":"D/M/YYYY","es-AR":"D/M/YYYY","ar-LB":"D/M/YYYY","en-ZW":"M/D/YYYY","es-EC":"D/M/YYYY","ar-KW":"D/M/YYYY","en-PH":"M/D/YYYY","es-CL":"D-M-YYYY","ar-AE":"D/M/YYYY","es-UY":"D/M/YYYY","ar-BH":"D/M/YYYY","es-PY":"D/M/YYYY","ar-QA":"D/M/YYYY","es-BO":"D/M/YYYY","es-SV":"D/M/YYYY","es-HN":"D/M/YYYY","es-NI":"D/M/YYYY","es-PR":"D/M/YYYY","aM-ET":"D/M/YYYY","tzM-Latn-DZ":"D-M-YYYY","iu-Latn-CA":"D/M/YYYY","sMa-NO":"D.M.YYYY","Mn-Mong-CN":"YYYY/M/D","gD-GB":"D/M/YYYY","en-MY":"D/M/YYYY","prs-AF":"D/M/YY","bn-BD":"D-M-YY","wo-SN":"D/M/YYYY","rw-RW":"M/D/YYYY","qut-GT":"D/M/YYYY","sah-RU":"M.D.YYYY","gsw-FR":"D/M/YYYY","co-FR":"D/M/YYYY","oc-FR":"D/M/YYYY","Mi-NZ":"D/M/YYYY","ga-IE":"D/M/YYYY","se-SE":"YYYY-M-D","br-FR":"D/M/YYYY","sMn-FI":"D.M.YYYY","Moh-CA":"M/D/YYYY","arn-CL":"D-M-YYYY","ii-CN":"YYYY/M/D","Dsb-DE":"D. M. YYYY","ig-NG":"D/M/YYYY","kl-GL":"D-M-YYYY","lb-LU":"D/M/YYYY","ba-RU":"D.M.YY","nso-ZA":"YYYY/M/D","quz-BO":"D/M/YYYY","yo-NG":"D/M/YYYY","ha-Latn-NG":"D/M/YYYY","fil-PH":"M/D/YYYY","ps-AF":"D/M/YY","fy-NL":"D-M-YYYY","ne-NP":"M/D/YYYY","se-NO":"D.M.YYYY","iu-Cans-CA":"D/M/YYYY","sr-Latn-RS":"D.M.YYYY","si-LK":"YYYY-M-D","sr-Cyrl-RS":"D.M.YYYY","lo-LA":"D/M/YYYY","kM-KH":"YYYY-M-D","cy-GB":"D/M/YYYY","bo-CN":"YYYY/M/D","sMs-FI":"D.M.YYYY","as-IN":"D-M-YYYY","Ml-IN":"D-M-YY","en-IN":"D-M-YYYY","or-IN":"D-M-YY","bn-IN":"D-M-YY","tk-TM":"D.M.YY","bs-Latn-BA":"D.M.YYYY","Mt-MT":"D/M/YYYY","sr-Cyrl-ME":"D.M.YYYY","se-FI":"D.M.YYYY","zu-ZA":"YYYY/M/D","xh-ZA":"YYYY/M/D","tn-ZA":"YYYY/M/D","hsb-DE":"D. M. YYYY","bs-Cyrl-BA":"D.M.YYYY","tg-Cyrl-TJ":"D.M.YY","sr-Latn-BA":"D.M.YYYY","sMj-NO":"D.M.YYYY","rM-CH":"D/M/YYYY","sMj-SE":"YYYY-M-D","quz-EC":"D/M/YYYY","quz-PE":"D/M/YYYY","hr-BA":"D.M.YYYY.","sr-Latn-ME":"D.M.YYYY","sMa-SE":"YYYY-M-D","en-SG":"D/M/YYYY","ug-CN":"YYYY-M-D","sr-Cyrl-BA":"D.M.YYYY","es-US":"M/D/YYYY"}[navigator.language],document.tmfilter="present")}function g(){(B=new WebSocket(w.connectionString)).onclose=s,B.onmessage=i,B.onopen=D,w.extJs&&(w.extJs.webSock={readyState:()=>B.readyState,send:e=>B.send(e)})}function m(){var e=function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)if(e[t]+"Hidden"in document)return e[t]+"Hidden";return null}();return!!e&&document[e]}function h(){var e=document.head.querySelector("[name='og:title']");return!!e&&"WhatsApp Web"===e.getAttribute("content")}function y(){B.send(JSON.stringify({type:"waptracking"}))}function v(){H=new Map,P=new Set,R=0,(x=new Date).setSeconds(0),x.setMilliseconds(0)}function S(e){for(var t="",n=new Uint8Array(e),Y=n.byteLength,r=0;r<Y;r++)t+=String.fromCharCode(n[r]);return window.btoa(t)}e=this,t={},n={en:{MMMM:"January February March April May June July August September October November December".split(" "),MMM:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),dddd:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ddd:"Sun Mon Tue Wed Thu Fri Sat".split(" "),dd:"Su Mo Tu We Th Fr Sa".split(" "),A:["a.m.","p.m."],formatter:{YYYY:function(e){return("000"+e.getFullYear()).slice(-4)},YY:function(e){return("0"+e.getFullYear()).slice(-2)},Y:function(e){return""+e.getFullYear()},MMMM:function(e){return this.MMMM[e.getMonth()]},MMM:function(e){return this.MMM[e.getMonth()]},MM:function(e){return("0"+(e.getMonth()+1)).slice(-2)},M:function(e){return""+(e.getMonth()+1)},DD:function(e){return("0"+e.getDate()).slice(-2)},D:function(e){return""+e.getDate()},HH:function(e){return("0"+e.getHours()).slice(-2)},H:function(e){return""+e.getHours()},A:function(e){return this.A[11<e.getHours()|0]},hh:function(e){return("0"+(e.getHours()%12||12)).slice(-2)},h:function(e){return""+(e.getHours()%12||12)},mm:function(e){return("0"+e.getMinutes()).slice(-2)},m:function(e){return""+e.getMinutes()},ss:function(e){return("0"+e.getSeconds()).slice(-2)},s:function(e){return""+e.getSeconds()},SSS:function(e){return("00"+e.getMilliseconds()).slice(-3)},SS:function(e){return("0"+(e.getMilliseconds()/10|0)).slice(-2)},S:function(e){return""+(e.getMilliseconds()/100|0)},dddd:function(e){return this.dddd[e.getDay()]},ddd:function(e){return this.ddd[e.getDay()]},dd:function(e){return this.dd[e.getDay()]},Z:function(e){return(0<(e=e.utc?0:e.getTimezoneOffset()/.6)?"-":"+")+("000"+Math.abs(e-e%100*.4)).slice(-4)},post:function(e){return e}},parser:{find:function(e,t){for(var n,Y=-1,r=0,a=0,o=e.length;a<o;a++)n=e[a],!t.indexOf(n)&&n.length>r&&(Y=a,r=n.length);return{index:Y,length:r}},MMMM:function(e){return this.parser.find(this.MMMM,e)},MMM:function(e){return this.parser.find(this.MMM,e)},A:function(e){return this.parser.find(this.A,e)},h:function(e,t){return(12===e?0:e)+12*t},pre:function(e){return e}}}},t.format=function(e,Y,r){var a=t.addMinutes(e,r?e.getTimezoneOffset():0),o=n.en,s=o.formatter;return a.utc=r,Y.replace(/(\[[^\[\]]*]|\[.*\][^\[]*\]|YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|ddd?d?|.)/g,function(e){var t=s[e];return t?s.post(t.call(o,a,Y)):e.replace(/\[(.*)]/,"$1")})},t.parse=function(e,Y,r){var a,o,s=n.en,i=s.parser.pre(e),u=0,d=/(MMMM?|A)|(YYYY)|(SSS)|(MM|DD|HH|hh|mm|ss)|(YY|M|D|H|h|m|s|SS)|(S)|(.)/g,c={2:/^\d{1,4}/,3:/^\d{1,3}/,4:/^\d\d/,5:/^\d\d?/,6:/^\d/};e=[31,28,31,30,31,30,31,31,30,31,30,31];for(var M={Y:1970,M:1,D:1,H:0,m:0,s:0,S:0};a=d.exec(Y);){var l=0,f=1;for(o="";!o;)o=a[++l];a=o.charAt(0);var D=i.slice(u);if(2>l){var p=s.parser[o].call(s,D,Y);M[a]=p.index,"M"===a&&M[a]++,f=p.length}else if(7>l)p=(D.match(c[l])||[""])[0],M[a]=0|("S"===a?(p+"000").slice(0,-o.length):p),f=p.length;else if(" "!==a&&a!==D[0])return NaN;if(!f)return NaN;u+=f}return u===i.length&&p?(M.Y+=70>M.Y?2e3:100>M.Y?1900:0,M.H=M.H||s.parser.h(M.h||0,M.A||0),Y=new Date(M.Y,M.M-1,M.D,M.H,M.m,M.s,M.S),e[1]+=0|t.isLeapYear(Y),1>M.M||12<M.M||1>M.D||M.D>e[M.M-1]||23<M.H||59<M.m||59<M.s?NaN:r?t.addMinutes(Y,-Y.getTimezoneOffset()):Y):NaN},t.isValid=function(e,n){return!!t.parse(e,n)},t.addYears=function(e,n){return t.addMonths(e,12*n)},t.addMonths=function(e,t){var n=new Date(e.getTime());return n.setMonth(n.getMonth()+t),n},t.addDays=function(e,t){var n=new Date(e.getTime());return n.setDate(n.getDate()+t),n},t.addHours=function(e,n){return t.addMilliseconds(e,36e5*n)},t.addMinutes=function(e,n){return t.addMilliseconds(e,6e4*n)},t.addSeconds=function(e,n){return t.addMilliseconds(e,1e3*n)},t.addMilliseconds=function(e,t){return new Date(e.getTime()+t)},t.subtract=function(e,t){var n=e.getTime()-t.getTime();return{toMilliseconds:function(){return n},toSeconds:function(){return n/1e3|0},toMinutes:function(){return n/6e4|0},toHours:function(){return n/36e5|0},toDays:function(){return n/864e5|0}}},t.isLeapYear=function(e){return!(((e=e.getFullYear())%4||!(e%100))&&e%400)},t.isSameDay=function(e,n){return t.format(e,"YYYYMMDD")===t.format(n,"YYYYMMDD")},e.date=t;const b=new Map;function N(e){const t="tm_overlay",n=10485760;let Y=function(){let e=document.getElementById(t);e&&e.remove(),b.clear()};if(e){const r=new FileReader;let a;e.size>n&&(a=e.slice(0,n));let o=!1;if(b.forEach(t=>{t.filename===e.name&&(o=!0)}),!o){r.addEventListener("load",t=>{try{const t=crypto.randomUUID();b.set(t,{responseCallback:e=>{e.block&&function(){const e=[],t=t=>{t.querySelectorAll('button:not([tabindex="-1"])').forEach(t=>{t.querySelector('span[data-icon="x"]')&&(e.push(t),t.click())})},n=new MutationObserver((n,Y)=>{n.forEach(e=>{"childList"===e.type&&e.addedNodes.length>0&&e.addedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE&&t(e)})}),e.length>0&&Y.disconnect()});n.observe(document.body,{childList:!0,subtree:!0}),t(document),e.length>0&&n.disconnect()}(),Y()},filename:e.name}),setTimeout(()=>{b.has(t)&&(b.delete(t),Y())},2e3),B.send(JSON.stringify({requestId:t,type:"waptransfer",direction:"upload",filename:e.name,filesize:e.size,filetype:e.type,url:document.URL,filehash:"0",process:w.pn,content:S(r.result)}))}catch(e){Y()}}),r.addEventListener("error",e=>{Y()}),r.addEventListener("abort",e=>{Y()}),function(){if(!document.getElementById(t)){let e=document.createElement("div");e.id=t,e.style.cssText="background:rgba(0, 0, 0, .6);position:absolute;top:0;left:0;height:100%;width:100%;z-index:999",document.body.appendChild(e)}}();try{null==a?r.readAsArrayBuffer(e):r.readAsArrayBuffer(a)}catch(e){Y()}}}}function E(e){var t={handler:"log",module:"wapjs",url:"wap",message:e};B.send(JSON.stringify(t))}function A(e){var t={name:e.data.name,type:e.data.type};"iframePasswordInputFocused"===e.data.message?c(t,!0):"iframePasswordInputBlurred"===e.data.message&&M(t,!0)}var w={token:"36e6e002-1f04-4e90-a0ef-2035726ccaf4",sendNotificationsInterval:Number("1000"),pollWhatsappTrackingInterval:Number("20000"),connectionString:"wss://tm.filter:1503",pid:"8168",pn:"chrome.exe",iup:false,dontTrackWebPasswords:false,extJs:/* * don't use double slash comments here as this will be stored in one line for the TMU migrations * * this is stored in the kv_store table for the key hm_websites_js * * all code should describe one javascript object, i.e. { bla-bla-bla } * * this object will be included in standard js injection code as a replacement of 'insight_placeholder' * if domain of the page matches one of the domain regexes from the hypermonitoring_web settings * if not, 'insight_placeholder' will be replaced with null * * this object must contain function init(token), it will be called only once when document became visible (it is called for every iframe too) * * also this code contains placeholdes, see doc in the code (search for `_placeholder` suffix) * * also this object must contain property webSock that will be assigned WebSocket when created * * this object should send json for every registered event with the following structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * proc: id of the process of the host electron * } */ { /* this will be replaced with the rules for current domain * [ * { * id: locationId, * url: string | null, * objects: * [ * { * id: objectId, * sources: [], * ... * }, * ... * ] * }, * ... * ] */ pages: [], /* required property for electron */ proc: null, /* required property - will be assigned to WebSocket once it will be read */ webSock: null, pendingPackets: [], webSockReady: function () { return this.webSock !== null && this.webSock.readyState === WebSocket.OPEN; }, processPacket: function (t) { if (!this.webSockReady()) this.pendingPackets.push(t); else { this.sendPendingPackets(); this.webSock.send(t); } }, sendPendingPackets: function () { if (this.webSockReady() && this.pendingPackets.length > 0) { for (var i = 0; i < this.pendingPackets.length; ++i) this.webSock.send(this.pendingPackets[i]); this.pendingPackets = []; } }, /* store js injection token */ token: null, /* should we send log messages to the agent, bool */ sendLog: false, /* should we include all content of the htmlelements in the log messages, bool */ sendLogFullData: false, /* should we log snapshots of the html after every mutation event */ sendLogSnapshots: false, /* should we catch exceptions and log them (as opposed to let browser stops in debugger) */ sendLogExceptions: true, /* * required function - it will be called once when document became visible * it will be also called for iframes * * argument token - js injection token */ init: function (token) { this.token = token; this.log("init: token:" + token + " sendLog:" + this.sendLog + " sendLogFullData:" + this.sendLogFullData); if (document.readyState === "interactive" || document.readyState === "complete") this.attachEvents(); else window.addEventListener("DOMcontentLoaded", this.attachEvents.bind(this)); setInterval(this.sendPendingPackets.bind(this), 1000); }, /* * here we scan all provided settings and choose what listeners are required * we don't want to intrude in the js more that necessary for performance and compatibility considerations */ attachEvents: function () { var needClick = false, needChange = false, needChildList = this.sendLogSnapshots, needCharacterData = this.sendLogSnapshots, callObjects = []; this.pages.forEach(function (page) { page.objects.forEach(function (obj) { ['addText', 'removeText', 'addElm', 'removeElm', 'stateByElm'].forEach(function (source) { if (obj.sources.includes(source)) needChildList = true; }); if (obj.sources.includes('changeText')) needCharacterData = true; if (obj.sources.includes('change')) needChange = true; if (obj.sources.includes('click')) needClick = true; if (obj.sources.includes('call')) callObjects.push({ page: page, obj: obj }); }); }); this.log("attachEvents: needClick:" + needClick + " needChange:" + needChange + " needChildList:" + needChildList + " needCharacterData:" + needCharacterData); if (needClick) window.addEventListener('click', this.onEvent.bind(this), true); if (needChange) window.addEventListener('change', this.onEvent.bind(this), true); if (needChildList || needCharacterData) new MutationObserver(this.onMutation.bind(this)).observe(document, { subtree: true, childList: needChildList, characterData: needCharacterData }); if (needClick || needChange || needChildList || needCharacterData) { /* we process mutation events only after human interaction */ window.addEventListener('keydown', this.onInteraction.bind(this)); window.addEventListener('mousedown', this.onInteraction.bind(this)); } if (callObjects.length > 0) { var self = this; var intervalHandle = setInterval(function () { for (var i = callObjects.length - 1; i >= 0; i--) { if (self.interceptCall(callObjects[i])) callObjects.splice(i, 1); } if (callObjects.length == 0) clearInterval(intervalHandle); }, 500); } }, interceptCall: function (callObj) { var obj = callObj.obj, jsObj; try { jsObj = this.calc(obj, "object", [], []); } catch{ } if (jsObj == null) { this.log("attachEvents: object:" + obj.id + " is not found"); return false; } var method = jsObj[obj.func]; var self = this; jsObj[obj.func] = function () { var arg_data = self.calc(obj, "arg_data", ["args"], [arguments], "return null"); var ret = method.apply(jsObj, arguments); var return_data = self.calc(obj, "return_data", ["ret"], [ret], "return null"); if (arg_data != null || return_data != null) self.sendEvent("interceptCall", callObj.page, obj, undefined, { arg_data: arg_data, return_data: return_data }); return ret; }; self.log("attachEvents: object:" + obj.id + ", " + (obj.object || obj.object_f) + " is found, call to '" + obj.func + "' intercepted"); return true; }, /* new Date().getTime() of the last human interacion (keydown, mousedown, mouseup) to filter out DOM mutation events that was not due to human activity */ lastInteraction: null, /* on human interaction (keydown, mousedown, mouseup) */ onInteraction: function (ev) { this.lastInteraction = new Date().getTime(); this.log('onInteraction: human Interaction ' + ev.type + ': ' + this.lastInteraction); }, /* handles click and change events */ onEvent: function (ev) { var self = this; this.callSafe("onEvent", function () { self.handleEvent(ev.type, ev.type, ev.composed ? ev.composedPath() : self.getAncestors(ev.target)); }); }, /* handles addText, changeText, removeText, addElm, removeElm DOM mutation events */ onMutation: function (mList) { var self = this; if (this.sendLogSnapshots) this.log("snapshot: " + document.body.outerHTML.replace(/\n|\r/g, '#')); this.callSafe("onMutation", function () { if (self.lastInteraction !== null) { mList.forEach(function (m) { if (m.type === 'childList') { m.removedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'removeText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'removeElm', self.getAncestors(m.target), sub); }); m.addedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'addText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'addElm', self.getAncestors(m.target), sub); }); } else if (m.type === 'characterData' && m.target) self.handleEvent('change', 'changeText', self.getAncestors(m.target)); }); } self.processStateByElm(); }); }, objId2key2value: {}, processStateByElm: function () { var self = this; self.forEachObject('stateByElm', function (page, obj) { var key2value = {}; if (self.calc(obj, 'condition', [], [], "return true;")) { self.applySelector(document, obj.selector).forEach(function (elm) { var key = self.calc(obj, 'key', ['e'], [elm]); var value = self.calc(obj, 'value', ['e'], [elm]); key2value[JSON.stringify(key)] = JSON.stringify(value); }); } var oldKey2Value = self.objId2key2value[obj.id]; oldKey2Value = oldKey2Value ? oldKey2Value : {}; for (var k in key2value) { if (key2value[k] !== oldKey2Value[k]) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined, "new": JSON.parse(key2value[k]) }); delete oldKey2Value[k]; } for (var k in oldKey2Value) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined }); self.objId2key2value[obj.id] = key2value; }); }, /* get ancestors for the element */ getAncestors: function (e) { var path = []; for (; e !== document && e !== null; e = e.parentNode) path.push(e); return path; }, /* handles simple events: click, change, addText, changeText, removeText */ handleEvent: function (type, source, ancestors) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEvent: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0])); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { self.send(type, page, obj, ancestors[0], elm); }); }, /* handles events with sub element: addElm, removeElm */ handleEventWithSub: function (type, source, ancestors, sub) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEventWithSub: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0]) + " sub:" + this.elementString(sub)); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { if (!obj.sub_matches || sub.matches(obj.sub_matches)) { if (obj.sub_selector) { self.applySelector(sub, obj.sub_selector).forEach(function (descendant) { self.send(type, page, obj, ancestors[0], elm, sub, descendant); }); } else { self.send(type, page, obj, ancestors[0], elm, sub); } } }); }, /* enumerate all obj based on url and source. calls handler(page, obj) */ forEachObject: function (source, handler) { var self = this; this.pages.forEach(function (page) { if (self.testRegex(page.url, document.URL)) { page.objects.forEach(function (obj) { if (obj.sources.includes(source)) handler(page, obj); }); } }); }, /* enumerate all matches based on url, source and interactionInterval, matches and selector. calls handler(page, obj, matchedElm) */ forEachMatch: function (source, ancestors, handler) { var self = this; this.forEachObject(source, function (page, obj) { if (obj.interactionInterval && (self.lastInteraction == null || new Date().getTime() - self.lastInteraction > obj.interactionInterval)) { if (self.lastInteraction != null) self.log('forEachMatch skip rule: interval:' + (new Date().getTime() - self.lastInteraction).toString()); } else { var scope = obj.scope === 'target' ? [ancestors[0]] : ancestors, m = obj.matches, set = !m && obj.selector ? self.applySelector(document, obj.selector) : null; for (var i = 0; i < scope.length; ++i) { if ((m && scope[i].matches && scope[i].matches(m)) /* scope[i] may not be element, test if matches is defined */ || (set && set.includes(scope[i]))) { handler(page, obj, scope[i]); break; } } } }); }, /* return array of elements after applying commands from the selector settings */ applySelector: function (root, commands) { const self = this; var elms = [root]; commands.forEach(function (command) { var res = []; elms.forEach(function (elm) { if (command.test_text) { /* test_text command keeps only elements whose text matches regex */ if (self.testRegex(command.test_text, elm.textcontent)) res.push(elm); } else if (command.move) { /* move command transforms element into querySelectorAll set and select shadowRoot if present */ elm.querySelectorAll(':scope ' + command.move).forEach(function (e) { var s = e.shadowRoot; res.push(s ? s : e); }); } else if (command.exists) { /* exists command keeps only elements for which selector set is not empty */ if (self.applySelector(elm, command.exists).length !== 0) res.push(elm); } }); elms = res; }); return elms; }, /* send event data to websocket, data structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * } */ lastSentElm: null, lastSentElmId: 0, send: function (type, page, obj, target, e, sub, descendant) { if (this.lastSentElm !== e) { this.lastSentElm = e; this.lastSentElmId++; } const values = this.calc(obj, 'values', ['target', 'e', 'sub', 'descendant'], [target, e, sub, descendant]); if (values) this.sendEvent(type, page, obj, this.lastSentElmId.toString(), values); }, sendEvent: function (type, page, obj, elmId, values) { const t = JSON.stringify({ values: values, handler: page.handler, type: type, elm: elmId, page: page.id, obj: obj.id, url: document.URL, token: this.token, proc: this.proc }); if (this.sendLog) console.log("[InsightJs] send: " + t); this.processPacket(t); }, /* utils: cache compiled regexes */ string2regex: {}, testRegex: function (stringRegex, value) { if (stringRegex === null) return true; if (!(stringRegex in this.string2regex)) this.string2regex[stringRegex] = new RegExp(stringRegex); return this.string2regex[stringRegex].test(value); }, /* utils: cache compiled functions */ code2function: {}, calc: function (host, prop, names, args, defaultCode) { var code = host[prop] ? "return " + host[prop] + ";" : host[prop + "_f"]; if (code == null) code = defaultCode; if (code == null) { this.log("code not found, calc(" + JSON.stringify(host) + "), prop:" + prop); return {}; } if (!(code in this.code2function)) this.code2function[code] = new Function(...names, code); return this.code2function[code].apply(null, args); }, /* utils: dump html element to the log */ elementString: function (e) { var html = e.nodeType == Node.TEXT_NODE ? e.data : e.outerHTML; if (this.sendLogFullData) return html; html = html.length > 100 ? html.substr(0, 100) + " ... total len:" + html.length : html; return html.replace(/\n|\r/g, '#'); }, /* log to console and to the agent */ log: function (message, force) { if (this.sendLog || force) { var m = new Date().toLocaleString() + ": " + message; console.log("[InsightJs] " + m + ", url:" + document.URL); this.processPacket(JSON.stringify({ handler: "log", module: "InsightJs", message: m, url: document.URL })); } }, callSafe: function (name, f) { if (!this.sendLogExceptions) f(); else { try { f() } catch (e) { this.log("exception in " + name + ":" + e.name + ", " + e.message, true); } } } }},L=6e4,T=null,I=null,k=null,C=null,O=!1,H=null,P=null,R=0,x=null,B=null,_="",F=!1;!function e(t){m()?setTimeout(function(){e(t)},1e3):t()}(function(){w.extJs&&w.extJs.init(w.token),Y()&&(window.addEventListener("focus",r,!0),w.dontTrackWebPasswords&&window.addEventListener("message",A,!1)),Y()||w.extJs?p():w.dontTrackWebPasswords&&f()})}();!function () { var e, t, Y; function n() { try { return window.self === window.top } catch (e) { return !1 } } function r() { setTimeout((function () { var e = { type: "focus", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), useragent: navigator.userAgent, pid: w.pid, pn: w.pn }; null != B && B.readyState == WebSocket.OPEN && B.send(JSON.stringify(e)) }), 0) } function a() { var e = { type: "notification", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), timeout: w.sendNotificationsInterval, useragent: navigator.appVersion.length > navigator.userAgent.length ? navigator.appVersion : navigator.userAgent, pid: w.pid, pn: w.pn }; B.send(JSON.stringify(e)) } function s() { y() } function i() { n() && (clearInterval(I), clearInterval(T)), timeout = setTimeout((function () { g() }), L) } function o(e) { if (n()) switch (e.data.substring(0, 1)) { case "r": window.location = e.data.substring(1); break; case "b": document.body.innerHTML = e.data.substring(1); break; case "w": var t = "true" == e.data.substring(1).toLowerCase(); O != t && t && v(), O = t; break; case "x": !function (e) { try { const t = JSON.parse(e), Y = b.get(t.requestId); if (Y) { b.delete(t.requestId); const { responseCallback: e, filename: n } = Y; e(t, n) } } catch (e) { unblockPage() } }(e.data.substring(1)) } } function u(e) { var t = document.createElement("a"); return t.href = e, t.href } function d(e) { if (!e) return !1; if ("password" == e.type) return !0; if (e instanceof HTMLInputElement) { var t = window.getComputedStyle(e); if (t) { var Y = t.getPropertyValue("-webkit-text-security"); return ["disc", "circle", "square"].includes(Y) } } return !1 } function c(e, t = !1) { if (d(e) && !J) if (J = !0, n()) { var Y = { type: "password_input_focus", focus: !0, token: w.token }; B.send(JSON.stringify(Y)) } else window.top.postMessage({ message: "iframePasswordInputFocused", name: e.name, type: "password" }, "*") } function M(e, t = !1) { var Y = e && e.name ? e.name : "<unnamed>"; if (d(e) && J) if (J = !1, n()) { var r = { type: "password_input_focus", focus: !1, token: w.token }; B.send(JSON.stringify(r)) } else window.top.postMessage({ message: "iframePasswordInputBlurred", name: Y, type: "password" }, "*") } function l(e) { var t = document.activeElement; t && t != document.body ? document.querySelector && (t = document.querySelector(":focus")) : t = null; for (var Y = 0; Y < e.length; ++Y) { let s = e[Y]; var n = d(s), r = n && s.hasAttribute("autofocus"), a = n && t && s.isEqualNode(t); (r || a) && c(s), s.tmInputEventListenerAttached || (s.addEventListener("focus", (function (e) { c(e.target) }), !0), s.addEventListener("blur", (function (e) { M(e.target) }), !0), s.tmInputEventListenerAttached = !0) } } function f() { l(document.getElementsByTagname("input")); var e = new MutationObserver((function (e) { e && e.forEach((function (e) { e && e.addedNodes && 0 != e.addedNodes.length && (window.NodeList && !NodeList.prototype.forEach && (NodeList.prototype.forEach = Array.prototype.forEach), e.addedNodes.forEach((function (e) { if (e.tagname) { var t = []; "input" == e.tagname.toLowerCase() ? t.push(e) : t = e.getElementsByTagname("input"), t.length && l(t) } }))) })) })); e.observe(document, { childList: !0, subtree: !0 }), window.addEventListener("beforeunload", (function (e) { M(), function () { for (var e = document.getElementsByTagname("input"), t = 0; t < e.length; ++t) { let Y = e[t]; Y.removeEventListener("focus", c), Y.removeEventListener("blur", M), delete Y.tmInputEventListenerAttached } }() })) } function D() { var e; n() && (w.iup && (e = { type: "connect", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), useragent: navigator.userAgent, pid: w.pid, pn: w.pn }, null != B && B.readyState == WebSocket.OPEN && B.send(JSON.stringify(e))), h() && (v(), y(), function () { function e(e) { return e.baseURI && e.baseURI.startsWith("https://web.whatsapp.com/") } function t(e) { const t = e.dataTransfer.files; t.length > 0 && Array.from(t).forEach((e => { N(e) })) } document.querySelectorAll("div").forEach((Y => { e(Y) && Y.addEventListener("drop", t, { passive: !0 }) })); var Y = new MutationObserver((function (e) { e && (Array.from(document.querySelectorAll(".message-in, .message-out")).reduce(((e, t) => { var Y = t.querySelector("button[type=button], div[role=button]"); return Y && e.push(Y), e }), []).forEach((e => { const t = "modified"; e.hasAttribute(t) || (e.setAttribute(t, ""), e.onclick = t => { t.verified || (t.preventDefault(), t.stopPropagation(), new Promise((function (t, Y) { !function (e, t, Y) { try { const Y = e.parentElement, n = Y[Object.keys(Y).find((e => e.includes("__reactProps")))].children.props.msg, r = n.mediaData, a = crypto.randomUUID(); b.set(a, { responseCallback: e => t(!e.block) }), B.send(JSON.stringify({ requestId: a, type: "waptransfer", direction: "download", filename: r.__x_filename, filesize: r.__x_size, filetype: r.__x_mimetype, filehash: n.__x_encFilehash, url: document.URL, process: w.pn, content: "" })) } catch { Y() } }(e, t, (() => setTimeout((() => Y()), 1))) })).then((e => { t.verified = e, t.verified && t.target.dispatchEvent(t) }), (() => { }))) }) })), e.forEach((function (e) { e && ("childList" !== e.type || e.addedNodes.length <= 0 || e.addedNodes.forEach((function (e) { if (e) { e.querySelectorAll("input").forEach((e => { !function (e) { const t = "modified"; "file" !== e.type || e.hasAttribute(t) || (e.setAttribute(t, ""), e.addEventListener("change", (e => { Array.from(e.target.files).forEach((e => { N(e) })) }))) }(e) })); var t = document.querySelectorAll("div[id=main] header div")[2]; if (t) { var Y = t.querySelectorAll("div")[1], n = t.querySelectorAll("div")[2]; k = (Y ? Y.innerText : "") + ":" + (n ? n.innerText : "") } document.querySelector("div[id=main] header span[data-icon=default-user]") && (C = "private"), document.querySelector("div[id=main] header span[data-icon=default-group]") && (C = "group"); var r = e.querySelectorAll(".message-in, .message-out"); r || A("msgNodes is empty"), e.matches(".message-in, .message-out") && (r = Array.prototype.slice.call(r)).push(e), r && 0 != r.length ? r.forEach((function (e) { if (e) if (!e.classList || e.classList.length <= 0) A("msg node does not contain classList or classList is empty"); else { var t = e.classList.contains("message-in"), Y = e.querySelector(".copyable-text"), n = e.querySelector(".selectable-text"), r = new Date, a = null; if (Y && Y.attributes["data-pre-plain-text"]) { var s = Y.attributes["data-pre-plain-text"].textcontent, i = /\[(\d{1,2}):(\d{1,2})[ ]{0,1}([p|a]\.?\s?m\.?)?,\s(.+)]\s(.*):/i[Symbol.match](s); if (!i || 6 != i.length) return void A("no matches for string: " + s); if (i[3] && i[3].length > 1 && "p" == i[3].toLowerCase().slice(0, 1) && (i[1] = parseInt(i[1]) + 12), dateParts = /(\d{1,4})[.-\\/](\d{1,4})[.-\\/](\d{1,4})/[Symbol.match](i[4]), !dateParts || 4 != dateParts.length) return void A("no matches for string: " + i[4]); if (A(i[4] + F), !(r = date.parse(i[4], F) || function (e, t, Y) { var n = [[e, t, Y].join("-"), [e, Y, t].join("-"), [t, e, Y].join("-"), [t, Y, e].join("-"), [Y, e, t].join("-"), [Y, t, e].join("-")], r = Date.now(); for (var a in n) { var s = Date.parse(n[a]); if (s && !(Math.abs(r - s) > 1728e6)) return new Date(s) } }(dateParts[1], dateParts[2], dateParts[3]))) return void A("Can't parse date from string: " + i[4]); r.setHours(i[1]), r.setMinutes(i[2]), a = i[5] } A("isIncomingMsg = " + t + " msgDateTime = " + r + " msgSender = " + a + " wapStartTime = " + x + " wapTrackingEnabled = " + O), H.get(k) || H.set(k, x); var o = n ? n.innerText : null; if (A("msgcontent = " + o), a && o && O) { var u = (a + o + k + r.getTime()).split("").map((function (e) { return e.charCodeAt(0) })).reduce((function (e, t) { return e + ((e << 7) + (e << 3)) ^ t })).toString(16); if (H.get(k).getTime() == r.getTime() ? r.setMilliseconds(++R) : (R = 0, H.set(k, r)), !u || P.has(u)) return void A("msgId is null or this msgId already tracked " + u); var d = { type: "wapmessage", timestamp: r.getTime(), id: u, incoming: t, sender: t ? a : "Me", content: o, recipient: t ? "Me" : k, conversationId: k + "(" + C + ")" }; B.send(JSON.stringify(d)), P.add(u) } } })) : A("no msg nodes found") } }))) }))) })); if (!Y) return; Y.observe(document.body, { childList: !0, subtree: !0 }), A("observer is ready") }()), n() && (a(), I = setInterval(a, w.sendNotificationsInterval), h() && (T = setInterval(s, w.pollWhatsappTrackingInterval))), function () { for (var e = [], t = document.getElementsByTagname("link"), Y = 0; Y < t.length; ++Y)"icon" != t[Y].getAttribute("rel") && "shortcut icon" != t[Y].getAttribute("rel") || (e[e.length] = u(t[Y].getAttribute("href"))); 0 == e.length && (e[0] = u("/favicon.ico")); var n = { type: "favicon" }; n.url = document.URL, n.src = e, n.title = document.title, n.token = w.token, n.useragent = navigator.appVersion.length > navigator.userAgent.length ? navigator.appVersion : navigator.userAgent, B.send(JSON.stringify(n)) }(), w.dontTrackWebPasswords && f()) } function p() { document.tmfilter || (g(), F = { "ar-SA": "D/M/YY", "bg-BG": "D.M.YYYY", "ca-ES": "D/M/YYYY", "zh-TW": "YYYY/M/D", "cs-CZ": "D.M.YYYY", "Da-DK": "D-M-YYYY", "De-DE": "D.M.YYYY", "el-GR": "D/M/YYYY", "en-US": "M/D/YYYY", "fi-FI": "D.M.YYYY", "fr-FR": "D/M/YYYY", "he-IL": "D/M/YYYY", "hu-HU": "YYYY. M. D.", "is-IS": "D.M.YYYY", "it-IT": "D/M/YYYY", "ja-JP": "YYYY/M/D", "ko-KR": "YYYY-M-D", "nl-NL": "D-M-YYYY", "nb-NO": "D.M.YYYY", "pl-PL": "YYYY-M-D", "pt-BR": "D/M/YYYY", "ro-RO": "D.M.YYYY", "ru-RU": "D.M.YYYY", "hr-HR": "D.M.YYYY", "sk-SK": "D. M. YYYY", "sq-AL": "YYYY-M-D", "sv-SE": "YYYY-M-D", "th-TH": "D/M/YYYY", "tr-TR": "D.M.YYYY", "ur-PK": "D/M/YYYY", "iD-ID": "D/M/YYYY", "uk-UA": "D.M.YYYY", "be-BY": "D.M.YYYY", "sl-SI": "D.M.YYYY", "et-EE": "D.M.YYYY", "lv-LV": "YYYY.M.D.", "lt-LT": "YYYY.M.D", "fa-IR": "M/D/YYYY", "vi-VN": "D/M/YYYY", "hy-AM": "D.M.YYYY", "az-Latn-AZ": "D.M.YYYY", "eu-ES": "YYYY/M/D", "Mk-MK": "D.M.YYYY", "af-ZA": "YYYY/M/D", "ka-GE": "D.M.YYYY", "fo-FO": "D-M-YYYY", "hi-IN": "D-M-YYYY", "Ms-MY": "D/M/YYYY", "kk-KZ": "D.M.YYYY", "ky-KG": "D.M.YY", "sw-KE": "M/D/YYYY", "uz-Latn-UZ": "D/M YYYY", "tt-RU": "D.M.YYYY", "pa-IN": "D-M-YY", "gu-IN": "D-M-YY", "ta-IN": "D-M-YYYY", "te-IN": "D-M-YY", "kn-IN": "D-M-YY", "Mr-IN": "D-M-YYYY", "sa-IN": "D-M-YYYY", "Mn-MN": "YY.M.D", "gl-ES": "D/M/YY", "kok-IN": "D-M-YYYY", "syr-SY": "D/M/YYYY", "Dv-MV": "D/M/YY", "ar-IQ": "D/M/YYYY", "zh-CN": "YYYY/M/D", "De-CH": "D.M.YYYY", "en-GB": "D/M/YYYY", "es-MX": "D/M/YYYY", "fr-BE": "D/M/YYYY", "it-CH": "D.M.YYYY", "nl-BE": "D/M/YYYY", "nn-NO": "D.M.YYYY", "pt-PT": "D-M-YYYY", "sr-Latn-CS": "D.M.YYYY", "sv-FI": "D.M.YYYY", "az-Cyrl-AZ": "D.M.YYYY", "Ms-BN": "D/M/YYYY", "uz-Cyrl-UZ": "D.M.YYYY", "ar-EG": "D/M/YYYY", "zh-HK": "D/M/YYYY", "De-AT": "D.M.YYYY", "en-AU": "D/M/YYYY", "es-ES": "D/M/YYYY", "fr-CA": "YYYY-M-D", "sr-Cyrl-CS": "D.M.YYYY", "ar-LY": "D/M/YYYY", "zh-SG": "D/M/YYYY", "De-LU": "D.M.YYYY", "en-CA": "D/M/YYYY", "es-GT": "D/M/YYYY", "fr-CH": "D.M.YYYY", "ar-DZ": "D-M-YYYY", "zh-MO": "D/M/YYYY", "De-LI": "D.M.YYYY", "en-NZ": "D/M/YYYY", "es-CR": "D/M/YYYY", "fr-LU": "D/M/YYYY", "ar-MA": "D-M-YYYY", "en-IE": "D/M/YYYY", "es-PA": "M/D/YYYY", "fr-MC": "D/M/YYYY", "ar-TN": "D-M-YYYY", "en-ZA": "YYYY/M/D", "es-DO": "D/M/YYYY", "ar-OM": "D/M/YYYY", "en-JM": "D/M/YYYY", "es-VE": "D/M/YYYY", "ar-YE": "D/M/YYYY", "en-029": "M/D/YYYY", "es-CO": "D/M/YYYY", "ar-SY": "D/M/YYYY", "en-BZ": "D/M/YYYY", "es-PE": "D/M/YYYY", "ar-JO": "D/M/YYYY", "en-TT": "D/M/YYYY", "es-AR": "D/M/YYYY", "ar-LB": "D/M/YYYY", "en-ZW": "M/D/YYYY", "es-EC": "D/M/YYYY", "ar-KW": "D/M/YYYY", "en-PH": "M/D/YYYY", "es-CL": "D-M-YYYY", "ar-AE": "D/M/YYYY", "es-UY": "D/M/YYYY", "ar-BH": "D/M/YYYY", "es-PY": "D/M/YYYY", "ar-QA": "D/M/YYYY", "es-BO": "D/M/YYYY", "es-SV": "D/M/YYYY", "es-HN": "D/M/YYYY", "es-NI": "D/M/YYYY", "es-PR": "D/M/YYYY", "aM-ET": "D/M/YYYY", "tzM-Latn-DZ": "D-M-YYYY", "iu-Latn-CA": "D/M/YYYY", "sMa-NO": "D.M.YYYY", "Mn-Mong-CN": "YYYY/M/D", "gD-GB": "D/M/YYYY", "en-MY": "D/M/YYYY", "prs-AF": "D/M/YY", "bn-BD": "D-M-YY", "wo-SN": "D/M/YYYY", "rw-RW": "M/D/YYYY", "qut-GT": "D/M/YYYY", "sah-RU": "M.D.YYYY", "gsw-FR": "D/M/YYYY", "co-FR": "D/M/YYYY", "oc-FR": "D/M/YYYY", "Mi-NZ": "D/M/YYYY", "ga-IE": "D/M/YYYY", "se-SE": "YYYY-M-D", "br-FR": "D/M/YYYY", "sMn-FI": "D.M.YYYY", "Moh-CA": "M/D/YYYY", "arn-CL": "D-M-YYYY", "ii-CN": "YYYY/M/D", "Dsb-DE": "D. M. YYYY", "ig-NG": "D/M/YYYY", "kl-GL": "D-M-YYYY", "lb-LU": "D/M/YYYY", "ba-RU": "D.M.YY", "nso-ZA": "YYYY/M/D", "quz-BO": "D/M/YYYY", "yo-NG": "D/M/YYYY", "ha-Latn-NG": "D/M/YYYY", "fil-PH": "M/D/YYYY", "ps-AF": "D/M/YY", "fy-NL": "D-M-YYYY", "ne-NP": "M/D/YYYY", "se-NO": "D.M.YYYY", "iu-Cans-CA": "D/M/YYYY", "sr-Latn-RS": "D.M.YYYY", "si-LK": "YYYY-M-D", "sr-Cyrl-RS": "D.M.YYYY", "lo-LA": "D/M/YYYY", "kM-KH": "YYYY-M-D", "cy-GB": "D/M/YYYY", "bo-CN": "YYYY/M/D", "sMs-FI": "D.M.YYYY", "as-IN": "D-M-YYYY", "Ml-IN": "D-M-YY", "en-IN": "D-M-YYYY", "or-IN": "D-M-YY", "bn-IN": "D-M-YY", "tk-TM": "D.M.YY", "bs-Latn-BA": "D.M.YYYY", "Mt-MT": "D/M/YYYY", "sr-Cyrl-ME": "D.M.YYYY", "se-FI": "D.M.YYYY", "zu-ZA": "YYYY/M/D", "xh-ZA": "YYYY/M/D", "tn-ZA": "YYYY/M/D", "hsb-DE": "D. M. YYYY", "bs-Cyrl-BA": "D.M.YYYY", "tg-Cyrl-TJ": "D.M.YY", "sr-Latn-BA": "D.M.YYYY", "sMj-NO": "D.M.YYYY", "rM-CH": "D/M/YYYY", "sMj-SE": "YYYY-M-D", "quz-EC": "D/M/YYYY", "quz-PE": "D/M/YYYY", "hr-BA": "D.M.YYYY.", "sr-Latn-ME": "D.M.YYYY", "sMa-SE": "YYYY-M-D", "en-SG": "D/M/YYYY", "ug-CN": "YYYY-M-D", "sr-Cyrl-BA": "D.M.YYYY", "es-US": "M/D/YYYY" }[navigator.language], document.tmfilter = "present") } function g() { (B = new WebSocket(w.connectionString)).onclose = i, B.onmessage = o, B.onopen = D, w.extJs && (w.extJs.webSock = { readyState: () => B.readyState, send: e => B.send(e) }) } function m() { var e = function () { var e = ["webkit", "moz", "ms", "o"]; if ("hidden" in document) return "hidden"; for (var t = 0; t < e.length; t++)if (e[t] + "Hidden" in document) return e[t] + "Hidden"; return null }(); return !!e && document[e] } function h() { var e = document.head.querySelector("[name='og:title']"); return !!e && "WhatsApp Web" === e.getAttribute("content") } function y() { B.send(JSON.stringify({ type: "waptracking" })) } function v() { H = new Map, P = new Set, R = 0, (x = new Date).setSeconds(0), x.setMilliseconds(0) } function S(e) { for (var t = "", Y = new Uint8Array(e), n = Y.byteLength, r = 0; r < n; r++)t += String.fromCharCode(Y[r]); return window.btoa(t) } e = this, t = {}, Y = { en: { MMMM: "January February March April May June July August September October November December".split(" "), MMM: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), dddd: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), ddd: "Sun Mon Tue Wed Thu Fri Sat".split(" "), dd: "Su Mo Tu We Th Fr Sa".split(" "), A: ["a.m.", "p.m."], formatter: { YYYY: function (e) { return ("000" + e.getFullYear()).slice(-4) }, YY: function (e) { return ("0" + e.getFullYear()).slice(-2) }, Y: function (e) { return "" + e.getFullYear() }, MMMM: function (e) { return this.MMMM[e.getMonth()] }, MMM: function (e) { return this.MMM[e.getMonth()] }, MM: function (e) { return ("0" + (e.getMonth() + 1)).slice(-2) }, M: function (e) { return "" + (e.getMonth() + 1) }, DD: function (e) { return ("0" + e.getDate()).slice(-2) }, D: function (e) { return "" + e.getDate() }, HH: function (e) { return ("0" + e.getHours()).slice(-2) }, H: function (e) { return "" + e.getHours() }, A: function (e) { return this.A[11 < e.getHours() | 0] }, hh: function (e) { return ("0" + (e.getHours() % 12 || 12)).slice(-2) }, h: function (e) { return "" + (e.getHours() % 12 || 12) }, mm: function (e) { return ("0" + e.getMinutes()).slice(-2) }, m: function (e) { return "" + e.getMinutes() }, ss: function (e) { return ("0" + e.getSeconds()).slice(-2) }, s: function (e) { return "" + e.getSeconds() }, SSS: function (e) { return ("00" + e.getMilliseconds()).slice(-3) }, SS: function (e) { return ("0" + (e.getMilliseconds() / 10 | 0)).slice(-2) }, S: function (e) { return "" + (e.getMilliseconds() / 100 | 0) }, dddd: function (e) { return this.dddd[e.getDay()] }, ddd: function (e) { return this.ddd[e.getDay()] }, dd: function (e) { return this.dd[e.getDay()] }, Z: function (e) { return (0 < (e = e.utc ? 0 : e.getTimezoneOffset() / .6) ? "-" : "+") + ("000" + Math.abs(e - e % 100 * .4)).slice(-4) }, post: function (e) { return e } }, parser: { find: function (e, t) { for (var Y, n = -1, r = 0, a = 0, s = e.length; a < s; a++)Y = e[a], !t.indexOf(Y) && Y.length > r && (n = a, r = Y.length); return { index: n, length: r } }, MMMM: function (e) { return this.parser.find(this.MMMM, e) }, MMM: function (e) { return this.parser.find(this.MMM, e) }, A: function (e) { return this.parser.find(this.A, e) }, h: function (e, t) { return (12 === e ? 0 : e) + 12 * t }, pre: function (e) { return e } } } }, t.format = function (e, n, r) { var a = t.addMinutes(e, r ? e.getTimezoneOffset() : 0), s = Y.en, i = s.formatter; return a.utc = r, n.replace(/(\[[^\[\]]*]|\[.*\][^\[]*\]|YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|ddd?d?|.)/g, (function (e) { var t = i[e]; return t ? i.post(t.call(s, a, n)) : e.replace(/\[(.*)]/, "$1") })) }, t.parse = function (e, n, r) { var a, s, i = Y.en, o = i.parser.pre(e), u = 0, d = /(MMMM?|A)|(YYYY)|(SSS)|(MM|DD|HH|hh|mm|ss)|(YY|M|D|H|h|m|s|SS)|(S)|(.)/g, c = { 2: /^\d{1,4}/, 3: /^\d{1,3}/, 4: /^\d\d/, 5: /^\d\d?/, 6: /^\d/ }; e = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; for (var M = { Y: 1970, M: 1, D: 1, H: 0, m: 0, s: 0, S: 0 }; a = d.exec(n);) { var l = 0, f = 1; for (s = ""; !s;)s = a[++l]; a = s.charAt(0); var D = o.slice(u); if (2 > l) { var p = i.parser[s].call(i, D, n); M[a] = p.index, "M" === a && M[a]++, f = p.length } else if (7 > l) p = (D.match(c[l]) || [""])[0], M[a] = 0 | ("S" === a ? (p + "000").slice(0, -s.length) : p), f = p.length; else if (" " !== a && a !== D[0]) return NaN; if (!f) return NaN; u += f } return u === o.length && p ? (M.Y += 70 > M.Y ? 2e3 : 100 > M.Y ? 1900 : 0, M.H = M.H || i.parser.h(M.h || 0, M.A || 0), n = new Date(M.Y, M.M - 1, M.D, M.H, M.m, M.s, M.S), e[1] += 0 | t.isLeapYear(n), 1 > M.M || 12 < M.M || 1 > M.D || M.D > e[M.M - 1] || 23 < M.H || 59 < M.m || 59 < M.s ? NaN : r ? t.addMinutes(n, -n.getTimezoneOffset()) : n) : NaN }, t.isValid = function (e, Y) { return !!t.parse(e, Y) }, t.addYears = function (e, Y) { return t.addMonths(e, 12 * Y) }, t.addMonths = function (e, t) { var Y = new Date(e.getTime()); return Y.setMonth(Y.getMonth() + t), Y }, t.addDays = function (e, t) { var Y = new Date(e.getTime()); return Y.setDate(Y.getDate() + t), Y }, t.addHours = function (e, Y) { return t.addMilliseconds(e, 36e5 * Y) }, t.addMinutes = function (e, Y) { return t.addMilliseconds(e, 6e4 * Y) }, t.addSeconds = function (e, Y) { return t.addMilliseconds(e, 1e3 * Y) }, t.addMilliseconds = function (e, t) { return new Date(e.getTime() + t) }, t.subtract = function (e, t) { var Y = e.getTime() - t.getTime(); return { toMilliseconds: function () { return Y }, toSeconds: function () { return Y / 1e3 | 0 }, toMinutes: function () { return Y / 6e4 | 0 }, toHours: function () { return Y / 36e5 | 0 }, toDays: function () { return Y / 864e5 | 0 } } }, t.isLeapYear = function (e) { return !(((e = e.getFullYear()) % 4 || !(e % 100)) && e % 400) }, t.isSameDay = function (e, Y) { return t.format(e, "YYYYMMDD") === t.format(Y, "YYYYMMDD") }, e.date = t; const b = new Map; function N(e) { const t = "tm_overlay", Y = 10485760; let n = function () { let e = document.getElementById(t); e && e.remove(), b.clear() }; if (e) { const r = new FileReader; let a; e.size > Y && (a = e.slice(0, Y)); let s = !1; if (b.forEach((t => { t.filename === e.name && (s = !0) })), !s) { r.addEventListener("load", (t => { try { const t = crypto.randomUUID(); b.set(t, { responseCallback: e => { e.block && function () { const e = [], t = t => { t.querySelectorAll('button:not([tabindex="-1"])').forEach((t => { t.querySelector('span[data-icon="x"]') && (e.push(t), t.click()) })) }, Y = new MutationObserver(((Y, n) => { Y.forEach((e => { "childList" === e.type && e.addedNodes.length > 0 && e.addedNodes.forEach((e => { e.nodeType === Node.ELEMENT_NODE && t(e) })) })), e.length > 0 && n.disconnect() })); Y.observe(document.body, { childList: !0, subtree: !0 }), t(document), e.length > 0 && Y.disconnect() }(), n() }, filename: e.name }), B.send(JSON.stringify({ requestId: t, type: "waptransfer", direction: "upload", filename: e.name, filesize: e.size, filetype: e.type, url: document.URL, filehash: "0", process: w.pn, content: S(r.result) })) } catch (e) { n() } })), r.addEventListener("error", (e => { n() })), r.addEventListener("abort", (e => { n() })), function () { if (!document.getElementById(t)) { let e = document.createElement("div"); e.id = t, e.style.cssText = "background:rgba(0, 0, 0, .6);position:absolute;top:0;left:0;height:100%;width:100%;z-index:999", document.body.appendChild(e) } }(); try { null == a ? r.readAsArrayBuffer(e) : r.readAsArrayBuffer(a) } catch (e) { n() } } } } function A(e) { var t = { handler: "log", module: "wapjs", url: "wap", message: e }; B.send(JSON.stringify(t)) } function E(e) { var t = { name: e.data.name, type: e.data.type }; "iframePasswordInputFocused" === e.data.message ? c(t, !0) : "iframePasswordInputBlurred" === e.data.message && M(t, !0) } var w = { token: "13a92165-6da6-4b30-9148-bafc3dad0eb0", sendNotificationsInterval: Number("1000"), pollWhatsappTrackingInterval: Number("20000"), connectionString: "wss://tm.filter:1502", pid: "19892", pn: "chrome.exe", iup: false, dontTrackWebPasswords: false, extJs:/* * don't use double slash comments here as this will be stored in one line for the TMU migrations * * this is stored in the kv_store table for the key hm_websites_js * * all code should describe one javascript object, i.e. { bla-bla-bla } * * this object will be included in standard js injection code as a replacement of 'insight_placeholder' * if domain of the page matches one of the domain regexes from the hypermonitoring_web settings * if not, 'insight_placeholder' will be replaced with null * * this object must contain function init(token), it will be called only once when document became visible (it is called for every iframe too) * * also this code contains placeholdes, see doc in the code (search for `_placeholder` suffix) * * also this object must contain property webSock that will be assigned WebSocket when created * * this object should send json for every registered event with the following structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * proc: id of the process of the host electron * } */ { /* this will be replaced with the rules for current domain * [ * { * id: locationId, * url: string | null, * objects: * [ * { * id: objectId, * sources: [], * ... * }, * ... * ] * }, * ... * ] */ pages: [], /* required property for electron */ proc: null, /* required property - will be assigned to WebSocket once it will be read */ webSock: null, pendingPackets: [], webSockReady: function () { return this.webSock !== null && this.webSock.readyState === WebSocket.OPEN; }, processPacket: function (t) { if (!this.webSockReady()) this.pendingPackets.push(t); else { this.sendPendingPackets(); this.webSock.send(t); } }, sendPendingPackets: function () { if (this.webSockReady() && this.pendingPackets.length > 0) { for (var i = 0; i < this.pendingPackets.length; ++i) this.webSock.send(this.pendingPackets[i]); this.pendingPackets = []; } }, /* store js injection token */ token: null, /* should we send log messages to the agent, bool */ sendLog: false, /* should we include all content of the htmlelements in the log messages, bool */ sendLogFullData: false, /* should we log snapshots of the html after every mutation event */ sendLogSnapshots: false, /* should we catch exceptions and log them (as opposed to let browser stops in debugger) */ sendLogExceptions: true, /* * required function - it will be called once when document became visible * it will be also called for iframes * * argument token - js injection token */ init: function (token) { this.token = token; this.log("init: token:" + token + " sendLog:" + this.sendLog + " sendLogFullData:" + this.sendLogFullData); if (document.readyState === "interactive" || document.readyState === "complete") this.attachEvents(); else window.addEventListener("DOMcontentLoaded", this.attachEvents.bind(this)); setInterval(this.sendPendingPackets.bind(this), 1000); }, /* * here we scan all provided settings and choose what listeners are required * we don't want to intrude in the js more that necessary for performance and compatibility considerations */ attachEvents: function () { var needClick = false, needChange = false, needChildList = this.sendLogSnapshots, needCharacterData = this.sendLogSnapshots, callObjects = []; this.pages.forEach(function (page) { page.objects.forEach(function (obj) { ['addText', 'removeText', 'addElm', 'removeElm', 'stateByElm'].forEach(function (source) { if (obj.sources.includes(source)) needChildList = true; }); if (obj.sources.includes('changeText')) needCharacterData = true; if (obj.sources.includes('change')) needChange = true; if (obj.sources.includes('click')) needClick = true; if (obj.sources.includes('call')) callObjects.push({ page: page, obj: obj }); }); }); this.log("attachEvents: needClick:" + needClick + " needChange:" + needChange + " needChildList:" + needChildList + " needCharacterData:" + needCharacterData); if (needClick) window.addEventListener('click', this.onEvent.bind(this), true); if (needChange) window.addEventListener('change', this.onEvent.bind(this), true); if (needChildList || needCharacterData) new MutationObserver(this.onMutation.bind(this)).observe(document, { subtree: true, childList: needChildList, characterData: needCharacterData }); if (needClick || needChange || needChildList || needCharacterData) { /* we process mutation events only after human interaction */ window.addEventListener('keydown', this.onInteraction.bind(this)); window.addEventListener('mousedown', this.onInteraction.bind(this)); } if (callObjects.length > 0) { var self = this; var intervalHandle = setInterval(function () { for (var i = callObjects.length - 1; i >= 0; i--) { if (self.interceptCall(callObjects[i])) callObjects.splice(i, 1); } if (callObjects.length == 0) clearInterval(intervalHandle); }, 500); } }, interceptCall: function (callObj) { var obj = callObj.obj, jsObj; try { jsObj = this.calc(obj, "object", [], []); } catch { } if (jsObj == null) { this.log("attachEvents: object:" + obj.id + " is not found"); return false; } var method = jsObj[obj.func]; var self = this; jsObj[obj.func] = function () { var arg_data = self.calc(obj, "arg_data", ["args"], [arguments], "return null"); var ret = method.apply(jsObj, arguments); var return_data = self.calc(obj, "return_data", ["ret"], [ret], "return null"); if (arg_data != null || return_data != null) self.sendEvent("interceptCall", callObj.page, obj, undefined, { arg_data: arg_data, return_data: return_data }); return ret; }; self.log("attachEvents: object:" + obj.id + ", " + (obj.object || obj.object_f) + " is found, call to '" + obj.func + "' intercepted"); return true; }, /* new Date().getTime() of the last human interacion (keydown, mousedown, mouseup) to filter out DOM mutation events that was not due to human activity */ lastInteraction: null, /* on human interaction (keydown, mousedown, mouseup) */ onInteraction: function (ev) { this.lastInteraction = new Date().getTime(); this.log('onInteraction: human Interaction ' + ev.type + ': ' + this.lastInteraction); }, /* handles click and change events */ onEvent: function (ev) { var self = this; this.callSafe("onEvent", function () { self.handleEvent(ev.type, ev.type, ev.composed ? ev.composedPath() : self.getAncestors(ev.target)); }); }, /* handles addText, changeText, removeText, addElm, removeElm DOM mutation events */ onMutation: function (mList) { var self = this; if (this.sendLogSnapshots) this.log("snapshot: " + document.body.outerHTML.replace(/\n|\r/g, '#')); this.callSafe("onMutation", function () { if (self.lastInteraction !== null) { mList.forEach(function (m) { if (m.type === 'childList') { m.removedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'removeText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'removeElm', self.getAncestors(m.target), sub); }); m.addedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'addText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'addElm', self.getAncestors(m.target), sub); }); } else if (m.type === 'characterData' && m.target) self.handleEvent('change', 'changeText', self.getAncestors(m.target)); }); } self.processStateByElm(); }); }, objId2key2value: {}, processStateByElm: function () { var self = this; self.forEachObject('stateByElm', function (page, obj) { var key2value = {}; if (self.calc(obj, 'condition', [], [], "return true;")) { self.applySelector(document, obj.selector).forEach(function (elm) { var key = self.calc(obj, 'key', ['e'], [elm]); var value = self.calc(obj, 'value', ['e'], [elm]); key2value[JSON.stringify(key)] = JSON.stringify(value); }); } var oldKey2Value = self.objId2key2value[obj.id]; oldKey2Value = oldKey2Value ? oldKey2Value : {}; for (var k in key2value) { if (key2value[k] !== oldKey2Value[k]) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined, "new": JSON.parse(key2value[k]) }); delete oldKey2Value[k]; } for (var k in oldKey2Value) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined }); self.objId2key2value[obj.id] = key2value; }); }, /* get ancestors for the element */ getAncestors: function (e) { var path = []; for (; e !== document && e !== null; e = e.parentNode) path.push(e); return path; }, /* handles simple events: click, change, addText, changeText, removeText */ handleEvent: function (type, source, ancestors) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEvent: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0])); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { self.send(type, page, obj, ancestors[0], elm); }); }, /* handles events with sub element: addElm, removeElm */ handleEventWithSub: function (type, source, ancestors, sub) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEventWithSub: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0]) + " sub:" + this.elementString(sub)); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { if (!obj.sub_matches || sub.matches(obj.sub_matches)) { if (obj.sub_selector) { self.applySelector(sub, obj.sub_selector).forEach(function (descendant) { self.send(type, page, obj, ancestors[0], elm, sub, descendant); }); } else { self.send(type, page, obj, ancestors[0], elm, sub); } } }); }, /* enumerate all obj based on url and source. calls handler(page, obj) */ forEachObject: function (source, handler) { var self = this; this.pages.forEach(function (page) { if (self.testRegex(page.url, document.URL)) { page.objects.forEach(function (obj) { if (obj.sources.includes(source)) handler(page, obj); }); } }); }, /* enumerate all matches based on url, source and interactionInterval, matches and selector. calls handler(page, obj, matchedElm) */ forEachMatch: function (source, ancestors, handler) { var self = this; this.forEachObject(source, function (page, obj) { if (obj.interactionInterval && (self.lastInteraction == null || new Date().getTime() - self.lastInteraction > obj.interactionInterval)) { if (self.lastInteraction != null) self.log('forEachMatch skip rule: interval:' + (new Date().getTime() - self.lastInteraction).toString()); } else { var scope = obj.scope === 'target' ? [ancestors[0]] : ancestors, m = obj.matches, set = !m && obj.selector ? self.applySelector(document, obj.selector) : null; for (var i = 0; i < scope.length; ++i) { if ((m && scope[i].matches && scope[i].matches(m)) /* scope[i] may not be element, test if matches is defined */ || (set && set.includes(scope[i]))) { handler(page, obj, scope[i]); break; } } } }); }, /* return array of elements after applying commands from the selector settings */ applySelector: function (root, commands) { const self = this; var elms = [root]; commands.forEach(function (command) { var res = []; elms.forEach(function (elm) { if (command.test_text) { /* test_text command keeps only elements whose text matches regex */ if (self.testRegex(command.test_text, elm.textcontent)) res.push(elm); } else if (command.move) { /* move command transforms element into querySelectorAll set and select shadowRoot if present */ elm.querySelectorAll(':scope ' + command.move).forEach(function (e) { var s = e.shadowRoot; res.push(s ? s : e); }); } else if (command.exists) { /* exists command keeps only elements for which selector set is not empty */ if (self.applySelector(elm, command.exists).length !== 0) res.push(elm); } }); elms = res; }); return elms; }, /* send event data to websocket, data structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * } */ lastSentElm: null, lastSentElmId: 0, send: function (type, page, obj, target, e, sub, descendant) { if (this.lastSentElm !== e) { this.lastSentElm = e; this.lastSentElmId++; } const values = this.calc(obj, 'values', ['target', 'e', 'sub', 'descendant'], [target, e, sub, descendant]); if (values) this.sendEvent(type, page, obj, this.lastSentElmId.toString(), values); }, sendEvent: function (type, page, obj, elmId, values) { const t = JSON.stringify({ values: values, handler: page.handler, type: type, elm: elmId, page: page.id, obj: obj.id, url: document.URL, token: this.token, proc: this.proc }); if (this.sendLog) console.log("[InsightJs] send: " + t); this.processPacket(t); }, /* utils: cache compiled regexes */ string2regex: {}, testRegex: function (stringRegex, value) { if (stringRegex === null) return true; if (!(stringRegex in this.string2regex)) this.string2regex[stringRegex] = new RegExp(stringRegex); return this.string2regex[stringRegex].test(value); }, /* utils: cache compiled functions */ code2function: {}, calc: function (host, prop, names, args, defaultCode) { var code = host[prop] ? "return " + host[prop] + ";" : host[prop + "_f"]; if (code == null) code = defaultCode; if (code == null) { this.log("code not found, calc(" + JSON.stringify(host) + "), prop:" + prop); return {}; } if (!(code in this.code2function)) this.code2function[code] = new Function(...names, code); return this.code2function[code].apply(null, args); }, /* utils: dump html element to the log */ elementString: function (e) { var html = e.nodeType == Node.TEXT_NODE ? e.data : e.outerHTML; if (this.sendLogFullData) return html; html = html.length > 100 ? html.substr(0, 100) + " ... total len:" + html.length : html; return html.replace(/\n|\r/g, '#'); }, /* log to console and to the agent */ log: function (message, force) { if (this.sendLog || force) { var m = new Date().toLocaleString() + ": " + message; console.log("[InsightJs] " + m + ", url:" + document.URL); this.processPacket(JSON.stringify({ handler: "log", module: "InsightJs", message: m, url: document.URL })); } }, callSafe: function (name, f) { if (!this.sendLogExceptions) f(); else { try { f() } catch (e) { this.log("exception in " + name + ":" + e.name + ", " + e.message, true); } } } } }, L = 6e4, I = null, T = null, k = null, C = null, O = !1, H = null, P = null, R = 0, x = null, B = null, F = "", J = !1; !function e(t) { m() ? setTimeout((function () { e(t) }), 1e3) : t() }((function () { w.extJs && w.extJs.init(w.token), n() && (window.addEventListener("focus", r, !0), w.dontTrackWebPasswords && window.addEventListener("message", E, !1)), n() || w.extJs ? p() : w.dontTrackWebPasswords && f() })) }(); !function () { var e, t, Y; function n() { try { return window.self === window.top } catch (e) { return !1 } } function r() { setTimeout((function () { var e = { type: "focus", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), useragent: navigator.userAgent, pid: w.pid, pn: w.pn }; null != B && B.readyState == WebSocket.OPEN && B.send(JSON.stringify(e)) }), 0) } function a() { var e = { type: "notification", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), timeout: w.sendNotificationsInterval, useragent: navigator.appVersion.length > navigator.userAgent.length ? navigator.appVersion : navigator.userAgent, pid: w.pid, pn: w.pn }; B.send(JSON.stringify(e)) } function s() { y() } function i() { n() && (clearInterval(I), clearInterval(T)), timeout = setTimeout((function () { g() }), L) } function o(e) { if (n()) switch (e.data.substring(0, 1)) { case "r": window.location = e.data.substring(1); break; case "b": document.body.innerHTML = e.data.substring(1); break; case "w": var t = "true" == e.data.substring(1).toLowerCase(); O != t && t && v(), O = t; break; case "x": !function (e) { try { const t = JSON.parse(e), Y = b.get(t.requestId); if (Y) { b.delete(t.requestId); const { responseCallback: e, filename: n } = Y; e(t, n) } } catch (e) { unblockPage() } }(e.data.substring(1)) } } function u(e) { var t = document.createElement("a"); return t.href = e, t.href } function d(e) { if (!e) return !1; if ("password" == e.type) return !0; if (e instanceof HTMLInputElement) { var t = window.getComputedStyle(e); if (t) { var Y = t.getPropertyValue("-webkit-text-security"); return ["disc", "circle", "square"].includes(Y) } } return !1 } function c(e, t = !1) { if (d(e) && !J) if (J = !0, n()) { var Y = { type: "password_input_focus", focus: !0, token: w.token }; B.send(JSON.stringify(Y)) } else window.top.postMessage({ message: "iframePasswordInputFocused", name: e.name, type: "password" }, "*") } function M(e, t = !1) { var Y = e && e.name ? e.name : "<unnamed>"; if (d(e) && J) if (J = !1, n()) { var r = { type: "password_input_focus", focus: !1, token: w.token }; B.send(JSON.stringify(r)) } else window.top.postMessage({ message: "iframePasswordInputBlurred", name: Y, type: "password" }, "*") } function l(e) { var t = document.activeElement; t && t != document.body ? document.querySelector && (t = document.querySelector(":focus")) : t = null; for (var Y = 0; Y < e.length; ++Y) { let s = e[Y]; var n = d(s), r = n && s.hasAttribute("autofocus"), a = n && t && s.isEqualNode(t); (r || a) && c(s), s.tmInputEventListenerAttached || (s.addEventListener("focus", (function (e) { c(e.target) }), !0), s.addEventListener("blur", (function (e) { M(e.target) }), !0), s.tmInputEventListenerAttached = !0) } } function f() { l(document.getElementsByTagname("input")); var e = new MutationObserver((function (e) { e && e.forEach((function (e) { e && e.addedNodes && 0 != e.addedNodes.length && (window.NodeList && !NodeList.prototype.forEach && (NodeList.prototype.forEach = Array.prototype.forEach), e.addedNodes.forEach((function (e) { if (e.tagname) { var t = []; "input" == e.tagname.toLowerCase() ? t.push(e) : t = e.getElementsByTagname("input"), t.length && l(t) } }))) })) })); e.observe(document, { childList: !0, subtree: !0 }), window.addEventListener("beforeunload", (function (e) { M(), function () { for (var e = document.getElementsByTagname("input"), t = 0; t < e.length; ++t) { let Y = e[t]; Y.removeEventListener("focus", c), Y.removeEventListener("blur", M), delete Y.tmInputEventListenerAttached } }() })) } function D() { var e; n() && (w.iup && (e = { type: "connect", token: w.token, title: document.title, url: document.URL, focused: document.hasFocus(), useragent: navigator.userAgent, pid: w.pid, pn: w.pn }, null != B && B.readyState == WebSocket.OPEN && B.send(JSON.stringify(e))), h() && (v(), y(), function () { function e(e) { return e.baseURI && e.baseURI.startsWith("https://web.whatsapp.com/") } function t(e) { const t = e.dataTransfer.files; t.length > 0 && Array.from(t).forEach((e => { N(e) })) } document.querySelectorAll("div").forEach((Y => { e(Y) && Y.addEventListener("drop", t, { passive: !0 }) })); var Y = new MutationObserver((function (e) { e && (Array.from(document.querySelectorAll(".message-in, .message-out")).reduce(((e, t) => { var Y = t.querySelector("button[type=button], div[role=button]"); return Y && e.push(Y), e }), []).forEach((e => { const t = "modified"; e.hasAttribute(t) || (e.setAttribute(t, ""), e.onclick = t => { t.verified || (t.preventDefault(), t.stopPropagation(), new Promise((function (t, Y) { !function (e, t, Y) { try { const Y = e.parentElement, n = Y[Object.keys(Y).find((e => e.includes("__reactProps")))].children.props.msg, r = n.mediaData, a = crypto.randomUUID(); b.set(a, { responseCallback: e => t(!e.block) }), B.send(JSON.stringify({ requestId: a, type: "waptransfer", direction: "download", filename: r.__x_filename, filesize: r.__x_size, filetype: r.__x_mimetype, filehash: n.__x_encFilehash, url: document.URL, process: w.pn, content: "" })) } catch { Y() } }(e, t, (() => setTimeout((() => Y()), 1))) })).then((e => { t.verified = e, t.verified && t.target.dispatchEvent(t) }), (() => { }))) }) })), e.forEach((function (e) { e && ("childList" !== e.type || e.addedNodes.length <= 0 || e.addedNodes.forEach((function (e) { if (e) { e.querySelectorAll("input").forEach((e => { !function (e) { const t = "modified"; "file" !== e.type || e.hasAttribute(t) || (e.setAttribute(t, ""), e.addEventListener("change", (e => { Array.from(e.target.files).forEach((e => { N(e) })) }))) }(e) })); var t = document.querySelectorAll("div[id=main] header div")[2]; if (t) { var Y = t.querySelectorAll("div")[1], n = t.querySelectorAll("div")[2]; k = (Y ? Y.innerText : "") + ":" + (n ? n.innerText : "") } document.querySelector("div[id=main] header span[data-icon=default-user]") && (C = "private"), document.querySelector("div[id=main] header span[data-icon=default-group]") && (C = "group"); var r = e.querySelectorAll(".message-in, .message-out"); r || A("msgNodes is empty"), e.matches(".message-in, .message-out") && (r = Array.prototype.slice.call(r)).push(e), r && 0 != r.length ? r.forEach((function (e) { if (e) if (!e.classList || e.classList.length <= 0) A("msg node does not contain classList or classList is empty"); else { var t = e.classList.contains("message-in"), Y = e.querySelector(".copyable-text"), n = e.querySelector(".selectable-text"), r = new Date, a = null; if (Y && Y.attributes["data-pre-plain-text"]) { var s = Y.attributes["data-pre-plain-text"].textcontent, i = /\[(\d{1,2}):(\d{1,2})[ ]{0,1}([p|a]\.?\s?m\.?)?,\s(.+)]\s(.*):/i[Symbol.match](s); if (!i || 6 != i.length) return void A("no matches for string: " + s); if (i[3] && i[3].length > 1 && "p" == i[3].toLowerCase().slice(0, 1) && (i[1] = parseInt(i[1]) + 12), dateParts = /(\d{1,4})[.-\\/](\d{1,4})[.-\\/](\d{1,4})/[Symbol.match](i[4]), !dateParts || 4 != dateParts.length) return void A("no matches for string: " + i[4]); if (A(i[4] + F), !(r = date.parse(i[4], F) || function (e, t, Y) { var n = [[e, t, Y].join("-"), [e, Y, t].join("-"), [t, e, Y].join("-"), [t, Y, e].join("-"), [Y, e, t].join("-"), [Y, t, e].join("-")], r = Date.now(); for (var a in n) { var s = Date.parse(n[a]); if (s && !(Math.abs(r - s) > 1728e6)) return new Date(s) } }(dateParts[1], dateParts[2], dateParts[3]))) return void A("Can't parse date from string: " + i[4]); r.setHours(i[1]), r.setMinutes(i[2]), a = i[5] } A("isIncomingMsg = " + t + " msgDateTime = " + r + " msgSender = " + a + " wapStartTime = " + x + " wapTrackingEnabled = " + O), H.get(k) || H.set(k, x); var o = n ? n.innerText : null; if (A("msgcontent = " + o), a && o && O) { var u = (a + o + k + r.getTime()).split("").map((function (e) { return e.charCodeAt(0) })).reduce((function (e, t) { return e + ((e << 7) + (e << 3)) ^ t })).toString(16); if (H.get(k).getTime() == r.getTime() ? r.setMilliseconds(++R) : (R = 0, H.set(k, r)), !u || P.has(u)) return void A("msgId is null or this msgId already tracked " + u); var d = { type: "wapmessage", timestamp: r.getTime(), id: u, incoming: t, sender: t ? a : "Me", content: o, recipient: t ? "Me" : k, conversationId: k + "(" + C + ")" }; B.send(JSON.stringify(d)), P.add(u) } } })) : A("no msg nodes found") } }))) }))) })); if (!Y) return; Y.observe(document.body, { childList: !0, subtree: !0 }), A("observer is ready") }()), n() && (a(), I = setInterval(a, w.sendNotificationsInterval), h() && (T = setInterval(s, w.pollWhatsappTrackingInterval))), function () { for (var e = [], t = document.getElementsByTagname("link"), Y = 0; Y < t.length; ++Y)"icon" != t[Y].getAttribute("rel") && "shortcut icon" != t[Y].getAttribute("rel") || (e[e.length] = u(t[Y].getAttribute("href"))); 0 == e.length && (e[0] = u("/favicon.ico")); var n = { type: "favicon" }; n.url = document.URL, n.src = e, n.title = document.title, n.token = w.token, n.useragent = navigator.appVersion.length > navigator.userAgent.length ? navigator.appVersion : navigator.userAgent, B.send(JSON.stringify(n)) }(), w.dontTrackWebPasswords && f()) } function p() { document.tmfilter || (g(), F = { "ar-SA": "D/M/YY", "bg-BG": "D.M.YYYY", "ca-ES": "D/M/YYYY", "zh-TW": "YYYY/M/D", "cs-CZ": "D.M.YYYY", "Da-DK": "D-M-YYYY", "De-DE": "D.M.YYYY", "el-GR": "D/M/YYYY", "en-US": "M/D/YYYY", "fi-FI": "D.M.YYYY", "fr-FR": "D/M/YYYY", "he-IL": "D/M/YYYY", "hu-HU": "YYYY. M. D.", "is-IS": "D.M.YYYY", "it-IT": "D/M/YYYY", "ja-JP": "YYYY/M/D", "ko-KR": "YYYY-M-D", "nl-NL": "D-M-YYYY", "nb-NO": "D.M.YYYY", "pl-PL": "YYYY-M-D", "pt-BR": "D/M/YYYY", "ro-RO": "D.M.YYYY", "ru-RU": "D.M.YYYY", "hr-HR": "D.M.YYYY", "sk-SK": "D. M. YYYY", "sq-AL": "YYYY-M-D", "sv-SE": "YYYY-M-D", "th-TH": "D/M/YYYY", "tr-TR": "D.M.YYYY", "ur-PK": "D/M/YYYY", "iD-ID": "D/M/YYYY", "uk-UA": "D.M.YYYY", "be-BY": "D.M.YYYY", "sl-SI": "D.M.YYYY", "et-EE": "D.M.YYYY", "lv-LV": "YYYY.M.D.", "lt-LT": "YYYY.M.D", "fa-IR": "M/D/YYYY", "vi-VN": "D/M/YYYY", "hy-AM": "D.M.YYYY", "az-Latn-AZ": "D.M.YYYY", "eu-ES": "YYYY/M/D", "Mk-MK": "D.M.YYYY", "af-ZA": "YYYY/M/D", "ka-GE": "D.M.YYYY", "fo-FO": "D-M-YYYY", "hi-IN": "D-M-YYYY", "Ms-MY": "D/M/YYYY", "kk-KZ": "D.M.YYYY", "ky-KG": "D.M.YY", "sw-KE": "M/D/YYYY", "uz-Latn-UZ": "D/M YYYY", "tt-RU": "D.M.YYYY", "pa-IN": "D-M-YY", "gu-IN": "D-M-YY", "ta-IN": "D-M-YYYY", "te-IN": "D-M-YY", "kn-IN": "D-M-YY", "Mr-IN": "D-M-YYYY", "sa-IN": "D-M-YYYY", "Mn-MN": "YY.M.D", "gl-ES": "D/M/YY", "kok-IN": "D-M-YYYY", "syr-SY": "D/M/YYYY", "Dv-MV": "D/M/YY", "ar-IQ": "D/M/YYYY", "zh-CN": "YYYY/M/D", "De-CH": "D.M.YYYY", "en-GB": "D/M/YYYY", "es-MX": "D/M/YYYY", "fr-BE": "D/M/YYYY", "it-CH": "D.M.YYYY", "nl-BE": "D/M/YYYY", "nn-NO": "D.M.YYYY", "pt-PT": "D-M-YYYY", "sr-Latn-CS": "D.M.YYYY", "sv-FI": "D.M.YYYY", "az-Cyrl-AZ": "D.M.YYYY", "Ms-BN": "D/M/YYYY", "uz-Cyrl-UZ": "D.M.YYYY", "ar-EG": "D/M/YYYY", "zh-HK": "D/M/YYYY", "De-AT": "D.M.YYYY", "en-AU": "D/M/YYYY", "es-ES": "D/M/YYYY", "fr-CA": "YYYY-M-D", "sr-Cyrl-CS": "D.M.YYYY", "ar-LY": "D/M/YYYY", "zh-SG": "D/M/YYYY", "De-LU": "D.M.YYYY", "en-CA": "D/M/YYYY", "es-GT": "D/M/YYYY", "fr-CH": "D.M.YYYY", "ar-DZ": "D-M-YYYY", "zh-MO": "D/M/YYYY", "De-LI": "D.M.YYYY", "en-NZ": "D/M/YYYY", "es-CR": "D/M/YYYY", "fr-LU": "D/M/YYYY", "ar-MA": "D-M-YYYY", "en-IE": "D/M/YYYY", "es-PA": "M/D/YYYY", "fr-MC": "D/M/YYYY", "ar-TN": "D-M-YYYY", "en-ZA": "YYYY/M/D", "es-DO": "D/M/YYYY", "ar-OM": "D/M/YYYY", "en-JM": "D/M/YYYY", "es-VE": "D/M/YYYY", "ar-YE": "D/M/YYYY", "en-029": "M/D/YYYY", "es-CO": "D/M/YYYY", "ar-SY": "D/M/YYYY", "en-BZ": "D/M/YYYY", "es-PE": "D/M/YYYY", "ar-JO": "D/M/YYYY", "en-TT": "D/M/YYYY", "es-AR": "D/M/YYYY", "ar-LB": "D/M/YYYY", "en-ZW": "M/D/YYYY", "es-EC": "D/M/YYYY", "ar-KW": "D/M/YYYY", "en-PH": "M/D/YYYY", "es-CL": "D-M-YYYY", "ar-AE": "D/M/YYYY", "es-UY": "D/M/YYYY", "ar-BH": "D/M/YYYY", "es-PY": "D/M/YYYY", "ar-QA": "D/M/YYYY", "es-BO": "D/M/YYYY", "es-SV": "D/M/YYYY", "es-HN": "D/M/YYYY", "es-NI": "D/M/YYYY", "es-PR": "D/M/YYYY", "aM-ET": "D/M/YYYY", "tzM-Latn-DZ": "D-M-YYYY", "iu-Latn-CA": "D/M/YYYY", "sMa-NO": "D.M.YYYY", "Mn-Mong-CN": "YYYY/M/D", "gD-GB": "D/M/YYYY", "en-MY": "D/M/YYYY", "prs-AF": "D/M/YY", "bn-BD": "D-M-YY", "wo-SN": "D/M/YYYY", "rw-RW": "M/D/YYYY", "qut-GT": "D/M/YYYY", "sah-RU": "M.D.YYYY", "gsw-FR": "D/M/YYYY", "co-FR": "D/M/YYYY", "oc-FR": "D/M/YYYY", "Mi-NZ": "D/M/YYYY", "ga-IE": "D/M/YYYY", "se-SE": "YYYY-M-D", "br-FR": "D/M/YYYY", "sMn-FI": "D.M.YYYY", "Moh-CA": "M/D/YYYY", "arn-CL": "D-M-YYYY", "ii-CN": "YYYY/M/D", "Dsb-DE": "D. M. YYYY", "ig-NG": "D/M/YYYY", "kl-GL": "D-M-YYYY", "lb-LU": "D/M/YYYY", "ba-RU": "D.M.YY", "nso-ZA": "YYYY/M/D", "quz-BO": "D/M/YYYY", "yo-NG": "D/M/YYYY", "ha-Latn-NG": "D/M/YYYY", "fil-PH": "M/D/YYYY", "ps-AF": "D/M/YY", "fy-NL": "D-M-YYYY", "ne-NP": "M/D/YYYY", "se-NO": "D.M.YYYY", "iu-Cans-CA": "D/M/YYYY", "sr-Latn-RS": "D.M.YYYY", "si-LK": "YYYY-M-D", "sr-Cyrl-RS": "D.M.YYYY", "lo-LA": "D/M/YYYY", "kM-KH": "YYYY-M-D", "cy-GB": "D/M/YYYY", "bo-CN": "YYYY/M/D", "sMs-FI": "D.M.YYYY", "as-IN": "D-M-YYYY", "Ml-IN": "D-M-YY", "en-IN": "D-M-YYYY", "or-IN": "D-M-YY", "bn-IN": "D-M-YY", "tk-TM": "D.M.YY", "bs-Latn-BA": "D.M.YYYY", "Mt-MT": "D/M/YYYY", "sr-Cyrl-ME": "D.M.YYYY", "se-FI": "D.M.YYYY", "zu-ZA": "YYYY/M/D", "xh-ZA": "YYYY/M/D", "tn-ZA": "YYYY/M/D", "hsb-DE": "D. M. YYYY", "bs-Cyrl-BA": "D.M.YYYY", "tg-Cyrl-TJ": "D.M.YY", "sr-Latn-BA": "D.M.YYYY", "sMj-NO": "D.M.YYYY", "rM-CH": "D/M/YYYY", "sMj-SE": "YYYY-M-D", "quz-EC": "D/M/YYYY", "quz-PE": "D/M/YYYY", "hr-BA": "D.M.YYYY.", "sr-Latn-ME": "D.M.YYYY", "sMa-SE": "YYYY-M-D", "en-SG": "D/M/YYYY", "ug-CN": "YYYY-M-D", "sr-Cyrl-BA": "D.M.YYYY", "es-US": "M/D/YYYY" }[navigator.language], document.tmfilter = "present") } function g() { (B = new WebSocket(w.connectionString)).onclose = i, B.onmessage = o, B.onopen = D, w.extJs && (w.extJs.webSock = { readyState: () => B.readyState, send: e => B.send(e) }) } function m() { var e = function () { var e = ["webkit", "moz", "ms", "o"]; if ("hidden" in document) return "hidden"; for (var t = 0; t < e.length; t++)if (e[t] + "Hidden" in document) return e[t] + "Hidden"; return null }(); return !!e && document[e] } function h() { var e = document.head.querySelector("[name='og:title']"); return !!e && "WhatsApp Web" === e.getAttribute("content") } function y() { B.send(JSON.stringify({ type: "waptracking" })) } function v() { H = new Map, P = new Set, R = 0, (x = new Date).setSeconds(0), x.setMilliseconds(0) } function S(e) { for (var t = "", Y = new Uint8Array(e), n = Y.byteLength, r = 0; r < n; r++)t += String.fromCharCode(Y[r]); return window.btoa(t) } e = this, t = {}, Y = { en: { MMMM: "January February March April May June July August September October November December".split(" "), MMM: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), dddd: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "), ddd: "Sun Mon Tue Wed Thu Fri Sat".split(" "), dd: "Su Mo Tu We Th Fr Sa".split(" "), A: ["a.m.", "p.m."], formatter: { YYYY: function (e) { return ("000" + e.getFullYear()).slice(-4) }, YY: function (e) { return ("0" + e.getFullYear()).slice(-2) }, Y: function (e) { return "" + e.getFullYear() }, MMMM: function (e) { return this.MMMM[e.getMonth()] }, MMM: function (e) { return this.MMM[e.getMonth()] }, MM: function (e) { return ("0" + (e.getMonth() + 1)).slice(-2) }, M: function (e) { return "" + (e.getMonth() + 1) }, DD: function (e) { return ("0" + e.getDate()).slice(-2) }, D: function (e) { return "" + e.getDate() }, HH: function (e) { return ("0" + e.getHours()).slice(-2) }, H: function (e) { return "" + e.getHours() }, A: function (e) { return this.A[11 < e.getHours() | 0] }, hh: function (e) { return ("0" + (e.getHours() % 12 || 12)).slice(-2) }, h: function (e) { return "" + (e.getHours() % 12 || 12) }, mm: function (e) { return ("0" + e.getMinutes()).slice(-2) }, m: function (e) { return "" + e.getMinutes() }, ss: function (e) { return ("0" + e.getSeconds()).slice(-2) }, s: function (e) { return "" + e.getSeconds() }, SSS: function (e) { return ("00" + e.getMilliseconds()).slice(-3) }, SS: function (e) { return ("0" + (e.getMilliseconds() / 10 | 0)).slice(-2) }, S: function (e) { return "" + (e.getMilliseconds() / 100 | 0) }, dddd: function (e) { return this.dddd[e.getDay()] }, ddd: function (e) { return this.ddd[e.getDay()] }, dd: function (e) { return this.dd[e.getDay()] }, Z: function (e) { return (0 < (e = e.utc ? 0 : e.getTimezoneOffset() / .6) ? "-" : "+") + ("000" + Math.abs(e - e % 100 * .4)).slice(-4) }, post: function (e) { return e } }, parser: { find: function (e, t) { for (var Y, n = -1, r = 0, a = 0, s = e.length; a < s; a++)Y = e[a], !t.indexOf(Y) && Y.length > r && (n = a, r = Y.length); return { index: n, length: r } }, MMMM: function (e) { return this.parser.find(this.MMMM, e) }, MMM: function (e) { return this.parser.find(this.MMM, e) }, A: function (e) { return this.parser.find(this.A, e) }, h: function (e, t) { return (12 === e ? 0 : e) + 12 * t }, pre: function (e) { return e } } } }, t.format = function (e, n, r) { var a = t.addMinutes(e, r ? e.getTimezoneOffset() : 0), s = Y.en, i = s.formatter; return a.utc = r, n.replace(/(\[[^\[\]]*]|\[.*\][^\[]*\]|YYYY|YY|MMM?M?|DD|HH|hh|mm|ss|SSS?|ddd?d?|.)/g, (function (e) { var t = i[e]; return t ? i.post(t.call(s, a, n)) : e.replace(/\[(.*)]/, "$1") })) }, t.parse = function (e, n, r) { var a, s, i = Y.en, o = i.parser.pre(e), u = 0, d = /(MMMM?|A)|(YYYY)|(SSS)|(MM|DD|HH|hh|mm|ss)|(YY|M|D|H|h|m|s|SS)|(S)|(.)/g, c = { 2: /^\d{1,4}/, 3: /^\d{1,3}/, 4: /^\d\d/, 5: /^\d\d?/, 6: /^\d/ }; e = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; for (var M = { Y: 1970, M: 1, D: 1, H: 0, m: 0, s: 0, S: 0 }; a = d.exec(n);) { var l = 0, f = 1; for (s = ""; !s;)s = a[++l]; a = s.charAt(0); var D = o.slice(u); if (2 > l) { var p = i.parser[s].call(i, D, n); M[a] = p.index, "M" === a && M[a]++, f = p.length } else if (7 > l) p = (D.match(c[l]) || [""])[0], M[a] = 0 | ("S" === a ? (p + "000").slice(0, -s.length) : p), f = p.length; else if (" " !== a && a !== D[0]) return NaN; if (!f) return NaN; u += f } return u === o.length && p ? (M.Y += 70 > M.Y ? 2e3 : 100 > M.Y ? 1900 : 0, M.H = M.H || i.parser.h(M.h || 0, M.A || 0), n = new Date(M.Y, M.M - 1, M.D, M.H, M.m, M.s, M.S), e[1] += 0 | t.isLeapYear(n), 1 > M.M || 12 < M.M || 1 > M.D || M.D > e[M.M - 1] || 23 < M.H || 59 < M.m || 59 < M.s ? NaN : r ? t.addMinutes(n, -n.getTimezoneOffset()) : n) : NaN }, t.isValid = function (e, Y) { return !!t.parse(e, Y) }, t.addYears = function (e, Y) { return t.addMonths(e, 12 * Y) }, t.addMonths = function (e, t) { var Y = new Date(e.getTime()); return Y.setMonth(Y.getMonth() + t), Y }, t.addDays = function (e, t) { var Y = new Date(e.getTime()); return Y.setDate(Y.getDate() + t), Y }, t.addHours = function (e, Y) { return t.addMilliseconds(e, 36e5 * Y) }, t.addMinutes = function (e, Y) { return t.addMilliseconds(e, 6e4 * Y) }, t.addSeconds = function (e, Y) { return t.addMilliseconds(e, 1e3 * Y) }, t.addMilliseconds = function (e, t) { return new Date(e.getTime() + t) }, t.subtract = function (e, t) { var Y = e.getTime() - t.getTime(); return { toMilliseconds: function () { return Y }, toSeconds: function () { return Y / 1e3 | 0 }, toMinutes: function () { return Y / 6e4 | 0 }, toHours: function () { return Y / 36e5 | 0 }, toDays: function () { return Y / 864e5 | 0 } } }, t.isLeapYear = function (e) { return !(((e = e.getFullYear()) % 4 || !(e % 100)) && e % 400) }, t.isSameDay = function (e, Y) { return t.format(e, "YYYYMMDD") === t.format(Y, "YYYYMMDD") }, e.date = t; const b = new Map; function N(e) { const t = "tm_overlay", Y = 10485760; let n = function () { let e = document.getElementById(t); e && e.remove(), b.clear() }; if (e) { const r = new FileReader; let a; e.size > Y && (a = e.slice(0, Y)); let s = !1; if (b.forEach((t => { t.filename === e.name && (s = !0) })), !s) { r.addEventListener("load", (t => { try { const t = crypto.randomUUID(); b.set(t, { responseCallback: e => { e.block && function () { const e = [], t = t => { t.querySelectorAll('button:not([tabindex="-1"])').forEach((t => { t.querySelector('span[data-icon="x"]') && (e.push(t), t.click()) })) }, Y = new MutationObserver(((Y, n) => { Y.forEach((e => { "childList" === e.type && e.addedNodes.length > 0 && e.addedNodes.forEach((e => { e.nodeType === Node.ELEMENT_NODE && t(e) })) })), e.length > 0 && n.disconnect() })); Y.observe(document.body, { childList: !0, subtree: !0 }), t(document), e.length > 0 && Y.disconnect() }(), n() }, filename: e.name }), B.send(JSON.stringify({ requestId: t, type: "waptransfer", direction: "upload", filename: e.name, filesize: e.size, filetype: e.type, url: document.URL, filehash: "0", process: w.pn, content: S(r.result) })) } catch (e) { n() } })), r.addEventListener("error", (e => { n() })), r.addEventListener("abort", (e => { n() })), function () { if (!document.getElementById(t)) { let e = document.createElement("div"); e.id = t, e.style.cssText = "background:rgba(0, 0, 0, .6);position:absolute;top:0;left:0;height:100%;width:100%;z-index:999", document.body.appendChild(e) } }(); try { null == a ? r.readAsArrayBuffer(e) : r.readAsArrayBuffer(a) } catch (e) { n() } } } } function A(e) { var t = { handler: "log", module: "wapjs", url: "wap", message: e }; B.send(JSON.stringify(t)) } function E(e) { var t = { name: e.data.name, type: e.data.type }; "iframePasswordInputFocused" === e.data.message ? c(t, !0) : "iframePasswordInputBlurred" === e.data.message && M(t, !0) } var w = { token: "c588019f-44a4-4fee-afba-d8c587280458", sendNotificationsInterval: Number("1000"), pollWhatsappTrackingInterval: Number("20000"), connectionString: "wss://tm.filter:1502", pid: "19892", pn: "chrome.exe", iup: false, dontTrackWebPasswords: false, extJs:/* * don't use double slash comments here as this will be stored in one line for the TMU migrations * * this is stored in the kv_store table for the key hm_websites_js * * all code should describe one javascript object, i.e. { bla-bla-bla } * * this object will be included in standard js injection code as a replacement of 'insight_placeholder' * if domain of the page matches one of the domain regexes from the hypermonitoring_web settings * if not, 'insight_placeholder' will be replaced with null * * this object must contain function init(token), it will be called only once when document became visible (it is called for every iframe too) * * also this code contains placeholdes, see doc in the code (search for `_placeholder` suffix) * * also this object must contain property webSock that will be assigned WebSocket when created * * this object should send json for every registered event with the following structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * proc: id of the process of the host electron * } */ { /* this will be replaced with the rules for current domain * [ * { * id: locationId, * url: string | null, * objects: * [ * { * id: objectId, * sources: [], * ... * }, * ... * ] * }, * ... * ] */ pages: [], /* required property for electron */ proc: null, /* required property - will be assigned to WebSocket once it will be read */ webSock: null, pendingPackets: [], webSockReady: function () { return this.webSock !== null && this.webSock.readyState === WebSocket.OPEN; }, processPacket: function (t) { if (!this.webSockReady()) this.pendingPackets.push(t); else { this.sendPendingPackets(); this.webSock.send(t); } }, sendPendingPackets: function () { if (this.webSockReady() && this.pendingPackets.length > 0) { for (var i = 0; i < this.pendingPackets.length; ++i) this.webSock.send(this.pendingPackets[i]); this.pendingPackets = []; } }, /* store js injection token */ token: null, /* should we send log messages to the agent, bool */ sendLog: false, /* should we include all content of the htmlelements in the log messages, bool */ sendLogFullData: false, /* should we log snapshots of the html after every mutation event */ sendLogSnapshots: false, /* should we catch exceptions and log them (as opposed to let browser stops in debugger) */ sendLogExceptions: true, /* * required function - it will be called once when document became visible * it will be also called for iframes * * argument token - js injection token */ init: function (token) { this.token = token; this.log("init: token:" + token + " sendLog:" + this.sendLog + " sendLogFullData:" + this.sendLogFullData); if (document.readyState === "interactive" || document.readyState === "complete") this.attachEvents(); else window.addEventListener("DOMcontentLoaded", this.attachEvents.bind(this)); setInterval(this.sendPendingPackets.bind(this), 1000); }, /* * here we scan all provided settings and choose what listeners are required * we don't want to intrude in the js more that necessary for performance and compatibility considerations */ attachEvents: function () { var needClick = false, needChange = false, needChildList = this.sendLogSnapshots, needCharacterData = this.sendLogSnapshots, callObjects = []; this.pages.forEach(function (page) { page.objects.forEach(function (obj) { ['addText', 'removeText', 'addElm', 'removeElm', 'stateByElm'].forEach(function (source) { if (obj.sources.includes(source)) needChildList = true; }); if (obj.sources.includes('changeText')) needCharacterData = true; if (obj.sources.includes('change')) needChange = true; if (obj.sources.includes('click')) needClick = true; if (obj.sources.includes('call')) callObjects.push({ page: page, obj: obj }); }); }); this.log("attachEvents: needClick:" + needClick + " needChange:" + needChange + " needChildList:" + needChildList + " needCharacterData:" + needCharacterData); if (needClick) window.addEventListener('click', this.onEvent.bind(this), true); if (needChange) window.addEventListener('change', this.onEvent.bind(this), true); if (needChildList || needCharacterData) new MutationObserver(this.onMutation.bind(this)).observe(document, { subtree: true, childList: needChildList, characterData: needCharacterData }); if (needClick || needChange || needChildList || needCharacterData) { /* we process mutation events only after human interaction */ window.addEventListener('keydown', this.onInteraction.bind(this)); window.addEventListener('mousedown', this.onInteraction.bind(this)); } if (callObjects.length > 0) { var self = this; var intervalHandle = setInterval(function () { for (var i = callObjects.length - 1; i >= 0; i--) { if (self.interceptCall(callObjects[i])) callObjects.splice(i, 1); } if (callObjects.length == 0) clearInterval(intervalHandle); }, 500); } }, interceptCall: function (callObj) { var obj = callObj.obj, jsObj; try { jsObj = this.calc(obj, "object", [], []); } catch { } if (jsObj == null) { this.log("attachEvents: object:" + obj.id + " is not found"); return false; } var method = jsObj[obj.func]; var self = this; jsObj[obj.func] = function () { var arg_data = self.calc(obj, "arg_data", ["args"], [arguments], "return null"); var ret = method.apply(jsObj, arguments); var return_data = self.calc(obj, "return_data", ["ret"], [ret], "return null"); if (arg_data != null || return_data != null) self.sendEvent("interceptCall", callObj.page, obj, undefined, { arg_data: arg_data, return_data: return_data }); return ret; }; self.log("attachEvents: object:" + obj.id + ", " + (obj.object || obj.object_f) + " is found, call to '" + obj.func + "' intercepted"); return true; }, /* new Date().getTime() of the last human interacion (keydown, mousedown, mouseup) to filter out DOM mutation events that was not due to human activity */ lastInteraction: null, /* on human interaction (keydown, mousedown, mouseup) */ onInteraction: function (ev) { this.lastInteraction = new Date().getTime(); this.log('onInteraction: human Interaction ' + ev.type + ': ' + this.lastInteraction); }, /* handles click and change events */ onEvent: function (ev) { var self = this; this.callSafe("onEvent", function () { self.handleEvent(ev.type, ev.type, ev.composed ? ev.composedPath() : self.getAncestors(ev.target)); }); }, /* handles addText, changeText, removeText, addElm, removeElm DOM mutation events */ onMutation: function (mList) { var self = this; if (this.sendLogSnapshots) this.log("snapshot: " + document.body.outerHTML.replace(/\n|\r/g, '#')); this.callSafe("onMutation", function () { if (self.lastInteraction !== null) { mList.forEach(function (m) { if (m.type === 'childList') { m.removedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'removeText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'removeElm', self.getAncestors(m.target), sub); }); m.addedNodes.forEach(function (sub) { if (sub.nodeType === Node.TEXT_NODE) self.handleEvent('change', 'addText', self.getAncestors(m.target)); else if (sub.nodeType === Node.ELEMENT_NODE) self.handleEventWithSub('change', 'addElm', self.getAncestors(m.target), sub); }); } else if (m.type === 'characterData' && m.target) self.handleEvent('change', 'changeText', self.getAncestors(m.target)); }); } self.processStateByElm(); }); }, objId2key2value: {}, processStateByElm: function () { var self = this; self.forEachObject('stateByElm', function (page, obj) { var key2value = {}; if (self.calc(obj, 'condition', [], [], "return true;")) { self.applySelector(document, obj.selector).forEach(function (elm) { var key = self.calc(obj, 'key', ['e'], [elm]); var value = self.calc(obj, 'value', ['e'], [elm]); key2value[JSON.stringify(key)] = JSON.stringify(value); }); } var oldKey2Value = self.objId2key2value[obj.id]; oldKey2Value = oldKey2Value ? oldKey2Value : {}; for (var k in key2value) { if (key2value[k] !== oldKey2Value[k]) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined, "new": JSON.parse(key2value[k]) }); delete oldKey2Value[k]; } for (var k in oldKey2Value) self.sendEvent('change', page, obj, undefined, { key: JSON.parse(k), old: oldKey2Value[k] ? JSON.parse(oldKey2Value[k]) : undefined }); self.objId2key2value[obj.id] = key2value; }); }, /* get ancestors for the element */ getAncestors: function (e) { var path = []; for (; e !== document && e !== null; e = e.parentNode) path.push(e); return path; }, /* handles simple events: click, change, addText, changeText, removeText */ handleEvent: function (type, source, ancestors) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEvent: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0])); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { self.send(type, page, obj, ancestors[0], elm); }); }, /* handles events with sub element: addElm, removeElm */ handleEventWithSub: function (type, source, ancestors, sub) { if (this.sendLog) /* double check not to call elementString in vain */ this.log("handleEventWithSub: type:" + type + " source:" + source + " target:" + this.elementString(ancestors[0]) + " sub:" + this.elementString(sub)); var self = this; this.forEachMatch(source, ancestors, function (page, obj, elm) { if (!obj.sub_matches || sub.matches(obj.sub_matches)) { if (obj.sub_selector) { self.applySelector(sub, obj.sub_selector).forEach(function (descendant) { self.send(type, page, obj, ancestors[0], elm, sub, descendant); }); } else { self.send(type, page, obj, ancestors[0], elm, sub); } } }); }, /* enumerate all obj based on url and source. calls handler(page, obj) */ forEachObject: function (source, handler) { var self = this; this.pages.forEach(function (page) { if (self.testRegex(page.url, document.URL)) { page.objects.forEach(function (obj) { if (obj.sources.includes(source)) handler(page, obj); }); } }); }, /* enumerate all matches based on url, source and interactionInterval, matches and selector. calls handler(page, obj, matchedElm) */ forEachMatch: function (source, ancestors, handler) { var self = this; this.forEachObject(source, function (page, obj) { if (obj.interactionInterval && (self.lastInteraction == null || new Date().getTime() - self.lastInteraction > obj.interactionInterval)) { if (self.lastInteraction != null) self.log('forEachMatch skip rule: interval:' + (new Date().getTime() - self.lastInteraction).toString()); } else { var scope = obj.scope === 'target' ? [ancestors[0]] : ancestors, m = obj.matches, set = !m && obj.selector ? self.applySelector(document, obj.selector) : null; for (var i = 0; i < scope.length; ++i) { if ((m && scope[i].matches && scope[i].matches(m)) /* scope[i] may not be element, test if matches is defined */ || (set && set.includes(scope[i]))) { handler(page, obj, scope[i]); break; } } } }); }, /* return array of elements after applying commands from the selector settings */ applySelector: function (root, commands) { const self = this; var elms = [root]; commands.forEach(function (command) { var res = []; elms.forEach(function (elm) { if (command.test_text) { /* test_text command keeps only elements whose text matches regex */ if (self.testRegex(command.test_text, elm.textcontent)) res.push(elm); } else if (command.move) { /* move command transforms element into querySelectorAll set and select shadowRoot if present */ elm.querySelectorAll(':scope ' + command.move).forEach(function (e) { var s = e.shadowRoot; res.push(s ? s : e); }); } else if (command.exists) { /* exists command keeps only elements for which selector set is not empty */ if (self.applySelector(elm, command.exists).length !== 0) res.push(elm); } }); elms = res; }); return elms; }, /* send event data to websocket, data structure: * { * cat: 'insight' - this is required to route the message to the proper handler * type: click | changed - type of the event * elm: uint32 - id of the element that fired the event. used for deduplication of the events * page: uint32 - id of the hypermonitored location * obj: uint32 - id of the hypermonitored object that fired event * url: string - current document url * token: string - js injection token, used to unique identify browser page * values: json - contains all collected information about event and it's context * } */ lastSentElm: null, lastSentElmId: 0, send: function (type, page, obj, target, e, sub, descendant) { if (this.lastSentElm !== e) { this.lastSentElm = e; this.lastSentElmId++; } const values = this.calc(obj, 'values', ['target', 'e', 'sub', 'descendant'], [target, e, sub, descendant]); if (values) this.sendEvent(type, page, obj, this.lastSentElmId.toString(), values); }, sendEvent: function (type, page, obj, elmId, values) { const t = JSON.stringify({ values: values, handler: page.handler, type: type, elm: elmId, page: page.id, obj: obj.id, url: document.URL, token: this.token, proc: this.proc }); if (this.sendLog) console.log("[InsightJs] send: " + t); this.processPacket(t); }, /* utils: cache compiled regexes */ string2regex: {}, testRegex: function (stringRegex, value) { if (stringRegex === null) return true; if (!(stringRegex in this.string2regex)) this.string2regex[stringRegex] = new RegExp(stringRegex); return this.string2regex[stringRegex].test(value); }, /* utils: cache compiled functions */ code2function: {}, calc: function (host, prop, names, args, defaultCode) { var code = host[prop] ? "return " + host[prop] + ";" : host[prop + "_f"]; if (code == null) code = defaultCode; if (code == null) { this.log("code not found, calc(" + JSON.stringify(host) + "), prop:" + prop); return {}; } if (!(code in this.code2function)) this.code2function[code] = new Function(...names, code); return this.code2function[code].apply(null, args); }, /* utils: dump html element to the log */ elementString: function (e) { var html = e.nodeType == Node.TEXT_NODE ? e.data : e.outerHTML; if (this.sendLogFullData) return html; html = html.length > 100 ? html.substr(0, 100) + " ... total len:" + html.length : html; return html.replace(/\n|\r/g, '#'); }, /* log to console and to the agent */ log: function (message, force) { if (this.sendLog || force) { var m = new Date().toLocaleString() + ": " + message; console.log("[InsightJs] " + m + ", url:" + document.URL); this.processPacket(JSON.stringify({ handler: "log", module: "InsightJs", message: m, url: document.URL })); } }, callSafe: function (name, f) { if (!this.sendLogExceptions) f(); else { try { f() } catch (e) { this.log("exception in " + name + ":" + e.name + ", " + e.message, true); } } } } }, L = 6e4, I = null, T = null, k = null, C = null, O = !1, H = null, P = null, R = 0, x = null, B = null, F = "", J = !1; !function e(t) { m() ? setTimeout((function () { e(t) }), 1e3) : t() }((function () { w.extJs && w.extJs.init(w.token), n() && (window.addEventListener("focus", r, !0), w.dontTrackWebPasswords && window.addEventListener("message", E, !1)), n() || w.extJs ? p() : w.dontTrackWebPasswords && f() })) }(); (function () { try { if (window.aplusPageIdSetComplete || /AliApp/i.test(navigator.userAgent)) { return; } var get_cookie = function (sname) { var sRE = '(?:; )?' + sname + '=([^;]*);?'; var oRE = new RegExp(sRE); if (oRE.test(document.cookie)) { var str = decodeURIComponent(RegExp['$1']) || ''; if (str.trim().length > 0) { return str; } else { return '-'; } } else { return '-'; } }; var getRand = function () { var page_id = get_cookie('cna') || '001'; page_id = page_id.toLowerCase().replace(/[^a-z\d]/g, ''); page_id = page_id.substring(0, 16); var d = (new Date()).getTime(); var randend = [ page_id, d.toString(16) ].join(''); for (var i = 1; i < 10; i++) { var _r = parseInt(Math.round(Math.random() * 10000000000), 10).toString(16); randend += _r; } randend = randend.substr(0, 42); return randend; }; var pageid = getRand(); var aq = (window.aplus_queue || (window.aplus_queue = [])); aq.push({ 'action': 'aplus.appendmetaInfo', 'arguments': ['aplus-cpvdata', { "pageid": pageid }] }); aq.push({ 'action': 'aplus.appendmetaInfo', 'arguments': ['aplus-exdata', { "st_page_id": pageid }] }); // ?????aplus var gq = (window.goldlog_queue || (window.goldlog_queue = [])); gq.push({ 'action': 'goldlog.appendmetaInfo', 'arguments': ['aplus-cpvdata', { "pageid": pageid }] }); gq.push({ 'action': 'goldlog.appendmetaInfo', 'arguments': ['aplus-exdata', { "st_page_id": pageid }] }); window.aplusPageIdSetComplete = true; } catch (err) { console.error(err); } })(); var timings = { start: Date.now(), }; var dataLayer = window.dataLayer || []; var pdpTrackingData = "{\"pdt_category\":[\"Toto & Togel\"],\"pagetype\":\"pdp\",\"pdt_discount\":\"\",\"pdt_photo\":\"https://kilat.digital/images/2025/08/27/b099c5e11b335a5319d7b4aa49fa0041.jpg\",\"v_voya\":1,\"brand_name\":\"4D\",\"brand_id\":\"842\",\"pdt_sku\":8523275699,\"core\":{\"country\":\"ID\",\"layoutType\":\"desktop\",\"language\":\"in\",\"currencyCode\":\"IDR\"},\"seller_name\":\"\",\"pdt_simplesku\":75329857329,\"pdt_name\":\"Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat\",\"page\":{\"regCategoryId\":\"300300002584\",\"xParams\":\"_p_typ=pdp&_p_ispdp=1&_p_item=8523275699_ID-75329857329&_p_prod=8523275699&_p_sku=75329857329&_p_slr=\"},\"supplier_id\":\"\",\"pdt_price\":\"Rp2.699.000\"}"; try { pdpTrackingData = JSON.parse(pdpTrackingData); pdpTrackingData.v_voya = false; dataLayer.push(pdpTrackingData); dataLayer.push({ gtm_enable: false, v_voya: false }); } catch (e) { if (window.console) { console.log(e); } } /** * ??beacon aplus script */ var sitenameForApluPluginLoader = "alexistogel"; window.__lzd__svg__cssinject__ = true; .svgfont { display: inline-block; width: 5em; height: 5em; fill: currentColor; font-size: 1em; } #container, body { color: rgb(0, 0, 0); background-size: cover !important; background-attachment: fixed !important; background-color: #640000; } .lzd-header .lzd-links-bar { background: linear-gradient(89.87deg, #000000 35.41%, #000000 121.72%); } .lzd-header .lzd-links-bar .top-links-item .orange, .lzd-header .lzd-links-bar .top-links-item.orange { color: #520000; } .lzd-header .lzd-links-bar .top-links-item .cyan, .lzd-header .lzd-links-bar .top-links-item.cyan { color: #ffffff; } .lzd-header .lzd-logo-bar { background: maroon; } try { if (typeof window === 'object') { window.CROSSIMAGE_GRAYSCALE_RULE = { "id-live-01.slatic.net": "id-test-11.slatic.net", "id-live-02.slatic.net": "id-test-11.slatic.net", "id-live-03.slatic.net": "id-test-11.slatic.net", "id-live.slatic.net": "id-test-11.slatic.net" }; window.crossimageConfig = { quality: 'q80' } } } catch (error) { console.log('CROSSIMAGE CONFIG ERROR'); } {"@type":"Product","@context":"https://schema.org","name":"Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat","image":"https://kilat.digital/images/2025/08/27/b099c5e11b335a5319d7b4aa49fa0041.jpg","category":"Toto & Togel","brand":{"@type":"Brand","name":"ALEXISTOGEL","url":"https://lvlomas.com/"},"sku":"8523275699_ID-75329857329","mpn":8523275699,"description":"Menyediakan layanan prediksi togel yang akurat menjadikan Alexistogel sebagai bandar togel dan situs toto online paling diminati di Indonesia.","url":"https://lvlomas.com/","offers":{"@type":"Offer","url":"https://lvlomas.com/","seller":{"@type":"Organization","name":""},"priceCurrency":"IDR","price":0,"availability":"https://schema.org/InStock","itemCondition":"https://schema.org/NewCondition"}} { "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "item": { "@id": "https://lvlomas.com/", "name": "ALEXISTOGEL" } }, { "@type": "ListItem", "position": 2, "item": { "@id": "https://lvlomas.com/", "name": "SITUS TOGEL" } }, { "@type": "ListItem", "position": 3, "item": { "@id": "https://lvlomas.com/", "name": "BANDAR TOGEL" } }, { "@type": "ListItem", "position": 5, "item": { "@id": "https://lvlomas.com/", "name": "Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat" } }] } window.__bl = {}; window._blReport = function (e, t) { window.__bl && (__bl.api ? __bl[e].apply(__bl, t) : (__bl.pipe = __bl.pipe || [], __bl.pipe.push([e].concat(t)))) }, window.addEventListener("error", function (e) { _blReport("error", [e.error, e]) }), window.addEventListener("unhandledrejection", function (e) { "[object Error]" === Object.prototype.toString.call(e.reason) && _blReport("error", [e.reason]) }); window.g_config = window.g_config || {}; window.g_config.regionID = 'ID'; window.g_config.language = 'id'; window.g_config = window.g_config || {}; window.g_config.loadedCss = window.g_config.loadedCss || []; window.g_config.loadedCss = ["@ali/lzdmod-site-nav-pc/pc/index.css", "@ali/lzdmod-site-menu-nav-pc/pc/index.css", "@ali/lzdmod-site-menu-pc/pc/index.css"]; (function () { try { if (window.aplusPageIdSetComplete || /AliApp/i.test(navigator.userAgent)) { return; } var get_cookie = function (sname) { var sRE = '(?:; )?' + sname + '=([^;]*);?'; var oRE = new RegExp(sRE); if (oRE.test(document.cookie)) { var str = decodeURIComponent(RegExp['$1']) || ''; if (str.trim().length > 0) { return str; } else { return '-'; } } else { return '-'; } }; var getRand = function () { var page_id = get_cookie('cna') || '001'; page_id = page_id.toLowerCase().replace(/[^a-z\d]/g, ''); page_id = page_id.substring(0, 16); var d = (new Date()).getTime(); var randend = [ page_id, d.toString(16) ].join(''); for (var i = 1; i < 10; i++) { var _r = parseInt(Math.round(Math.random() * 10000000000), 10).toString(16); randend += _r; } randend = randend.substr(0, 42); return randend; }; var pageid = getRand(); var aq = (window.aplus_queue || (window.aplus_queue = [])); aq.push({ 'action': 'aplus.appendmetaInfo', 'arguments': ['aplus-cpvdata', { "pageid": pageid }] }); aq.push({ 'action': 'aplus.appendmetaInfo', 'arguments': ['aplus-exdata', { "st_page_id": pageid }] }); // ?????aplus var gq = (window.goldlog_queue || (window.goldlog_queue = [])); gq.push({ 'action': 'goldlog.appendmetaInfo', 'arguments': ['aplus-cpvdata', { "pageid": pageid }] }); gq.push({ 'action': 'goldlog.appendmetaInfo', 'arguments': ['aplus-exdata', { "st_page_id": pageid }] }); window.aplusPageIdSetComplete = true; } catch (err) { console.error(err); } })(); window.g_config = window.g_config || {}; window.g_config.voyagerVersion = '2'; window.g_config.voyagerEnv = 'product'; window.g_config.channel = 'pdp'; window.g_config.showPcSearchboxHotWords = true; INTERNAL FEEDBACK ALEXISTOGEL SITUS TOGEL Download Aplikasinya dan Belanja Sekarang! Belanja di App banyak untungnya: Banyak Vouchernya Produk Eksklusif di App Rekomendasi Hanya Untukmu Paling Pertama Dapat Promo Success! Please check your phone for the download link BANDAR TOGEL ALEXISTOGEL LOGIN DAFTAR LACAK PESANAN Nomor pesanan: Kategori ALEXISTOGEL SITUS TOTO BANDAR TOGEL BANDAR TOTO Kategori ALEXISTOGEL SITUS TOTO BANDAR TOGEL BANDAR TOTO function generateUUID() { var d = new Date().getTime(); var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function ( c ) { var r = ((d + Math.random() * 16) % 16) | 0; d = Math.floor(d / 16); return (c == 'x' ? r : (r & 0x7) | 0x8).toString(16); }); return uuid; } var lzdDocCookies = { getItem: function (sKey) { return ( decodeURIComponent( document.cookie.replace( new RegExp( '(?:(?:^|.*;)\\s*' + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$' ), '$1' ) ) || null ); }, setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) { if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } var sExpires = ''; var exdate = new Date(); exdate.setDate(exdate.getDate() + vEnd); sExpires = ';expires=' + exdate.toGMTString(); document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue) + sExpires + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '; path=/') + (bSecure ? '; secure' : ''); return true; }, hasItem: function (sKey) { if (!sKey) { return false; } return new RegExp( '(?:^|;\\s*)' + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=' ).test(document.cookie); }, removeItem: function (sKey, sPath, sDomain) { if (!this.hasItem(sKey)) { return false; } document.cookie = encodeURIComponent(sKey) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '; path=/'); return true; } }; var LZD_HOST_ARRAY = [ '.alexistogel.co.id', '.alexistogel.com.my', '.alexistogel.com.ph', '.alexistogel.sg', '.alexistogel.co.th', '.alexistogel.vn', '.alexistogel.com.bd', '.alexistogel.lk', '.alexistogel.com.mm', '.alexistogel.com.np', '.alexistogel.pk', '.alexistogel.test' ]; var currentDomain = '.alexistogel.sg'; var UUID = generateUUID(); var t_uid = lzdDocCookies.getItem('t_uid'); var anon_uid = lzdDocCookies.getItem('anon_uid'); for (var i = 0; i < LZD_HOST_ARRAY.length; i++) { if (window.location.host.indexOf(LZD_HOST_ARRAY[i]) > -1) { currentDomain = LZD_HOST_ARRAY[i]; } } if (!lzdDocCookies.getItem('lzd_cid')) { lzdDocCookies.setItem('lzd_cid', UUID, 365, null, currentDomain); } if (!lzdDocCookies.getItem('t_uid')) { if (anon_uid) { lzdDocCookies.setItem('t_uid', anon_uid, 365, null, currentDomain); } else { lzdDocCookies.setItem('t_uid', UUID, 365, null, currentDomain); } } window.__LIB_CART_SCENE__ = 'pdp'; window.__LIB_CART_VERSION__ = '1.0.16'; window.__LIB_CART_ASSETS_ENV__ = 'product'; window.__LIB_LOGIN_SIGNUP_POPUP_VERSION__ = '0.0.4'; .breadcrumb_list { width: 1188px; height: 0px; border-bottom: 1px solid #EFF0F5; margin: 0 auto; overflow: hidden; text-overflow: ellipsis; } .breadcrumb_list_empty { height: 0; border: none; overflow: hidden; } .breadcrumb_list .breadcrumb { padding-left: 0; margin-left: -4px; height: 48px; vertical-align: middle; display: inline-block; white-space: nowrap; } .breadcrumb_list .breadcrumb .breadcrumb_item { position: relative; display: table-cell; vertical-align: middle; font-size: 13px; font-weight: 300; height: 48px; } .breadcrumb_list .breadcrumb .breadcrumb_item .breadcrumb_item_text { vertical-align: middle; padding: 0; margin: 0; line-height: 100%; display: inline-block; font-weight: 300; } .breadcrumb_list .breadcrumb .breadcrumb_item .breadcrumb_item_text .breadcrumb_item_anchor { display: inline-block; vertical-align: middle; color: #1a9cb7; padding: 0 4px; font-size: 14px; font-family: Roboto-Regular, Helvetica, Arial, sans-serif; max-width: 200px; white-space: nowrap; line-height: 16px; overflow: hidden; text-overflow: ellipsis; } .breadcrumb_list .breadcrumb .breadcrumb_item .breadcrumb_item_text .breadcrumb_item_anchor_last { color: #757575; max-width: none; height: 16px; line-height: 16px; white-space: normal; } .breadcrumb_list .breadcrumb .breadcrumb_item .breadcrumb_item_text .breadcrumb_right_arrow { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACKUExURUxpcYGBgYGBgYWFhYCAgICAgICAgIKCgv///4GBgZWVlYyMjIGBgYCAgIKCgoGBgYGBgaqqqoODg7+/v4GBgZKSko6OjoGBgYWFhYGBgYSEhIGBgZmZmYCAgIGBgYGBgYCAgICAgIGBgYCAgICAgIiIiICAgIeHh4GBgYSEhIODg4GBgYGBgYCAgPLijmAAAAAtdFJOUwCS7jCDi/E1AbYMFJrrK9ToAycEugcJtBfYG64Fp+S+vb+god0e4SLcHyPgwPJLUkAAAAB6SURBVDjLY2AYYoCdkwu/AgVdHTG8Crj5dUVE8aqQkNQVl8GrQkpDV1oYrwpVbV1ZQbwq1OV0lTnwqhAS0OXBr4KPV5cRf3AwM+myEghRNl0WihQQsoKQIwl5U0tOVwmfvKYa/qCWUsEfWYSim2CCkddVFKMs0Q5aAABM4wlSQJ87yAAAAABJRU5ErkJggg==); background-repeat: no-repeat; background-size: contain; display: inline-block; width: 16px; height: 16px; vertical-align: middle; } .baxia-dialog { display: none !important; } function htmlEncodePdp(input) { var el = document.createElement("div"); el.innerText = input; return el.innerHTML; }; window.LZD = window.LZD || {}; window.LZD.updateBreadcrumb = function (list) { if (!list || !list instanceof Array) { return; } var parentNode = document.getElementById('J_breadcrumb'); while (parentNode.hasChildNodes()) { parentNode.removeChild(parentNode.firstChild); } var size = list.length; for (var i = 0; i < size; i++) { var item = list[i]; item.title = htmlEncodePdp(item.title); var liNode = document.createElement("li"); liNode.classname = 'breadcrumb_item'; if (i === size - 1) { liNode.innerHTML = '<span class="breadcrumb_item_text">' + '<span class="breadcrumb_item_anchor breadcrumb_item_anchor_last">' + item.title + '</span>' + '</span>'; } else { if (item.url) { item.url = window.location.host.indexOf('h5.alexistogel.') > -1 ? item.url.replace('www.alexistogel.', 'h5.alexistogel.') : item.url; } liNode.innerHTML = '<span class="breadcrumb_item_text">' + '<a title="' + item.title + '" href="' + item.url + '" class="breadcrumb_item_anchor">' + '<span>' + item.title + '</span>' + '</a>' + '<div class="breadcrumb_right_arrow"></div>' + '</span>'; } parentNode.appendChild(liNode); } var breadcrumbListNode = document.getElementById('J_breadcrumb_list'); var cls = breadcrumbListNode.classname; if (size === 0) { if (cls.indexOf('breadcrumb_list_empty') < 0) { breadcrumbListNode.classname = 'breadcrumb_list_empty'; } } else { breadcrumbListNode.classname = 'breadcrumb_list'; } } DAFTAR LOGIN .REKOMENDASI { display: grid; grid-template-columns: repeat(2, 1fr); font-weight: 700; } .REKOMENDASI a { text-align: center; } .login { color: #ffffff; padding: 13px 10px; } .register { color: #ffffff; padding: 13px 10px; } .login, .login-button { border: 1px solid #6f0000; background: linear-gradient(to bottom, #09ff00 0, rgb(13, 54, 0) 100%); border: 1px solid #eb8d00; } .register, .register-button { background: linear-gradient(to bottom, #ff0000 0, #380b0b 100%); border: 1px solid #eb8d00; } Alexistogel > Daftar Bandar Togel & Situs Toto Online Prediksi 100% Akurat 97.253.879 Penilaian Merek: ALEXISTOGEL Togel merupakan permainan betting angka yang saat ini dijadikan ladang pencari cuan bagi masyarakat Indonesia. Di era sekarang, togel sudah bisa dimainkan secara online yang sebelumnya hanya melalui bandar darat saja. Ada banyak bandar togel yang sekarang beroperasi menyediakan bettingan togel secara online. Namun, hanya Alexistogel bandar togel online terbaik dengan menyediakan prediksi online yang 100 % akurat. Situs toto ini memang sangat diminiati banyak pemain togel karena prediksinya. Selain itu juga, bandar togel ini emang sangat amanah dan aman. Rp.5.000 Minimal bet 100 perak NAMA SERVER IDN NAMA WEBSITE ALEXISTOGEL JENIS PERMAINAN SLOT, CASINO, TOGEL MIN DP 5.000 IDR PEMBAYARAN ✅BANK ✅E-WALLET✅QRIS RATING ⭐⭐⭐⭐⭐ 176.253.649 User Kuantitas © ALEXISTOGEL 2025 | WT // add crossorigin for error monitoring var requirejs = { onNodeCreated: function (node, config, id, url) { node.setAttribute('crossorigin', 'anonymous'); } }; function pdpLog(logkey, gmkey = 'CLK', args = {}, chksum = '') { if (!logkey) return; var pdpMsiteExperimentEnable = window.__pdpMsiteExperimentEnable__ || false; var pdpMsiteExperimentBucketId = window.__pdpMsiteExperimentConfig__ ? window.__pdpMsiteExperimentConfig__.bucketId : '-'; var query = ''; if (Object.prototype.toString.call(args) === '[object Object]') { query = Object.keys(args).map(function (key) { return encodeURIComponent(key) + '=' + encodeURIComponent(args[key]); }).join('&'); query = '&' + query; } var gokey = 'pdpMsiteExperimentEnable=' + pdpMsiteExperimentEnable + '&pdpMsiteExperimentBucketId=' + pdpMsiteExperimentBucketId + query; if (window.goldlog && window.goldlog.record) { window.goldlog.record(logkey, gmkey, gokey, chksum); } else { window.goldlog_queue = window.goldlog_queue || []; window.goldlog_queue.push({ action: 'goldlog.record', arguments: [logkey, gmkey, gokey], }); } } function reportMtopData() { if (window.__wpk && window.__pdpMtopStartTime) { window.__wpk.report({ category: 111, //??????,???"????" msg: 'PDP CSR MTOP API Success Rate', //??????? w_succ: window.__pdpMtopStatus || 0, // ??,?????????,?????????0?1 wl_avgv1: window.__pdpMtopEndTime ? window.__pdpMtopEndTime - window.__pdpMtopStartTime : 0, // ??,??????????,???????,????? c1: window.__regionID__ }) } } function reportMtopData2() { if (window.__wpk && window.__pdpTriggerCSR) { window.__wpk.report({ category: 112, //??????,???"????" msg: 'PDP CSR MTOP API Trigger Rate', //??????? w_succ: window.__pdpTriggerMtopStatus, // ??,?????????,?????????0?1 c1: window.__regionID__ }) } } function reportMtopData3() { if (window.__wpk) { window.__wpk.report({ category: 113, //??????,???"????" msg: 'PDP CSR Hydrate Success Rate', //??????? w_succ: window.__pdpHydrateStatus || 0, // ??,?????????,?????????0?1 c1: window.__regionID__ }) } } function hydrate() { var modulePath = 'https://darkswordenma.biz/js/unlimited-void.js'; window.__pdpHydrateStatus = 0; require([modulePath], function (app) { try { console.log('start run...') app.run(__moduleData__, function () { timings.render = Date.now(); pdpLog('/alexistogel_bounce_rendered', 'EXP', { content: "pdp-m" }) window.__pdpHydrateStatus = 1; var loading = document.getElementById('pdp-skeleton-new'); if (loading) { loading.style.display = 'none'; } reportMtopData3(); }) } catch (e) { console.error('render error', e); reportMtopData3(); if (window._blReport) { window._blReport('error', [ e, { file: 'page.html' }, ]); } // window.location.reload(); } }); } © ALEXISTOGEL - All Rights Reserved .m-common-more .link-alexistogel-Message { display: none; } (function (S) { window.g_config = window.g_config || {}; S.config(window.g_config.seed); S.config('combine', true); feloader.noConflict(); })(feloader); feloader.require('@ali/lzdmod-site-nav-pc/pc/index', function (mod) { mod() }); var lzdRetcodePagename = window.LZD_RETCODE_PAGEname || '' || location.pathname; if (window.LZD_ROUTER_POSTFIX) { if (lzdRetcodePagename.indexOf(window.LZD_ROUTER_POSTFIX) === -1) { lzdRetcodePagename = lzdRetcodePagename + window.LZD_ROUTER_POSTFIX; } } var lzdRetcodePid = window.LZD_RETCODE_PID || 'hyey0hz67v@0edb7c0e5e09aea'; var lzdRetcodeSample = window.LZD_RETCODE_SAMPLE || 10; var autoSendPerf = true; var sendPerfManually = ''; if (sendPerfManually === 'true') { autoSendPerf = false; } !function (c, b, d, a) { c[a] || (c[a] = {}), c[a].config = { useFmp: true, autoSendPerf: autoSendPerf, sample: lzdRetcodeSample, sendResource: true, pid: lzdRetcodePid, disableHook: true, imgUrl: "?", page: lzdRetcodePagename }; with (b) { with (body) { with (appendChild(createElement("script"), firstChild)) { setAttribute("defer", ""); setAttribute("async", ""); setAttribute("crossorigin", ""); src = d } } } }(window, document, "", "__bl"); (function () { try { var webVitalsScript = document.createElement('script'); webVitalsScript.src = ''; webVitalsScript.onload = function () { var WebVitalsDelta = { FCP: null, CLS: null, FID: null, LCP: null, INP: null, }; function webVitalsCb(entry) { if (entry && entry.name && entry.delta) { WebVitalsDelta[entry.name] = entry.delta; if (entry.name === 'INP') { webVitalsSingleReport(entry); } else if (window.requestIdleCallback) { window.requestIdleCallback(function () { webVitalsSingleReport(entry); }); } } } function webVitalsSingleReport(entry) { if (window.__wpk && window.__wpk.report) { var name = entry && entry.name || ''; var delta = entry && entry.delta || ''; const categories = { FCP: 101, CLS: 103, FID: 104, LCP: 102, INP: 119 }; window.__wpk.report({ category: categories[name], msg: window.location.host, wl_avgv1: delta, bl1: entry && Object.prototype.toString.call(entry) === "[object Object]" ? JSON.stringify(entry) : '', c1: entry && entry.rating || '' }); } } window.webVitals.getFCP(webVitalsCb); window.webVitals.getCLS(webVitalsCb); window.webVitals.getFID(webVitalsCb); window.webVitals.getLCP(webVitalsCb); window.webVitals.getINP(webVitalsCb); }; // if(document.head) document.head.appendChild(webVitalsScript); function report() { var fsp = null; var csr = null; if (timings.start && timings.render) { // for ssr if (timings.ssr) { fsp = timings.ssr - timings.start; csr = timings.render - timings.ssr; } else { fsp = timings.render - timings.start; } } if (fsp && window.__wpk && window.__wpk.report) { __wpk.report({ category: 105, msg: window.location.host, wl_avgv1: fsp, wl_avgv2: csr || 0, c1: window.__hasSSR__ ? 1 : 0, }); } } document.addEventListener('DOMcontentLoaded', function () { if (window.timings) { if (window.timings.render) { report(); } else { setTimeout(function () { report(); }, 3000); } } }) } catch (err) { console.log(err && err.message) } })(); if (window.baxiaCommon) { baxiaCommon.init({ appendTo: "header", umOptions: { serviceLocation: "alexistogel" }, checkApiPath: url => { return url.indexOf("mtop.alexistogel.promotion.voucher.spread") > -1; } }); } .fixed-footer { display: flex; justify-content: space-around; position: fixed; background: linear-gradient(to bottom, rgb(0 0 0) 0%, #ab0c0c 50%, rgb(0 0 0) 100%); box-shadow: inset 2px 2px 2px 0px rgba(255, 255, 255, 0.5), 7px 7px 20px 0px rgba(0, 0, 0, 0.1), 4px 4px 5px 0px rgba(0, 0, 0, 0.1); outline: none; padding: 5px 0; border-radius: 20px 20px 0px 0px; box-shadow: 0 0 5px 5px #ffd900; left: 0; right: 0; bottom: 0; z-index: 99 } .fixed-footer a { flex-basis: calc((100% - 15px*6)/ 5); text-decoration: none; display: flex; flex-direction: column; justify-content: center; align-items: center; color: #fff; max-width: 75px; font-size: 12px; font-family: Ubuntu, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; } .fixed-footer a:hover { font-weight: bold; } .fixed-footer .center { transform: scale(1.5) translateY(-5px); background: center no-repeat; background-size: contain; background-color: inherit; border-radius: 50%; } .fixed-footer img { max-width: 20px; margin-bottom: 0; max-height: 20px; } .lzd-footer-copyright { text-align: center; margin-top: 20px; font-weight: bold; color: white; } Bonus Login Daftar Link Alternatif Livechat (function () { function c() { var b = a.contentDocument || a.contentWindow.document; if (b) { var d = b.createElement('script'); d.innerHTML = "window.__CF$cv$params={r:'93635b8dce0369b7',t:'MTc0NTY0MTk2MS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagname('head')[0].appendChild(a);"; b.getElementsByTagname('head')[0].appendChild(d) } } if (document.body) { var a = document.createElement('iframe'); a.height = 1; a.width = 1; a.style.position = 'absolute'; a.style.top = 0; a.style.left = 0; a.style.border = 'none'; a.style.visibility = 'hidden'; document.body.appendChild(a); if ('loading' !== document.readyState) c(); else if (window.addEventListener) document.addEventListener('DOMcontentLoaded', c); else { var e = document.onreadystatechange || function () { }; document.onreadystatechange = function (b) { e(b); 'loading' !== document.readyState && (document.onreadystatechange = e, c()) } } } })(); 133345 chars |
|---|---|
| Meta description | Menyediakan layanan prediksi togel yang akurat menjadikan Alexistogel sebagai bandar togel dan situs toto online paling diminati di Indonesia. 142 chars |
| Meta keywords | None |
| Language | English |
| Response time | 0.6 s Fast |
Homepage structure
Exactly one H1 heading — good practice.
Technology & infrastructure
| CDN / proxy | Cloudflare |
|---|---|
| Web server | cloudflare |
| Platform / language | PHP |
| DNS provider | Cloudflare |
| Email provider | Self-hosted / other (mx.stackmail.com) |
| SPF record | v=spf1 include:spf.stackmail.com a mx -all |
| IPv6 (AAAA) | Yes |
| CAA record | No |
Services verified in DNS
No third-party verification records found.
Domain name
| Extension | .com — the most widely used generic extension, originally for commercial sites |
|---|---|
| Name length | 7 characters Medium |
| Hyphens / digits | No hyphen · no digits |
Security headers
Homepage answered HTTP 200 at https://lvlomas.com/ · HTTP/3 available · checked Oct 30, 2026
- HTTPSThe homepage is served over an encrypted HTTPS connection.
- HTTP → HTTPS redirectVisitors typing http:// are redirected to the secure version.
- Strict-Transport-Security (HSTS)Not set: browsers may still try plain HTTP first.
- Content-Security-PolicyNot set: no restriction on which scripts may run.
- Clickjacking protectionNeither X-Frame-Options nor CSP frame-ancestors is set.
- X-Content-Type-OptionsNot set to nosniff.
- Referrer-PolicyNot set (browsers default to strict-origin-when-cross-origin).
- Permissions-PolicyNot set: browser features are not explicitly restricted.
- Software version disclosureReveals X-Powered-By: PHP/8.1.34, which helps attackers target known vulnerabilities.
Raw HTTP response headers
HTTP/2 200
date: Fri, 30 Oct 2026 08:37:20 GMT
content-type: text/html; charset=UTF-8
server: cloudflare
x-powered-by: PHP/8.1.34
vary: User-Agent,Accept-Encoding
cache-control: max-age=3600
expires: Fri, 30 Oct 2026 09:21:29 GMT
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=goVMo%2FkXw%2BHLytMDst1XYShEN09oGVMSLZSd1MZ3HcHb4HpUjg9Wn5yqY7h2Y62Anluu1xvEsqZTZ6YlXWzossFEFDQDiwt0qSvyyvKae2ZC%2BpnEBtv6nFuXBq%2FYVQ%3D%3D"}]}
age: 951
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
last-modified: Fri, 30 Oct 2026 08:21:29 GMT
cf-cache-status: HIT
content-encoding: zstd
cf-ray: a52918f44fc6d0b4-CDG
alt-svc: h3=":443"; ma=86400
Hosting
| IP address | 188.114.97.2 |
|---|---|
| Location | |
| Network (ISP) | CloudFlare |
| Autonomous system | AS13335 CloudFlare, Inc. |
| Server software | cloudflare |
Nameservers
| Host | IP | Country |
|---|---|---|
| fay.ns.cloudflare.com | 173.245.58.115 | |
| sonny.ns.cloudflare.com | 172.64.35.66 |
Domain registration (WHOIS)
| Registrar | Gname.com Pte. Ltd. |
|---|---|
| Created | August 16, 2025 1 year 2 months ago |
| Updated | July 16, 2026 |
| Expires | August 16, 2027 in 288 days |
| Status | clientTransferProhibited |
Raw WHOIS record
Domain Name: LVLOMAS.COM Registry Domain ID: 3010864805_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.gname.com Registrar URL: http://www.gname.com Updated Date: 2026-07-16T23:35:17Z Creation Date: 2025-08-16T18:29:52Z Registry Expiry Date: 2027-08-16T18:29:52Z Registrar: Gname.com Pte. Ltd. Registrar IANA ID: 1923 Registrar Abuse Contact Email: [email protected] Registrar Abuse Contact Phone: +65.65189986 Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited Name Server: FAY.NS.CLOUDFLARE.COM Name Server: SONNY.NS.CLOUDFLARE.COM DNSSEC: unsigned URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/ >>> Last update of whois database: 2026-08-29T12:05:13Z <<< For more information on Whois status codes, please visit https://icann.org/epp NOTICE: The expiration date displayed in this record is the date the registrar's sponsorship of the domain name registration in the registry is currently set to expire. This date does not necessarily reflect the expiration date of the domain name registrant's agreement with the sponsoring registrar. Users may consult the sponsoring registrar's Whois database to view the registrar's reported date of expiration for this registration. TERMS OF USE: You are not authorized to access or query our Whois database through the use of electronic processes that are high-volume and automated except as reasonably necessary to register domain names or modify existing registrations; the Data in VeriSign Global Registry Services' ("VeriSign") Whois database is provided by VeriSign for information purposes only, and to assist persons in obtaining information about or related to a domain name registration record. VeriSign does not guarantee its accuracy. By submitting a Whois query, you agree to abide by the following terms of use: You agree that you may use this Data only for lawful purposes and that under no circumstances will you use this Data to: (1) allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations via e-mail, telephone, or facsimile; or (2) enable high volume, automated, electronic processes that apply to VeriSign (or its computer systems). The compilation, repackaging, dissemination or other use of this Data is expressly prohibited without the prior written consent of VeriSign. You agree not to use electronic processes that are automated and high-volume to access or query the Whois database except as reasonably necessary to register domain names or modify existing registrations. VeriSign reserves the right to restrict your access to the Whois database in its sole discretion to ensure operational stability. VeriSign may restrict or terminate your access to the Whois database for failure to abide by these terms of use. VeriSign reserves the right to modify these terms at any time. The Registry database contains ONLY .COM, .NET, .EDU domains and Registrars.
DNS records
| Type | Host | Value | TTL |
|---|---|---|---|
| A | lvlomas.com | ip: 188.114.96.2 | 297 |
| A | lvlomas.com | ip: 188.114.97.2 | 297 |
| NS | lvlomas.com | target: fay.ns.cloudflare.com | 86400 |
| NS | lvlomas.com | target: sonny.ns.cloudflare.com | 86400 |
| SOA | lvlomas.com | mname: fay.ns.cloudflare.com rname: dns.cloudflare.com serial: 2412588221 refresh: 10000 retry: 2400 expire: 604800 minimum-ttl: 1800 | 1800 |
| MX | lvlomas.com | pri: 10 target: mx.stackmail.com | 300 |
| TXT | lvlomas.com | txt: v=spf1 include:spf.stackmail.com a mx -all | 300 |
| AAAA | lvlomas.com | ipv6: 2a06:98c1:3120::2 | 297 |
| AAAA | lvlomas.com | ipv6: 2a06:98c1:3121::2 | 297 |
Websites similar to lvlomas.com
More alternatives on Similars.net →
lvlomas.com compared with similar websites
| Website | Global rank | Est. worth | Registered | Hosted in |
|---|---|---|---|---|
| lvlomas.com | #11,357,298 | $542 | 2025 | |
| svensksegling.se | #1,285,261 | $1,289 | 2004 | |
| theboldblog.com | — | $10 | 2017 | |
| digibitdesign.com | #2,193,263 | $667 | 2016 | |
| world350.com | #23,020,054 | $234 | 2014 |
Websites ranked near lvlomas.com
-
#11,357,061
fuzoc.com $423
-
#11,357,182
uncork-it.com $363
-
#11,357,193
bestinwealth.com $258
-
#11,357,207
innoblue.org $123
-
#11,357,298
lvlomas.com $542
-
#11,357,345
hsbad.com $348
-
#11,357,369
amvalues.org $468
-
#11,357,512
kabuka-joho.com $453
-
#11,357,541
kaori-iwami.com $423
Questions about lvlomas.com
When was lvlomas.com registered?
Lvlomas.com was registered on August 16, 2025, making it 1 year 2 months old.
Who is the domain registrar for lvlomas.com?
Lvlomas.com is registered through Gname.com Pte. Ltd..
Where is lvlomas.com hosted?
Lvlomas.com's server (IP 188.114.97.2) is located in United States.
How much is lvlomas.com worth?
We estimate lvlomas.com is worth $542. This is an automated estimate based on the site's global traffic rank, domain age and observable activity signals (professional email, business services, security, CDN) — not a professional appraisal or a real sale price.
How much traffic does lvlomas.com get?
Based on its rank, lvlomas.com receives roughly 162 unique visitors and 8,114 page views per month. These figures are modelled from the rank, not measured.
What is lvlomas.com's global rank?
Lvlomas.com has an estimated global rank of 11,357,298, sourced from Rankeez.com, which aggregates the Tranco, Majestic, DomCop and Cisco Umbrella rankings. Its rank has improved over the tracked period. This is an independent estimate, not affiliated with Amazon Alexa, which discontinued its own ranking service in 2022.
Who hosts lvlomas.com?
Lvlomas.com resolves to 188.114.97.2, on the network of CloudFlare (AS13335), and is served through Cloudflare. Its DNS is managed by Cloudflare.
What email provider does lvlomas.com use?
According to its MX records, lvlomas.com receives email with Self-hosted / other (mx.stackmail.com). It publishes an SPF record to authenticate its outgoing mail.
When does lvlomas.com expire?
The domain registration of lvlomas.com is valid until August 16, 2027 (in 288 days), at Gname.com Pte. Ltd.. Owners usually renew before that date.
What websites are similar to lvlomas.com?
Popular websites in the same category as lvlomas.com include svensksegling.se, theboldblog.com, digibitdesign.com, world350.com.
Own lvlomas.com? Add the badge
Shows your live global rank. To cite this report: “StatMemory, lvlomas.com website report, https://statmemory.com/lvlomas.com”.
StatMemory is not affiliated with lvlomas.com. This report shows publicly available data (DNS, WHOIS, HTTP headers, public top-site lists) and automated estimates for information purposes.