diff --git a/CHANGELOG.md b/CHANGELOG.md index 569a709..2b7ac7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.21.0] - 2026-10-22 + +### Added + +- **See which bots the Vercel validator blocked, or would have.** When the validator refuses a request on Vercel, or would in monitor mode, it now reports a match key for it: a salted SHA-256 of the client IP and path, never the values themselves. WebDecoy labels the detection of that same request on the Detections page ("Would block" or "Blocked", with the reason), and the Enforcement page links each count to them. A refused request that was never recorded as a bot detection stays a count only. + ## [0.20.0] - 2026-10-20 ### Added diff --git a/package-lock.json b/package-lock.json index b2b8f34..7eb2254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10407,7 +10407,7 @@ }, "packages/client": { "name": "@webdecoy/client", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.11", @@ -10424,10 +10424,10 @@ }, "packages/express": { "name": "@webdecoy/express", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "devDependencies": { "@types/express": "^4.17.21", @@ -10448,10 +10448,10 @@ }, "packages/fastify": { "name": "@webdecoy/fastify", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "dependencies": { - "@webdecoy/node": "^0.20.0", + "@webdecoy/node": "^0.21.0", "fastify-plugin": "^4.5.1" }, "devDependencies": { @@ -10472,10 +10472,10 @@ }, "packages/hono": { "name": "@webdecoy/hono", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "devDependencies": { "@types/jest": "^29.5.11", @@ -10495,10 +10495,10 @@ }, "packages/nextjs": { "name": "@webdecoy/nextjs", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "devDependencies": { "@types/jest": "^29.5.11", @@ -10518,7 +10518,7 @@ }, "packages/webdecoy": { "name": "@webdecoy/node", - "version": "0.20.0", + "version": "0.21.0", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.11", diff --git a/packages/client/package.json b/packages/client/package.json index 5be8261..a9fd590 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/client", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy browser widget - signal collection, proof-of-work, and captcha UI", "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/packages/express/package.json b/packages/express/package.json index 2c4c48e..2c9d868 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/express", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy middleware for Express.js", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -40,7 +40,7 @@ "url": "https://github.com/WebDecoy/node/issues" }, "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "peerDependencies": { "express": "^4.18.0 || ^5.0.0" diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 574d6ab..402424e 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/fastify", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy plugin for Fastify", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -40,7 +40,7 @@ "url": "https://github.com/WebDecoy/node/issues" }, "dependencies": { - "@webdecoy/node": "^0.20.0", + "@webdecoy/node": "^0.21.0", "fastify-plugin": "^4.5.1" }, "peerDependencies": { diff --git a/packages/hono/package.json b/packages/hono/package.json index 3e70c98..ecf6c5a 100644 --- a/packages/hono/package.json +++ b/packages/hono/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/hono", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy middleware for Hono \u2014 Cloudflare Workers, Bun, Deno, Node", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -44,7 +44,7 @@ "url": "https://github.com/WebDecoy/node/issues" }, "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "peerDependencies": { "hono": "^4.0.0" diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 6de0c0c..530201b 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/nextjs", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy middleware for Next.js", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -42,7 +42,7 @@ "url": "https://github.com/WebDecoy/node/issues" }, "dependencies": { - "@webdecoy/node": "^0.20.0" + "@webdecoy/node": "^0.21.0" }, "peerDependencies": { "next": ">=13.0.0" diff --git a/packages/webdecoy/package.json b/packages/webdecoy/package.json index a141a4e..9b4f96f 100644 --- a/packages/webdecoy/package.json +++ b/packages/webdecoy/package.json @@ -1,6 +1,6 @@ { "name": "@webdecoy/node", - "version": "0.20.0", + "version": "0.21.0", "description": "Web Decoy SDK for Node.js - Bot detection with TLS fingerprinting", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/webdecoy/src/clearance/gate.generated.js b/packages/webdecoy/src/clearance/gate.generated.js index 6ec6bfe..89cebfa 100644 --- a/packages/webdecoy/src/clearance/gate.generated.js +++ b/packages/webdecoy/src/clearance/gate.generated.js @@ -1,7 +1,7 @@ // GENERATED by WebDecoy edge/vercel-validator/scripts/bundle.mjs. DO NOT EDIT. -// Build vercel-9971cf5b9746. Regenerate from the validator source; gate-bundle.test.ts fails on a hand edit. -var k={"chat.deepseek.com":"DeepSeek","chat.openai.com":"ChatGPT","chatgpt.com":"ChatGPT","claude.ai":"Claude","copilot.microsoft.com":"Copilot","deepseek.com":"DeepSeek","gemini.google.com":"Gemini","grok.com":"Grok","kagi.com":"Kagi","meta.ai":"Meta AI","perplexity.ai":"Perplexity","phind.com":"Phind","www.deepseek.com":"DeepSeek","www.grok.com":"Grok","www.kagi.com":"Kagi","www.meta.ai":"Meta AI","www.perplexity.ai":"Perplexity","www.phind.com":"Phind","www.you.com":"You.com","you.com":"You.com"};var tt=["utm_source","ref","utm_medium"],oe=500;function rt(e,t){let r=(e??"").trim();if(r)try{return k[new URL(r).hostname.toLowerCase()]??""}catch{return""}let n;try{n=new URL(t)}catch{return""}for(let o of tt)for(let a of n.searchParams.getAll(o)){let i=nt(a);if(i)return i}return""}var ae=e=>e.replace(/[ \-_.]/g,"");function nt(e){let t=e.trim().toLowerCase();if(!t)return"";try{let n=new URL(t).hostname;n&&(t=n.toLowerCase())}catch{}if(t=t.replace(/\.$/,""),k[t])return k[t];let r=ae(t);for(let[n,o]of Object.entries(k))if(r===ae(o.toLowerCase())||r===n.replace(/^www\./,"").replace(/\./g,""))return o;return""}function ie(e,t){if(e.method!=="GET")return null;let r=e.headers;if(r.get("sec-fetch-mode")!=="navigate")return null;let n=r.get("sec-fetch-dest");if(n&&n!=="document")return null;let o=rt(r.get("referer")??"",t.toString());if(!o)return null;let a=t.pathname||"/";return a.length>oe&&(a=a.slice(0,oe)),{platform:o,path:a}}var ot="web-bot-auth";async function se(e,t){let r=e.headers.get("signature-input"),n=e.headers.get("signature");if(!r&&!n)return{status:"none"};if(!r||!n)return{status:"invalid"};if(!t||t.length===0)return{status:"unknown_key"};let o,a;try{o=ut(r),a=gt(n)}catch{return{status:"invalid"}}let i=!1,s=!1;for(let c of o){if(c.params.get("tag")!==ot)continue;i=!0;let u=a.get(c.label);if(!u)continue;let p=c.params.get("keyid");if(typeof p!="string")continue;let w;try{w=at(e,c)}catch{s||=t.some(f=>f.keyid===p);continue}let d=t.find(f=>{if(f.keyid!==p)return!1;try{return ce(f.directory)===w}catch{return!1}});if(!d)continue;s=!0;let y=Date.now()/1e3,b=c.params.get("created"),g=c.params.get("expires");if(typeof b!="number"||typeof g!="number"||y>=g+10||y+101440*60||!c.components.some(f=>f.name==="@authority"||f.name==="@target-uri"))continue;let A;try{A=it(e,c)}catch{continue}let l=!1;try{let f=await crypto.subtle.importKey("raw",pe(d.public_key),{name:"Ed25519"},!1,["verify"]);l=await crypto.subtle.verify({name:"Ed25519"},f,u,new TextEncoder().encode(A))}catch{l=!1}if(l)return{status:"verified",name:d.name,category:d.category,keyid:p}}return s?{status:"invalid"}:i?{status:"unknown_key"}:{status:"none"}}function at(e,t){let r=e.headers.get("signature-agent");if(r===null)throw new Error("missing signature-agent");let n=t.components.find(i=>i.name.toLowerCase()==="signature-agent");if(!n)throw new Error("signature-agent is not covered");let o=r.trim(),a;if(o.startsWith('"')){if(n.keyParam!==void 0)throw new Error("legacy string cannot select a member");let i=new P(o);if(a=fe(i),i.skipSP(),!i.eof())throw new Error("trailing signature-agent data")}else{if(n.keyParam===void 0)throw new Error("dictionary member is not covered");let i=T(o).find(c=>c.key===n.keyParam),s=i?.items[0]?.value;if(!i||i.isList||i.items.length!==1||typeof s!="string")throw new Error("signature-agent member is not a string");a=s}return ce(a)}function ce(e){let t=new URL(e);if(t.protocol!=="https:"||!t.hostname||t.username||t.password)throw new Error("signature-agent must be an https URL");return`https://${H(t)}`}function it(e,t){let r=new URL(e.url),n=[];for(let o of t.components)n.push(`${st(o)}: ${ct(e,r,o)}`);return n.push(`"@signature-params": ${t.raw.trim()}`),n.join(` -`)}function st(e){let t=`"${e.name.toLowerCase()}"`;return e.keyParam!==void 0?`${t};key="${e.keyParam}"`:t}function ct(e,t,r){let n=r.name.toLowerCase();if(n==="@authority")return H(t);if(n==="@target-uri")return`${t.protocol}//${H(t)}${t.pathname}${t.search}`;if(n==="signature-agent"){let o=e.headers.get("signature-agent");if(o===null)throw new Error("signature-agent covered but absent");return r.keyParam!==void 0?lt(o,r.keyParam):o.trim().replace(/\s+/g," ")}throw new Error(`unsupported covered component ${n}`)}function H(e){let t=e.hostname.toLowerCase(),r=e.port;return!r||e.protocol==="https:"&&r==="443"||e.protocol==="http:"&&r==="80"?t:`${t}:${r}`}function lt(e,t){let n=T(e).find(o=>o.key===t);if(!n)throw new Error(`signature-agent has no member ${t}`);return n.raw}function ut(e){return T(e).map(r=>{if(!r.isList)throw new Error(`Signature-Input member ${r.key} is not an inner list`);let n=r.items.map(o=>{if(typeof o.value!="string")throw new Error("component identifier is not a string");let a=o.params.get("key");return{name:o.value,keyParam:typeof a=="string"?a:void 0}});return{label:r.key,components:n,params:r.params,raw:r.raw}})}function gt(e){let t=T(e),r=new Map;for(let n of t){if(n.isList||n.items.length!==1)throw new Error(`Signature member ${n.key} is not a byte sequence`);let o=n.items[0].bytes;if(!o)throw new Error(`Signature member ${n.key} is not a byte sequence`);r.set(n.key,o)}return r}var P=class{constructor(t,r=0){this.s=t;this.i=r}eof(){return this.i>=this.s.length}peek(){return this.s[this.i]}skipSP(){for(;!this.eof()&&(this.peek()===" "||this.peek()===" ");)this.i++}};function T(e){let t=new P(e),r=[];for(t.skipSP();!t.eof();){let o={key:ue(t),raw:"",isList:!1,items:[],params:new Map};if(!t.eof()&&t.peek()==="="){t.i++;let a=t.i;if(!t.eof()&&t.peek()==="(")o.isList=!0,ft(t,o);else{let{value:i,params:s,bytes:c}=le(t);o.items.push({value:i,params:s,...c?{bytes:c}:{}})}o.raw=e.slice(a,t.i)}else o.params=K(t),o.items.push({value:!0,params:new Map});if(r.push(o),t.skipSP(),t.eof())break;if(t.peek()!==",")throw new Error(`expected ',' at ${t.i}`);if(t.i++,t.skipSP(),t.eof())throw new Error("trailing comma")}return r}function ft(e,t){for(e.i++;;){if(e.skipSP(),e.eof())throw new Error("unterminated inner list");if(e.peek()===")"){e.i++;break}let{value:r,params:n}=le(e);if(t.items.push({value:r,params:n}),e.eof())throw new Error("unterminated inner list");let o=e.peek();if(o!==" "&&o!==")")throw new Error(`bad inner list at ${e.i}`)}t.params=K(e)}function le(e){let{value:t,bytes:r}=ge(e),n=K(e);return{value:t,params:n,bytes:r}}function K(e){let t=new Map;for(;!e.eof()&&e.peek()===";";){e.i++,e.skipSP();let r=ue(e),n=!0;if(!e.eof()&&e.peek()==="="){e.i++;let o=ge(e);n=(typeof o.value=="boolean",o.value)}typeof n!="boolean"&&t.set(r,n)}return t}function ue(e){let t=e.peek();if(!t||!/[a-z*]/.test(t))throw new Error(`invalid key at ${e.i}`);let r=e.i;for(;!e.eof()&&/[a-z0-9_\-.*]/.test(e.peek());)e.i++;return e.s.slice(r,e.i)}function ge(e){let t=e.peek();if(t==='"')return{value:fe(e)};if(t===":")return{value:"",bytes:pt(e)};if(t==="?"){e.i++;let r=e.peek();if(e.i++,r==="1")return{value:!0};if(r==="0")return{value:!1};throw new Error("bad boolean")}if(t==="-"||/[0-9]/.test(t))return{value:dt(e)};if(/[a-zA-Z*]/.test(t))return{value:ht(e)};throw new Error(`invalid bare item at ${e.i}`)}function fe(e){e.i++;let t="";for(;!e.eof();){let r=e.s[e.i++];if(r==='"')return t;if(r==="\\"){let n=e.s[e.i++];if(n!=='"'&&n!=="\\")throw new Error("bad escape");t+=n}else{let n=r.charCodeAt(0);if(n<32||n>126)throw new Error("bad char in string");t+=r}}throw new Error("unterminated string")}function pt(e){e.i++;let t=e.i;for(;!e.eof()&&e.peek()!==":";)e.i++;if(e.eof())throw new Error("unterminated byte sequence");let r=e.s.slice(t,e.i);return e.i++,pe(r)}function dt(e){let t=e.i;for(e.peek()==="-"&&e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;if(!e.eof()&&e.peek()===".")for(e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;return Number(e.s.slice(t,e.i))}function ht(e){let t=e.i;for(e.i++;!e.eof()&&/[a-zA-Z0-9!#$%&'*+\-.^_`|~:/]/.test(e.peek());)e.i++;return e.s.slice(t,e.i)}function pe(e){let t=atob(e),r=new Uint8Array(new ArrayBuffer(t.length));for(let n=0;n0?Object.keys(z).find(t=>z[t]===e)??"":""}function he(e){return e=wt(e),e=yt(e),e.toLowerCase()}function wt(e){for(let t=0;t<4;t++){let r=bt(e);if(r===e)break;e=r}return e}function bt(e){if(!e.includes("%"))return e;let t="";for(let r=0;r=0&&o>=0){let a=n<<4|o;if(a<128){t+=String.fromCharCode(a),r+=2;continue}}}t+=e[r]}return t}function me(e){return e>=48&&e<=57?e-48:e>=97&&e<=102?e-97+10:e>=65&&e<=70?e-65+10:-1}function yt(e){if(e==="")return e;let t=e.length>1&&e[e.length-1]==="/",r=[];for(let o of e.split("/"))if(!(o===""||o===".")){if(o===".."){r.length>0&&r.pop();continue}r.push(o)}let n="/"+r.join("/");return t&&n!=="/"&&(n+="/"),n}function O(e,t){let r=he(e),n=he(t);if(n.endsWith("/*")){let o=n.slice(0,-2);return o===""?!0:r===o||r.startsWith(o+"/")}return r===n}function B(e){return e.endsWith("/*")?e.length-2:1<<20}function we(e,t,r){let n=new Map,o=new Set,a=[],i=[],s=new Map,c=(l,f)=>{let v=new Set(l);for(let R of f)for(let _ of s.get(R)??[])v.add(_);return v.size===0?void 0:[...v].sort()},u=(l,f,v)=>v?{pattern:l,required_trust:f,refused_behaviors:v}:{pattern:l,required_trust:f};for(let l of t){if(!O(e,l.pattern))continue;if((l.exceptions??[]).some(R=>O(e,R))){i.push(l.pattern);continue}let f=n.get(l.pattern);f===void 0&&a.push(l.pattern);let v=mt(l.min_trust);(f===void 0||v>f)&&n.set(l.pattern,v),l.mode!=="monitor"&&o.add(l.pattern);for(let R of l.refuse_behaviors??[])s.has(l.pattern)||s.set(l.pattern,new Set),s.get(l.pattern)?.add(R)}let p=[];if(a.length===0){let l="";for(let f of i)(l===""||B(f)>B(l))&&(l=f);return{covering:a,deciding_mode:"",attributed:"",required_trust:"",requirement_source:"",previews:p,excepted_by:l,refused_behaviors:[]}}a.sort((l,f)=>B(f)-B(l));let w=r==="monitor",d=a.filter(l=>o.has(l)),y=w?"monitor":"enforce";if(d.length===0){if(!w)for(let l of a)p.push(u(l,V(n.get(l)??0),c([],[l])));d=a,y="monitor"}let b=0,g="";for(let l of d){let f=n.get(l)??0;f>b&&(b=f,g=l)}let A=c([],d)??[];if(y==="enforce")for(let l of a)o.has(l)||p.push(u(l,V(Math.max(b,n.get(l)??0)),c(A,[l])));return{covering:a,deciding_mode:y,attributed:d[0],required_trust:V(b),requirement_source:g,previews:p,excepted_by:"",refused_behaviors:A}}var vt="other",_t={"search engine crawler":"search","ai search":"search","ai assistant":"agent","ai crawler":"training","page preview":"link_preview","feed fetcher":"feeds","monitoring & analytics":"monitoring","search engine optimization":"seo",security:"security_testing"};function I(e){let t=e.trim().toLowerCase();return t?_t[t]??vt:""}function W(e,t){let r=I(e);return r!==""&&t.includes(r)}var xt={search_engines:["search engine crawler"],ai_crawlers:["ai assistant","ai crawler","ai search"],monitoring:["monitoring & analytics"]};function be(e,t){let r=xt[e];return r?r.every(n=>W(n,t)):!1}var At=O;function ye(e,t,r){return e?t?t.some(n=>At(r,n)):!0:!1}var Rt="x-wd-service-token",Ct="wd_clearance";function ve(e,t,r=[]){if(e.graded&&t&&!Bt(e.graded.trust,t))return{pass:!1,label:"insufficient-trust"};if(e.crawler&&r.length>0){if(e.crawler.behavior&&r.includes(e.crawler.behavior))return{pass:!1,label:"crawler-refused"};if(!e.crawler.behavior&&e.crawler.exempted)return{pass:!1,label:"missing"}}return{pass:e.pass,label:e.label}}async function Re(e,t,r){let n=new URL(e.url).pathname,o=we(n,Pt(t),t.mode),a=o.deciding_mode||t.mode,i=await kt(e,t,r,o.covering.length>0,o.excepted_by!==""),s=i.behavior??"",c=ve(i,o.required_trust,o.refused_behaviors),u=c.label==="excepted"?o.excepted_by:c.label==="unscoped"?"":o.attributed,p=!c.pass&&a==="enforce",w=o.previews.map(d=>{let y=ve(i,d.required_trust,d.refused_behaviors??[]);return{pattern:d.pattern,refused:!y.pass&&!p?y.label:""}});return{pass:c.pass,label:c.label,pattern:u,mode:a,previews:w,behavior:c.pass?s:"",crawlerBehavior:i.crawler?.behavior??"",referral:ie(e,new URL(e.url)),outsideReach:i.outsideReach??""}}async function kt(e,t,r,n,o){let a=await St(e,t,r);if(a.grants)return{pass:!0,label:"machine"};let i=await Et(e,t,r,n,o);return a.outsideReach?{...i,outsideReach:a.outsideReach}:i}async function St(e,t,r){let n=e.headers.get(Rt);if(!n)return{grants:!1,outsideReach:""};let o=await ke(n,t.keys,r.siteKey);if(!o||o.typ!=="machine"||!o.sub)return{grants:!1,outsideReach:""};if(t.active_credentials.includes(o.sub))return{grants:!0,outsideReach:""};let a=(t.restricted_credentials??[]).find(s=>s&&s.id===o.sub);if(!a)return{grants:!1,outsideReach:""};let i=new URL(e.url).pathname;return ye(a.here,a.paths,i)?{grants:!0,outsideReach:""}:{grants:!1,outsideReach:o.sub}}async function Et(e,t,r,n,o){let a=await r.verifiedBotCategory(e,n)||"",i=a?{behavior:I(a),exempted:!1}:void 0;if(a&&Ot(a,t)){let p=I(a);return{pass:!0,label:"verified-bot",behavior:p,crawler:{behavior:p,exempted:!0}}}let s=await se(e,t.signed_agents);if(s.status==="verified"&&It(s.category,t))return{pass:!0,label:"signed-agent",behavior:xe(s.category),crawler:{behavior:xe(s.category),exempted:!0}};if(s.status==="invalid"&&n)return{pass:!1,label:"agent-impersonation",crawler:i};if(!n)return o?{pass:!0,label:"excepted",crawler:i}:{pass:!0,label:"unscoped",crawler:i};let c=j(e.headers.get("cookie")??"",Ct);if(!c)return{pass:!1,label:"missing",crawler:i};let u=await ke(c,t.keys,r.siteKey);return!u||(u.typ??"")!==""?{pass:!1,label:"invalid",crawler:i}:t.denied_fps&&t.denied_fps.includes(u.fp)?{pass:!1,label:"revoked",crawler:i}:{pass:!0,label:"valid",graded:{trust:u.trust},crawler:i}}function Pt(e){let t=new Set(e.routes),r=new Map;for(let o of e.route_exceptions??[])t.has(o.pattern)&&Array.isArray(o.except)&&r.set(o.pattern,o.except);let n=e.routes.map(o=>({pattern:o,exceptions:r.get(o)}));for(let o of e.route_min_trust??[])t.has(o.pattern)&&n.push({pattern:o.pattern,min_trust:o.min_trust,exceptions:r.get(o.pattern)});for(let o of e.monitor_routes??[])n.push({pattern:o.pattern,min_trust:o.min_trust,mode:"monitor",exceptions:o.except});for(let o of e.route_refusals??[])!Array.isArray(o.refuse_behaviors)||o.refuse_behaviors.length===0||(o.mode==="monitor"?n.push({pattern:o.pattern,mode:"monitor",refuse_behaviors:o.refuse_behaviors}):t.has(o.pattern)&&n.push({pattern:o.pattern,exceptions:r.get(o.pattern),refuse_behaviors:o.refuse_behaviors}));return n}var Tt={"attested-human":2,"human-likely":1,clean:0};function _e(e){return Tt[e??""]??0}function Bt(e,t){return _e(e)>=_e(t)}function Ot(e,t){let r=t.allow_behaviors;return r?W(e,r):Dt(e,t.allow)}function It(e,t){let r=t.allow_behaviors;return r?be(e,r):de(e,t.allow)}function xe(e){return e==="search_engines"?"search":e==="monitoring"?"monitoring":""}function Dt(e,t){let r=e.trim().toLowerCase();return!!(t.search_engines&&r.includes("search engine crawler")||t.ai_crawlers&&r.startsWith("ai ")||t.monitoring&&r.includes("monitoring"))}function F(e){return!e.pass&&e.mode==="enforce"&&(e.label==="missing"||e.label==="invalid")}function Ce(e){return F(e)?{...e,pass:!0,label:"outage-pass"}:e}function j(e,t){for(let r of e.split(";")){let n=r.indexOf("=");if(!(n<0)&&r.slice(0,n).trim()===t)return r.slice(n+1).trim()||null}return null}async function ke(e,t,r){try{let n=e.indexOf(".");if(n<0)return null;let o=Ae(e.slice(0,n)),a=Ae(e.slice(n+1)),i=JSON.parse(new TextDecoder().decode(o)),s=t.find(p=>p.kid===i.kid);if(!s)return null;let c=await crypto.subtle.importKey("raw",Mt(s.public_key),{name:"Ed25519"},!1,["verify"]);return!await crypto.subtle.verify({name:"Ed25519"},c,a,o)||i.tenant!==r||Date.now()/1e3>=i.exp?null:i}catch{return null}}function Ae(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);return Se(atob(t))}function Mt(e){return Se(atob(e))}function Se(e){let t=new Uint8Array(new ArrayBuffer(e.length));for(let r=0;r{let o=!1;try{let a=new AbortController,i=setTimeout(()=>a.abort(),3e3);try{let s=await n(e.replace(/\/+$/,"")+"/api/v1/clearance",{method:"POST",headers:{"content-type":"application/json","user-agent":"WebDecoy-OutageProbe/1"},body:JSON.stringify({aid:t,fp:"wd-outage-probe",scope:"",ua:"WebDecoy-OutageProbe/1"}),signal:a.signal});s.status<300&&(o=typeof(await s.json())?.granted=="boolean")}finally{clearTimeout(i)}}catch{o=!1}return D={at:r,available:o},o})();try{return await S}finally{S=null}}function Ee(e){let t="";for(let r of new Uint8Array(e))t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function Pe(e,t){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Ee(await crypto.subtle.sign("HMAC",r,new TextEncoder().encode(t)))}async function Te(e){return Ee(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e))).slice(0,16)}function Be(e,t,r){return`${Lt}|${e}|${t}|${r}`}async function Nt(e,t,r,n){let o=Math.floor(n/1e3)+300;return`${o}.${await Pe(e,Be(t,o,await Te(r)))}`}async function Oe(e,t,r,n,o){if(!t||!e)return!1;let a=e.indexOf(".");if(a<=0)return!1;let i=Number(e.slice(0,a));if(!Number.isInteger(i)||i<=Math.floor(o/1e3)||i>Math.floor(o/1e3)+300)return!1;let s=await Pe(t,Be(r,i,await Te(n))),c=e.slice(a+1);if(c.length!==s.length)return!1;let u=0;for(let p=0;pnew Response(JSON.stringify(s),{status:i,headers:{"content-type":"application/json","cache-control":"no-store",...c}});if(e.method!=="POST")return o(405,{pass:!1});if(!t.sensorKey)return o(503,{pass:!1,reason:"unsupported"});if(await Ut(t.apiBase,t.siteKey,r,n))return o(409,{pass:!1,reason:"mint_available"});let a=await Nt(t.sensorKey,t.host,e.headers.get("user-agent")??"",r);return o(200,{pass:!0,expires_in:300},{"set-cookie":`${q}=${a}; Path=/; Secure; SameSite=Lax; HttpOnly; Max-Age=300`})}var Gt="wdfp1",De=` +// Build vercel-895bda3b1f84. Regenerate from the validator source; gate-bundle.test.ts fails on a hand edit. +var k={"chat.deepseek.com":"DeepSeek","chat.openai.com":"ChatGPT","chatgpt.com":"ChatGPT","claude.ai":"Claude","copilot.microsoft.com":"Copilot","deepseek.com":"DeepSeek","gemini.google.com":"Gemini","grok.com":"Grok","kagi.com":"Kagi","meta.ai":"Meta AI","perplexity.ai":"Perplexity","phind.com":"Phind","www.deepseek.com":"DeepSeek","www.grok.com":"Grok","www.kagi.com":"Kagi","www.meta.ai":"Meta AI","www.perplexity.ai":"Perplexity","www.phind.com":"Phind","www.you.com":"You.com","you.com":"You.com"};var rt=["utm_source","ref","utm_medium"],ae=500;function nt(e,t){let r=(e??"").trim();if(r)try{return k[new URL(r).hostname.toLowerCase()]??""}catch{return""}let n;try{n=new URL(t)}catch{return""}for(let o of rt)for(let a of n.searchParams.getAll(o)){let i=ot(a);if(i)return i}return""}var ie=e=>e.replace(/[ \-_.]/g,"");function ot(e){let t=e.trim().toLowerCase();if(!t)return"";try{let n=new URL(t).hostname;n&&(t=n.toLowerCase())}catch{}if(t=t.replace(/\.$/,""),k[t])return k[t];let r=ie(t);for(let[n,o]of Object.entries(k))if(r===ie(o.toLowerCase())||r===n.replace(/^www\./,"").replace(/\./g,""))return o;return""}function se(e,t){if(e.method!=="GET")return null;let r=e.headers;if(r.get("sec-fetch-mode")!=="navigate")return null;let n=r.get("sec-fetch-dest");if(n&&n!=="document")return null;let o=nt(r.get("referer")??"",t.toString());if(!o)return null;let a=t.pathname||"/";return a.length>ae&&(a=a.slice(0,ae)),{platform:o,path:a}}var at="web-bot-auth";async function ce(e,t){let r=e.headers.get("signature-input"),n=e.headers.get("signature");if(!r&&!n)return{status:"none"};if(!r||!n)return{status:"invalid"};if(!t||t.length===0)return{status:"unknown_key"};let o,a;try{o=gt(r),a=ft(n)}catch{return{status:"invalid"}}let i=!1,s=!1;for(let c of o){if(c.params.get("tag")!==at)continue;i=!0;let p=a.get(c.label);if(!p)continue;let l=c.params.get("keyid");if(typeof l!="string")continue;let h;try{h=it(e,c)}catch{s||=t.some(f=>f.keyid===l);continue}let d=t.find(f=>{if(f.keyid!==l)return!1;try{return le(f.directory)===h}catch{return!1}});if(!d)continue;s=!0;let w=Date.now()/1e3,b=c.params.get("created"),g=c.params.get("expires");if(typeof b!="number"||typeof g!="number"||w>=g+10||w+101440*60||!c.components.some(f=>f.name==="@authority"||f.name==="@target-uri"))continue;let A;try{A=st(e,c)}catch{continue}let u=!1;try{let f=await crypto.subtle.importKey("raw",de(d.public_key),{name:"Ed25519"},!1,["verify"]);u=await crypto.subtle.verify({name:"Ed25519"},f,p,new TextEncoder().encode(A))}catch{u=!1}if(u)return{status:"verified",name:d.name,category:d.category,keyid:l}}return s?{status:"invalid"}:i?{status:"unknown_key"}:{status:"none"}}function it(e,t){let r=e.headers.get("signature-agent");if(r===null)throw new Error("missing signature-agent");let n=t.components.find(i=>i.name.toLowerCase()==="signature-agent");if(!n)throw new Error("signature-agent is not covered");let o=r.trim(),a;if(o.startsWith('"')){if(n.keyParam!==void 0)throw new Error("legacy string cannot select a member");let i=new T(o);if(a=pe(i),i.skipSP(),!i.eof())throw new Error("trailing signature-agent data")}else{if(n.keyParam===void 0)throw new Error("dictionary member is not covered");let i=B(o).find(c=>c.key===n.keyParam),s=i?.items[0]?.value;if(!i||i.isList||i.items.length!==1||typeof s!="string")throw new Error("signature-agent member is not a string");a=s}return le(a)}function le(e){let t=new URL(e);if(t.protocol!=="https:"||!t.hostname||t.username||t.password)throw new Error("signature-agent must be an https URL");return`https://${H(t)}`}function st(e,t){let r=new URL(e.url),n=[];for(let o of t.components)n.push(`${ct(o)}: ${lt(e,r,o)}`);return n.push(`"@signature-params": ${t.raw.trim()}`),n.join(` +`)}function ct(e){let t=`"${e.name.toLowerCase()}"`;return e.keyParam!==void 0?`${t};key="${e.keyParam}"`:t}function lt(e,t,r){let n=r.name.toLowerCase();if(n==="@authority")return H(t);if(n==="@target-uri")return`${t.protocol}//${H(t)}${t.pathname}${t.search}`;if(n==="signature-agent"){let o=e.headers.get("signature-agent");if(o===null)throw new Error("signature-agent covered but absent");return r.keyParam!==void 0?ut(o,r.keyParam):o.trim().replace(/\s+/g," ")}throw new Error(`unsupported covered component ${n}`)}function H(e){let t=e.hostname.toLowerCase(),r=e.port;return!r||e.protocol==="https:"&&r==="443"||e.protocol==="http:"&&r==="80"?t:`${t}:${r}`}function ut(e,t){let n=B(e).find(o=>o.key===t);if(!n)throw new Error(`signature-agent has no member ${t}`);return n.raw}function gt(e){return B(e).map(r=>{if(!r.isList)throw new Error(`Signature-Input member ${r.key} is not an inner list`);let n=r.items.map(o=>{if(typeof o.value!="string")throw new Error("component identifier is not a string");let a=o.params.get("key");return{name:o.value,keyParam:typeof a=="string"?a:void 0}});return{label:r.key,components:n,params:r.params,raw:r.raw}})}function ft(e){let t=B(e),r=new Map;for(let n of t){if(n.isList||n.items.length!==1)throw new Error(`Signature member ${n.key} is not a byte sequence`);let o=n.items[0].bytes;if(!o)throw new Error(`Signature member ${n.key} is not a byte sequence`);r.set(n.key,o)}return r}var T=class{constructor(t,r=0){this.s=t;this.i=r}eof(){return this.i>=this.s.length}peek(){return this.s[this.i]}skipSP(){for(;!this.eof()&&(this.peek()===" "||this.peek()===" ");)this.i++}};function B(e){let t=new T(e),r=[];for(t.skipSP();!t.eof();){let o={key:ge(t),raw:"",isList:!1,items:[],params:new Map};if(!t.eof()&&t.peek()==="="){t.i++;let a=t.i;if(!t.eof()&&t.peek()==="(")o.isList=!0,pt(t,o);else{let{value:i,params:s,bytes:c}=ue(t);o.items.push({value:i,params:s,...c?{bytes:c}:{}})}o.raw=e.slice(a,t.i)}else o.params=V(t),o.items.push({value:!0,params:new Map});if(r.push(o),t.skipSP(),t.eof())break;if(t.peek()!==",")throw new Error(`expected ',' at ${t.i}`);if(t.i++,t.skipSP(),t.eof())throw new Error("trailing comma")}return r}function pt(e,t){for(e.i++;;){if(e.skipSP(),e.eof())throw new Error("unterminated inner list");if(e.peek()===")"){e.i++;break}let{value:r,params:n}=ue(e);if(t.items.push({value:r,params:n}),e.eof())throw new Error("unterminated inner list");let o=e.peek();if(o!==" "&&o!==")")throw new Error(`bad inner list at ${e.i}`)}t.params=V(e)}function ue(e){let{value:t,bytes:r}=fe(e),n=V(e);return{value:t,params:n,bytes:r}}function V(e){let t=new Map;for(;!e.eof()&&e.peek()===";";){e.i++,e.skipSP();let r=ge(e),n=!0;if(!e.eof()&&e.peek()==="="){e.i++;let o=fe(e);n=(typeof o.value=="boolean",o.value)}typeof n!="boolean"&&t.set(r,n)}return t}function ge(e){let t=e.peek();if(!t||!/[a-z*]/.test(t))throw new Error(`invalid key at ${e.i}`);let r=e.i;for(;!e.eof()&&/[a-z0-9_\-.*]/.test(e.peek());)e.i++;return e.s.slice(r,e.i)}function fe(e){let t=e.peek();if(t==='"')return{value:pe(e)};if(t===":")return{value:"",bytes:dt(e)};if(t==="?"){e.i++;let r=e.peek();if(e.i++,r==="1")return{value:!0};if(r==="0")return{value:!1};throw new Error("bad boolean")}if(t==="-"||/[0-9]/.test(t))return{value:ht(e)};if(/[a-zA-Z*]/.test(t))return{value:mt(e)};throw new Error(`invalid bare item at ${e.i}`)}function pe(e){e.i++;let t="";for(;!e.eof();){let r=e.s[e.i++];if(r==='"')return t;if(r==="\\"){let n=e.s[e.i++];if(n!=='"'&&n!=="\\")throw new Error("bad escape");t+=n}else{let n=r.charCodeAt(0);if(n<32||n>126)throw new Error("bad char in string");t+=r}}throw new Error("unterminated string")}function dt(e){e.i++;let t=e.i;for(;!e.eof()&&e.peek()!==":";)e.i++;if(e.eof())throw new Error("unterminated byte sequence");let r=e.s.slice(t,e.i);return e.i++,de(r)}function ht(e){let t=e.i;for(e.peek()==="-"&&e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;if(!e.eof()&&e.peek()===".")for(e.i++;!e.eof()&&/[0-9]/.test(e.peek());)e.i++;return Number(e.s.slice(t,e.i))}function mt(e){let t=e.i;for(e.i++;!e.eof()&&/[a-zA-Z0-9!#$%&'*+\-.^_`|~:/]/.test(e.peek());)e.i++;return e.s.slice(t,e.i)}function de(e){let t=atob(e),r=new Uint8Array(new ArrayBuffer(t.length));for(let n=0;n0?Object.keys(W).find(t=>W[t]===e)??"":""}function me(e){return e=bt(e),e=vt(e),e.toLowerCase()}function bt(e){for(let t=0;t<4;t++){let r=yt(e);if(r===e)break;e=r}return e}function yt(e){if(!e.includes("%"))return e;let t="";for(let r=0;r=0&&o>=0){let a=n<<4|o;if(a<128){t+=String.fromCharCode(a),r+=2;continue}}}t+=e[r]}return t}function we(e){return e>=48&&e<=57?e-48:e>=97&&e<=102?e-97+10:e>=65&&e<=70?e-65+10:-1}function vt(e){if(e==="")return e;let t=e.length>1&&e[e.length-1]==="/",r=[];for(let o of e.split("/"))if(!(o===""||o===".")){if(o===".."){r.length>0&&r.pop();continue}r.push(o)}let n="/"+r.join("/");return t&&n!=="/"&&(n+="/"),n}function I(e,t){let r=me(e),n=me(t);if(n.endsWith("/*")){let o=n.slice(0,-2);return o===""?!0:r===o||r.startsWith(o+"/")}return r===n}function O(e){return e.endsWith("/*")?e.length-2:1<<20}function be(e,t,r){let n=new Map,o=new Set,a=[],i=[],s=new Map,c=(u,f)=>{let v=new Set(u);for(let C of f)for(let _ of s.get(C)??[])v.add(_);return v.size===0?void 0:[...v].sort()},p=(u,f,v)=>v?{pattern:u,required_trust:f,refused_behaviors:v}:{pattern:u,required_trust:f};for(let u of t){if(!I(e,u.pattern))continue;if((u.exceptions??[]).some(C=>I(e,C))){i.push(u.pattern);continue}let f=n.get(u.pattern);f===void 0&&a.push(u.pattern);let v=wt(u.min_trust);(f===void 0||v>f)&&n.set(u.pattern,v),u.mode!=="monitor"&&o.add(u.pattern);for(let C of u.refuse_behaviors??[])s.has(u.pattern)||s.set(u.pattern,new Set),s.get(u.pattern)?.add(C)}let l=[];if(a.length===0){let u="";for(let f of i)(u===""||O(f)>O(u))&&(u=f);return{covering:a,deciding_mode:"",attributed:"",required_trust:"",requirement_source:"",previews:l,excepted_by:u,refused_behaviors:[]}}a.sort((u,f)=>O(f)-O(u));let h=r==="monitor",d=a.filter(u=>o.has(u)),w=h?"monitor":"enforce";if(d.length===0){if(!h)for(let u of a)l.push(p(u,z(n.get(u)??0),c([],[u])));d=a,w="monitor"}let b=0,g="";for(let u of d){let f=n.get(u)??0;f>b&&(b=f,g=u)}let A=c([],d)??[];if(w==="enforce")for(let u of a)o.has(u)||l.push(p(u,z(Math.max(b,n.get(u)??0)),c(A,[u])));return{covering:a,deciding_mode:w,attributed:d[0],required_trust:z(b),requirement_source:g,previews:l,excepted_by:"",refused_behaviors:A}}var _t="other",xt={"search engine crawler":"search","ai search":"search","ai assistant":"agent","ai crawler":"training","page preview":"link_preview","feed fetcher":"feeds","monitoring & analytics":"monitoring","search engine optimization":"seo",security:"security_testing"};function D(e){let t=e.trim().toLowerCase();return t?xt[t]??_t:""}function F(e,t){let r=D(e);return r!==""&&t.includes(r)}var At={search_engines:["search engine crawler"],ai_crawlers:["ai assistant","ai crawler","ai search"],monitoring:["monitoring & analytics"]};function ye(e,t){let r=At[e];return r?r.every(n=>F(n,t)):!1}var Rt=I;function ve(e,t,r){return e?t?t.some(n=>Rt(r,n)):!0:!1}var Ct="x-wd-service-token",St="wd_clearance";function _e(e,t,r=[]){if(e.graded&&t&&!Ot(e.graded.trust,t))return{pass:!1,label:"insufficient-trust"};if(e.crawler&&r.length>0){if(e.crawler.behavior&&r.includes(e.crawler.behavior))return{pass:!1,label:"crawler-refused"};if(!e.crawler.behavior&&e.crawler.exempted)return{pass:!1,label:"missing"}}return{pass:e.pass,label:e.label}}async function Ce(e,t,r){let n=new URL(e.url).pathname,o=be(n,Tt(t),t.mode),a=o.deciding_mode||t.mode,i=await kt(e,t,r,o.covering.length>0,o.excepted_by!==""),s=i.behavior??"",c=_e(i,o.required_trust,o.refused_behaviors),p=c.label==="excepted"?o.excepted_by:c.label==="unscoped"?"":o.attributed,l=!c.pass&&a==="enforce",h=o.previews.map(d=>{let w=_e(i,d.required_trust,d.refused_behaviors??[]);return{pattern:d.pattern,refused:!w.pass&&!l?w.label:""}});return{pass:c.pass,label:c.label,pattern:p,mode:a,previews:h,behavior:c.pass?s:"",crawlerBehavior:i.crawler?.behavior??"",referral:se(e,new URL(e.url)),outsideReach:i.outsideReach??""}}async function kt(e,t,r,n,o){let a=await Et(e,t,r);if(a.grants)return{pass:!0,label:"machine"};let i=await Pt(e,t,r,n,o);return a.outsideReach?{...i,outsideReach:a.outsideReach}:i}async function Et(e,t,r){let n=e.headers.get(Ct);if(!n)return{grants:!1,outsideReach:""};let o=await ke(n,t.keys,r.siteKey);if(!o||o.typ!=="machine"||!o.sub)return{grants:!1,outsideReach:""};if(t.active_credentials.includes(o.sub))return{grants:!0,outsideReach:""};let a=(t.restricted_credentials??[]).find(s=>s&&s.id===o.sub);if(!a)return{grants:!1,outsideReach:""};let i=new URL(e.url).pathname;return ve(a.here,a.paths,i)?{grants:!0,outsideReach:""}:{grants:!1,outsideReach:o.sub}}async function Pt(e,t,r,n,o){let a=await r.verifiedBotCategory(e,n)||"",i=a?{behavior:D(a),exempted:!1}:void 0;if(a&&It(a,t)){let l=D(a);return{pass:!0,label:"verified-bot",behavior:l,crawler:{behavior:l,exempted:!0}}}let s=await ce(e,t.signed_agents);if(s.status==="verified"&&Dt(s.category,t))return{pass:!0,label:"signed-agent",behavior:Ae(s.category),crawler:{behavior:Ae(s.category),exempted:!0}};if(s.status==="invalid"&&n)return{pass:!1,label:"agent-impersonation",crawler:i};if(!n)return o?{pass:!0,label:"excepted",crawler:i}:{pass:!0,label:"unscoped",crawler:i};let c=q(e.headers.get("cookie")??"",St);if(!c)return{pass:!1,label:"missing",crawler:i};let p=await ke(c,t.keys,r.siteKey);return!p||(p.typ??"")!==""?{pass:!1,label:"invalid",crawler:i}:t.denied_fps&&t.denied_fps.includes(p.fp)?{pass:!1,label:"revoked",crawler:i}:{pass:!0,label:"valid",graded:{trust:p.trust},crawler:i}}function Tt(e){let t=new Set(e.routes),r=new Map;for(let o of e.route_exceptions??[])t.has(o.pattern)&&Array.isArray(o.except)&&r.set(o.pattern,o.except);let n=e.routes.map(o=>({pattern:o,exceptions:r.get(o)}));for(let o of e.route_min_trust??[])t.has(o.pattern)&&n.push({pattern:o.pattern,min_trust:o.min_trust,exceptions:r.get(o.pattern)});for(let o of e.monitor_routes??[])n.push({pattern:o.pattern,min_trust:o.min_trust,mode:"monitor",exceptions:o.except});for(let o of e.route_refusals??[])!Array.isArray(o.refuse_behaviors)||o.refuse_behaviors.length===0||(o.mode==="monitor"?n.push({pattern:o.pattern,mode:"monitor",refuse_behaviors:o.refuse_behaviors}):t.has(o.pattern)&&n.push({pattern:o.pattern,exceptions:r.get(o.pattern),refuse_behaviors:o.refuse_behaviors}));return n}var Bt={"attested-human":2,"human-likely":1,clean:0};function xe(e){return Bt[e??""]??0}function Ot(e,t){return xe(e)>=xe(t)}function It(e,t){let r=t.allow_behaviors;return r?F(e,r):Mt(e,t.allow)}function Dt(e,t){let r=t.allow_behaviors;return r?ye(e,r):he(e,t.allow)}function Ae(e){return e==="search_engines"?"search":e==="monitoring"?"monitoring":""}function Mt(e,t){let r=e.trim().toLowerCase();return!!(t.search_engines&&r.includes("search engine crawler")||t.ai_crawlers&&r.startsWith("ai ")||t.monitoring&&r.includes("monitoring"))}function j(e){return!e.pass&&e.mode==="enforce"&&(e.label==="missing"||e.label==="invalid")}function Se(e){return j(e)?{...e,pass:!0,label:"outage-pass"}:e}function q(e,t){for(let r of e.split(";")){let n=r.indexOf("=");if(!(n<0)&&r.slice(0,n).trim()===t)return r.slice(n+1).trim()||null}return null}async function ke(e,t,r){try{let n=e.indexOf(".");if(n<0)return null;let o=Re(e.slice(0,n)),a=Re(e.slice(n+1)),i=JSON.parse(new TextDecoder().decode(o)),s=t.find(l=>l.kid===i.kid);if(!s)return null;let c=await crypto.subtle.importKey("raw",Lt(s.public_key),{name:"Ed25519"},!1,["verify"]);return!await crypto.subtle.verify({name:"Ed25519"},c,a,o)||i.tenant!==r||Date.now()/1e3>=i.exp?null:i}catch{return null}}function Re(e){let t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);return Ee(atob(t))}function Lt(e){return Ee(atob(e))}function Ee(e){let t=new Uint8Array(new ArrayBuffer(e.length));for(let r=0;r{let o=!1;try{let a=new AbortController,i=setTimeout(()=>a.abort(),3e3);try{let s=await n(e.replace(/\/+$/,"")+"/api/v1/clearance",{method:"POST",headers:{"content-type":"application/json","user-agent":"WebDecoy-OutageProbe/1"},body:JSON.stringify({aid:t,fp:"wd-outage-probe",scope:"",ua:"WebDecoy-OutageProbe/1"}),signal:a.signal});s.status<300&&(o=typeof(await s.json())?.granted=="boolean")}finally{clearTimeout(i)}}catch{o=!1}return M={at:r,available:o},o})();try{return await E}finally{E=null}}function Pe(e){let t="";for(let r of new Uint8Array(e))t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function Te(e,t){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Pe(await crypto.subtle.sign("HMAC",r,new TextEncoder().encode(t)))}async function Be(e){return Pe(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e))).slice(0,16)}function Oe(e,t,r){return`${Ut}|${e}|${t}|${r}`}async function $t(e,t,r,n){let o=Math.floor(n/1e3)+300;return`${o}.${await Te(e,Oe(t,o,await Be(r)))}`}async function Ie(e,t,r,n,o){if(!t||!e)return!1;let a=e.indexOf(".");if(a<=0)return!1;let i=Number(e.slice(0,a));if(!Number.isInteger(i)||i<=Math.floor(o/1e3)||i>Math.floor(o/1e3)+300)return!1;let s=await Te(t,Oe(r,i,await Be(n))),c=e.slice(a+1);if(c.length!==s.length)return!1;let p=0;for(let l=0;lnew Response(JSON.stringify(s),{status:i,headers:{"content-type":"application/json","cache-control":"no-store",...c}});if(e.method!=="POST")return o(405,{pass:!1});if(!t.sensorKey)return o(503,{pass:!1,reason:"unsupported"});if(await Nt(t.apiBase,t.siteKey,r,n))return o(409,{pass:!1,reason:"mint_available"});let a=await $t(t.sensorKey,t.host,e.headers.get("user-agent")??"",r);return o(200,{pass:!0,expires_in:300},{"set-cookie":`${J}=${a}; Path=/; Secure; SameSite=Lax; HttpOnly; Max-Age=300`})}var Gt="wdfp1",Me=` async function wdDeviceFP() { // Canvas: 32-bit rolling hash of the dataURL, matching // EnvironmentalCollector._getCanvasHash in @webdecoy/client. The drawing @@ -48,7 +48,7 @@ async function wdDeviceFP() { return { fp: fp, canvas32: canvas32, webgl: webgl }; } -`;function J(e){let r=["missing","invalid","insufficient-trust","revoked","crawler-refused","agent-impersonation"].includes(e)?e:"denied";return{version:1,reason:r,recoverable:r==="missing"||r==="invalid"||r==="insufficient-trust"}}function Me(e){let t=J(e);return{"cache-control":"no-store","x-wd-clearance":"challenged","x-wd-challenge":String(t.version),"x-wd-challenge-reason":t.reason,"x-wd-challenge-recoverable":String(t.recoverable)}}var $t=6e4,L="x-wd-clearance",Le="x-wd-class",Ue="__wd_clearance_check",Z="/.well-known/wd-clearance/pat",E=new Map,Ht=16,Kt=3e4,Vt=3e5,X=new Map,Y=new Map,zt=86400;function Ne(e,t){return`https://wd-config.invalid/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function Ge(){try{return globalThis.caches?.default??null}catch{return null}}async function $e(e,t){let r=Ge();if(!r)return null;try{let n=await r.match(Ne(e,t));return n?await n.json():null}catch{return null}}async function Wt(e,t,r){let n=Ge();if(n)try{await n.put(Ne(e,t),new Response(JSON.stringify(r),{headers:{"content-type":"application/json","cache-control":`max-age=${zt}`}}))}catch{}}function Ft(e){let t=e?.headers.get("retry-after"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?Math.min(Math.max(r*1e3,5e3),Vt):Kt}async function He(e,t){let r=Date.now(),n=t,o=E.get(n);if(o&&r-o.at<$t)return o.config;let a=X.get(n);if(a!==void 0&&rHt){let c=E.keys().next();c.done||E.delete(c.value)}return await Wt(e.siteKey,t,s),s}}catch{}return X.set(r,n+Ft(a)),o??await $e(e.siteKey,t)}function Ke(e,t,r,n){return new Response(JSON.stringify({wd_clearance:!0,nonce:e,mode:t,site_key:r,capabilities:n}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store","access-control-allow-origin":"*"}})}var qt=3e3;async function Ve(e,t){let r=new URL(e.url).searchParams.get("fp")??"",n=`${t}/api/v1/clearance/pat?fp=${encodeURIComponent(r)}`,o=new Headers,a=e.headers.get("authorization");a&&o.set("authorization",a);let i;try{i=await fetch(n,{method:"GET",headers:o,redirect:"manual",signal:AbortSignal.timeout(qt)})}catch{return new Response(JSON.stringify({attested:!1,reason:"unreachable"}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store"}})}let s=new Headers({"content-type":"application/json","cache-control":"no-store"}),c=i.headers.get("www-authenticate");return c&&s.set("www-authenticate",c),new Response(i.body,{status:i.status,headers:s})}function ze(e,t,r,n="denied"){let o=e.headers.get("accept")??"";if(e.method!=="GET"||!o.includes("text/html"))return new Response(JSON.stringify({error:"clearance required",challenge:J(n)}),{status:403,headers:{"content-type":"application/json",...Me(n)}});let a=Yt(t,r);return new Response(a,{status:403,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store",[L]:"challenged"}})}var Jt="https://cdn.webdecoy.com/wordpress/assets/icon-128x128.png";function Yt(e,t){return` +`;function Y(e){let r=["missing","invalid","insufficient-trust","revoked","crawler-refused","agent-impersonation"].includes(e)?e:"denied";return{version:1,reason:r,recoverable:r==="missing"||r==="invalid"||r==="insufficient-trust"}}function Le(e){let t=Y(e);return{"cache-control":"no-store","x-wd-clearance":"challenged","x-wd-challenge":String(t.version),"x-wd-challenge-reason":t.reason,"x-wd-challenge-recoverable":String(t.recoverable)}}var Kt=6e4,U="x-wd-clearance",Ue="x-wd-class",Ne="__wd_clearance_check",Q="/.well-known/wd-clearance/pat",P=new Map,Ht=16,Vt=3e4,zt=3e5,Z=new Map,X=new Map,Wt=86400;function $e(e,t){return`https://wd-config.invalid/${encodeURIComponent(e)}/${encodeURIComponent(t)}`}function Ge(){try{return globalThis.caches?.default??null}catch{return null}}async function Ke(e,t){let r=Ge();if(!r)return null;try{let n=await r.match($e(e,t));return n?await n.json():null}catch{return null}}async function Ft(e,t,r){let n=Ge();if(n)try{await n.put($e(e,t),new Response(JSON.stringify(r),{headers:{"content-type":"application/json","cache-control":`max-age=${Wt}`}}))}catch{}}function jt(e){let t=e?.headers.get("retry-after"),r=t?Number(t):NaN;return Number.isFinite(r)&&r>0?Math.min(Math.max(r*1e3,5e3),zt):Vt}async function He(e,t){let r=Date.now(),n=t,o=P.get(n);if(o&&r-o.atHt){let c=P.keys().next();c.done||P.delete(c.value)}return await Ft(e.siteKey,t,s),s}}catch{}return Z.set(r,n+jt(a)),o??await Ke(e.siteKey,t)}function Ve(e,t,r,n){return new Response(JSON.stringify({wd_clearance:!0,nonce:e,mode:t,site_key:r,capabilities:n}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store","access-control-allow-origin":"*"}})}var Jt=3e3;async function ze(e,t){let r=new URL(e.url).searchParams.get("fp")??"",n=`${t}/api/v1/clearance/pat?fp=${encodeURIComponent(r)}`,o=new Headers,a=e.headers.get("authorization");a&&o.set("authorization",a);let i;try{i=await fetch(n,{method:"GET",headers:o,redirect:"manual",signal:AbortSignal.timeout(Jt)})}catch{return new Response(JSON.stringify({attested:!1,reason:"unreachable"}),{status:200,headers:{"content-type":"application/json","cache-control":"no-store"}})}let s=new Headers({"content-type":"application/json","cache-control":"no-store"}),c=i.headers.get("www-authenticate");return c&&s.set("www-authenticate",c),new Response(i.body,{status:i.status,headers:s})}function We(e,t,r,n="denied"){let o=e.headers.get("accept")??"";if(e.method!=="GET"||!o.includes("text/html"))return new Response(JSON.stringify({error:"clearance required",challenge:Y(n)}),{status:403,headers:{"content-type":"application/json",...Le(n)}});let a=Xt(t,r);return new Response(a,{status:403,headers:{"content-type":"text/html; charset=utf-8","cache-control":"no-store",[U]:"challenged"}})}var Yt="https://cdn.webdecoy.com/wordpress/assets/icon-128x128.png";function Xt(e,t){return` @@ -71,14 +71,14 @@ async function wdDeviceFP() {
-
WebDecoy
+
WebDecoy

Checking your browser

This takes a moment and happens only once.

This site is protected by WebDecoy.

-`}function U(e){if(typeof e!="string")return"";let t=e.trim().toLowerCase().replace(/:\d+$/,"").replace(/\.$/,"");return t.length>0&&t.length<=253?t:""}var We=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","route_refusals","crawler_behavior","ai_referrals"];var Q=60,Xt=500,Zt=6e3,Fe=40,Qt=60,er=16,C=new TextEncoder,tr=3e3,rr=2e4,nr=1e4,or=16,x=new Map;function ar(e,t,r){return`${e}|${t}|${r}`}function je(e,t,r,n,o=Date.now()){try{let a=e?.label??"",i=e?.mode??"",s=e?.pattern??"",c=e?.previews??[],u=e?.behavior??"",p=e?.crawlerBehavior??"",w=e?.outsideReach??"";if(!a||!r||!r.siteKey||!r.apiBase)return;let d=U(t);if(!d)return;let y=Math.floor(o/1e3/Q)*Q,b=ar(y,i,d);for(let[h,m]of x)m.bucketStart!==y&&(N(m,r,n),x.delete(h));let g=x.get(b);if(!g){if(x.size>=or)for(let[h,m]of x)N(m,r,n),x.delete(h);g={bucketStart:y,mode:i,host:d,counts:new Map,routes:new Map,previews:new Map,credentials:new Map,referrals:new Map,routeBytes:0,total:0},x.set(b,g),ir(b,g,r,n,o)}g.counts.set(a,(g.counts.get(a)??0)+1);let A=typeof s=="string"?s:"",l=typeof u=="string"?u:"",f=typeof p=="string"?p:"",v=`${A} +`}function N(e){if(typeof e!="string")return"";let t=e.trim().toLowerCase().replace(/:\d+$/,"").replace(/\.$/,"");return t.length>0&&t.length<=253?t:""}var Fe=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","route_refusals","crawler_behavior","ai_referrals"];var ee=60,Zt=500,Qt=6e3,je=40,er=60,tr=16,R=new TextEncoder,rr=60,nr=24,or=3e3,ar=2e4,ir=1e4,sr=16,x=new Map;function cr(e,t,r){return`${e}|${t}|${r}`}function qe(e,t,r,n,o=Date.now()){try{let a=e?.label??"",i=e?.mode??"",s=e?.pattern??"",c=e?.previews??[],p=e?.behavior??"",l=e?.crawlerBehavior??"",h=e?.outsideReach??"";if(!a||!r||!r.siteKey||!r.apiBase)return;let d=N(t);if(!d)return;let w=Math.floor(o/1e3/ee)*ee,b=cr(w,i,d);for(let[m,y]of x)y.bucketStart!==w&&($(y,r,n),x.delete(m));let g=x.get(b);if(!g){if(x.size>=sr)for(let[m,y]of x)$(y,r,n),x.delete(m);g={bucketStart:w,mode:i,host:d,counts:new Map,routes:new Map,previews:new Map,credentials:new Map,referrals:new Map,refusals:[],routeBytes:0,total:0},x.set(b,g),lr(b,g,r,n,o)}g.counts.set(a,(g.counts.get(a)??0)+1);let A=typeof s=="string"?s:"",u=typeof p=="string"?p:"",f=typeof l=="string"?l:"",v=`${A} ${a} -${l} -${f}`,R=g.routes.get(v);R?R.count++:(g.routes.set(v,{pattern:A,verdict:a,behavior:l,crawlerBehavior:f,count:1}),g.routeBytes+=C.encode(A).length+C.encode(a).length+C.encode(l).length+C.encode(f).length+Fe);for(let h of Array.isArray(c)?c:[]){if(!h||typeof h.pattern!="string"||!h.pattern)continue;let m=g.previews.get(h.pattern);m||(m={evaluated:0,refused:new Map},g.previews.set(h.pattern,m),g.routeBytes+=C.encode(h.pattern).length+Qt),m.evaluated++,typeof h.refused=="string"&&h.refused&&(m.refused.has(h.refused)||(g.routeBytes+=C.encode(h.refused).length+er),m.refused.set(h.refused,(m.refused.get(h.refused)??0)+1))}typeof w=="string"&&w&&g.credentials.set(w,(g.credentials.get(w)??0)+1);let _=e?.referral;if(_&&typeof _.platform=="string"&&_.platform&&typeof _.path=="string"){let h=`${_.platform} -${_.path}`,m=g.referrals.get(h);m?m.count++:(g.referrals.set(h,{platform:_.platform,path:_.path,count:1}),g.routeBytes+=C.encode(_.platform).length+C.encode(_.path).length+Fe)}g.total++,(g.total>=Xt||g.routeBytes>=Zt)&&(N(g,r,n),x.delete(b))}catch{}}function ir(e,t,r,n,o){try{let a=(t.bucketStart+Q)*1e3,i=Math.floor(Math.random()*nr),s=Math.max(0,Math.min(a-o+i,rr));n.waitUntil(new Promise(c=>{setTimeout(()=>{try{x.get(e)===t&&(N(t,r,n),x.delete(e))}catch{}c()},s)}))}catch{}}function N(e,t,r){try{if(e.total<=0||e.counts.size===0)return;let n={};for(let[s,c]of e.counts)n[s]=c;let o=[];for(let s of e.routes.values()){let c={pattern:s.pattern,verdict:s.verdict,count:s.count};s.behavior&&(c.behavior=s.behavior),s.crawlerBehavior&&(c.crawler_behavior=s.crawlerBehavior),o.push(c)}let a={organization_id:t.siteKey,bucket_start:e.bucketStart,mode:e.mode,counts:n,route_counts:o,report_id:crypto.randomUUID()};if(e.previews.size>0){let s=[];for(let[c,u]of e.previews){let p={};for(let[w,d]of u.refused)p[w]=d;s.push({pattern:c,evaluated:u.evaluated,additional_refusals:p})}a.previews=s}if(e.credentials.size>0){let s=[];for(let[c,u]of e.credentials)s.push({credential_id:c,outside_reach:u});a.credential_presentations=s}e.referrals.size>0&&(a.ai_referrals=[...e.referrals.values()].map(s=>({platform:s.platform,path:s.path,count:s.count}))),t.propertyId&&(a.property_id=t.propertyId),a.host=e.host,t.bundleVersion&&(a.reporter_version=t.bundleVersion);let i=!!(t.scannerId&&t.sensorKey);i&&(a.scanner_id=t.scannerId),a.capabilities=t.capabilities??We,r.waitUntil(sr(t.apiBase,JSON.stringify(a),i?t.sensorKey:void 0).then(()=>{},()=>{}))}catch{}}async function sr(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),tr),a={"content-type":"application/json"};r&&(a["x-wd-sensor-key"]=r);try{await fetch(e.replace(/\/+$/,"")+"/api/v1/clearance/telemetry",{method:"POST",headers:a,body:t,signal:n.signal})}finally{clearTimeout(o)}}var G=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","bot_verification_rdns","crawler_behavior","ai_referrals"];var cr=[{category:"search_engines",suffixes:[".googlebot.com",".google.com",".search.msn.com",".crawl.yahoo.net",".applebot.apple.com",".yandex.com",".yandex.net",".yandex.ru",".crawl.baidu.com",".crawl.baidu.jp"]}];function lr(e,t){let r=e.toLowerCase().replace(/\.$/,"");for(let n of cr)if(t[n.category]){for(let o of n.suffixes)if(r.endsWith(o))return n.category}return null}var $=new Map,ur=36e5,gr=5e3;async function qe(e,t,r,n){let o=$.get(e);if(o&&n-o.at=gr&&$.clear(),$.set(e,{category:a,at:n}),a}async function fr(e,t,r){let n=e.replace(/\.$/,""),o=t.includes(":")?[r.resolve6(n)]:[r.resolve4(n)];try{return(await Promise.all(o)).flat().some(i=>i===t)}catch{return!1}}var Je=[["reflectionbot","Reflectionbot","reflectionbot","crawler"],["gptbot","GPTBot","gptbot","crawler"],["claudebot","ClaudeBot","claudebot","crawler"],["anthropic-ai","Anthropic","anthropic","crawler"],["claude-web","Claude-Web","claude-web","crawler"],["ccbot","CCBot","ccbot","crawler"],["google-extended","Google-Extended","google-extended","crawler"],["bytespider","ByteSpider","bytespider","crawler"],["amazonbot","Amazonbot","amazonbot","crawler"],["facebookbot","FacebookBot","facebookbot","crawler"],["meta-externalagent","Meta-ExternalAgent","meta-externalagent","crawler"],["cohere-ai","Cohere","cohere-ai","crawler"],["cohere","Cohere","cohere-ai","crawler"],["applebot-extended","Applebot-Extended","applebot-extended","crawler"],["youbot","YouBot","youbot","crawler"],["mistralbot","MistralBot","mistral","crawler"],["gemini","Gemini","gemini","crawler"],["ai2bot","AI2Bot","ai2bot","crawler"],["deepseek","DeepSeek","deepseek","crawler"],["qwen","Qwen","qwen","crawler"],["webzio","Webz.io","webzio","crawler"],["sentibot","Sentibot","sentibot","crawler"],["omgili","Omgili","omgili","crawler"],["img2dataset","img2dataset","img2dataset","crawler"],["timpibot","Timpibot","timpibot","crawler"],["velenpublicwebcrawler","VelenPublicWebCrawler","velenpublicwebcrawler","crawler"],["isscyberriskcrawler","ISSCyberRiskCrawler","isscyberriskcrawler","crawler"],["friendlycrawler","FriendlyCrawler","friendlycrawler","crawler"],["duckassistbot","DuckAssistBot","duckassistbot","crawler"],["sofyabot","SofyaBot","sofyabot","crawler"],["xai-searchbot","xAI-SearchBot","xai-searchbot","crawler"],["linkupbot","LinkupBot","linkupbot","crawler"],["perplexitybot","PerplexityBot","perplexitybot","crawler"],["claude-searchbot","Claude-SearchBot","claude-searchbot","crawler"],["oai-searchbot","OAI-SearchBot","oai-searchbot","crawler"],["searchgpt","SearchGPT","searchgpt","crawler"],["phind","Phind","phind","crawler"],["kagi","Kagi","kagi","crawler"],["exa.ai","Exa","exa","crawler"],["exabot","Exa","exa","crawler"],["metaphor","Metaphor","metaphor","crawler"],["tavily","Tavily","tavily","crawler"],["bravesearch","BraveSearch","brave-search","crawler"],["neevabot","NeevaBot","neeva","crawler"],["operator","Operator","operator","crawler"],["claude-user","Claude-User","claude-user","crawler"],["gemini-user","Gemini-User","gemini-user","crawler"],["googleagent-mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["amazonbuyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["buyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["browser-use","Browser-Use","browser-use","crawler"],["stagehand","Stagehand","stagehand","crawler"],["multion","MultiOn","multion","crawler"],["iboubot","IbouBot","iboubot","crawler"],["googlebot","Googlebot","googlebot","crawler"],["google-inspectiontool","Google-InspectionTool","google-inspectiontool","crawler"],["bingbot","Bingbot","bingbot","crawler"],["msnbot","MSNBot","msnbot","crawler"],["yandexbot","YandexBot","yandexbot","crawler"],["baiduspider","Baiduspider","baiduspider","crawler"],["duckduckbot","DuckDuckBot","duckduckbot","crawler"],["applebot","Applebot","applebot","crawler"],["sogou","Sogou Spider","sogou","crawler"],["qwantify","Qwantify","qwantify","crawler"],["naver","Naver","naver","crawler"],["yeti","Naver","naver","crawler"],["seznambot","SeznamBot","seznam","crawler"],["ecosia","Ecosia","ecosia","crawler"],["mojeekbot","MojeekBot","mojeek","crawler"],["slurp","Yahoo! Slurp","yahoo-slurp","crawler"],["ahrefsbot","AhrefsBot","ahrefsbot","crawler"],["ahrefs","AhrefsBot","ahrefsbot","crawler"],["semrushbot","SemrushBot","semrushbot","crawler"],["semrush","SemrushBot","semrushbot","crawler"],["mj12bot","MJ12bot","mj12bot","crawler"],["dotbot","DotBot","dotbot","crawler"],["rogerbot","Rogerbot","rogerbot","crawler"],["screaming frog","Screaming Frog","screaming-frog","crawler"],["sitebulb","Sitebulb","sitebulb","crawler"],["deepcrawl","DeepCrawl","deepcrawl","crawler"],["oncrawl","OnCrawl","oncrawl","crawler"],["botify","Botify","botify","crawler"],["contentking","ContentKing","contentking","crawler"],["sistrix","SISTRIX","sistrix","crawler"],["serpstat","Serpstat","serpstat","crawler"],["spyfu","SpyFu","spyfu","crawler"],["nessus","Nessus","nessus","crawler"],["qualys","Qualys","qualys","crawler"],["shodan","Shodan","shodan","crawler"],["censys","Censys","censys","crawler"],["nmap","Nmap","nmap","crawler"],["zap/","OWASP ZAP","zap","crawler"],["burp","Burp Suite","burp","crawler"],["nikto","Nikto","nikto","crawler"],["nuclei","Nuclei","nuclei","crawler"],["acunetix","Acunetix","acunetix","crawler"],["netsparker","Netsparker","netsparker","crawler"],["detectify","Detectify","detectify","crawler"],["intruder","Intruder","intruder","crawler"],["python-requests","Python-Requests","python-requests","tool"],["python-urllib","Python-urllib","python-urllib","tool"],["python/","Python","python","tool"],["scrapy","Scrapy","scrapy","tool"],["httpx","HTTPX","httpx","tool"],["aiohttp","aiohttp","aiohttp","tool"],["beautifulsoup","BeautifulSoup","beautifulsoup","tool"],["node-fetch","node-fetch","node-fetch","tool"],["axios/","Axios","axios","tool"],["got/","Got","got","tool"],["undici","Undici","undici","tool"],["go-http-client","Go-HTTP-Client","go-http-client","tool"],["colly","Colly","colly","tool"],["java/","Java","java","tool"],["okhttp","OkHttp","okhttp","tool"],["apache-httpclient","Apache-HttpClient","apache-httpclient","tool"],["jsoup","Jsoup","jsoup","tool"],["guzzlehttp","GuzzleHttp","guzzlehttp","tool"],["php/","PHP","php","tool"],["ruby","Ruby","ruby","tool"],["faraday","Faraday","faraday","tool"],["mechanize","Mechanize","mechanize","tool"],["headlesschrome","HeadlessChrome","headlesschrome","tool"],["puppeteer","Puppeteer","puppeteer","tool"],["playwright","Playwright","playwright","tool"],["selenium","Selenium","selenium","tool"],["phantomjs","PhantomJS","phantomjs","tool"],["splash","Splash","splash","tool"],["browserless","Browserless","browserless","tool"],["browserbase","Browserbase","browserbase","tool"],["ia_archiver","Internet Archive","ia-archiver","crawler"],["archive.org_bot","Archive.org","archive-org-bot","crawler"],["wayback","Wayback Machine","wayback","crawler"],["heritrix","Heritrix","heritrix","crawler"],["brozzler","Brozzler","brozzler","crawler"],["facebookexternalhit","Facebook","facebookexternalhit","crawler"],["facebot","Facebot","facebot","crawler"],["twitterbot","Twitterbot","twitterbot","crawler"],["linkedinbot","LinkedInBot","linkedinbot","crawler"],["slackbot","Slackbot","slackbot","crawler"],["telegrambot","TelegramBot","telegrambot","crawler"],["whatsapp","WhatsApp","whatsapp","crawler"],["discordbot","Discordbot","discordbot","crawler"],["pinterest","Pinterest","pinterestbot","crawler"],["tumblr","Tumblr","tumblr","crawler"],["reddit","Reddit","reddit","crawler"],["embedly","Embedly","embedly","crawler"],["iframely","Iframely","iframely","crawler"],["curl/","cURL","curl","tool"],["wget/","Wget","wget","tool"],["libwww-perl","libwww-perl","libwww-perl","tool"],["lwp-","LWP","lwp","tool"],["httrack","HTTrack","httrack","tool"],["webdecoybot","WebDecoyBot","webdecoybot","crawler"],["uptimerobot","UptimeRobot","uptimerobot","crawler"],["pingdom","Pingdom","pingdom","crawler"],["statuscake","StatusCake","statuscake","crawler"],["betteruptime","Better Uptime","better-uptime","crawler"],["datadog","Datadog Synthetics","datadog-synthetics","crawler"],["newrelic","New Relic","newrelic","crawler"],["site24x7","Site24x7","site24x7","crawler"],["freshping","Freshping","freshping","crawler"],["hetrixtools","HetrixTools","hetrixtools","crawler"],["nodeping","NodePing","nodeping","crawler"],["gtmetrix","GTmetrix","gtmetrix","crawler"],["chrome-lighthouse","Lighthouse","chrome-lighthouse","crawler"],["google page speed","Lighthouse","chrome-lighthouse","crawler"],["feedly","Feedly","feedly","crawler"],["feedfetcher","Feedfetcher-Google","feedfetcher-google","crawler"],["newsblur","NewsBlur","newsblur","crawler"],["inoreader","Inoreader","inoreader","crawler"],["theoldreader","The Old Reader","theoldreader","crawler"],["feedbin","Feedbin","feedbin","crawler"],["miniflux","Miniflux","miniflux","crawler"],["freshrss","FreshRSS","freshrss","crawler"],["commafeed","CommaFeed","commafeed","crawler"],["diffbot","Diffbot","diffbot","crawler"],["import.io","Import.io","import-io","crawler"],["brightdata","Bright Data","bright-data","crawler"],["luminati","Bright Data","bright-data","crawler"],["oxylabs","Oxylabs","oxylabs","crawler"],["scrapingbee","ScrapingBee","scrapingbee","crawler"],["scrapingant","ScrapingAnt","scrapingant","crawler"],["zyte","Zyte","zyte","crawler"],["scrapinghub","Zyte","zyte","crawler"],["apify","Apify","apify","crawler"],["crawlbase","Crawlbase","crawlbase","crawler"],["webscrapingapi","WebScrapingAPI","webscrapingapi","crawler"],["chatgpt-user","ChatGPT-User","chatgpt-user","crawler"],["perplexity-user","Perplexity-User","perplexity-user","crawler"],["mistralai-user","MistralAI-User","mistralai-user","crawler"],["meta-externalfetcher","Meta-ExternalFetcher","meta-externalfetcher","crawler"],["gemini-deep-research","Gemini-Deep-Research","gemini-deep-research","crawler"],["copilot","Microsoft Copilot","copilot","crawler"],["cortana","Cortana","cortana","crawler"],["siri","Siri","siri","crawler"]];function pr(e){for(let[t,r,n,o]of Je)if(e.includes(t))return{name:r,id:n,kind:o};return null}var dr=/(?:bot|crawler|spider)(?:[/\s);,]|$)/i;function Ye(e){let t=e.toLowerCase(),r=pr(t);return r?.kind==="crawler"||!r&&dr.test(e)}var hr="Search Engine Crawler",ee=1e3,mr={search_engines:!0,ai_crawlers:!0,monitoring:!0};function wr(e){if(!e.includes(":"))return e.split(".").reverse().join(".")+".in-addr.arpa";let[t,r=""]=e.split("::"),n=t?t.split(":"):[],o=r?r.split(":"):[],a=8-n.length-o.length;return a<0?"":[...n,...Array(Math.max(0,a)).fill("0"),...o].map(s=>s.padStart(4,"0")).join("").split("").reverse().join(".")+".ip6.arpa"}function te(e,t){return Promise.race([e,new Promise((r,n)=>setTimeout(()=>n(new Error("dns timeout")),t))])}function br(e){return{reverse:t=>te(e(wr(t),"PTR"),ee),resolve4:t=>te(e(t,"A"),ee),resolve6:t=>te(e(t,"AAAA"),ee)}}function Xe(e,t,r,n=typeof Deno<"u"&&Deno&&typeof Deno.resolveDns=="function"?Deno.resolveDns.bind(Deno):void 0,o=Date.now()){return!r||!e||!n||!Ye(t)?Promise.resolve(""):qe(e,mr,br(n),o).then(a=>a==="search_engines"?hr:"").catch(()=>"")}var yr="https://cloudflare-dns.com/dns-query",vr=1e3,_r={A:1,PTR:12,AAAA:28};function xr(e=fetch){return async(t,r)=>{let n=_r[r];if(!n)throw new Error(`unsupported record type ${r}`);let o=`${yr}?name=${encodeURIComponent(t)}&type=${r}`,a=await e(o,{headers:{accept:"application/dns-json"},signal:AbortSignal.timeout(vr)});if(!a.ok)throw new Error(`doh ${a.status}`);let i=await a.json();if(i.Status!==0)throw new Error(`dns status ${i.Status}`);let s=(i.Answer??[]).filter(c=>c.type===n&&typeof c.data=="string").map(c=>c.data);if(s.length===0)throw new Error("no records");return s}}function Ze(e,t,r,n=fetch){return Xe(e,t,r,xr(n))}var re="vercel-9971cf5b9746";var Qe="https://in.webdecoy.com";function et(e){let t=new Headers(e.headers);return t.delete(L),t.delete(Le),t}function ne(e,t){let r=et(e);return t&&r.set(L,t),{action:"continue",headers:r,verdict:t}}async function Ar(e,t,r){try{let n=(r.ingest??"").trim().replace(/\/+$/,"")||Qe,o=new URL(e.url),a=o.searchParams.get(Ue),i=U(o.hostname),s=await He({apiBase:n,siteKey:r.siteKey},i);if(a!==null)return{action:"respond",response:Ke(a,s?s.mode:"unknown",r.siteKey,G)};if(o.pathname===Z)return{action:"respond",response:await Ve(e,n)};if(o.pathname===M)return{action:"respond",response:await Ie(e,{apiBase:n,siteKey:r.siteKey,sensorKey:r.sensorKey,host:i})};if(!s)return ne(e,null);let c=await Re(e,s,{siteKey:r.siteKey,verifiedBotCategory:(u,p)=>Ze(t.ip,u.headers.get("user-agent")??"",p,t.fetch??fetch)});if(F(c)){let u=j(e.headers.get("cookie")??"",q);u&&await Oe(u,r.sensorKey,i,e.headers.get("user-agent")??"",Date.now())&&(c=Ce(c))}return je(c,o.hostname,{siteKey:r.siteKey,apiBase:n,scannerId:r.scannerId,sensorKey:r.sensorKey,bundleVersion:re,capabilities:G},{waitUntil:u=>t.waitUntil?.(u)},Date.now()),c.pass||c.mode!=="enforce"?ne(e,c.label):{action:"respond",response:ze(e,n,r.siteKey,c.label)}}catch{try{return ne(e,null)}catch{return{action:"continue",headers:null,verdict:null}}}}export{re as BUILD,Qe as DEFAULT_INGEST,G as VERCEL_VALIDATOR_CAPABILITIES,et as cleanHeaders,Ar as runGate}; +${u} +${f}`,C=g.routes.get(v);C?C.count++:(g.routes.set(v,{pattern:A,verdict:a,behavior:u,crawlerBehavior:f,count:1}),g.routeBytes+=R.encode(A).length+R.encode(a).length+R.encode(u).length+R.encode(f).length+je);for(let m of Array.isArray(c)?c:[]){if(!m||typeof m.pattern!="string"||!m.pattern)continue;let y=g.previews.get(m.pattern);y||(y={evaluated:0,refused:new Map},g.previews.set(m.pattern,y),g.routeBytes+=R.encode(m.pattern).length+er),y.evaluated++,typeof m.refused=="string"&&m.refused&&(y.refused.has(m.refused)||(g.routeBytes+=R.encode(m.refused).length+tr),y.refused.set(m.refused,(y.refused.get(m.refused)??0)+1))}typeof h=="string"&&h&&g.credentials.set(h,(g.credentials.get(h)??0)+1);let _=e?.referral;if(_&&typeof _.platform=="string"&&_.platform&&typeof _.path=="string"){let m=`${_.platform} +${_.path}`,y=g.referrals.get(m);y?y.count++:(g.referrals.set(m,{platform:_.platform,path:_.path,count:1}),g.routeBytes+=R.encode(_.platform).length+R.encode(_.path).length+je)}let S=e?.refusal;S&&typeof S.ip=="string"&&S.ip&&typeof S.path=="string"&&S.path.startsWith("/")&&(g.refusals.push({ip:S.ip,path:S.path,at:Math.floor(o/1e3),verdict:a}),g.routeBytes+=rr),g.total++,(g.total>=Zt||g.routeBytes>=Qt)&&($(g,r,n),x.delete(b))}catch{}}function lr(e,t,r,n,o){try{let a=(t.bucketStart+ee)*1e3,i=Math.floor(Math.random()*ir),s=Math.max(0,Math.min(a-o+i,ar));n.waitUntil(new Promise(c=>{setTimeout(()=>{try{x.get(e)===t&&($(t,r,n),x.delete(e))}catch{}c()},s)}))}catch{}}function $(e,t,r){try{if(e.total<=0||e.counts.size===0)return;let n={};for(let[l,h]of e.counts)n[l]=h;let o=[];for(let l of e.routes.values()){let h={pattern:l.pattern,verdict:l.verdict,count:l.count};l.behavior&&(h.behavior=l.behavior),l.crawlerBehavior&&(h.crawler_behavior=l.crawlerBehavior),o.push(h)}let a={organization_id:t.siteKey,bucket_start:e.bucketStart,mode:e.mode,counts:n,route_counts:o,report_id:crypto.randomUUID()};if(e.previews.size>0){let l=[];for(let[h,d]of e.previews){let w={};for(let[b,g]of d.refused)w[b]=g;l.push({pattern:h,evaluated:d.evaluated,additional_refusals:w})}a.previews=l}if(e.credentials.size>0){let l=[];for(let[h,d]of e.credentials)l.push({credential_id:h,outside_reach:d});a.credential_presentations=l}e.referrals.size>0&&(a.ai_referrals=[...e.referrals.values()].map(l=>({platform:l.platform,path:l.path,count:l.count}))),t.propertyId&&(a.property_id=t.propertyId),a.host=e.host,t.bundleVersion&&(a.reporter_version=t.bundleVersion);let i=!!(t.scannerId&&t.sensorKey);i&&(a.scanner_id=t.scannerId),a.capabilities=t.capabilities??Fe;let s=i?e.refusals:[],c=()=>fr(t.apiBase,JSON.stringify(a),i?t.sensorKey:void 0),p=s.length===0?c():gr(t.siteKey,s).then(l=>{a.refusals=l}).catch(()=>{}).then(c);r.waitUntil(p.then(()=>{},()=>{}))}catch{}}async function ur(e,t,r){let n=await crypto.subtle.digest("SHA-256",R.encode(`${e.toLowerCase()}|${t}|${r}`)),o="";for(let a of new Uint8Array(n))o+=a.toString(16).padStart(2,"0");return o.slice(0,nr)}async function gr(e,t){let r=[];for(let n of t)r.push({k:await ur(e,n.ip,n.path),t:n.at,v:n.verdict});return r}async function fr(e,t,r){let n=new AbortController,o=setTimeout(()=>n.abort(),or),a={"content-type":"application/json"};r&&(a["x-wd-sensor-key"]=r);try{await fetch(e.replace(/\/+$/,"")+"/api/v1/clearance/telemetry",{method:"POST",headers:a,body:t,signal:n.signal})}finally{clearTimeout(o)}}var G=["route_min_trust","route_attribution","monitor_routes","route_exceptions","bot_behaviors","credential_reach","bot_verification_rdns","crawler_behavior","ai_referrals"];var pr=[{category:"search_engines",suffixes:[".googlebot.com",".google.com",".search.msn.com",".crawl.yahoo.net",".applebot.apple.com",".yandex.com",".yandex.net",".yandex.ru",".crawl.baidu.com",".crawl.baidu.jp"]}];function dr(e,t){let r=e.toLowerCase().replace(/\.$/,"");for(let n of pr)if(t[n.category]){for(let o of n.suffixes)if(r.endsWith(o))return n.category}return null}var K=new Map,hr=36e5,mr=5e3;async function Je(e,t,r,n){let o=K.get(e);if(o&&n-o.at=mr&&K.clear(),K.set(e,{category:a,at:n}),a}async function wr(e,t,r){let n=e.replace(/\.$/,""),o=t.includes(":")?[r.resolve6(n)]:[r.resolve4(n)];try{return(await Promise.all(o)).flat().some(i=>i===t)}catch{return!1}}var Ye=[["reflectionbot","Reflectionbot","reflectionbot","crawler"],["gptbot","GPTBot","gptbot","crawler"],["claudebot","ClaudeBot","claudebot","crawler"],["anthropic-ai","Anthropic","anthropic","crawler"],["claude-web","Claude-Web","claude-web","crawler"],["ccbot","CCBot","ccbot","crawler"],["google-extended","Google-Extended","google-extended","crawler"],["bytespider","ByteSpider","bytespider","crawler"],["amazonbot","Amazonbot","amazonbot","crawler"],["facebookbot","FacebookBot","facebookbot","crawler"],["meta-externalagent","Meta-ExternalAgent","meta-externalagent","crawler"],["cohere-ai","Cohere","cohere-ai","crawler"],["cohere","Cohere","cohere-ai","crawler"],["applebot-extended","Applebot-Extended","applebot-extended","crawler"],["youbot","YouBot","youbot","crawler"],["mistralbot","MistralBot","mistral","crawler"],["gemini","Gemini","gemini","crawler"],["ai2bot","AI2Bot","ai2bot","crawler"],["deepseek","DeepSeek","deepseek","crawler"],["qwen","Qwen","qwen","crawler"],["webzio","Webz.io","webzio","crawler"],["sentibot","Sentibot","sentibot","crawler"],["omgili","Omgili","omgili","crawler"],["img2dataset","img2dataset","img2dataset","crawler"],["timpibot","Timpibot","timpibot","crawler"],["velenpublicwebcrawler","VelenPublicWebCrawler","velenpublicwebcrawler","crawler"],["isscyberriskcrawler","ISSCyberRiskCrawler","isscyberriskcrawler","crawler"],["friendlycrawler","FriendlyCrawler","friendlycrawler","crawler"],["duckassistbot","DuckAssistBot","duckassistbot","crawler"],["sofyabot","SofyaBot","sofyabot","crawler"],["xai-searchbot","xAI-SearchBot","xai-searchbot","crawler"],["linkupbot","LinkupBot","linkupbot","crawler"],["perplexitybot","PerplexityBot","perplexitybot","crawler"],["claude-searchbot","Claude-SearchBot","claude-searchbot","crawler"],["oai-searchbot","OAI-SearchBot","oai-searchbot","crawler"],["searchgpt","SearchGPT","searchgpt","crawler"],["phind","Phind","phind","crawler"],["kagi","Kagi","kagi","crawler"],["exa.ai","Exa","exa","crawler"],["exabot","Exa","exa","crawler"],["metaphor","Metaphor","metaphor","crawler"],["tavily","Tavily","tavily","crawler"],["bravesearch","BraveSearch","brave-search","crawler"],["neevabot","NeevaBot","neeva","crawler"],["operator","Operator","operator","crawler"],["claude-user","Claude-User","claude-user","crawler"],["gemini-user","Gemini-User","gemini-user","crawler"],["googleagent-mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["mariner","GoogleAgent-Mariner","googleagent-mariner","crawler"],["amazonbuyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["buyforme","AmazonBuyForMe","amazon-buyforme","crawler"],["browser-use","Browser-Use","browser-use","crawler"],["stagehand","Stagehand","stagehand","crawler"],["multion","MultiOn","multion","crawler"],["iboubot","IbouBot","iboubot","crawler"],["googlebot","Googlebot","googlebot","crawler"],["google-inspectiontool","Google-InspectionTool","google-inspectiontool","crawler"],["bingbot","Bingbot","bingbot","crawler"],["msnbot","MSNBot","msnbot","crawler"],["yandexbot","YandexBot","yandexbot","crawler"],["baiduspider","Baiduspider","baiduspider","crawler"],["duckduckbot","DuckDuckBot","duckduckbot","crawler"],["applebot","Applebot","applebot","crawler"],["sogou","Sogou Spider","sogou","crawler"],["qwantify","Qwantify","qwantify","crawler"],["naver","Naver","naver","crawler"],["yeti","Naver","naver","crawler"],["seznambot","SeznamBot","seznam","crawler"],["ecosia","Ecosia","ecosia","crawler"],["mojeekbot","MojeekBot","mojeek","crawler"],["slurp","Yahoo! Slurp","yahoo-slurp","crawler"],["ahrefsbot","AhrefsBot","ahrefsbot","crawler"],["ahrefs","AhrefsBot","ahrefsbot","crawler"],["semrushbot","SemrushBot","semrushbot","crawler"],["semrush","SemrushBot","semrushbot","crawler"],["mj12bot","MJ12bot","mj12bot","crawler"],["dotbot","DotBot","dotbot","crawler"],["rogerbot","Rogerbot","rogerbot","crawler"],["screaming frog","Screaming Frog","screaming-frog","crawler"],["sitebulb","Sitebulb","sitebulb","crawler"],["deepcrawl","DeepCrawl","deepcrawl","crawler"],["oncrawl","OnCrawl","oncrawl","crawler"],["botify","Botify","botify","crawler"],["contentking","ContentKing","contentking","crawler"],["sistrix","SISTRIX","sistrix","crawler"],["serpstat","Serpstat","serpstat","crawler"],["spyfu","SpyFu","spyfu","crawler"],["nessus","Nessus","nessus","crawler"],["qualys","Qualys","qualys","crawler"],["shodan","Shodan","shodan","crawler"],["censys","Censys","censys","crawler"],["nmap","Nmap","nmap","crawler"],["zap/","OWASP ZAP","zap","crawler"],["burp","Burp Suite","burp","crawler"],["nikto","Nikto","nikto","crawler"],["nuclei","Nuclei","nuclei","crawler"],["acunetix","Acunetix","acunetix","crawler"],["netsparker","Netsparker","netsparker","crawler"],["detectify","Detectify","detectify","crawler"],["intruder","Intruder","intruder","crawler"],["python-requests","Python-Requests","python-requests","tool"],["python-urllib","Python-urllib","python-urllib","tool"],["python/","Python","python","tool"],["scrapy","Scrapy","scrapy","tool"],["httpx","HTTPX","httpx","tool"],["aiohttp","aiohttp","aiohttp","tool"],["beautifulsoup","BeautifulSoup","beautifulsoup","tool"],["node-fetch","node-fetch","node-fetch","tool"],["axios/","Axios","axios","tool"],["got/","Got","got","tool"],["undici","Undici","undici","tool"],["go-http-client","Go-HTTP-Client","go-http-client","tool"],["colly","Colly","colly","tool"],["java/","Java","java","tool"],["okhttp","OkHttp","okhttp","tool"],["apache-httpclient","Apache-HttpClient","apache-httpclient","tool"],["jsoup","Jsoup","jsoup","tool"],["guzzlehttp","GuzzleHttp","guzzlehttp","tool"],["php/","PHP","php","tool"],["ruby","Ruby","ruby","tool"],["faraday","Faraday","faraday","tool"],["mechanize","Mechanize","mechanize","tool"],["headlesschrome","HeadlessChrome","headlesschrome","tool"],["puppeteer","Puppeteer","puppeteer","tool"],["playwright","Playwright","playwright","tool"],["selenium","Selenium","selenium","tool"],["phantomjs","PhantomJS","phantomjs","tool"],["splash","Splash","splash","tool"],["browserless","Browserless","browserless","tool"],["browserbase","Browserbase","browserbase","tool"],["ia_archiver","Internet Archive","ia-archiver","crawler"],["archive.org_bot","Archive.org","archive-org-bot","crawler"],["wayback","Wayback Machine","wayback","crawler"],["heritrix","Heritrix","heritrix","crawler"],["brozzler","Brozzler","brozzler","crawler"],["facebookexternalhit","Facebook","facebookexternalhit","crawler"],["facebot","Facebot","facebot","crawler"],["twitterbot","Twitterbot","twitterbot","crawler"],["linkedinbot","LinkedInBot","linkedinbot","crawler"],["slackbot","Slackbot","slackbot","crawler"],["telegrambot","TelegramBot","telegrambot","crawler"],["whatsapp","WhatsApp","whatsapp","crawler"],["discordbot","Discordbot","discordbot","crawler"],["pinterest","Pinterest","pinterestbot","crawler"],["tumblr","Tumblr","tumblr","crawler"],["reddit","Reddit","reddit","crawler"],["embedly","Embedly","embedly","crawler"],["iframely","Iframely","iframely","crawler"],["curl/","cURL","curl","tool"],["wget/","Wget","wget","tool"],["libwww-perl","libwww-perl","libwww-perl","tool"],["lwp-","LWP","lwp","tool"],["httrack","HTTrack","httrack","tool"],["webdecoybot","WebDecoyBot","webdecoybot","crawler"],["uptimerobot","UptimeRobot","uptimerobot","crawler"],["pingdom","Pingdom","pingdom","crawler"],["statuscake","StatusCake","statuscake","crawler"],["betteruptime","Better Uptime","better-uptime","crawler"],["datadog","Datadog Synthetics","datadog-synthetics","crawler"],["newrelic","New Relic","newrelic","crawler"],["site24x7","Site24x7","site24x7","crawler"],["freshping","Freshping","freshping","crawler"],["hetrixtools","HetrixTools","hetrixtools","crawler"],["nodeping","NodePing","nodeping","crawler"],["gtmetrix","GTmetrix","gtmetrix","crawler"],["chrome-lighthouse","Lighthouse","chrome-lighthouse","crawler"],["google page speed","Lighthouse","chrome-lighthouse","crawler"],["feedly","Feedly","feedly","crawler"],["feedfetcher","Feedfetcher-Google","feedfetcher-google","crawler"],["newsblur","NewsBlur","newsblur","crawler"],["inoreader","Inoreader","inoreader","crawler"],["theoldreader","The Old Reader","theoldreader","crawler"],["feedbin","Feedbin","feedbin","crawler"],["miniflux","Miniflux","miniflux","crawler"],["freshrss","FreshRSS","freshrss","crawler"],["commafeed","CommaFeed","commafeed","crawler"],["diffbot","Diffbot","diffbot","crawler"],["import.io","Import.io","import-io","crawler"],["brightdata","Bright Data","bright-data","crawler"],["luminati","Bright Data","bright-data","crawler"],["oxylabs","Oxylabs","oxylabs","crawler"],["scrapingbee","ScrapingBee","scrapingbee","crawler"],["scrapingant","ScrapingAnt","scrapingant","crawler"],["zyte","Zyte","zyte","crawler"],["scrapinghub","Zyte","zyte","crawler"],["apify","Apify","apify","crawler"],["crawlbase","Crawlbase","crawlbase","crawler"],["webscrapingapi","WebScrapingAPI","webscrapingapi","crawler"],["chatgpt-user","ChatGPT-User","chatgpt-user","crawler"],["perplexity-user","Perplexity-User","perplexity-user","crawler"],["mistralai-user","MistralAI-User","mistralai-user","crawler"],["meta-externalfetcher","Meta-ExternalFetcher","meta-externalfetcher","crawler"],["gemini-deep-research","Gemini-Deep-Research","gemini-deep-research","crawler"],["copilot","Microsoft Copilot","copilot","crawler"],["cortana","Cortana","cortana","crawler"],["siri","Siri","siri","crawler"]];function br(e){for(let[t,r,n,o]of Ye)if(e.includes(t))return{name:r,id:n,kind:o};return null}var yr=/(?:bot|crawler|spider)(?:[/\s);,]|$)/i;function Xe(e){let t=e.toLowerCase(),r=br(t);return r?.kind==="crawler"||!r&&yr.test(e)}var vr="Search Engine Crawler",te=1e3,_r={search_engines:!0,ai_crawlers:!0,monitoring:!0};function xr(e){if(!e.includes(":"))return e.split(".").reverse().join(".")+".in-addr.arpa";let[t,r=""]=e.split("::"),n=t?t.split(":"):[],o=r?r.split(":"):[],a=8-n.length-o.length;return a<0?"":[...n,...Array(Math.max(0,a)).fill("0"),...o].map(s=>s.padStart(4,"0")).join("").split("").reverse().join(".")+".ip6.arpa"}function re(e,t){return Promise.race([e,new Promise((r,n)=>setTimeout(()=>n(new Error("dns timeout")),t))])}function Ar(e){return{reverse:t=>re(e(xr(t),"PTR"),te),resolve4:t=>re(e(t,"A"),te),resolve6:t=>re(e(t,"AAAA"),te)}}function Ze(e,t,r,n=typeof Deno<"u"&&Deno&&typeof Deno.resolveDns=="function"?Deno.resolveDns.bind(Deno):void 0,o=Date.now()){return!r||!e||!n||!Xe(t)?Promise.resolve(""):Je(e,_r,Ar(n),o).then(a=>a==="search_engines"?vr:"").catch(()=>"")}var Rr="https://cloudflare-dns.com/dns-query",Cr=1e3,Sr={A:1,PTR:12,AAAA:28};function kr(e=fetch){return async(t,r)=>{let n=Sr[r];if(!n)throw new Error(`unsupported record type ${r}`);let o=`${Rr}?name=${encodeURIComponent(t)}&type=${r}`,a=await e(o,{headers:{accept:"application/dns-json"},signal:AbortSignal.timeout(Cr)});if(!a.ok)throw new Error(`doh ${a.status}`);let i=await a.json();if(i.Status!==0)throw new Error(`dns status ${i.Status}`);let s=(i.Answer??[]).filter(c=>c.type===n&&typeof c.data=="string").map(c=>c.data);if(s.length===0)throw new Error("no records");return s}}function Qe(e,t,r,n=fetch){return Ze(e,t,r,kr(n))}var ne="vercel-895bda3b1f84";var et="https://in.webdecoy.com";function tt(e){let t=new Headers(e.headers);return t.delete(U),t.delete(Ue),t}function oe(e,t){let r=tt(e);return t&&r.set(U,t),{action:"continue",headers:r,verdict:t}}async function Er(e,t,r){try{let n=(r.ingest??"").trim().replace(/\/+$/,"")||et,o=new URL(e.url),a=o.searchParams.get(Ne),i=N(o.hostname),s=await He({apiBase:n,siteKey:r.siteKey},i);if(a!==null)return{action:"respond",response:Ve(a,s?s.mode:"unknown",r.siteKey,G)};if(o.pathname===Q)return{action:"respond",response:await ze(e,n)};if(o.pathname===L)return{action:"respond",response:await De(e,{apiBase:n,siteKey:r.siteKey,sensorKey:r.sensorKey,host:i})};if(!s)return oe(e,null);let c=await Ce(e,s,{siteKey:r.siteKey,verifiedBotCategory:(p,l)=>Qe(t.ip,p.headers.get("user-agent")??"",l,t.fetch??fetch)});if(j(c)){let p=q(e.headers.get("cookie")??"",J);p&&await Ie(p,r.sensorKey,i,e.headers.get("user-agent")??"",Date.now())&&(c=Se(c))}return qe({...c,refusal:c.pass?null:{ip:t.ip,path:o.pathname}},o.hostname,{siteKey:r.siteKey,apiBase:n,scannerId:r.scannerId,sensorKey:r.sensorKey,bundleVersion:ne,capabilities:G},{waitUntil:p=>t.waitUntil?.(p)},Date.now()),c.pass||c.mode!=="enforce"?oe(e,c.label):{action:"respond",response:We(e,n,r.siteKey,c.label)}}catch{try{return oe(e,null)}catch{return{action:"continue",headers:null,verdict:null}}}}export{ne as BUILD,et as DEFAULT_INGEST,G as VERCEL_VALIDATOR_CAPABILITIES,tt as cleanHeaders,Er as runGate};