import{deep_copy,SettingsManager,Time}from"./utils.mjs";import*asbapifrom"./api.js";classAPI{staticendpoints={};staticregister(t,e){vara=t.name+"."+e;consts=t[e];this.endpoints[a]=function(){returns.apply(t,[{tab_id:arguments[0].tab_id,frame_id:arguments[0].frame_id,...arguments[0].data}])}}}classCache{staticcache={};staticasyncset({tab_id:t,name:e,value:a,tab_specific:s}={tab_specific:!1}){returns&&(e=t+"_"+e),Cache.cache[e]=a,Cache.cache[e]}staticasyncget({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){returna&&(e=t+"_"+e),Cache.cache[e]}staticasyncremove({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){a&&(e=t+"_"+e);a=Cache.cache[e];returndeleteCache.cache[e],a}staticasyncappend({tab_id:t,name:e,value:a,tab_specific:s}={tab_specific:!1}){return(e=s?t+"_"+e:e)inCache.cache||(Cache.cache[e]=[]),Cache.cache[e].push(a),Cache.cache[e]}staticasyncempty({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){a&&(e=t+"_"+e);a=Cache.cache[e];returnCache.cache[e]=[],a}staticasyncinc({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return(e=a?t+"_"+e:e)inCache.cache||(Cache.cache[e]=0),Cache.cache[e]++,Cache.cache[e]}staticasyncdec({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){return(e=a?t+"_"+e:e)inCache.cache||(Cache.cache[e]=0),Cache.cache[e]--,Cache.cache[e]}staticasynczero({tab_id:t,name:e,tab_specific:a}={tab_specific:!1}){returna&&(e=t+"_"+e),Cache.cache[e]=0,Cache.cache[e]}static{API.register(this,"set"),API.register(this,"get"),API.register(this,"remove"),API.register(this,"append"),API.register(this,"empty"),API.register(this,"inc"),API.register(this,"dec"),API.register(this,"zero")}}classSettings{staticdata={};static_save(){returnnewPromise(t=>{bapi.browser.storage.sync.set({settings:Settings.data},t)})}static_get_settings(){returnnewPromise(e=>{bapi.browser.storage.sync.get(["settings"],({settings:t})=>{e(t)})})}staticasyncload(){for(lett=0;t<4;t++){vare=awaitSettings._get_settings();if(e)returnSettings.data=e,void(Settings.data.version!==SettingsManager.DEFAULT.version&&(e=Settings.data.key,awaitSettings.reset(),Settings.data.key=e))}awaitSettings.reset()}staticasyncget(){returnSettings.data}staticasyncset({id:t,value:e}){Settings.data[t]=e,awaitSettings._save()}staticasyncupdate({settings:t}){for(var[e,a]ofObject.entries(t))Settings.data[e]=a;awaitSettings._save()}staticasyncreplace({settings:t}){Settings.data=t,awaitSettings._save()}staticasyncreset(){Settings.data=deep_copy(SettingsManager.DEFAULT),awaitSettings._save()}static{API.register(this,"get"),API.register(this,"set"),API.register(this,"update"),API.register(this,"replace"),API.register(this,"reset")}}classNet{staticasyncfetch({url:t,options:e}={options:{}}){try{returnawait(awaitfetch(t,e)).text()}catch(t){returnnull}}static{API.register(this,"fetch")}}classTab{staticreloads={};static_reload({tab_id:e}){returnnewPromise(t=>bapi.browser.tabs.reload(e,{bypassCache:!0},t))}staticasyncreload({tab_id:t,delay:e,overwrite:a}={delay:0,overwrite:!0}){e=parseInt(e);vars=Tab.reloads[t]?.delay-(Date.now()-Tab.reloads[t]?.start),s=isNaN(s)||s<0?0:s;return!!(a||0==s||e<=s)&&(clearTimeout(Tab.reloads[t]?.timer),Tab.reloads[t]={delay:e,start:Date.now(),timer:setTimeout(()=>Tab._reload({tab_id:t}),e)},!0)}staticclose({tab_id:e}){returnnewPromise(t=>bapi.browser.tabs.remove(e,t))}staticopen({url:e}={url:null}){returnnewPromise(t=>bapi.browser.tabs.create({url:e},t))}staticnavigate({tab_id:e,url:a}){returnnewPromise(t=>bapi.browser.tabs.update(e,{url:a},t))}staticinfo({tab_id:t}){returnnewPromise(e=>{try{bapi.browser.tabs.get(t,t=>e(t))}catch(t){e(!1)}})}staticactive(){returnnewPromise(asynce=>{vart;if("firefox"!==bapi.VERSION)return[t]=awaitbapi.browser.tabs.query({active:!0,lastFocusedWindow:!0}),e(t);bapi.browser.tabs.query({active:!0,lastFocusedWindow:!0},([t])=>{bapi.browser.runtime.lastError,e(t)})})}static{API.register(this,"reload"),API.register(this,"close"),API.register(this,"open"),API.register(this,"navigate"),API.register(this,"info"),API.register(this,"active")}}classInject{staticasync_inject(e){e.target.tabId||(t=awaitTab.active(),e.target.tabId=t.id);vart=newPromise(t=>bapi.browser.scripting.executeScript(e,t));returnt}staticasyncfunc({tab_id:t,func:e,args:a}={args:[]}){t={target:{tabId:t,allFrames:!0},world:"MAIN",injectImmediately:!0,func:e,args:a};returnInject._inject(t)}staticasyncfiles({tab_id:t,frame_id:e,files:a}){t={target:{tabId:t,frameIds:[e]},world:"MAIN",injectImmediately:!0,files:a};return"firefox"===bapi.VERSION&&deletet.world,Inject._inject(t)}static{API.register(this,"func"),API.register(this,"files")}}classRecaptcha{staticasyncreset({tab_id:t}){returnawaitInject.func({tab_id:t,data:{func:()=>{try{window.grecaptcha?.reset()}catch{}},args:[]}}),!0}static{API.register(this,"reset")}}classServer{staticENDPOINT="https://api.nopecha.com/status?v="+bapi.browser.runtime.getManifest().version;staticis_fetching_plan=!1;staticasyncget_plan({key:t}){if(Server.is_fetching_plan)return!1;Server.is_fetching_plan=!0;lete={plan:"Unknown",credit:0};try{"undefined"===t&&(t="");vara=awaitfetch(Server.ENDPOINT+"&key="+t);e=JSON.parse(awaita.text())}catch{}returnServer.is_fetching_plan=!1,e}static{API.register(this,"get_plan")}}classImage{staticencode({url:t}){returnnewPromise(a=>{fetch(t).then(t=>t.blob()).then(t=>{conste=newFileReader;e.onload=()=>a(e.result),e.readAsDataURL(t)})})}static{API.register(this,"encode")}}classRelay{staticasyncsend({tab_id:t,data:e}){t=t||(awaitTab.active()).id,bapi.browser.tabs.sendMessage(t,e)}static{API.register(this,"send")}}classIcon{staticset({status:a}){returnnewPromise(t=>{vare="firefox"===bapi.VERSION?bapi.browser.browserAction:bapi.browser.action;"on"===a?e.setIcon({path:{16:"/icon/16.png",32:"/icon/32.png",48:"/icon/48.png",128:"/icon/128.png"}},t):"off"===a?e.setIcon({path:{16:"/icon/16g.png",32:"/icon/32g.png",48:"/icon/48g.png",128:"/icon/128g.png"}},t):t(!1)})}staticset_badge_text({tab_id:a,data:s}){returnnewPromise(t=>{vare={text:s};a&&(e.tabId=a),bapi.browser.action.setBadgeText(e,t)})}staticset_badge_color({tab_id:a,data:s}){returnnewPromise(t=>{vare={color:s};a&&(e.tabId=a),bapi.browser.action.setBadgeBackgroundColor(e,t)})}staticasyncset_badge({tab_id:t,data:{global:e,text:a,color:s}}){t||e||(t=(awaitTab.active()).id),e&&(t=null);e=[Icon.set_badge_text({tab_id:t,data:a})];returns&&e.push(Icon.set_badge_color({tab_id:t,data:s})),Promise.all(e)}static{API.register(this,"set")}}classBrowser{staticasyncversion(){returnbapi.VERSION}staticasynclog(){}static{API.register(this,"version"),API.register(this,"log")}}classContextMenu{staticlisten(){bapi.browser.contextMenus.onClicked.addListener(function(e,t){if("nopecha_disable_host"===e.menuItemId){e=e.pageUrl;if(e){e=e.replace(/^(.*:)\/\/([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$/,"$2");lett=newSet;for(constaofSettings.data.disabled_hosts)t.add(a.trim());t.add(e),t=[...t],Settings.set({id:"disabled_hosts",value:t})}}})}staticcreate(){bapi.browser.contextMenus.create({title:"Disable NopeCHA on this site",id:"nopecha_disable_host"})}static{bapi.browser.runtime.onInstalled.addListener(ContextMenu.create),ContextMenu.listen()}}(async()=>{bapi.register_language(),awaitSettings.load(),awaitIcon.set({status:Settings.data.enabled?"on":"off"}),bapi.browser.runtime.onMessage.addListener((t,e,a)=>{consts=t[0];leti=null;t=(i=1<t.length?2===t.length?t[1]:t.slice(1):i)&&"tab_id"ini?i.tab_id:e?.tab?.id,e=e?.frameId;try{API.endpoints[s]({tab_id:t,frame_id:e,data:i}).then(t=>{["Browser.log","Settings.get","Settings.set","Cache.get","Cache.set","Tab.info"].includes(s);try{a(t)}catch(t){}}).catch(t=>{})}catch(t){}return!0})})();
(async()=>{functiono(){returnnull!==(document.querySelector('button[aria-describedby="descriptionVerify"]')||document.querySelector("#wrong_children_button")||document.querySelector("#wrongTimeout_children_button"))}functionr(){try{vare=document.querySelector('button[aria-describedby="descriptionVerify"]'),t=(e&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),e.click()),document.querySelector("#wrong_children_button")),a=(t&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),t.click()),document.querySelector("#wrongTimeout_children_button"));a&&(window.parent.postMessage({nopecha:!0,action:"clear"},"*"),a.click())}catch(e){}}functionu(){returndocument.querySelector("#game_children_text > h2")?.innerText?.trim()}functions(){returndocument.querySelector("img#game_challengeItem_image")?.src?.split(";base64,")[1]}letd=null;asyncfunctione(){e=500;vare,{task:t,cells:a,image_data:n}=awaitnewPromise(n=>{letc=!1;consti=setInterval(async()=>{if(!c){c=!0;vare=awaitBG.exec("Settings.get");if(e.enabled&&e.funcaptcha_auto_solve){e.funcaptcha_auto_open&&o()&&awaitr();e=u();if(e){vart=document.querySelectorAll("#game_children_challenge ul > li > a");if(6===t.length){vara=s();if(a&&d!==a)returnd=a,clearInterval(i),c=!1,n({task:e,cells:t,image_data:a})}}c=!1}}},e)});if(null!==t&&null!==a&&null!==n){varc=awaitBG.exec("Settings.get");if(c.enabled&&c.funcaptcha_auto_solve){vari=Time.time(),l=(awaitNopeCHA.post({captcha_type:IS_DEVELOPMENT?"funcaptcha_dev":"funcaptcha",task:t,image_data:[n],key:c.key}))["data"];if(l){t=parseInt(c.funcaptcha_solve_delay_time)||1e3,n=c.funcaptcha_solve_delay?t-(Time.time()-i):0;0<n&&awaitTime.sleep(n);for(lete=0;e<l.length;e++)!1!==l[e]&&a[e].click()}d=null}}}if(window.location.pathname.startsWith("/fc/assets/tile-game-ui/"))for(;;){awaitTime.sleep(1e3);vart,a=awaitBG.exec("Settings.get");a&&a.enabled&&(t=awaitLocation.hostname(),a.disabled_hosts.includes(t)||(a.funcaptcha_auto_open&&o()?awaitr():a.funcaptcha_auto_solve&&null!==u()&&null!==s()&&awaite()))}})();
}`];consto=document.body.appendChild(document.createElement("style")).sheet;for(constnint)o.insertRule(t[n],n);letn=0;letr=1;consta={};a[0]=document.createElement("div");a[0].classList.add("input_row");document.body.append(a[0]);consti=document.createElement("div");i.id="nframes_label";i.innerText="# iframes";a[0].append(i);constc=document.createElement("input");c.id="nframes";c.placeholder="Number of iframes";c.value=E;c.addEventListener("input",()=>{E=parseInt(c.value)});a[0].append(c);constm={reset:{row:0,fn:e,args:[]},all:{row:0,fn:w,args:[]}};for(constsinu)n++%9==0&&r++,m[s]={row:r,fn:g,args:[s,0]};for(constdinh)n++%9==0&&r++,m[d]={row:r,fn:A,args:[d,0]};for(const[p,l]ofObject.entries(m)){constr=l.row,f=(l.rowina||(a[l.row]=document.createElement("div"),a[l.row].classList.add("input_row"),document.body.append(a[l.row])),document.createElement("input"));f.type="button",f.value=p,f.addEventListener("click",()=>{e(),l.fn(...l.args)}),a[l.row].append(f)}}(),g("imvu",0,E)})();
(async()=>{vare=IS_DEVELOPMENT;consto="lazy";window.nopecha=[];vara={};asyncfunctiont(e){vara=(document.querySelector("#game_children_text > h2")||document.querySelector("#game-header"))?.innerText?.trim(),t=(document.querySelector("img#game_challengeItem_image")||document.querySelector("#challenge-image"))?.src?.split(";base64,")[1];a&&t&&(a={task:a,image:t,index:e,url:(awaitBG.exec("Tab.info"))?.url},o.startsWith("l")&&window.parent.postMessage({nopecha:!0,action:"append",data:a},"*"),o.startsWith("e"))&&awaitNet.fetch("https://api.nopecha.com/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}varn=window.addEventListener?"addEventListener":"attachEvent";for(window[n]("attachEvent"==n?"onmessage":"message",asynce=>{e=e[e.message?"message":"data"];e&&!0===e.nopecha&&("append"===e.action?window.nopecha.push(e.data):"clear"===e.action?window.nopecha=[]:"reload"===e.action&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0)))},!1);;){awaitTime.sleep(1e3);try{if(document.querySelector("body.victory")){vari=[];for(constsofwindow.nopecha){varc=Net.fetch("https://api.nopecha.com/upload",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});i.push(c)}awaitPromise.all(i),window.nopecha=[],e&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0))}"block"===document.querySelector("#timeout_widget")?.style?.display&&(window.parent.postMessage({nopecha:!0,action:"reload"},"*"),window.location.reload(!0));varr=document.querySelectorAll("#game_children_challenge ul > li > a");for(constlinr){vard=r[l];lina&&d.removeEventListener("click",a[l]),a[l]=t.bind(this,parseInt(l)),d.addEventListener("click",a[l])}}catch(e){}}})();
<svgwidth="16"height="16"viewBox="2 2 22 22"fill="#ffffff"><pathd="M 12 2.0996094 L 1 12 L 4 12 L 4 21 L 11 21 L 11 15 L 13 15 L 13 21 L 20 21 L 20 12 L 23 12 L 12 2.0996094 z M 12 4.7910156 L 18 10.191406 L 18 11 L 18 19 L 15 19 L 15 13 L 9 13 L 9 19 L 6 19 L 6 10.191406 L 12 4.7910156 z"/></svg>
(async()=>{functione(){vare,t;if(!i())returne="true"===document.querySelector(".recaptcha-checkbox")?.getAttribute("aria-checked"),t=document.querySelector("#recaptcha-verify-button")?.disabled,e||t}functioni(){return"Try again later"===document.querySelector(".rc-doscaptcha-header")?.innerText}asyncfunctiont(){!0!==awaitBG.exec("Cache.get",{name:"recaptcha_widget_visible",tab_specific:!0})||e()||(awaitTime.sleep(500),document.querySelector("#recaptcha-anchor")?.click())}asyncfunctiona(t){vara=awaitBG.exec("Cache.get",{name:"recaptcha_image_visible",tab_specific:!0});if(!0===a&&!e()&&!i()){a=document.querySelector(".rc-audiochallenge-tdownload-link")?.href,a=(fetch(a),document.querySelector("#audio-source")?.src?.replace("recaptcha.net","google.com"));lete=document.querySelector("html")?.getAttribute("lang")?.trim();e&&0!==e.length||(e="en");varc=Time.time(),a=awaitNet.fetch("https://engageub.pythonanywhere.com",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:"input="+encodeURIComponent(a)+"&lang="+e});document.querySelector("#audio-response").value=a;a=parseInt(t.recaptcha_solve_delay_time)||1e3,t=t.recaptcha_solve_delay?a-(Time.time()-c):0;0<t&&awaitTime.sleep(t),document.querySelector("#recaptcha-verify-button")?.click()}}for(;;){awaitTime.sleep(1e3);varc,r=awaitBG.exec("Settings.get");r&&r.enabled&&"Speech"===r.recaptcha_solve_method&&(c=awaitLocation.hostname(),r.disabled_hosts.includes(c)||(awaitasyncfunction(){vare=[...document.querySelectorAll('iframe[src*="/recaptcha/api2/bframe"]'),...document.querySelectorAll('iframe[src*="/recaptcha/enterprise/bframe"]')];if(0<e.length){for(consttofe)if("visible"===window.getComputedStyle(t).visibility)returnBG.exec("Cache.set",{name:"recaptcha_image_visible",value:!0,tab_specific:!0});awaitBG.exec("Cache.set",{name:"recaptcha_image_visible",value:!1,tab_specific:!0})}}(),awaitasyncfunction(){vare=[...document.querySelectorAll('iframe[src*="/recaptcha/api2/anchor"]'),...document.querySelectorAll('iframe[src*="/recaptcha/enterprise/anchor"]')];if(0<e.length){for(consttofe)if("visible"===window.getComputedStyle(t).visibility)returnBG.exec("Cache.set",{name:"recaptcha_widget_visible",value:!0,tab_specific:!0});awaitBG.exec("Cache.set",{name:"recaptcha_widget_visible",value:!1,tab_specific:!0})}}(),r.recaptcha_auto_open&&null!==document.querySelector(".recaptcha-checkbox")?awaitt():r.recaptcha_auto_solve&&null!==document.querySelector(".rc-imageselect-instructions")?await(!0===awaitBG.exec("Cache.get",{name:"recaptcha_image_visible",tab_specific:!0})&&!e()&&(awaitTime.sleep(500),!document.querySelector("#recaptcha-audio-button")?.click())):!r.recaptcha_auto_solve||null===document.querySelector("#audio-instructions")&&null===document.querySelector(".rc-doscaptcha-header")||awaita(r)))}})();
(async()=>{functione(){try{functiont(t){return`<p style='font-family: monospace; font-size: 12px; white-space: pre;'>${t}</p>`}vare=[];for(constnofarguments)e.push(t(n));e.push(t('Join us on <a href="https://nopecha.com/discord" target="_blank">Discord</a>')),document.body.innerHTML=e.join("<hr>")}catch(t){}}try{vart,n;document.location.hash?(e("Importing settings..."),awaitBG.exec("Settings.get"),t=SettingsManager.import(document.location.hash),awaitBG.exec("Settings.update",{settings:t}),e(`Visiting this URL will import your NopeCHA settings.
`+JSON.stringify(t,null,4))):e("Invalid URL.\nPlease set the URL hash and reload the page.","Example: https://nopecha.com/setup#TESTKEY123")}catch(t){e("Failed to import settings.\nPlease verify that your URL is formed properly.")}})();
(async()=>{asyncfunctionr(e){functionc(a){returnnewPromise(e=>{constt=newImage;t.onload=()=>e(t),t.src=function(e){lett=e.style.backgroundImage;returnt&&((e=t.trim().match(/(?!^)".*?"/g))&&0!==e.length||(t=null),t=e[0].replaceAll('"',"")),t}(a)})}try{return(awaitasyncfunction(e){vart=document.querySelector(e);if(tinstanceofHTMLCanvasElement)returnt;leta;if(a=tinstanceofHTMLImageElement?t:awaitc(t))return(t=document.createElement("canvas")).width=a.naturalWidth,t.height=a.naturalHeight,t.getContext("2d").drawImage(a,0,0),t;throwError("failed to get image element for "+e)}(e)).toDataURL("image/jpeg").split(";base64,")[1]}catch(e){returnnull}}letl=null;asyncfunctione(){vare,t,a,c,n=(e=500,awaitnewPromise(t=>{leta=!1;constc=setInterval(async()=>{if(!a){a=!0;vare=awaitBG.exec("Settings.get");if(e.textcaptcha_auto_solve){e=awaitr(e.textcaptcha_image_selector);if(e&&l!==e)returnl=e,clearInterval(c),a=!1,t({image_data:e})}a=!1}},e)}))["image_data"],i=awaitBG.exec("Settings.get");i.enabled&&i.textcaptcha_auto_solve&&(c=Time.time(),{job_id:t,data:n}=awaitNopeCHA.post({captcha_type:IS_DEVELOPMENT?"textcaptcha_dev":"textcaptcha",image_data:[n],key:i.key}),n)&&(a=(a=parseInt(i.textcaptcha_solve_delay_time))||100,0<(a=i.textcaptcha_solve_delay?a-(Time.time()-c):0)&&awaitTime.sleep(a),n)&&0<n.length&&(c=document.querySelector(i.textcaptcha_input_selector))&&!c.value&&(c.value=n[0])}for(;;){awaitTime.sleep(1e3);vart,a=awaitBG.exec("Settings.get");a&&a.enabled&&(t=awaitLocation.hostname(),a.disabled_hosts.includes(t)||a.textcaptcha_auto_solve&&function(e){try{vart;returndocument.querySelector(e.textcaptcha_image_selector)?!(!(t=document.querySelector(e.textcaptcha_input_selector))||t.value):void0}catch(e){}}(a)&&awaite())}})();