@nodatachat/mcp 1.6.21 → 1.6.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,42 +1,49 @@
1
- /*! @nodatachat/mcp 1.6.21 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
1
+ /*! @nodatachat/mcp 1.6.23 | Copyright 2026 Capsule Ltd. | FSL-1.1-ALv2 | see LICENSE.md */
2
2
  import{createRequire as __ndReq}from"node:module";const require=__ndReq(import.meta.url);
3
- import{parentPort as wt}from"node:worker_threads";import{createHash as Ss}from"node:crypto";import{closeSync as Es,existsSync as As,openSync as Is,readSync as $s,readdirSync as lr,readFileSync as Ts,statSync as ht}from"node:fs";import{homedir as Rs}from"node:os";import{basename as ur,join as Xe}from"node:path";import{TextDecoder as br}from"node:util";var q={text:[],header:[],secrets:[],table:null,amounts:null,severity:null};function kt(e){e.table&&(q.table=e.table),e.severity&&(q.severity=e.severity),e.amounts&&(q.amounts=e.amounts);for(let t of e.text??[])q.text.some(n=>n.kind===t.kind)||q.text.push(t);e.header&&!q.header.includes(e.header)&&q.header.push(e.header);for(let t of e.secrets??[])q.secrets.some(n=>n.id===t.id)||q.secrets.push(t)}function Ke(e){return q.severity?.(e)}function Ze(){return q.text}function dn(){return q.header}function Ce(){return q.table}function fn(){return q.secrets}var pn=[{id:"aws-access-key",name:"AWS Access Key",pattern:/(?:^|[^A-Z0-9])AKIA[A-Z2-7]{16}(?:[^A-Z2-7]|$)/,severity:"critical"},{id:"aws-secret-key",name:"AWS Secret Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key)\s*[=:]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/,severity:"critical"},{id:"gcp-api-key",name:"GCP API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"critical"},{id:"gcp-service-account",name:"GCP Service Account",pattern:/"type"\s*:\s*"service_account"/,severity:"critical"},{id:"github-token",name:"GitHub Token",pattern:/gh[pousr]_[0-9a-zA-Z]{36,}/,severity:"critical"},{id:"github-fine-grained",name:"GitHub Fine-Grained Token",pattern:/github_pat_[0-9a-zA-Z_]{22,}/,severity:"critical"},{id:"gitlab-token",name:"GitLab Token",pattern:/glpat-[0-9a-zA-Z_-]{20,}/,severity:"critical"},{id:"stripe-secret",name:"Stripe Secret Key",pattern:/sk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"stripe-restricted",name:"Stripe Restricted Key",pattern:/rk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"slack-token",name:"Slack Token",pattern:/xox[baprs]-[0-9a-zA-Z-]{10,}/,severity:"high"},{id:"slack-webhook",name:"Slack Webhook",pattern:/hooks\.slack\.com\/services\/T[0-9A-Z]{8,}\/B[0-9A-Z]{8,}\/[0-9a-zA-Z]{24}/,severity:"high"},{id:"twilio-api-key",name:"Twilio API Key",pattern:/SK[0-9a-fA-F]{32}/,severity:"high"},{id:"sendgrid-api-key",name:"SendGrid API Key",pattern:/SG\.[0-9a-zA-Z_-]{22}\.[0-9a-zA-Z_-]{43}/,severity:"critical"},{id:"postgres-uri",name:"PostgreSQL Connection String",pattern:/postgres(?:ql)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"mongodb-uri",name:"MongoDB Connection String",pattern:/mongodb(?:\+srv)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"redis-uri",name:"Redis Connection String",pattern:/redis(?:s)?:\/\/[^\s'"]{10,}/,severity:"high"},{id:"openai-key",name:"OpenAI API Key",pattern:/sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}/,severity:"critical"},{id:"openai-project-key",name:"OpenAI API Key",pattern:/sk-(?:proj|svcacct|admin)-[0-9A-Za-z_-]{40,}/,severity:"critical"},{id:"anthropic-key",name:"Anthropic API Key",pattern:/sk-ant-[0-9a-zA-Z_-]{40,}/,severity:"critical"},{id:"firebase-key",name:"Firebase API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"high"},{id:"supabase-key",name:"Supabase Service Key",pattern:/eyJ[0-9a-zA-Z_-]{100,}/,severity:"critical"},{id:"supabase-access-token",name:"Supabase Access Token",pattern:/\bsbp_[0-9a-f]{40}\b/,severity:"critical"},{id:"supabase-secret-key",name:"Supabase Secret Key",pattern:/\bsb_secret_[0-9A-Za-z_-]{20,}/,severity:"critical"},{id:"private-key",name:"Private Key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,severity:"critical"},{id:"jwt-secret",name:"JWT/Generic Secret",pattern:/(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"password-in-code",name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"bearer-token",name:"Bearer Token in Code",pattern:/['"]Bearer\s+[0-9a-zA-Z._-]{20,}['"]/,severity:"high"}];function At(){let e=fn().filter(t=>!pn.some(n=>n.id===t.id));return[...pn,...e]}var hn=/node_modules\/|\.next\/|\.test\.|\.spec\.|__tests__\/|\.nodata-proof\.json$|\.git\//,mn=/(^|\/)\.env(\.[\w-]+)*\.(example|sample|template|dist)$|\.(example|sample|template)$|(^|\/)[^/]*\.(example|sample)\.[a-z0-9]+$/i,It=/(^|\/)(__tests__|__mocks__|tests?|spec|fixtures?|mocks?|samples?|examples?|demo|testdata)(\/|$)|\.(test|spec)\.[a-z0-9]+$|\.min\.(m?js|css)$|(^|\/)[^/]*\.worker\.min\.m?js$/i,Ur=[{name:"lodash",below:"4.17.21",severity:"critical",cve:"CVE-2021-23337",desc:"Command injection via template"},{name:"minimist",below:"1.2.6",severity:"critical",cve:"CVE-2021-44906",desc:"Prototype pollution"},{name:"json5",below:"2.2.2",severity:"high",cve:"CVE-2022-46175",desc:"Prototype pollution"},{name:"express",below:"4.19.2",severity:"high",cve:"CVE-2024-29041",desc:"Open redirect"},{name:"path-to-regexp",below:"6.3.0",severity:"high",cve:"CVE-2024-45296",desc:"ReDoS"},{name:"sanitize-html",below:"2.12.1",severity:"high",cve:"CVE-2024-21501",desc:"XSS bypass"},{name:"dompurify",below:"3.0.9",severity:"high",cve:"CVE-2024-45801",desc:"mXSS"},{name:"jsonwebtoken",below:"9.0.0",severity:"critical",cve:"CVE-2022-23529",desc:"Key confusion attack"},{name:"jose",below:"4.15.5",severity:"high",cve:"CVE-2024-28176",desc:"DoS via JWE"},{name:"axios",below:"1.6.0",severity:"high",cve:"CVE-2023-45857",desc:"CSRF cookie leak"},{name:"node-fetch",below:"2.6.7",severity:"high",cve:"CVE-2022-0235",desc:"Header leak on redirect"},{name:"serialize-javascript",below:"6.0.2",severity:"critical",cve:"CVE-2024-11831",desc:"XSS via serialization"},{name:"xml2js",below:"0.6.0",severity:"high",cve:"CVE-2023-0842",desc:"Prototype pollution"},{name:"next",below:"14.1.1",severity:"high",cve:"CVE-2024-34350",desc:"SSRF via headers"},{name:"sharp",below:"0.32.6",severity:"high",cve:"CVE-2023-4863",desc:"libwebp heap overflow"},{name:"multer",below:"1.4.5",severity:"high",cve:"CVE-2022-24434",desc:"Prototype pollution"},{name:"tough-cookie",below:"4.1.3",severity:"medium",cve:"CVE-2023-26136",desc:"Prototype pollution"},{name:"semver",below:"7.5.4",severity:"medium",cve:"CVE-2022-25883",desc:"ReDoS"},{name:"ip",below:"2.0.1",severity:"critical",cve:"CVE-2024-29415",desc:"SSRF bypass via octal IP"},{name:"tar",below:"6.2.1",severity:"high",cve:"CVE-2024-28863",desc:"DoS via path traversal"}];function zr(e,t){let n=s=>s.replace(/^[^0-9]*/,"").split(".").map(o=>parseInt(o,10)||0),r=n(e),i=n(t);for(let s=0;s<3;s++){if((r[s]||0)<(i[s]||0))return!0;if((r[s]||0)>(i[s]||0))return!1}return!1}function gn(e){let t=[],n;try{n=JSON.parse(e)}catch{return t}let r={...n.dependencies??{},...n.devDependencies??{}};for(let[i,s]of Object.entries(r)){let o=(s||"").replace(/^[\^~>=<\s]+/,""),a=Ur.find(l=>l.name===i&&zr(o,l.below));a&&t.push({name:i,version:o,vuln:a})}return t}var Wr=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Salary / income"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication|prescription)$/i,type:"medical",label:"Medical"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Policy"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation"}],Vr=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם הלקוח|שם בן זוג|שם המבוטח|שם המוטב|שם הילד|שם הקטין)$/i,type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מס' זהות|teudat_zehut|tz|israeli_id|il_id)$/i,type:"id",label:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה)$/i,type:"id",label:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|אימייל|כתובת מייל)$/i,type:"email",label:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|טלפון נייד)$/i,type:"phone",label:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|רחוב|מס בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|מען)$/i,type:"address",label:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|ת לידה|תאריך הולדת|יום הולדת|גיל)$/i,type:"dob",label:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|מספר חשבון|מס חשבון|סניף|iban|iban_il)$/i,type:"financial",label:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|מספר אשראי|cvv|אשראי)$/i,type:"financial",label:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|מצב רפואי|חיסון|רגישות|אלרגיה|סוג דם)$/i,type:"medical",label:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מס פוליסה|פוליסה|מספר חבר|מספר ביטוח)$/i,type:"id",label:"\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4/\u05D7\u05D1\u05E8\u05D5\u05EA"},{pattern:/^(?:שם הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|תעודת לידה)$/i,type:"minor_data",label:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|השקפה פוליטית|מצב משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מס רכב|לוחית רישוי|מספר רישוי)$/i,type:"tracking",label:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}],Xr=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|enabled|active|public|version|metadata|config|settings|data|content|note|comment|label|color|icon)$/i,Gr=/^שם[ _](?:ה)?(?:קובץ|מוצר|פריט|חברה|ארגון|עסק|פרויקט|גיליון|טבלה|שדה|קטגוריה|סניף|בנק|עיר|רחוב|ישוב|יישוב|מסמך|תוכנית|חבילה|קורס|מחלקה|אתר|דומיין|מותג|ספק|שירות|תפקיד)$|^(file|product|item|company|org|organization|project|sheet|table|field|category|branch|bank|city|street|document|plan|course|department|site|domain|brand|vendor|service|role)[ _-]?name$/i;function be(e){if(!e)return null;let t=e.trim();if(Xr.test(t)||/^name$/i.test(t)||/^\[[A-Z_]+(?:-\d+)?\]$/.test(t))return null;let n=t.replace(/[\s-]+/g,"_");for(let r of[...Vr,...Wr])if(r.pattern.test(t)||r.pattern.test(n))return{type:r.type,label:r.label};if(Gr.test(t))return null;if(/^שם[ _][\u0590-\u05FF"'׳ ]{2,20}$/.test(t))return{type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"};if(/^(customer|client|employee|inspector|supervisor|contact|person|patient|user|owner|manager|agent|member|driver|tenant|student|parent|beneficiary|insured)_?(full_?)?name$/i.test(n))return{type:"name",label:"Person name"};for(let r of dn()){let i=r(t);if(i)return{type:i.type,label:i.label}}return null}var Je={id:"critical",financial:"critical",medical:"critical",biometric:"critical",minor_data:"critical",sensitive_personal:"critical",email:"high",phone:"high",name:"high",address:"high",dob:"high",tracking:"medium",location:"high",auth:"critical",employment:"medium",education:"medium",behavior:"high"};function qe(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let i=0;i<9;i++){let s=parseInt(n[i]??"0",10)*(i%2+1);s>9&&(s-=9),r+=s}return r%10===0&&parseInt(n,10)>0}var $t=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g;var Pe=/\bIL\d{2}\s?(?:\d{4}\s?){4}\d{3}\b/g;function Kr(e){let t=String(e??"").replace(/\D/g,"");if(t.length<12||t.length>19)return!1;let n=0,r=!1;for(let i=t.length-1;i>=0;i-=1){let s=parseInt(t[i]??"0",10);r&&(s*=2,s>9&&(s-=9)),n+=s,r=!r}return n%10===0}function Zr(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let i of n){let s=i>="A"&&i<="Z"?String(i.charCodeAt(0)-55):i;for(let o of s)r=(r*10+Number(o))%97}return r===1}var St="(?<!\\d)(?<!\\d[.,])",Et="(?!\\d)(?![.,]\\d)",Oe=[{subkind:"israeli_id",severity:"high",pattern:new RegExp(`${St}(?:\\d{8}-\\d|\\d{9})${Et}`,"g"),validate:qe,hint:"Israeli national ID (check digit verified) in plaintext. Encrypt the column or mask it at rest."},{subkind:"credit_card",severity:"critical",pattern:new RegExp(`${St}[2-6][ -]?(?:\\d[ -]?){11,17}\\d${Et}`,"g"),validate:Kr,hint:"Payment card number (Luhn verified) in plaintext. This is PCI scope."},{subkind:"iban",severity:"high",pattern:/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g,validate:Zr,hint:"Bank account in IBAN form (mod-97 verified) in plaintext."},{subkind:"israeli_phone",severity:"medium",pattern:new RegExp(`${St}(?:\\+972[- ]?|0)(?:[57]\\d|[2-489])[- ]?\\d{3}[- ]?\\d{4}${Et}`,"g"),validate:e=>{let t=e.replace(/\D/g,"").replace(/^972/,"0");return/^0[57]\d{8}$/.test(t)?!0:/^0[2-489]\d{7}$/.test(t)&&(/[- ]/.test(e)||e.startsWith("+972"))},hint:"Israeli phone number in plaintext."}];function yn(e){if(e.length!==14&&e.length!==17)return!1;let t=+e.slice(0,4),n=+e.slice(4,6),r=+e.slice(6,8),i=+e.slice(8,10),s=+e.slice(10,12),o=+e.slice(12,14);return t>=1970&&t<=2099&&n>=1&&n<=12&&r>=1&&r<=31&&i<24&&s<60&&o<60}function bn(e){let t=Number(e);return!Number.isSafeInteger(t)||t<1024?!1:Number.isInteger(Math.log2(t))||t%1048576===0}var Jr=new Set(["000000018","123456782","111111118","222222226","333333334","999999998","4111111111111111","4242424242424242","4000056655665556","5555555555554444","5105105105105100","2223003122003222","378282246310005","371449635398431","6011111111111117","3056930009020004","4012888888881881","4000000000000002"]);function Le(e){return Jr.has(e.replace(/\D/g,""))}function Ye(e){let t=e.replace(/\D/g,"");return yn(t)||bn(t)}function De(e,t){let n=[];for(let r of Oe){r.pattern.lastIndex=0;let i=new Set,s,o=0;for(;(s=r.pattern.exec(e))!==null&&(o+=1,!(o>2e5));){let a=s[0];if(!(r.subkind!=="iban"&&r.subkind!=="israeli_phone"&&Ye(a))&&(r.validate(a)&&i.add(a.replace(/[\s-]/g,"")),i.size>=1e5))break}if(i.size>0){if(t)for(let l of i)Le(l)||t(r.subkind,l);let a=[...i].filter(l=>!Le(l)).length;n.push({subkind:r.subkind,severity:a===0?"low":r.severity,hint:a===0?`${r.hint} All ${i.size} are published test numbers.`:r.hint,count:i.size,real:a})}}for(let r of Ze()){let i=new Set;for(let s of r.find(e))i.add(e.slice(s.start,s.end).trim());i.size>0&&n.push({subkind:r.kind,severity:r.severity,hint:r.hint,count:i.size})}return n}function Ne(e,t){let n=[],r="",i=!1;for(let s=0;s<e.length;s++){let o=e[s];i?o==='"'&&e[s+1]==='"'?(r+='"',s++):o==='"'?i=!1:r+=o:o==='"'?i=!0:o===t?(n.push(r),r=""):r+=o}return n.push(r),n}import{inflateRawSync as Oi}from"node:zlib";import{inflateSync as _n}from"node:zlib";var Fe=new Set([".pdf"]),xn=8*1024*1024;function Qe(e){let t=e.toString("latin1"),n=new Map,r=/(\d+)\s+(\d+)\s+obj\b/g,i;for(;(i=r.exec(t))!==null;){let s=Number(i[1]),o=r.lastIndex,a=t.indexOf("endobj",o);if(a<0)continue;let l=t.indexOf("stream",o),c,h=null;if(l>=0&&l<a){c=t.slice(o,l);let u=l+6;t[u]==="\r"&&(u+=1),t[u]===`
4
- `&&(u+=1);let p=t.indexOf("endstream",u);p>u&&(h=e.subarray(u,p))}else c=t.slice(o,a);n.set(s,{num:s,dict:c,stream:h})}for(let s of[...n.values()]){if(!s.stream||!/\/Type\s*\/ObjStm\b/.test(s.dict))continue;let o=Me(s),a=Number(/\/N\s+(\d+)/.exec(s.dict)?.[1]??0),l=Number(/\/First\s+(\d+)/.exec(s.dict)?.[1]??-1);if(o===null||!a||l<0)continue;let c=o.slice(0,l).trim().split(/\s+/).map(Number);for(let h=0;h<a;h+=1){let u=c[2*h],p=c[2*h+1];if(u===void 0||p===void 0||Number.isNaN(u)||Number.isNaN(p))break;let _=h+1<a?c[2*(h+1)+1]:void 0,x=o.slice(l+p,_!==void 0?l+_:void 0);n.has(u)||n.set(u,{num:u,dict:x,stream:null})}}return n}function Tt(e){let t=[...e.replace(/\s+/g,"")];if(t.length<40)return!1;let n=0,r=0;for(let i of t){let s=i.codePointAt(0)??0;s<32||s>=127&&s<=191||s===65533||s>=57344&&s<=63743?n+=1:/[\p{L}\p{N}]/u.test(i)&&(r+=1)}return n/t.length>.2||r/t.length<.25}function qr(e){let t=e.toString("latin1").replace(/\s/g,"");t.startsWith("<~")&&(t=t.slice(2));let n=t.indexOf("~>");n>=0&&(t=t.slice(0,n));let r=[],i=0,s=0;for(let o of t){if(o==="z"&&s===0){r.push(0,0,0,0);continue}let a=o.charCodeAt(0)-33;if(a<0||a>84)return null;i=i*85+a,s+=1,s===5&&(r.push(i>>>24&255,i>>>16&255,i>>>8&255,i&255),i=0,s=0)}if(s>0){for(let a=s;a<5;a+=1)i=i*85+84;let o=[i>>>24&255,i>>>16&255,i>>>8&255,i&255];for(let a=0;a<s-1;a+=1)r.push(o[a]??0)}return Buffer.from(r)}function Yr(e){let t=e.toString("latin1").replace(/\s/g,"").split(">")[0]??"",n=t.length%2?t+"0":t;return/^[0-9A-Fa-f]*$/.test(n)?Buffer.from(n,"hex"):null}function Qr(e){let t=/\/Filter\s*(\[[^\]]*\]|\/\w+)/.exec(e);return!t||!t[1]?[]:[...t[1].matchAll(/\/(\w+)/g)].map(n=>n[1]??"")}function Me(e,t){if(!e.stream)return null;let n=e.stream;for(let r of Qr(e.dict)){let i=null;if(r==="FlateDecode")try{i=t!==void 0?_n(n,{maxOutputLength:Math.max(1,t)}):_n(n)}catch{return null}else if(r==="ASCII85Decode")i=qr(n);else if(r==="ASCIIHexDecode")i=Yr(n);else return null;if(i===null)return null;n=i}return n.toString("latin1")}function ei(e){let t=new Map,n=1,r=/begincodespacerange([\s\S]*?)endcodespacerange/.exec(e);if(r&&r[1]){let l=/<([0-9A-Fa-f]+)>/.exec(r[1]);l&&l[1]&&l[1].length>=4&&(n=2)}let i=l=>{let c="";for(let h=0;h+3<l.length+1;h+=4){let u=parseInt(l.slice(h,h+4),16);Number.isFinite(u)&&u>0&&(c+=String.fromCharCode(u))}return c},s=/beginbfchar([\s\S]*?)endbfchar/g,o;for(;(o=s.exec(e))!==null;){let l=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,c;for(;(c=l.exec(o[1]??""))!==null;)t.set(parseInt(c[1]??"0",16),i(c[2]??""))}let a=/beginbfrange([\s\S]*?)endbfrange/g;for(;(o=a.exec(e))!==null;){let l=o[1]??"",c=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,h;for(;(h=c.exec(l))!==null;){let u=parseInt(h[1]??"0",16),p=parseInt(h[2]??"0",16),_=parseInt((h[3]??"0").slice(0,4)||"0",16);if(!(p-u>65535))for(let x=u;x<=p;x+=1)t.set(x,String.fromCharCode(_+(x-u)))}}return{map:t,bytes:n}}function ti(e){let t=new Map,n=[],r=[];for(let s of e.values()){for(let o of s.dict.matchAll(/\/Font\s*<<([\s\S]*?)>>/g))o[1]&&r.push(o[1]);for(let o of s.dict.matchAll(/\/Font\s+(\d+)\s+\d+\s+R/g)){let a=e.get(Number(o[1]));a&&r.push(a.dict)}}let i=new Set;for(let s of r){let o=/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g,a;for(;(a=o.exec(s))!==null;){let l=`${a[1]}#${a[2]}`;i.has(l)||(i.add(l),n.push([a[1]??"",Number(a[2])]))}}for(let[s,o]of n){let a=e.get(o);if(!a)continue;let l=null,c=/\/ToUnicode\s+(\d+)\s+\d+\s+R/.exec(a.dict);if(c){let u=e.get(Number(c[1])),p=u?Me(u):null;p&&(l=ei(p))}if(l||(l=ii(a.dict,e)),!l)continue;let h=t.get(s)??[];h.push(l),t.set(s,h)}return t}var ni=["alef","bet","gimel","dalet","he","vav","zayin","het","tet","yod","finalkaf","kaf","lamed","finalmem","mem","finalnun","nun","samekh","ayin","finalpe","pe","finaltsadi","tsadi","qof","resh","shin","tav"];function ri(e){let t=/^uni([0-9A-Fa-f]{4})$/.exec(e)??/^u([0-9A-Fa-f]{4,6})$/.exec(e);if(t)return String.fromCodePoint(parseInt(t[1],16));let n=/^afii(\d{5})$/.exec(e);if(n){let s=Number(n[1]);if(s>=57664&&s<=57690)return String.fromCharCode(1488+(s-57664))}let r=ni.indexOf(e.replace(/hebrew$/,""));return r>=0?String.fromCharCode(1488+r):e==="space"?" ":/^[A-Za-z]$/.test(e)?e:{zero:"0",one:"1",two:"2",three:"3",four:"4",five:"5",six:"6",seven:"7",eight:"8",nine:"9",period:".",comma:",",hyphen:"-",colon:":",slash:"/",at:"@"}[e]??null}function ii(e,t){let n=e,r=/\/Encoding\s+(\d+)\s+\d+\s+R/.exec(e);r&&(n=t.get(Number(r[1]))?.dict??"");let i=/\/Differences\s*\[([^\]]*)\]/.exec(n);if(!i?.[1])return null;let s=new Map,o=0;for(let a of i[1].match(/\d+|\/[^\s/[\]]+/g)??[]){if(/^\d+$/.test(a)){o=Number(a);continue}let l=ri(a.slice(1));l!==null&&s.set(o,l),o+=1}return s.size?{map:s,bytes:1}:null}function An(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r!=="\\"){t.push(r.charCodeAt(0)&255);continue}let i=e[n+1];if(i===void 0)break;if(i>="0"&&i<="7"){let o="",a=n+1;for(;a<e.length&&o.length<3&&e[a]>="0"&&e[a]<="7";)o+=e[a],a+=1;t.push(parseInt(o,8)&255),n=a-1;continue}let s={n:10,r:13,t:9,b:8,f:12};t.push(s[i]??i.charCodeAt(0)&255),n+=1}return t}function In(e){if(e.length<2||e[0]!==254||e[1]!==255)return null;let t="";for(let n=2;n+1<e.length;n+=2)t+=String.fromCharCode((e[n]??0)<<8|(e[n+1]??0));return t}function wn(e,t){let n=In(e);if(n!==null)return n;if(!t)return e.map(i=>String.fromCharCode(i)).join("");let r="";if(t.bytes===2)for(let i=0;i+1<e.length;i+=2){let s=(e[i]??0)<<8|(e[i+1]??0);r+=t.map.get(s)??""}else for(let i of e)r+=t.map.get(i)??String.fromCharCode(i);return r}function si(e){let t=0;for(let n of e){let r=n.codePointAt(0)??0;/[\p{L}\p{N}]/u.test(n)?t+=1:(r<32||r>=127&&r<=191||r===65533)&&(t-=2)}return t}function vn(e,t){if(!t||t.length<=1)return wn(e,t?.[0]);let n="",r=-1/0;for(let i of t){let s=wn(e,i),o=si(s);o>r&&(n=s,r=o)}return n}function oi(e,t){let n="",r="",i,s=!1,o="",a=0,l=null,c=()=>{r.trim()&&(n+=r+`
5
- `),r="",a=0},h=()=>{r&&!r.endsWith(" ")&&a>1&&(r+=" ")},u=/\/([^\s/<>[\]()]+)\s+-?[\d.]+\s+Tf|(-?[\d.]+)\s+(-?[\d.]+)\s+T[dD]\b|(?:-?[\d.]+\s+){5}(-?[\d.]+)\s+Tm\b|T\*|\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>|\[|\]|-?\d+(?:\.\d+)?|TJ|Tj|'|"/g,p;for(;(p=u.exec(e))!==null;){let _=p[0];if(p[1]!==void 0&&_.endsWith("Tf")){i=t.get(p[1]);continue}if(p[2]!==void 0){Math.abs(Number(p[3]))>.01?c():Number(p[2])!==0&&h();continue}if(p[4]!==void 0){let x=Number(p[4]);l!==null&&Math.abs(x-l)>.01?c():l!==null&&h(),l=x;continue}if(_==="T*"){c();continue}if(_==="["){s=!0;continue}if(_==="]"){s=!1;continue}if(_==="TJ"||_==="Tj"||_==="'"||_==='"'){(_==="'"||_==='"')&&c(),o&&(r+=o,a=o.trim().length,o="");continue}if(_.startsWith("("))o+=vn(An(_.slice(1,-1)),i);else if(_.startsWith("<")){let x=_.slice(1,-1).replace(/\s+/g,""),$=[];for(let N=0;N+1<x.length;N+=2)$.push(parseInt(x.slice(N,N+2),16));o+=vn($,i)}else s&&Number(_)<-200&&o&&!o.endsWith(" ")&&(o+=" ")}return o&&(r+=o),c(),n}function ai(e,t){let n=e.toString("latin1"),r=/\/Info\s+(\d+)\s+\d+\s+R/.exec(n),i=r?t.get(Number(r[1]))?.dict:void 0;if(!i)return"";let s=[],o=/\/(Author|Title|Subject|Keywords|Creator|Producer)\s*(\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>)/g,a;for(;(a=o.exec(i))!==null;){let l=a[2]??"";if(l.startsWith("(")){let c=An(l.slice(1,-1));s.push(In(c)??c.map(h=>String.fromCharCode(h)).join(""))}else{let c=l.slice(1,-1).replace(/\s+/g,""),h="";if(c.toUpperCase().startsWith("FEFF"))for(let u=4;u+3<c.length+1;u+=4)h+=String.fromCharCode(parseInt(c.slice(u,u+4),16));else for(let u=0;u+1<c.length;u+=2)h+=String.fromCharCode(parseInt(c.slice(u,u+2),16));s.push(h)}}return s.join(`
6
- `)}var kn="\u05DD\u05DF\u05E5\u05E3\u05DA";function et(e){let t=0,n=0;for(let r of e.match(/[\u05D0-\u05EA]{2,}/g)??[])kn.includes(r[0])&&(t+=1),kn.includes(r[r.length-1])&&(n+=1);return t>=3&&t>n*2}var ci={"(":")",")":"(","[":"]","]":"[","<":">",">":"<","{":"}","}":"{"};function tt(e){return/[\u05D0-\u05EA]/.test(e)?[...e].reverse().map(n=>ci[n]??n).join("").replace(/[A-Za-z0-9](?:[A-Za-z0-9@._\-/:+]*[A-Za-z0-9])?/g,n=>[...n].reverse().join("")):e}function Rt(e){if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-")||e.toString("latin1",0,Math.min(e.length,4096)).includes("/Encrypt"))return null;let n=Qe(e);if(n.size===0)return null;let r=ti(n),i=[];i.push(ai(e,n));let s=0,o=0,a=!1;for(let c of n.values()){if(!c.stream||!/\/Subtype\s*\/Form\b/.test(c.dict)&&/\/Subtype|\/Type\s*\/(XObject|Font|Metadata|ObjStm|XRef)|\/FontFile/.test(c.dict))continue;let u=Me(c);if(u===null||!/(TJ|Tj)\b/.test(u))continue;let p=oi(u,r);if(p.trim().length!==0){if(o+=1,s+p.length>xn){i.push(p.slice(0,Math.max(0,xn-s))),a=!0;break}i.push(p),s+=p.length}}if(o===0)return null;let l=i.slice(1).join(`
7
- `);return Tt(l)?null:(et(l)&&(l=l.split(`
8
- `).map(tt).join(`
9
- `)),{text:[i[0]??"",l].join(`
10
- `),truncated:a,streams:o})}var $n=200;function li(e){let t=0,n=0;for(let r of Qe(e).values())/\/Type\s*\/Page\b(?!s)/.test(r.dict)&&(t+=1),r.stream&&/\/Subtype\s*\/Image\b/.test(r.dict)&&(n+=1);return{pages:Math.max(t,1),images:n}}var Sn=/(\d+)\s+\d+\s+R/g;function fe(e,t){let n=new RegExp(`/${t}\\b\\s*`).exec(e);if(!n)return null;let r=n.index+n[0].length;if(e.startsWith("<<",r)){let s=0;for(let o=r;o<e.length-1;o++)if(e.startsWith("<<",o))s++,o++;else if(e.startsWith(">>",o)&&(s--,o++,s===0))return e.slice(r,o+1);return e.slice(r)}if(e[r]==="[")return e.slice(r,e.indexOf("]",r)+1||void 0);let i=/^(\d+)\s+\d+\s+R/.exec(e.slice(r));return i?i[0]:null}function _e(e,t){if(!t)return null;let n=/^(\d+)\s+\d+\s+R$/.exec(t.trim());return n?e.get(Number(n[1]))?.dict??null:t}function ui(e){let t=0;for(let n of e.matchAll(/\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]+>/g)){let r=n[0];t+=r.startsWith("(")?r.slice(1,-1).replace(/\\./g,"x").replace(/\s+/g,"").length:Math.floor(r.replace(/[<>\s]/g,"").length/2)}return t}var di=2e3,fi=2e4,En=64*1024*1024;function pi(e){let t=Qe(e),n=[...t.values()].filter(p=>/\/Type\s*\/Page\b(?!s)/.test(p.dict));if(!n.length||n.length>di)return null;let r=0,i=0,s=!1,o=new Set,a=new Set,l=(p,_=0)=>{if(o.has(p))return!0;if(a.has(p))return!1;if(++r>fi)return s=!0,!1;let x=t.get(p),$=!1;if(x&&/\/Subtype\s*\/Image\b/.test(x.dict))$=!0;else if(x&&/\/Subtype\s*\/Form\b/.test(x.dict)){if(_>2)return s=!0,!1;a.add(p);let N=_e(t,fe(x.dict,"Resources")),b=_e(t,N?fe(N,"XObject"):null)??"";for(let T of b.matchAll(Sn))if(l(Number(T[1]),_+1)){$=!0;break}a.delete(p)}return $&&o.add(p),$},c=new Map,h=p=>{if(c.has(p))return c.get(p);let _=t.get(p),x=_?Me(_,En-i):null;return x!==null&&(i+=x.length),c.set(p,x),x},u=0;for(let p of n){let _=_e(t,fe(p.dict,"Resources"));for(let K=p.dict,G=0;!_&&G<8;G++){let te=_e(t,fe(K,"Parent"));if(!te)break;_=_e(t,fe(te,"Resources")),K=te}let x=_e(t,_?fe(_,"XObject"):null)??"",$=new Set;for(let K of x.matchAll(/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g))l(Number(K[2]))&&$.add(K[1]);let N=[...(fe(p.dict,"Contents")??"").matchAll(Sn)].map(K=>Number(K[1]));if(!N.length)continue;if(s||i>=En)return u>0?u:null;let b=N.map(h);if(b.some(K=>K===null)){$.size>0&&(u+=1);continue}let T=b.join(`
11
- `),f=T.search(/\bBI\b/);(f>=0&&T.indexOf("ID",f+2)>0||[...T.matchAll(/\/([^\s/<>[\]()]+)\s+Do\b/g)].some(K=>$.has(K[1])))&&ui(T)<$n&&(u+=1)}return s&&u===0?null:u}function Tn(e,t){let n=li(e);if(n.images>0&&t.replace(/\s+/g,"").length<$n*n.pages)return!0;let i=pi(e);return i===null?n.images>0:i>0}function Rn(e){if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-"))return"not a valid PDF";if(e.toString("latin1",0,Math.min(e.length,4096)).includes("/Encrypt"))return"encrypted (password or copy protection)";let n=Qe(e),r=0,i=0,s=0;for(let o of n.values()){if(!o.stream)continue;if(/\/Subtype\s*\/Image\b/.test(o.dict)){i+=1;continue}let a=Me(o);if(a===null){/\/Type\s*\/(Font|Metadata|XRef)|\/FontFile|\/Length1/.test(o.dict)||(s+=1);continue}/(TJ|Tj)\b/.test(a)&&(r+=1)}return r===0&&i>0?"no text layer \u2014 a scanned image (needs OCR, which NoData does not do)":r===0&&s>0?"its pages are compressed in a way NoData cannot open":r===0?"no text in it":"its fonts have no usable letter map \u2014 the text decodes to symbols"}import{execFileSync as hi}from"node:child_process";import{existsSync as mi,mkdtempSync as gi,readFileSync as Ln,readdirSync as it,rmSync as yi,statSync as bi,writeFileSync as Pn}from"node:fs";import{tmpdir as _i}from"node:os";import{delimiter as xi,join as Z}from"node:path";var ne="install the free tools once (they run only on this computer): winget install oschwartz10612.Poppler and winget install UB-Mannheim.TesseractOCR (tick Hebrew in its installer)",nt=null;function Cn(e){try{return bi(e).isFile()}catch{return!1}}function wi(){let e=[],t=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"]].filter(Boolean),n=process.env.LOCALAPPDATA;for(let r of t)e.push(Z(r,"Tesseract-OCR"));if(n){e.push(Z(n,"Programs","Tesseract-OCR"),Z(n,"Microsoft","WinGet","Links"));let r=Z(n,"Microsoft","WinGet","Packages");try{for(let i of it(r))if(/^oschwartz10612\.Poppler/i.test(i))for(let s of it(Z(r,i)))e.push(Z(r,i,s,"Library","bin"))}catch{}}for(let r of t)try{for(let i of it(r))/^poppler/i.test(i)&&e.push(Z(r,i,"Library","bin"),Z(r,i,"bin"))}catch{}return e}function rt(e,t){let n=process.env[t];if(n)return Cn(n)?n:void 0;let r=process.platform==="win32",i=r?[`${e}.exe`,e]:[e],s=(process.env.PATH??"").split(xi).filter(Boolean);r&&s.push(...wi());for(let o of s)for(let a of i)if(Cn(Z(o,a)))return Z(o,a)}function ae(e,t,n){try{return hi(e,t,{encoding:"utf8",timeout:n,maxBuffer:64*1024*1024,stdio:["ignore","pipe","ignore"],windowsHide:!0})}catch{return null}}function re(){if(nt)return nt;if(/^(0|off|false|no)$/i.test(process.env.NODATA_PDF_TOOLS??""))return nt={ocrLangs:[],osd:!1};let e={pdftotext:rt("pdftotext","NODATA_PDFTOTEXT"),pdftoppm:rt("pdftoppm","NODATA_PDFTOPPM"),tesseract:rt("tesseract","NODATA_TESSERACT"),ocrmypdf:rt("ocrmypdf","NODATA_OCRMYPDF"),ocrLangs:[],osd:!1};if(e.tesseract){let t=new Set((ae(e.tesseract,["--list-langs"],15e3)??"").split(/\r?\n/).map(n=>n.trim()));e.ocrLangs=["heb","eng"].filter(n=>t.has(n)),e.osd=t.has("osd")}return nt=e}function st(e,t,n=".pdf"){let r=gi(Z(_i(),"nd-read-"));try{let i=Z(r,`in${n}`);return Pn(i,e,{mode:384}),t(r,i)}finally{yi(r,{recursive:!0,force:!0})}}function ot(e){let t=e.replace(/[\u200E\u200F\u202A-\u202E\u2066-\u2069]/g,"").replace(/\f/g,`
3
+ import{parentPort as At}from"node:worker_threads";import{createHash as Js}from"node:crypto";import{closeSync as Ys,existsSync as qs,openSync as Qs,readSync as eo,readdirSync as mr,readFileSync as to,statSync as xt}from"node:fs";import{homedir as no}from"node:os";import{basename as gr,join as Ge}from"node:path";import{TextDecoder as Sr}from"node:util";var Q={text:[],header:[],secrets:[],table:null,amounts:null,severity:null};function Tt(e){e.table&&(Q.table=e.table),e.severity&&(Q.severity=e.severity),e.amounts&&(Q.amounts=e.amounts);for(let t of e.text??[])Q.text.some(n=>n.kind===t.kind)||Q.text.push(t);e.header&&!Q.header.includes(e.header)&&Q.header.push(e.header);for(let t of e.secrets??[])Q.secrets.some(n=>n.id===t.id)||Q.secrets.push(t)}function Ye(e){return Q.severity?.(e)}function qe(){return Q.text}function yn(){return Q.header}function Ce(){return Q.table}function bn(){return Q.secrets}var _n=[{id:"aws-access-key",name:"AWS Access Key",pattern:/(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)/,severity:"critical"},{id:"aws-secret-key",name:"AWS Secret Key",pattern:/(?:aws_secret_access_key|aws_secret_key|secret_access_key)\s*[=:]\s*['"]?[A-Za-z0-9/+=]{40}['"]?/,severity:"critical"},{id:"gcp-api-key",name:"GCP API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"critical"},{id:"gcp-service-account",name:"GCP Service Account",pattern:/"type"\s*:\s*"service_account"/,severity:"critical"},{id:"github-token",name:"GitHub Token",pattern:/gh[pousr]_[0-9a-zA-Z]{36,}/,severity:"critical"},{id:"github-fine-grained",name:"GitHub Fine-Grained Token",pattern:/github_pat_[0-9a-zA-Z_]{22,}/,severity:"critical"},{id:"gitlab-token",name:"GitLab Token",pattern:/glpat-[0-9a-zA-Z_-]{20,}/,severity:"critical"},{id:"stripe-secret",name:"Stripe Secret Key",pattern:/sk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"stripe-restricted",name:"Stripe Restricted Key",pattern:/rk_live_[0-9a-zA-Z]{24,}/,severity:"critical"},{id:"slack-token",name:"Slack Token",pattern:/xox[baprs]-[0-9a-zA-Z-]{10,}/,severity:"high"},{id:"slack-webhook",name:"Slack Webhook",pattern:/hooks\.slack\.com\/services\/T[0-9A-Z]{8,}\/B[0-9A-Z]{8,}\/[0-9a-zA-Z]{24}/,severity:"high"},{id:"twilio-api-key",name:"Twilio API Key",pattern:/SK[0-9a-fA-F]{32}/,severity:"high"},{id:"sendgrid-api-key",name:"SendGrid API Key",pattern:/SG\.[0-9a-zA-Z_-]{22}\.[0-9a-zA-Z_-]{43}/,severity:"critical"},{id:"postgres-uri",name:"PostgreSQL Connection String",pattern:/postgres(?:ql)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"mongodb-uri",name:"MongoDB Connection String",pattern:/mongodb(?:\+srv)?:\/\/[^\s'"]{10,}/,severity:"critical"},{id:"redis-uri",name:"Redis Connection String",pattern:/redis(?:s)?:\/\/[^\s'"]{10,}/,severity:"high"},{id:"openai-key",name:"OpenAI API Key",pattern:/sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}/,severity:"critical"},{id:"openai-project-key",name:"OpenAI API Key",pattern:/sk-(?:proj|svcacct|admin)-[0-9A-Za-z_-]{40,}/,severity:"critical"},{id:"anthropic-key",name:"Anthropic API Key",pattern:/sk-ant-[0-9a-zA-Z_-]{40,}/,severity:"critical"},{id:"firebase-key",name:"Firebase API Key",pattern:/AIza[0-9A-Za-z_-]{35}/,severity:"high"},{id:"supabase-key",name:"Supabase Service Key",pattern:/eyJ[0-9a-zA-Z_-]{100,}/,severity:"critical"},{id:"supabase-access-token",name:"Supabase Access Token",pattern:/\bsbp_[0-9a-f]{40}\b/,severity:"critical"},{id:"supabase-secret-key",name:"Supabase Secret Key",pattern:/\bsb_secret_[0-9A-Za-z_-]{20,}/,severity:"critical"},{id:"private-key",name:"Private Key",pattern:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,severity:"critical"},{id:"jwt-secret",name:"JWT/Generic Secret",pattern:/(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"password-in-code",name:"Password in Code",pattern:/(?:password|passwd|pwd)\s*[=:]\s*['"][^'"]{8,}['"]/,severity:"high"},{id:"bearer-token",name:"Bearer Token in Code",pattern:/['"]Bearer\s+[0-9a-zA-Z._-]{20,}['"]/,severity:"high"}];function Lt(){let e=bn().filter(t=>!_n.some(n=>n.id===t.id));return[..._n,...e]}var xn=/node_modules\/|\.next\/|\.test\.|\.spec\.|__tests__\/|\.nodata-proof\.json$|\.git\//,wn=/(^|\/)\.env(\.[\w-]+)*\.(example|sample|template|dist)$|\.(example|sample|template)$|(^|\/)[^/]*\.(example|sample)\.[a-z0-9]+$/i,Ct=/(^|\/)(__tests__|__mocks__|tests?|spec|fixtures?|mocks?|samples?|examples?|demo|testdata)(\/|$)|\.(test|spec)\.[a-z0-9]+$|\.min\.(m?js|css)$|(^|\/)[^/]*\.worker\.min\.m?js$/i,Kr=[{name:"lodash",below:"4.17.21",severity:"critical",cve:"CVE-2021-23337",desc:"Command injection via template"},{name:"minimist",below:"1.2.6",severity:"critical",cve:"CVE-2021-44906",desc:"Prototype pollution"},{name:"json5",below:"2.2.2",severity:"high",cve:"CVE-2022-46175",desc:"Prototype pollution"},{name:"express",below:"4.19.2",severity:"high",cve:"CVE-2024-29041",desc:"Open redirect"},{name:"path-to-regexp",below:"6.3.0",severity:"high",cve:"CVE-2024-45296",desc:"ReDoS"},{name:"sanitize-html",below:"2.12.1",severity:"high",cve:"CVE-2024-21501",desc:"XSS bypass"},{name:"dompurify",below:"3.0.9",severity:"high",cve:"CVE-2024-45801",desc:"mXSS"},{name:"jsonwebtoken",below:"9.0.0",severity:"critical",cve:"CVE-2022-23529",desc:"Key confusion attack"},{name:"jose",below:"4.15.5",severity:"high",cve:"CVE-2024-28176",desc:"DoS via JWE"},{name:"axios",below:"1.6.0",severity:"high",cve:"CVE-2023-45857",desc:"CSRF cookie leak"},{name:"node-fetch",below:"2.6.7",severity:"high",cve:"CVE-2022-0235",desc:"Header leak on redirect"},{name:"serialize-javascript",below:"6.0.2",severity:"critical",cve:"CVE-2024-11831",desc:"XSS via serialization"},{name:"xml2js",below:"0.6.0",severity:"high",cve:"CVE-2023-0842",desc:"Prototype pollution"},{name:"next",below:"14.1.1",severity:"high",cve:"CVE-2024-34350",desc:"SSRF via headers"},{name:"sharp",below:"0.32.6",severity:"high",cve:"CVE-2023-4863",desc:"libwebp heap overflow"},{name:"multer",below:"1.4.5",severity:"high",cve:"CVE-2022-24434",desc:"Prototype pollution"},{name:"tough-cookie",below:"4.1.3",severity:"medium",cve:"CVE-2023-26136",desc:"Prototype pollution"},{name:"semver",below:"7.5.4",severity:"medium",cve:"CVE-2022-25883",desc:"ReDoS"},{name:"ip",below:"2.0.1",severity:"critical",cve:"CVE-2024-29415",desc:"SSRF bypass via octal IP"},{name:"tar",below:"6.2.1",severity:"high",cve:"CVE-2024-28863",desc:"DoS via path traversal"}];function Jr(e,t){let n=s=>s.replace(/^[^0-9]*/,"").split(".").map(o=>parseInt(o,10)||0),r=n(e),i=n(t);for(let s=0;s<3;s++){if((r[s]||0)<(i[s]||0))return!0;if((r[s]||0)>(i[s]||0))return!1}return!1}function vn(e){let t=[],n;try{n=JSON.parse(e)}catch{return t}let r={...n.dependencies??{},...n.devDependencies??{}};for(let[i,s]of Object.entries(r)){let o=(s||"").replace(/^[\^~>=<\s]+/,""),a=Kr.find(c=>c.name===i&&Jr(o,c.below));a&&t.push({name:i,version:o,vuln:a})}return t}var Yr=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Salary / income"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication|prescription)$/i,type:"medical",label:"Medical"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Policy"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation"}],qr=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם הלקוח|שם בן זוג|שם המבוטח|שם המוטב|שם הילד|שם הקטין)$/i,type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מס' זהות|teudat_zehut|tz|israeli_id|il_id)$/i,type:"id",label:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה)$/i,type:"id",label:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|אימייל|כתובת מייל)$/i,type:"email",label:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|טלפון נייד)$/i,type:"phone",label:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|רחוב|מס בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|מען)$/i,type:"address",label:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|ת לידה|תאריך הולדת|יום הולדת|גיל)$/i,type:"dob",label:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|מספר חשבון|מס חשבון|סניף|iban|iban_il)$/i,type:"financial",label:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|מספר אשראי|cvv|אשראי)$/i,type:"financial",label:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|מצב רפואי|חיסון|רגישות|אלרגיה|סוג דם)$/i,type:"medical",label:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מס פוליסה|פוליסה|מספר חבר|מספר ביטוח)$/i,type:"id",label:"\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4/\u05D7\u05D1\u05E8\u05D5\u05EA"},{pattern:/^(?:שם הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|תעודת לידה)$/i,type:"minor_data",label:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|השקפה פוליטית|מצב משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מס רכב|לוחית רישוי|מספר רישוי)$/i,type:"tracking",label:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}],Qr=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|enabled|active|public|version|metadata|config|settings|data|content|note|comment|label|color|icon)$/i,ei=/^שם[ _](?:ה)?(?:קובץ|מוצר|פריט|חברה|ארגון|עסק|פרויקט|גיליון|טבלה|שדה|קטגוריה|סניף|בנק|עיר|רחוב|ישוב|יישוב|מסמך|תוכנית|חבילה|קורס|מחלקה|אתר|דומיין|מותג|ספק|שירות|תפקיד)$|^(file|product|item|company|org|organization|project|sheet|table|field|category|branch|bank|city|street|document|plan|course|department|site|domain|brand|vendor|service|role)[ _-]?name$/i;function _e(e){if(!e)return null;let t=e.trim();if(Qr.test(t)||/^name$/i.test(t)||/^\[[A-Z_]+(?:-\d+)?\]$/.test(t))return null;let n=t.replace(/[\s-]+/g,"_");for(let r of[...qr,...Yr])if(r.pattern.test(t)||r.pattern.test(n))return{type:r.type,label:r.label};if(ei.test(t))return null;if(/^שם[ _][\u0590-\u05FF"'׳ ]{2,20}$/.test(t))return{type:"name",label:"\u05E9\u05DD \u05D0\u05D3\u05DD"};if(/^(customer|client|employee|inspector|supervisor|contact|person|patient|user|owner|manager|agent|member|driver|tenant|student|parent|beneficiary|insured)_?(full_?)?name$/i.test(n))return{type:"name",label:"Person name"};for(let r of yn()){let i=r(t);if(i)return{type:i.type,label:i.label}}return null}var Qe={id:"critical",financial:"critical",medical:"critical",biometric:"critical",minor_data:"critical",sensitive_personal:"critical",email:"high",phone:"high",name:"high",address:"high",dob:"high",tracking:"medium",location:"high",auth:"critical",employment:"medium",education:"medium",behavior:"high"};function et(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let i=0;i<9;i++){let s=parseInt(n[i]??"0",10)*(i%2+1);s>9&&(s-=9),r+=s}return r%10===0&&parseInt(n,10)>0}var Pt=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g;var Oe=/\bIL\d{2}\s?(?:\d{4}\s?){4}\d{3}\b/g;function ti(e){let t=String(e??"").replace(/\D/g,"");if(t.length<12||t.length>19)return!1;let n=0,r=!1;for(let i=t.length-1;i>=0;i-=1){let s=parseInt(t[i]??"0",10);r&&(s*=2,s>9&&(s-=9)),n+=s,r=!r}return n%10===0}function tt(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let i of n){let s=i>="A"&&i<="Z"?String(i.charCodeAt(0)-55):i;for(let o of s)r=(r*10+Number(o))%97}return r===1}var $t="(?<!\\d)(?<!\\d[.,])",Rt="(?!\\d)(?![.,]\\d)",De=[{subkind:"israeli_id",severity:"high",pattern:new RegExp(`${$t}(?:\\d{8}-\\d|\\d{9})${Rt}`,"g"),validate:et,hint:"Israeli national ID (check digit verified) in plaintext. Encrypt the column or mask it at rest."},{subkind:"credit_card",severity:"critical",pattern:new RegExp(`${$t}[2-6][ -]?(?:\\d[ -]?){11,17}\\d${Rt}`,"g"),validate:ti,hint:"Payment card number (Luhn verified) in plaintext. This is PCI scope."},{subkind:"iban",severity:"high",pattern:/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g,validate:tt,hint:"Bank account in IBAN form (mod-97 verified) in plaintext."},{subkind:"israeli_phone",severity:"medium",pattern:new RegExp(`${$t}(?:\\+972[- ]?|0)(?:[57]\\d|[2-489])[- ]?\\d{3}[- ]?\\d{4}${Rt}`,"g"),validate:e=>{let t=e.replace(/\D/g,"").replace(/^972/,"0");return/^0[57]\d{8}$/.test(t)?!0:/^0[2-489]\d{7}$/.test(t)&&(/[- ]/.test(e)||e.startsWith("+972"))},hint:"Israeli phone number in plaintext."}];function kn(e){if(e.length!==14&&e.length!==17)return!1;let t=+e.slice(0,4),n=+e.slice(4,6),r=+e.slice(6,8),i=+e.slice(8,10),s=+e.slice(10,12),o=+e.slice(12,14);return t>=1970&&t<=2099&&n>=1&&n<=12&&r>=1&&r<=31&&i<24&&s<60&&o<60}function Sn(e){let t=Number(e);return!Number.isSafeInteger(t)||t<1024?!1:Number.isInteger(Math.log2(t))||t%1048576===0}var ni=new Set(["000000018","123456782","111111118","222222226","333333334","999999998","4111111111111111","4242424242424242","4000056655665556","5555555555554444","5105105105105100","2223003122003222","378282246310005","371449635398431","6011111111111117","3056930009020004","4012888888881881","4000000000000002"]);function Pe(e){return ni.has(e.replace(/\D/g,""))}function nt(e){let t=e.replace(/\D/g,"");return kn(t)||Sn(t)}function Ne(e,t){let n=[];for(let r of De){r.pattern.lastIndex=0;let i=new Set,s,o=0;for(;(s=r.pattern.exec(e))!==null&&(o+=1,!(o>2e5));){let a=s[0];if(!(r.subkind!=="iban"&&r.subkind!=="israeli_phone"&&nt(a))&&(r.validate(a)&&i.add(a.replace(/[\s-]/g,"")),i.size>=1e5))break}if(i.size>0){if(t)for(let c of i)Pe(c)||t(r.subkind,c);let a=[...i].filter(c=>!Pe(c)).length;n.push({subkind:r.subkind,severity:a===0?"low":r.severity,hint:a===0?`${r.hint} All ${i.size} are published test numbers.`:r.hint,count:i.size,real:a})}}for(let r of qe()){let i=new Set;for(let s of r.find(e))i.add(e.slice(s.start,s.end).trim());i.size>0&&n.push({subkind:r.kind,severity:r.severity,hint:r.hint,count:i.size})}return n}function Fe(e,t){let n=[],r="",i=!1;for(let s=0;s<e.length;s++){let o=e[s];i?o==='"'&&e[s+1]==='"'?(r+='"',s++):o==='"'?i=!1:r+=o:o==='"'?i=!0:o===t?(n.push(r),r=""):r+=o}return n.push(r),n}import{inflateRawSync as ns}from"node:zlib";import{inflateSync as En}from"node:zlib";var Me=new Set([".pdf"]),An=8*1024*1024;function rt(e){let t=e.toString("latin1"),n=new Map,r=/(\d+)\s+(\d+)\s+obj\b/g,i;for(;(i=r.exec(t))!==null;){let s=Number(i[1]),o=r.lastIndex,a=t.indexOf("endobj",o);if(a<0)continue;let c=t.indexOf("stream",o),l,p=null;if(c>=0&&c<a){l=t.slice(o,c);let u=c+6;t[u]==="\r"&&(u+=1),t[u]===`
4
+ `&&(u+=1);let h=t.indexOf("endstream",u);h>u&&(p=e.subarray(u,h))}else l=t.slice(o,a);n.set(s,{num:s,dict:l,stream:p})}for(let s of[...n.values()]){if(!s.stream||!/\/Type\s*\/ObjStm\b/.test(s.dict))continue;let o=je(s),a=Number(/\/N\s+(\d+)/.exec(s.dict)?.[1]??0),c=Number(/\/First\s+(\d+)/.exec(s.dict)?.[1]??-1);if(o===null||!a||c<0)continue;let l=o.slice(0,c).trim().split(/\s+/).map(Number);for(let p=0;p<a;p+=1){let u=l[2*p],h=l[2*p+1];if(u===void 0||h===void 0||Number.isNaN(u)||Number.isNaN(h))break;let y=p+1<a?l[2*(p+1)+1]:void 0,_=o.slice(c+h,y!==void 0?c+y:void 0);n.has(u)||n.set(u,{num:u,dict:_,stream:null})}}return n}function Ot(e){let t=[...e.replace(/\s+/g,"")];if(t.length<40)return!1;let n=0,r=0;for(let i of t){let s=i.codePointAt(0)??0;s<32||s>=127&&s<=191||s===65533||s>=57344&&s<=63743?n+=1:/[\p{L}\p{N}]/u.test(i)&&(r+=1)}return n/t.length>.2||r/t.length<.25}function ri(e){let t=e.toString("latin1").replace(/\s/g,"");t.startsWith("<~")&&(t=t.slice(2));let n=t.indexOf("~>");n>=0&&(t=t.slice(0,n));let r=[],i=0,s=0;for(let o of t){if(o==="z"&&s===0){r.push(0,0,0,0);continue}let a=o.charCodeAt(0)-33;if(a<0||a>84)return null;i=i*85+a,s+=1,s===5&&(r.push(i>>>24&255,i>>>16&255,i>>>8&255,i&255),i=0,s=0)}if(s>0){for(let a=s;a<5;a+=1)i=i*85+84;let o=[i>>>24&255,i>>>16&255,i>>>8&255,i&255];for(let a=0;a<s-1;a+=1)r.push(o[a]??0)}return Buffer.from(r)}function ii(e){let t=e.toString("latin1").replace(/\s/g,"").split(">")[0]??"",n=t.length%2?t+"0":t;return/^[0-9A-Fa-f]*$/.test(n)?Buffer.from(n,"hex"):null}function si(e){let t=/\/Filter\s*(\[[^\]]*\]|\/\w+)/.exec(e);return!t||!t[1]?[]:[...t[1].matchAll(/\/(\w+)/g)].map(n=>n[1]??"")}function je(e,t){if(!e.stream)return null;let n=e.stream;for(let r of si(e.dict)){let i=null;if(r==="FlateDecode")try{i=t!==void 0?En(n,{maxOutputLength:Math.max(1,t)}):En(n)}catch{return null}else if(r==="ASCII85Decode")i=ri(n);else if(r==="ASCIIHexDecode")i=ii(n);else return null;if(i===null)return null;n=i}return n.toString("latin1")}function oi(e){let t=new Map,n=1,r=/begincodespacerange([\s\S]*?)endcodespacerange/.exec(e);if(r&&r[1]){let c=/<([0-9A-Fa-f]+)>/.exec(r[1]);c&&c[1]&&c[1].length>=4&&(n=2)}let i=c=>{let l="";for(let p=0;p+3<c.length+1;p+=4){let u=parseInt(c.slice(p,p+4),16);Number.isFinite(u)&&u>0&&(l+=String.fromCharCode(u))}return l},s=/beginbfchar([\s\S]*?)endbfchar/g,o;for(;(o=s.exec(e))!==null;){let c=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,l;for(;(l=c.exec(o[1]??""))!==null;)t.set(parseInt(l[1]??"0",16),i(l[2]??""))}let a=/beginbfrange([\s\S]*?)endbfrange/g;for(;(o=a.exec(e))!==null;){let c=o[1]??"",l=/<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]+)>\s*<([0-9A-Fa-f]*)>/g,p;for(;(p=l.exec(c))!==null;){let u=parseInt(p[1]??"0",16),h=parseInt(p[2]??"0",16),y=parseInt((p[3]??"0").slice(0,4)||"0",16);if(!(h-u>65535))for(let _=u;_<=h;_+=1)t.set(_,String.fromCharCode(y+(_-u)))}}return{map:t,bytes:n}}function ai(e){let t=new Map,n=[],r=[];for(let s of e.values()){for(let o of s.dict.matchAll(/\/Font\s*<<([\s\S]*?)>>/g))o[1]&&r.push(o[1]);for(let o of s.dict.matchAll(/\/Font\s+(\d+)\s+\d+\s+R/g)){let a=e.get(Number(o[1]));a&&r.push(a.dict)}}let i=new Set;for(let s of r){let o=/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g,a;for(;(a=o.exec(s))!==null;){let c=`${a[1]}#${a[2]}`;i.has(c)||(i.add(c),n.push([a[1]??"",Number(a[2])]))}}for(let[s,o]of n){let a=e.get(o);if(!a)continue;let c=null,l=/\/ToUnicode\s+(\d+)\s+\d+\s+R/.exec(a.dict);if(l){let u=e.get(Number(l[1])),h=u?je(u):null;h&&(c=oi(h))}if(c||(c=ui(a.dict,e)),!c)continue;let p=t.get(s)??[];p.push(c),t.set(s,p)}return t}var ci=["alef","bet","gimel","dalet","he","vav","zayin","het","tet","yod","finalkaf","kaf","lamed","finalmem","mem","finalnun","nun","samekh","ayin","finalpe","pe","finaltsadi","tsadi","qof","resh","shin","tav"];function li(e){let t=/^uni([0-9A-Fa-f]{4})$/.exec(e)??/^u([0-9A-Fa-f]{4,6})$/.exec(e);if(t)return String.fromCodePoint(parseInt(t[1],16));let n=/^afii(\d{5})$/.exec(e);if(n){let s=Number(n[1]);if(s>=57664&&s<=57690)return String.fromCharCode(1488+(s-57664))}let r=ci.indexOf(e.replace(/hebrew$/,""));return r>=0?String.fromCharCode(1488+r):e==="space"?" ":/^[A-Za-z]$/.test(e)?e:{zero:"0",one:"1",two:"2",three:"3",four:"4",five:"5",six:"6",seven:"7",eight:"8",nine:"9",period:".",comma:",",hyphen:"-",colon:":",slash:"/",at:"@"}[e]??null}function ui(e,t){let n=e,r=/\/Encoding\s+(\d+)\s+\d+\s+R/.exec(e);r&&(n=t.get(Number(r[1]))?.dict??"");let i=/\/Differences\s*\[([^\]]*)\]/.exec(n);if(!i?.[1])return null;let s=new Map,o=0;for(let a of i[1].match(/\d+|\/[^\s/[\]]+/g)??[]){if(/^\d+$/.test(a)){o=Number(a);continue}let c=li(a.slice(1));c!==null&&s.set(o,c),o+=1}return s.size?{map:s,bytes:1}:null}function Cn(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r!=="\\"){t.push(r.charCodeAt(0)&255);continue}let i=e[n+1];if(i===void 0)break;if(i>="0"&&i<="7"){let o="",a=n+1;for(;a<e.length&&o.length<3&&e[a]>="0"&&e[a]<="7";)o+=e[a],a+=1;t.push(parseInt(o,8)&255),n=a-1;continue}let s={n:10,r:13,t:9,b:8,f:12};t.push(s[i]??i.charCodeAt(0)&255),n+=1}return t}function Pn(e){if(e.length<2||e[0]!==254||e[1]!==255)return null;let t="";for(let n=2;n+1<e.length;n+=2)t+=String.fromCharCode((e[n]??0)<<8|(e[n+1]??0));return t}function In(e,t){let n=Pn(e);if(n!==null)return n;if(!t)return e.map(i=>String.fromCharCode(i)).join("");let r="";if(t.bytes===2)for(let i=0;i+1<e.length;i+=2){let s=(e[i]??0)<<8|(e[i+1]??0);r+=t.map.get(s)??""}else for(let i of e)r+=t.map.get(i)??String.fromCharCode(i);return r}function di(e){let t=0;for(let n of e){let r=n.codePointAt(0)??0;/[\p{L}\p{N}]/u.test(n)?t+=1:(r<32||r>=127&&r<=191||r===65533)&&(t-=2)}return t}function Tn(e,t){if(!t||t.length<=1)return In(e,t?.[0]);let n="",r=-1/0;for(let i of t){let s=In(e,i),o=di(s);o>r&&(n=s,r=o)}return n}function fi(e,t){let n="",r="",i,s=!1,o="",a=0,c=null,l=()=>{r.trim()&&(n+=r+`
5
+ `),r="",a=0},p=()=>{r&&!r.endsWith(" ")&&a>1&&(r+=" ")},u=/\/([^\s/<>[\]()]+)\s+-?[\d.]+\s+Tf|(-?[\d.]+)\s+(-?[\d.]+)\s+T[dD]\b|(?:-?[\d.]+\s+){5}(-?[\d.]+)\s+Tm\b|T\*|\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>|\[|\]|-?\d+(?:\.\d+)?|TJ|Tj|'|"/g,h;for(;(h=u.exec(e))!==null;){let y=h[0];if(h[1]!==void 0&&y.endsWith("Tf")){i=t.get(h[1]);continue}if(h[2]!==void 0){Math.abs(Number(h[3]))>.01?l():Number(h[2])!==0&&p();continue}if(h[4]!==void 0){let _=Number(h[4]);c!==null&&Math.abs(_-c)>.01?l():c!==null&&p(),c=_;continue}if(y==="T*"){l();continue}if(y==="["){s=!0;continue}if(y==="]"){s=!1;continue}if(y==="TJ"||y==="Tj"||y==="'"||y==='"'){(y==="'"||y==='"')&&l(),o&&(r+=o,a=o.trim().length,o="");continue}if(y.startsWith("("))o+=Tn(Cn(y.slice(1,-1)),i);else if(y.startsWith("<")){let _=y.slice(1,-1).replace(/\s+/g,""),A=[];for(let N=0;N+1<_.length;N+=2)A.push(parseInt(_.slice(N,N+2),16));o+=Tn(A,i)}else s&&Number(y)<-200&&o&&!o.endsWith(" ")&&(o+=" ")}return o&&(r+=o),l(),n}function pi(e,t){let n=e.toString("latin1"),r=/\/Info\s+(\d+)\s+\d+\s+R/.exec(n),i=r?t.get(Number(r[1]))?.dict:void 0;if(!i)return"";let s=[],o=/\/(Author|Title|Subject|Keywords|Creator|Producer)\s*(\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]*>)/g,a;for(;(a=o.exec(i))!==null;){let c=a[2]??"";if(c.startsWith("(")){let l=Cn(c.slice(1,-1));s.push(Pn(l)??l.map(p=>String.fromCharCode(p)).join(""))}else{let l=c.slice(1,-1).replace(/\s+/g,""),p="";if(l.toUpperCase().startsWith("FEFF"))for(let u=4;u+3<l.length+1;u+=4)p+=String.fromCharCode(parseInt(l.slice(u,u+4),16));else for(let u=0;u+1<l.length;u+=2)p+=String.fromCharCode(parseInt(l.slice(u,u+2),16));s.push(p)}}return s.join(`
6
+ `)}var $n="\u05DD\u05DF\u05E5\u05E3\u05DA";function it(e){let t=0,n=0;for(let r of e.match(/[\u05D0-\u05EA]{2,}/g)??[])$n.includes(r[0])&&(t+=1),$n.includes(r[r.length-1])&&(n+=1);return t>=3&&t>n*2}var hi={"(":")",")":"(","[":"]","]":"[","<":">",">":"<","{":"}","}":"{"};function st(e){return/[\u05D0-\u05EA]/.test(e)?[...e].reverse().map(n=>hi[n]??n).join("").replace(/[A-Za-z0-9](?:[A-Za-z0-9@._\-/:+]*[A-Za-z0-9])?/g,n=>[...n].reverse().join("")):e}function Dt(e){if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-")||e.toString("latin1",0,Math.min(e.length,4096)).includes("/Encrypt"))return null;let n=rt(e);if(n.size===0)return null;let r=ai(n),i=[];i.push(pi(e,n));let s=0,o=0,a=!1;for(let l of n.values()){if(!l.stream||!/\/Subtype\s*\/Form\b/.test(l.dict)&&/\/Subtype|\/Type\s*\/(XObject|Font|Metadata|ObjStm|XRef)|\/FontFile/.test(l.dict))continue;let u=je(l);if(u===null||!/(TJ|Tj)\b/.test(u))continue;let h=fi(u,r);if(h.trim().length!==0){if(o+=1,s+h.length>An){i.push(h.slice(0,Math.max(0,An-s))),a=!0;break}i.push(h),s+=h.length}}if(o===0)return null;let c=i.slice(1).join(`
7
+ `);return Ot(c)?null:(it(c)&&(c=c.split(`
8
+ `).map(st).join(`
9
+ `)),{text:[i[0]??"",c].join(`
10
+ `),truncated:a,streams:o})}var On=200;function mi(e){let t=0,n=0;for(let r of rt(e).values())/\/Type\s*\/Page\b(?!s)/.test(r.dict)&&(t+=1),r.stream&&/\/Subtype\s*\/Image\b/.test(r.dict)&&(n+=1);return{pages:Math.max(t,1),images:n}}var Rn=/(\d+)\s+\d+\s+R/g;function ge(e,t){let n=new RegExp(`/${t}\\b\\s*`).exec(e);if(!n)return null;let r=n.index+n[0].length;if(e.startsWith("<<",r)){let s=0;for(let o=r;o<e.length-1;o++)if(e.startsWith("<<",o))s++,o++;else if(e.startsWith(">>",o)&&(s--,o++,s===0))return e.slice(r,o+1);return e.slice(r)}if(e[r]==="[")return e.slice(r,e.indexOf("]",r)+1||void 0);let i=/^(\d+)\s+\d+\s+R/.exec(e.slice(r));return i?i[0]:null}function xe(e,t){if(!t)return null;let n=/^(\d+)\s+\d+\s+R$/.exec(t.trim());return n?e.get(Number(n[1]))?.dict??null:t}function gi(e){let t=0;for(let n of e.matchAll(/\((?:\\.|[^\\)])*\)|<[0-9A-Fa-f\s]+>/g)){let r=n[0];t+=r.startsWith("(")?r.slice(1,-1).replace(/\\./g,"x").replace(/\s+/g,"").length:Math.floor(r.replace(/[<>\s]/g,"").length/2)}return t}var yi=2e3,bi=2e4,Ln=64*1024*1024;function _i(e){let t=rt(e),n=[...t.values()].filter(h=>/\/Type\s*\/Page\b(?!s)/.test(h.dict));if(!n.length||n.length>yi)return null;let r=0,i=0,s=!1,o=new Set,a=new Set,c=(h,y=0)=>{if(o.has(h))return!0;if(a.has(h))return!1;if(++r>bi)return s=!0,!1;let _=t.get(h),A=!1;if(_&&/\/Subtype\s*\/Image\b/.test(_.dict))A=!0;else if(_&&/\/Subtype\s*\/Form\b/.test(_.dict)){if(y>2)return s=!0,!1;a.add(h);let N=xe(t,ge(_.dict,"Resources")),b=xe(t,N?ge(N,"XObject"):null)??"";for(let I of b.matchAll(Rn))if(c(Number(I[1]),y+1)){A=!0;break}a.delete(h)}return A&&o.add(h),A},l=new Map,p=h=>{if(l.has(h))return l.get(h);let y=t.get(h),_=y?je(y,Ln-i):null;return _!==null&&(i+=_.length),l.set(h,_),_},u=0;for(let h of n){let y=xe(t,ge(h.dict,"Resources"));for(let G=h.dict,K=0;!y&&K<8;K++){let ee=xe(t,ge(G,"Parent"));if(!ee)break;y=xe(t,ge(ee,"Resources")),G=ee}let _=xe(t,y?ge(y,"XObject"):null)??"",A=new Set;for(let G of _.matchAll(/\/([^\s/<>[\]()]+)\s+(\d+)\s+\d+\s+R/g))c(Number(G[2]))&&A.add(G[1]);let N=[...(ge(h.dict,"Contents")??"").matchAll(Rn)].map(G=>Number(G[1]));if(!N.length)continue;if(s||i>=Ln)return u>0?u:null;let b=N.map(p);if(b.some(G=>G===null)){A.size>0&&(u+=1);continue}let I=b.join(`
11
+ `),f=I.search(/\bBI\b/);(f>=0&&I.indexOf("ID",f+2)>0||[...I.matchAll(/\/([^\s/<>[\]()]+)\s+Do\b/g)].some(G=>A.has(G[1])))&&gi(I)<On&&(u+=1)}return s&&u===0?null:u}function Dn(e,t){let n=mi(e);if(n.images>0&&t.replace(/\s+/g,"").length<On*n.pages)return!0;let i=_i(e);return i===null?n.images>0:i>0}function Nn(e){if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-"))return"not a valid PDF";if(e.toString("latin1",0,Math.min(e.length,4096)).includes("/Encrypt"))return"encrypted (password or copy protection)";let n=rt(e),r=0,i=0,s=0;for(let o of n.values()){if(!o.stream)continue;if(/\/Subtype\s*\/Image\b/.test(o.dict)){i+=1;continue}let a=je(o);if(a===null){/\/Type\s*\/(Font|Metadata|XRef)|\/FontFile|\/Length1/.test(o.dict)||(s+=1);continue}/(TJ|Tj)\b/.test(a)&&(r+=1)}return r===0&&i>0?"no text layer \u2014 a scanned image (needs OCR, which NoData does not do)":r===0&&s>0?"its pages are compressed in a way NoData cannot open":r===0?"no text in it":"its fonts have no usable letter map \u2014 the text decodes to symbols"}import{execFileSync as xi}from"node:child_process";import{existsSync as wi,mkdtempSync as vi,readFileSync as Mn,readdirSync as ct,rmSync as ki,statSync as Si,writeFileSync as jn}from"node:fs";import{tmpdir as Ei}from"node:os";import{delimiter as Ai,join as Y}from"node:path";var re="install the free tools once (they run only on this computer): winget install oschwartz10612.Poppler and winget install UB-Mannheim.TesseractOCR (tick Hebrew in its installer)",ot=null;function Fn(e){try{return Si(e).isFile()}catch{return!1}}function Ii(){let e=[],t=[process.env.ProgramFiles,process.env["ProgramFiles(x86)"]].filter(Boolean),n=process.env.LOCALAPPDATA;for(let r of t)e.push(Y(r,"Tesseract-OCR"));if(n){e.push(Y(n,"Programs","Tesseract-OCR"),Y(n,"Microsoft","WinGet","Links"));let r=Y(n,"Microsoft","WinGet","Packages");try{for(let i of ct(r))if(/^oschwartz10612\.Poppler/i.test(i))for(let s of ct(Y(r,i)))e.push(Y(r,i,s,"Library","bin"))}catch{}}for(let r of t)try{for(let i of ct(r))/^poppler/i.test(i)&&e.push(Y(r,i,"Library","bin"),Y(r,i,"bin"))}catch{}return e}function at(e,t){let n=process.env[t];if(n)return Fn(n)?n:void 0;let r=process.platform==="win32",i=r?[`${e}.exe`,e]:[e],s=(process.env.PATH??"").split(Ai).filter(Boolean);r&&s.push(...Ii());for(let o of s)for(let a of i)if(Fn(Y(o,a)))return Y(o,a)}function ue(e,t,n){try{return xi(e,t,{encoding:"utf8",timeout:n,maxBuffer:64*1024*1024,stdio:["ignore","pipe","ignore"],windowsHide:!0})}catch{return null}}function ie(){if(ot)return ot;if(/^(0|off|false|no)$/i.test(process.env.NODATA_PDF_TOOLS??""))return ot={ocrLangs:[],osd:!1};let e={pdftotext:at("pdftotext","NODATA_PDFTOTEXT"),pdftoppm:at("pdftoppm","NODATA_PDFTOPPM"),tesseract:at("tesseract","NODATA_TESSERACT"),ocrmypdf:at("ocrmypdf","NODATA_OCRMYPDF"),ocrLangs:[],osd:!1};if(e.tesseract){let t=new Set((ue(e.tesseract,["--list-langs"],15e3)??"").split(/\r?\n/).map(n=>n.trim()));e.ocrLangs=["heb","eng"].filter(n=>t.has(n)),e.osd=t.has("osd")}return ot=e}function lt(e,t,n=".pdf"){let r=vi(Y(Ei(),"nd-read-"));try{let i=Y(r,`in${n}`);return jn(i,e,{mode:384}),t(r,i)}finally{ki(r,{recursive:!0,force:!0})}}function ut(e){let t=e.replace(/[\u200E\u200F\u202A-\u202E\u2066-\u2069]/g,"").replace(/\f/g,`
12
12
  `).replace(/[ \t]+\n/g,`
13
- `).trim();return t.replace(/\s/g,"").length<2||Tt(t)?null:et(t)?t.split(`
14
- `).map(tt).join(`
15
- `):t}function On(e){let t=re().pdftotext;if(!t)return null;let n=st(e,(r,i)=>ae(t,["-enc","UTF-8","-q",i,"-"],6e4));return n===null?null:ot(n)}var vi=()=>Math.max(1,Number(process.env.NODATA_OCR_MAX_PAGES)||10);function Dn(e){let t=e.toString("latin1",0,64).match(/^P5\s+(\d+)\s+(\d+)\s+255\s/);return t?{w:Number(t[1]),h:Number(t[2]),at:t[0].length}:null}function ki(e,t){let n=Dn(e);if(!n)return null;let{w:r,h:i,at:s}=n,o=e.subarray(s),[a,l]=t===180?[r,i]:[i,r],c=Buffer.alloc(a*l);for(let h=0;h<i;h++)for(let u=0;u<r;u++){let p=o[h*r+u];t===180?c[(i-1-h)*r+(r-1-u)]=p:t===90?c[u*a+(i-1-h)]=p:c[(r-1-u)*a+h]=p}return Buffer.concat([Buffer.from(`P5
16
- ${a} ${l}
13
+ `).trim();return t.replace(/\s/g,"").length<2||Ot(t)?null:it(t)?t.split(`
14
+ `).map(st).join(`
15
+ `):t}function Hn(e){let t=ie().pdftotext;if(!t)return null;let n=lt(e,(r,i)=>ue(t,["-enc","UTF-8","-q",i,"-"],6e4));return n===null?null:ut(n)}var Ti=()=>Math.max(1,Number(process.env.NODATA_OCR_MAX_PAGES)||10);function Bn(e){let t=e.toString("latin1",0,64).match(/^P5\s+(\d+)\s+(\d+)\s+255\s/);return t?{w:Number(t[1]),h:Number(t[2]),at:t[0].length}:null}function $i(e,t){let n=Bn(e);if(!n)return null;let{w:r,h:i,at:s}=n,o=e.subarray(s),[a,c]=t===180?[r,i]:[i,r],l=Buffer.alloc(a*c);for(let p=0;p<i;p++)for(let u=0;u<r;u++){let h=o[p*r+u];t===180?l[(i-1-p)*r+(r-1-u)]=h:t===90?l[u*a+(i-1-p)]=h:l[(r-1-u)*a+p]=h}return Buffer.concat([Buffer.from(`P5
16
+ ${a} ${c}
17
17
  255
18
- `,"latin1"),c])}function Nn(e,t){if(!e.osd)return;let n=ae(e.tesseract,[t,"-","--psm","0"],6e4)??"",r=Number(n.match(/Rotate:\s*(\d+)/)?.[1]??0),i=Number(n.match(/Orientation confidence:\s*([\d.]+)/)?.[1]??0);if(!(r===90||r===180||r===270)||i<2)return;let s=ki(Ln(t),r);s&&Pn(t,s,{mode:384})}function Si(e,t,n){if(!e.ocrmypdf||e.ocrLangs.length===0)return null;let r=Z(t,"side.txt");return ae(e.ocrmypdf,["-q","-l",e.ocrLangs.join("+"),"--rotate-pages","--deskew","--force-ocr","--sidecar",r,n,Z(t,"out.pdf")],3e5),mi(r)?ot(Ln(r,"utf8")):null}function Lt(e){let t=re();if(!t.pdftoppm||!t.tesseract||t.ocrLangs.length===0)return null;let n=vi();return st(e,(r,i)=>{if(ae(t.pdftoppm,["-r","300","-gray","-f","1","-l",String(n+1),i,Z(r,"p")],12e4)===null)return null;let s=it(r).filter(c=>/^p-\d+\.pgm$/.test(c)).sort((c,h)=>Number(c.match(/\d+/)[0])-Number(h.match(/\d+/)[0])),o=s.length>n,a=[];for(let c of s.slice(0,n)){Nn(t,Z(r,c));let h=ae(t.tesseract,[Z(r,c),"stdout","-l",t.ocrLangs.join("+"),"--psm","3"],12e4);h&&a.push(h)}let l=ot(a.join(`
19
- `))??Si(t,r,i);return l===null?null:{text:l,truncated:o,pages:Math.min(s.length,n)}})}var Pt={"jpeg image":".jpg","png image":".png","tiff image":".tif","bmp image":".bmp","gif image":".gif","webp image":".webp"};function at(){let e=re();return!!e.tesseract&&e.ocrLangs.length>0}function Ot(e,t){let n=re(),r=Pt[t];return!n.tesseract||n.ocrLangs.length===0||!r?null:st(e,(i,s)=>{let o=ae(n.tesseract,[s,"stdout","-l",n.ocrLangs.join("+"),"--psm","3"],12e4);return o===null?null:ot(o)},r)}function Ct(e){return new Set(e.match(/[\p{L}\p{N}]{2,}/gu)??[])}function je(e,t={}){let n=Rt(e),r=On(e);if(n){if(r===null)return{...n,engine:"builtin",uncertain:!1};let s=Ct(n.text),o=r.split(`
20
- `).filter(h=>[...Ct(h)].some(u=>!s.has(u))),a=Ct(r),l=[...a].filter(h=>!s.has(h)),c=l.length>Math.max(3,a.size*.1)||l.some(h=>/^\d{5,}$/.test(h));return o.length===0?{...n,engine:"builtin",uncertain:!1}:{...n,text:n.text+`
18
+ `,"latin1"),l])}function Un(e,t){if(!e.osd)return;let n=ue(e.tesseract,[t,"-","--psm","0"],6e4)??"",r=Number(n.match(/Rotate:\s*(\d+)/)?.[1]??0),i=Number(n.match(/Orientation confidence:\s*([\d.]+)/)?.[1]??0);if(!(r===90||r===180||r===270)||i<2)return;let s=$i(Mn(t),r);s&&jn(t,s,{mode:384})}function Ri(e,t,n){if(!e.ocrmypdf||e.ocrLangs.length===0)return null;let r=Y(t,"side.txt");return ue(e.ocrmypdf,["-q","-l",e.ocrLangs.join("+"),"--rotate-pages","--deskew","--force-ocr","--sidecar",r,n,Y(t,"out.pdf")],3e5),wi(r)?ut(Mn(r,"utf8")):null}function Ft(e){let t=ie();if(!t.pdftoppm||!t.tesseract||t.ocrLangs.length===0)return null;let n=Ti();return lt(e,(r,i)=>{if(ue(t.pdftoppm,["-r","300","-gray","-f","1","-l",String(n+1),i,Y(r,"p")],12e4)===null)return null;let s=ct(r).filter(l=>/^p-\d+\.pgm$/.test(l)).sort((l,p)=>Number(l.match(/\d+/)[0])-Number(p.match(/\d+/)[0])),o=s.length>n,a=[];for(let l of s.slice(0,n)){Un(t,Y(r,l));let p=ue(t.tesseract,[Y(r,l),"stdout","-l",t.ocrLangs.join("+"),"--psm","3"],12e4);p&&a.push(p)}let c=ut(a.join(`
19
+ `))??Ri(t,r,i);return c===null?null:{text:c,truncated:o,pages:Math.min(s.length,n)}})}var Mt={"jpeg image":".jpg","png image":".png","tiff image":".tif","bmp image":".bmp","gif image":".gif","webp image":".webp"};function dt(){let e=ie();return!!e.tesseract&&e.ocrLangs.length>0}function jt(e,t){let n=ie(),r=Mt[t];return!n.tesseract||n.ocrLangs.length===0||!r?null:lt(e,(i,s)=>{let o=ue(n.tesseract,[s,"stdout","-l",n.ocrLangs.join("+"),"--psm","3"],12e4);return o===null?null:ut(o)},r)}function Nt(e){return new Set(e.match(/[\p{L}\p{N}]{2,}/gu)??[])}function He(e,t={}){let n=Dt(e),r=Hn(e);if(n){if(r===null)return{...n,engine:"builtin",uncertain:!1};let s=Nt(n.text),o=r.split(`
20
+ `).filter(p=>[...Nt(p)].some(u=>!s.has(u))),a=Nt(r),c=[...a].filter(p=>!s.has(p)),l=c.length>Math.max(3,a.size*.1)||c.some(p=>/^\d{5,}$/.test(p));return o.length===0?{...n,engine:"builtin",uncertain:!1}:{...n,text:n.text+`
21
21
  `+o.join(`
22
- `),engine:"builtin",uncertain:c}}if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-"))return null;if(r!==null)return{text:r,truncated:!1,streams:0,engine:"pdftotext",uncertain:!1};if(!t.ocr)return null;let i=Lt(e);return i?{text:i.text,truncated:i.truncated,streams:0,engine:"ocr",uncertain:!1}:null}function Fn(e){let t=Rn(e),n=re();return/scanned image/.test(t)?n.tesseract&&n.pdftoppm&&n.ocrLangs.length?"no text layer \u2014 a scanned image; the folder scan reads it with OCR on this computer, the read gate does not wait for OCR":`no text layer \u2014 a scanned image. To read it: ${ne}`:/encrypted/.test(t)?t+(n.pdftotext?"":` \u2014 if it opens without a password, the second reader can read it: ${ne}`):/letter map|compressed/.test(t)&&!n.pdftotext?`${t}. A second reader may read it: ${ne}`:/letter map|compressed/.test(t)?`${t} (the second reader, pdftotext, could not read it either)`:t}var Mn=[208,207,17,224,161,177,26,225],Dt=4294967294,ct=4294967295,Ei=64*1024*1024;function xe(e){if(e.length<512)return!1;for(let t=0;t<Mn.length;t+=1)if(e[t]!==Mn[t])return!1;return!0}function Nt(e){if(!xe(e))return null;try{let t=e.readUInt16LE(30),n=e.readUInt16LE(32);if(t!==9&&t!==12)return null;let r=1<<t,i=1<<n,s=e.readUInt32LE(44),o=e.readUInt32LE(48),a=e.readUInt32LE(56),l=e.readUInt32LE(60),c=e.readUInt32LE(68),h=e.readUInt32LE(72),u=Math.floor((e.length-r)/r)+1,p=k=>{let C=(k+1)*r;return k>=u||C>=e.length?null:e.subarray(C,Math.min(C+r,e.length))},_=[];for(let k=0;k<109&&_.length<s;k+=1){let C=e.readUInt32LE(76+k*4);C!==ct&&_.push(C)}let x=c;for(let k=0;k<h&&x!==Dt&&x!==ct;k+=1){let C=p(x);if(!C)return null;let U=r/4-1;for(let z=0;z<U&&_.length<s;z+=1){let F=C.readUInt32LE(z*4);F!==ct&&_.push(F)}x=C.readUInt32LE(U*4)}let $=[];for(let k of _){let C=p(k);if(!C)return null;for(let U=0;U+4<=C.length;U+=4)$.push(C.readUInt32LE(U))}let N=(k,C,U)=>{let z=[],F=k;for(;F!==Dt&&F!==ct;){if(F>=C.length||z.length>U)return null;z.push(F),F=C[F]}return z},b=(k,C)=>{let U=N(k,$,u);if(!U)return null;let z=[];for(let oe of U){let d=p(oe);if(!d)return null;z.push(d)}let F=Buffer.concat(z);return C>=0?F.subarray(0,Math.min(C,F.length)):F},T=b(o,-1);if(!T)return null;let f=[],V=new Map;for(let k=0,C=0;k+128<=T.length;k+=128,C+=1){let U=T.readUInt16LE(k+64),z=T[k+66];if(z===0||U<2||U>64)continue;let F=T.subarray(k,k+U-2).toString("utf16le"),oe={id:C,name:F,type:z,left:T.readUInt32LE(k+68),right:T.readUInt32LE(k+72),child:T.readUInt32LE(k+76),start:T.readUInt32LE(k+116),size:T.readUInt32LE(k+120),path:F};f.push(oe),V.set(C,oe)}let Q=new Set,K=(k,C)=>{let U=[k];for(;U.length;){let z=U.pop(),F=V.get(z);!F||Q.has(z)||(Q.add(z),F.path=C?`${C}/${F.name}`:F.name,U.push(F.left,F.right),F.type===1&&K(F.child,F.path))}},G=f.find(k=>k.type===5);G&&K(G.child,"");let te=f.find(k=>k.type===5);if(!te)return null;let ue=null,ye=[];if(f.some(k=>k.type===2&&k.size<a&&k.size>0)){ue=b(te.start,te.size);let k=l!==Dt?b(l,-1):null;if(k)for(let C=0;C+4<=k.length;C+=4)ye.push(k.readUInt32LE(C));else ye=[]}let se=new Map,Re=new Map,de=(k,C)=>{se.has(k.name)||se.set(k.name,C),Re.set(k.path,C)};for(let k of f)if(k.type===2&&!(k.size>Ei)){if(k.size===0){de(k,Buffer.alloc(0));continue}if(k.size<a){if(!ue)continue;let C=N(k.start,ye,Math.ceil(ue.length/i)+1);if(!C)continue;let U=C.map(z=>ue.subarray(z*i,z*i+i));de(k,Buffer.concat(U).subarray(0,k.size))}else{let C=b(k.start,k.size);C&&de(k,C)}}return{streams:se,paths:Re}}catch{return null}}import{TextDecoder as jn}from"node:util";var He="password-protected: open it with its password, or check it by hand";function Ai(e){let t=e.streams;return t.has("EncryptionInfo")&&t.has("EncryptedPackage")?"encrypted-ooxml":t.has("WordDocument")?"doc":t.has("Workbook")||t.has("Book")?"xls":t.has("PowerPoint Document")?"ppt":[...t.keys()].some(n=>n.startsWith("__substg1.0_"))?"msg":null}var zn=e=>{try{return new jn(e)}catch{return new jn("latin1")}},we=zn("windows-1252");function Be(e){return e.replace(/[\r\x07\x0b\x0c]/g,`
22
+ `),engine:"builtin",uncertain:l}}if(!e.subarray(0,8).toString("latin1").startsWith("%PDF-"))return null;if(r!==null)return{text:r,truncated:!1,streams:0,engine:"pdftotext",uncertain:!1};if(!t.ocr)return null;let i=Ft(e);return i?{text:i.text,truncated:i.truncated,streams:0,engine:"ocr",uncertain:!1}:null}function zn(e){let t=Nn(e),n=ie();return/scanned image/.test(t)?n.tesseract&&n.pdftoppm&&n.ocrLangs.length?"no text layer \u2014 a scanned image; the folder scan reads it with OCR on this computer, the read gate does not wait for OCR":`no text layer \u2014 a scanned image. To read it: ${re}`:/encrypted/.test(t)?t+(n.pdftotext?"":` \u2014 if it opens without a password, the second reader can read it: ${re}`):/letter map|compressed/.test(t)&&!n.pdftotext?`${t}. A second reader may read it: ${re}`:/letter map|compressed/.test(t)?`${t} (the second reader, pdftotext, could not read it either)`:t}var Wn=[208,207,17,224,161,177,26,225],Ht=4294967294,ft=4294967295,Li=64*1024*1024;function we(e){if(e.length<512)return!1;for(let t=0;t<Wn.length;t+=1)if(e[t]!==Wn[t])return!1;return!0}function Bt(e){if(!we(e))return null;try{let t=e.readUInt16LE(30),n=e.readUInt16LE(32);if(t!==9&&t!==12)return null;let r=1<<t,i=1<<n,s=e.readUInt32LE(44),o=e.readUInt32LE(48),a=e.readUInt32LE(56),c=e.readUInt32LE(60),l=e.readUInt32LE(68),p=e.readUInt32LE(72),u=Math.floor((e.length-r)/r)+1,h=S=>{let C=(S+1)*r;return S>=u||C>=e.length?null:e.subarray(C,Math.min(C+r,e.length))},y=[];for(let S=0;S<109&&y.length<s;S+=1){let C=e.readUInt32LE(76+S*4);C!==ft&&y.push(C)}let _=l;for(let S=0;S<p&&_!==Ht&&_!==ft;S+=1){let C=h(_);if(!C)return null;let V=r/4-1;for(let X=0;X<V&&y.length<s;X+=1){let H=C.readUInt32LE(X*4);H!==ft&&y.push(H)}_=C.readUInt32LE(V*4)}let A=[];for(let S of y){let C=h(S);if(!C)return null;for(let V=0;V+4<=C.length;V+=4)A.push(C.readUInt32LE(V))}let N=(S,C,V)=>{let X=[],H=S;for(;H!==Ht&&H!==ft;){if(H>=C.length||X.length>V)return null;X.push(H),H=C[H]}return X},b=(S,C)=>{let V=N(S,A,u);if(!V)return null;let X=[];for(let le of V){let d=h(le);if(!d)return null;X.push(d)}let H=Buffer.concat(X);return C>=0?H.subarray(0,Math.min(C,H.length)):H},I=b(o,-1);if(!I)return null;let f=[],P=new Map;for(let S=0,C=0;S+128<=I.length;S+=128,C+=1){let V=I.readUInt16LE(S+64),X=I[S+66];if(X===0||V<2||V>64)continue;let H=I.subarray(S,S+V-2).toString("utf16le"),le={id:C,name:H,type:X,left:I.readUInt32LE(S+68),right:I.readUInt32LE(S+72),child:I.readUInt32LE(S+76),start:I.readUInt32LE(S+116),size:I.readUInt32LE(S+120),path:H};f.push(le),P.set(C,le)}let R=new Set,G=(S,C)=>{let V=[S];for(;V.length;){let X=V.pop(),H=P.get(X);!H||R.has(X)||(R.add(X),H.path=C?`${C}/${H.name}`:H.name,V.push(H.left,H.right),H.type===1&&G(H.child,H.path))}},K=f.find(S=>S.type===5);K&&G(K.child,"");let ee=f.find(S=>S.type===5);if(!ee)return null;let he=null,be=[];if(f.some(S=>S.type===2&&S.size<a&&S.size>0)){he=b(ee.start,ee.size);let S=c!==Ht?b(c,-1):null;if(S)for(let C=0;C+4<=S.length;C+=4)be.push(S.readUInt32LE(C));else be=[]}let ce=new Map,Re=new Map,me=(S,C)=>{ce.has(S.name)||ce.set(S.name,C),Re.set(S.path,C)};for(let S of f)if(S.type===2&&!(S.size>Li)){if(S.size===0){me(S,Buffer.alloc(0));continue}if(S.size<a){if(!he)continue;let C=N(S.start,be,Math.ceil(he.length/i)+1);if(!C)continue;let V=C.map(X=>he.subarray(X*i,X*i+i));me(S,Buffer.concat(V).subarray(0,S.size))}else{let C=b(S.start,S.size);C&&me(S,C)}}return{streams:ce,paths:Re}}catch{return null}}import{TextDecoder as Vn}from"node:util";var Be="password-protected: open it with its password, or check it by hand";function Ci(e){let t=e.streams;return t.has("EncryptionInfo")&&t.has("EncryptedPackage")?"encrypted-ooxml":t.has("WordDocument")?"doc":t.has("Workbook")||t.has("Book")?"xls":t.has("PowerPoint Document")?"ppt":[...t.keys()].some(n=>n.startsWith("__substg1.0_"))?"msg":null}var Gn=e=>{try{return new Vn(e)}catch{return new Vn("latin1")}},ve=Gn("windows-1252");function Ue(e){return e.replace(/[\r\x07\x0b\x0c]/g,`
23
23
  `).replace(/[\x13\x14\x15]/g," ").replace(/[\x00-\x08\x0e-\x1f]/g,"").replace(/\n{3,}/g,`
24
24
 
25
- `)}function Ii(e,t){return e.length>t?{text:e.slice(0,t),truncated:!0}:{text:e,truncated:!1}}function $i(e){let t=e.streams.get("WordDocument");if(t.length<512)return{kind:"doc",reason:"damaged Word file"};let n=t.readUInt16LE(10);if(n&256||n&32768)return{kind:"doc",reason:He};if(t.readUInt16LE(2)<101){let x=t.readUInt32LE(24),$=t.readUInt32LE(28);return $<=x||$>t.length?{kind:"doc",reason:"damaged Word file"}:Be(we.decode(t.subarray(x,$)))}let i=e.streams.get(n&512?"1Table":"0Table");if(!i)return{kind:"doc",reason:"damaged Word file (no table stream)"};let s=32;s+=2+t.readUInt16LE(s)*2,s+=2+t.readUInt16LE(s)*4;let o=s+2,a=t.readUInt32LE(o+264),l=t.readUInt32LE(o+264+4);if(!l||a+l>i.length)return{kind:"doc",reason:"damaged Word file (no piece table)"};let c=a,h=a+l,u=null;for(;c<h;){let x=i[c];if(x===1)c+=3+i.readInt16LE(c+1);else if(x===2){let $=i.readUInt32LE(c+1);u=i.subarray(c+5,Math.min(c+5+$,i.length));break}else break}if(!u||u.length<16)return{kind:"doc",reason:"damaged Word file (no piece table)"};let p=Math.floor((u.length-4)/12),_=[];for(let x=0;x<p;x+=1){let $=u.readUInt32LE(x*4),b=u.readUInt32LE((x+1)*4)-$;if(b<=0||b>t.length)continue;let T=u.readUInt32LE(4*(p+1)+x*8+2);if(T&1073741824){let f=(T&1073741823)/2;_.push(we.decode(t.subarray(f,Math.min(f+b,t.length))))}else _.push(t.subarray(T,Math.min(T+b*2,t.length)).toString("utf16le"))}return Be(_.join(""))}var Ft=class{segs;i=0;p=0;constructor(t){this.segs=t}here(){for(;this.i<this.segs.length&&this.p>=this.segs[this.i].length;)this.i+=1,this.p=0;return this.i<this.segs.length?this.segs[this.i]:null}get done(){return this.here()===null}atSeam(){return this.p===0&&this.i>0}u8(){let t=this.here();if(!t)throw new Error("eof");return t[this.p++]}u16(){return this.u8()|this.u8()<<8}u32(){return(this.u16()|this.u16()<<16)>>>0}skip(t){for(let n=0;n<t;n+=1)this.u8()}chars(t,n){let r="",i=t,s=n;for(;i>0&&this.here();){this.p===0&&r.length>0&&(s=(this.u8()&1)===1);let a=this.here();if(!a)break;let l=Math.floor((a.length-this.p)/(s?2:1)),c=Math.min(i,l);if(c<=0){this.p=a.length;continue}let h=a.subarray(this.p,this.p+c*(s?2:1));r+=s?h.toString("utf16le"):h.toString("latin1"),this.p+=h.length,i-=c}return r}};function Ti(e){let t=new Ft(e),n=[];try{t.u32();let r=t.u32();for(let i=0;i<r&&!t.done;i+=1){let s=t.u16(),o=t.u8(),a=o&8?t.u16():0,l=o&4?t.u32():0;n.push(t.chars(s,(o&1)===1)),t.skip(a*4+l)}}catch{}return n}function Hn(e,t,n,r){if(t+2>e.length)return"";let i=e.readUInt16LE(t);if(!n)return r.decode(e.subarray(t+2,t+2+i));let s=e[t+2],o=t+3;return s&8&&(o+=2),s&4&&(o+=4),s&1?e.subarray(o,o+i*2).toString("utf16le"):e.subarray(o,o+i).toString("latin1")}function Bn(e){let t;if(e&2)t=e>>2;else{let n=Buffer.alloc(8);n.writeUInt32LE(0,0),n.writeUInt32LE((e&4294967292)>>>0,4),t=n.readDoubleLE(0)}return e&1?t/100:t}var lt=e=>Number.isFinite(e)?String(e):"";function Ri(e){let t=e.streams.get("Workbook")??e.streams.get("Book"),n=!0,r=we,i=[],s=new Set,o=[],a=[],l=-1,c=null,h=0,u=($,N,b)=>{if(l<0||!b)return;let T=a[l],f=T.get($)??new Map;f.set(N,b),T.set($,f)},p=0;for(;p+4<=t.length;){let $=t.readUInt16LE(p),N=t.readUInt16LE(p+2),b=t.subarray(p+4,Math.min(p+4+N,t.length)),T=p+4+N;switch($){case 2057:h+=1,b.length>=4&&(n=b.readUInt16LE(0)===1536),h===1&&b.length>=4&&b.readUInt16LE(2)!==5&&(l=a.length,a.push(new Map));break;case 10:h=Math.max(0,h-1);break;case 47:return{kind:"xls",reason:He};case 66:if(b.length>=2&&!n){let f=b.readUInt16LE(0);r=f===1200?we:zn(`windows-${f}`)}break;case 133:if(b.length>6){let f=b[6];if(n){let V=b[7]&1;o.push(V?b.subarray(8,8+f*2).toString("utf16le"):b.subarray(8,8+f).toString("latin1"))}else o.push(r.decode(b.subarray(7,7+f)))}break;case 252:{let f=[b];for(;T+4<=t.length&&t.readUInt16LE(T)===60;){let V=t.readUInt16LE(T+2);f.push(t.subarray(T+4,Math.min(T+4+V,t.length))),T+=4+V}i=Ti(f);break}case 253:if(b.length>=10){let f=b.readUInt32LE(6);s.add(f),u(b.readUInt16LE(0),b.readUInt16LE(2),i[f]??"")}break;case 516:case 214:b.length>=8&&u(b.readUInt16LE(0),b.readUInt16LE(2),Hn(b,6,n,r));break;case 515:b.length>=14&&u(b.readUInt16LE(0),b.readUInt16LE(2),lt(b.readDoubleLE(6)));break;case 638:b.length>=10&&u(b.readUInt16LE(0),b.readUInt16LE(2),lt(Bn(b.readUInt32LE(6))));break;case 189:{if(b.length>=6){let f=b.readUInt16LE(0),V=b.readUInt16LE(2);for(let Q=4;Q+6<=b.length-2;Q+=6)u(f,V++,lt(Bn(b.readUInt32LE(Q+2))))}break}case 6:if(b.length>=14){let f=b.readUInt16LE(0),V=b.readUInt16LE(2);b.readUInt16LE(12)===65535?c=b[6]===0?[f,V]:null:u(f,V,lt(b.readDoubleLE(6)))}break;case 519:c&&u(c[0],c[1],Hn(b,0,n,r)),c=null;break}p=T}let _=[];a.forEach(($,N)=>{_.push(o[N]??"");for(let b of[...$.keys()].sort((T,f)=>T-f)){let T=$.get(b);_.push([...T.keys()].sort((f,V)=>f-V).map(f=>T.get(f)).join(" "))}_.push("")});let x=i.filter(($,N)=>!s.has(N));return x.length&&_.push(...x),Be(_.join(`
26
- `))}function Ci(e){if(e.streams.has("EncryptedSummary"))return{kind:"ppt",reason:He};let t=e.streams.get("PowerPoint Document"),n=[],r=0;for(;r+8<=t.length;){let i=t.readUInt16LE(r)&15,s=t.readUInt16LE(r+2),o=t.readUInt32LE(r+4);if(s===12052)return{kind:"ppt",reason:He};if(i===15){r+=8;continue}let a=t.subarray(r+8,Math.min(r+8+o,t.length));s===4e3||s===4026?n.push(a.toString("utf16le")):s===4008&&n.push(we.decode(a)),r+=8+o}return Be(n.join(`
27
- `))}function Li(e){let t=[];for(let[n,r]of e.paths){if(n.startsWith("__attach_"))continue;let i=/(?:^|\/)__substg1\.0_([0-9A-F]{4})(001F|001E)$/i.exec(n);i&&t.push(i[2].toUpperCase()==="001F"?r.toString("utf16le"):we.decode(r))}return Be(t.join(`
28
- `))}function Un(e){let t=new Map;for(let[n,r]of e.paths){let i=/^(__attach_version1\.0_#[0-9A-F]{8})\/__substg1\.0_(3707|3704|3701)(001F|0102)$/i.exec(n);if(!i)continue;let s=t.get(i[1])??{};i[2]==="3701"&&i[3]==="0102"?s.data=r:i[2]==="3707"?s.name=r.toString("utf16le").replace(/\0+$/,""):i[2]==="3704"&&(s.short=r.toString("utf16le").replace(/\0+$/,"")),t.set(i[1],s)}return[...t.values()].filter(n=>n.data).map((n,r)=>({name:n.name||n.short||`attachment-${r+1}`,data:n.data}))}function Mt(e,t){let n=Nt(e);if(!n)return{kind:null,reason:"damaged Office 97-2003 file"};let r=Ai(n);if(!r)return{kind:null,reason:"a compound file that is not a Word, Excel, PowerPoint or Outlook file"};if(r==="encrypted-ooxml")return{kind:r,reason:He};let i;try{i=r==="doc"?$i(n):r==="xls"?Ri(n):r==="ppt"?Ci(n):Li(n)}catch{i={kind:r,reason:"damaged Office 97-2003 file"}}if(typeof i!="string")return i;if(!i.trim()&&!(r==="msg"&&Un(n).length))return{kind:r,reason:"no text inside (an empty file, or only pictures)"};let s=Ii(i,t),o=r==="msg"?Un(n):[];return{kind:r,text:s.text,truncated:s.truncated,parts:[`cfb:${r}`],...o.length?{attachments:o}:{}}}import{TextDecoder as Wn}from"node:util";var Pi=new Set(["fonttbl","colortbl","stylesheet","listtable","listoverridetable","rsidtbl","generator","pict","object","objdata","themedata","colorschememapping","datastore","latentstyles","xmlnstbl","mmathpr","filetbl","revtbl","pgdsctbl","bkmkstart","bkmkend","fldinst","shppict","nonshppict","blipuid","panose","falt","wgrffmtfilter","defchp","defpap"]),Vn=e=>{try{return new Wn(e===65001?"utf-8":`windows-${e}`)}catch{return new Wn("windows-1252")}};function Ue(e){return e.length>=5&&e.subarray(0,5).toString("latin1")==="{\\rtf"}function jt(e){let t=Vn(1252),n=[],r=[],i=()=>{r.length&&(n.push(t.decode(Uint8Array.from(r))),r=[])},s=[],o=!1,a=1,l=0,c=0,h=e.length;for(;c<h;){let u=e[c];if(u==="{"){i(),s.push({skip:o,uc:a}),c+=1,e.startsWith("\\*",c)&&(o=!0);continue}if(u==="}"){i();let p=s.pop();p&&(o=p.skip,a=p.uc),c+=1;continue}if(u==="\\"){let p=e[c+1];if(p==="'"){let N=parseInt(e.substr(c+2,2),16);if(c+=4,l>0){l-=1;continue}!o&&Number.isFinite(N)&&r.push(N);continue}if(p==="\\"||p==="{"||p==="}"){o||(i(),n.push(p)),c+=2;continue}if(p==="~"){o||n.push(" "),c+=2;continue}let _=/^([a-zA-Z]+)(-?\d+)? ?/.exec(e.slice(c+1,c+40));if(!_){c+=2;continue}c+=1+_[0].length;let x=_[1].toLowerCase(),$=_[2]!==void 0?Number(_[2]):null;if(Pi.has(x)){o=!0;continue}x==="ansicpg"&&$?t=Vn($):x==="uc"&&$!==null?a=$:x==="u"&&$!==null?(i(),o||n.push(String.fromCharCode($<0?$+65536:$)),l=a):!o&&(x==="par"||x==="line"||x==="row"||x==="sect"||x==="page")?(i(),n.push(`
29
- `)):!o&&(x==="tab"||x==="cell")&&(i(),n.push(" "));continue}if(u==="\r"||u===`
30
- `){c+=1;continue}if(l>0){l-=1,c+=1;continue}o||(i(),n.push(u)),c+=1}return i(),n.join("").replace(/\n{3,}/g,`
25
+ `)}function Pi(e,t){return e.length>t?{text:e.slice(0,t),truncated:!0}:{text:e,truncated:!1}}function Oi(e){let t=e.streams.get("WordDocument");if(t.length<512)return{kind:"doc",reason:"damaged Word file"};let n=t.readUInt16LE(10);if(n&256||n&32768)return{kind:"doc",reason:Be};if(t.readUInt16LE(2)<101){let _=t.readUInt32LE(24),A=t.readUInt32LE(28);return A<=_||A>t.length?{kind:"doc",reason:"damaged Word file"}:Ue(ve.decode(t.subarray(_,A)))}let i=e.streams.get(n&512?"1Table":"0Table");if(!i)return{kind:"doc",reason:"damaged Word file (no table stream)"};let s=32;s+=2+t.readUInt16LE(s)*2,s+=2+t.readUInt16LE(s)*4;let o=s+2,a=t.readUInt32LE(o+264),c=t.readUInt32LE(o+264+4);if(!c||a+c>i.length)return{kind:"doc",reason:"damaged Word file (no piece table)"};let l=a,p=a+c,u=null;for(;l<p;){let _=i[l];if(_===1)l+=3+i.readInt16LE(l+1);else if(_===2){let A=i.readUInt32LE(l+1);u=i.subarray(l+5,Math.min(l+5+A,i.length));break}else break}if(!u||u.length<16)return{kind:"doc",reason:"damaged Word file (no piece table)"};let h=Math.floor((u.length-4)/12),y=[];for(let _=0;_<h;_+=1){let A=u.readUInt32LE(_*4),b=u.readUInt32LE((_+1)*4)-A;if(b<=0||b>t.length)continue;let I=u.readUInt32LE(4*(h+1)+_*8+2);if(I&1073741824){let f=(I&1073741823)/2;y.push(ve.decode(t.subarray(f,Math.min(f+b,t.length))))}else y.push(t.subarray(I,Math.min(I+b*2,t.length)).toString("utf16le"))}return Ue(y.join(""))}var Ut=class{segs;i=0;p=0;constructor(t){this.segs=t}here(){for(;this.i<this.segs.length&&this.p>=this.segs[this.i].length;)this.i+=1,this.p=0;return this.i<this.segs.length?this.segs[this.i]:null}get done(){return this.here()===null}atSeam(){return this.p===0&&this.i>0}u8(){let t=this.here();if(!t)throw new Error("eof");return t[this.p++]}u16(){return this.u8()|this.u8()<<8}u32(){return(this.u16()|this.u16()<<16)>>>0}skip(t){for(let n=0;n<t;n+=1)this.u8()}chars(t,n){let r="",i=t,s=n;for(;i>0&&this.here();){this.p===0&&r.length>0&&(s=(this.u8()&1)===1);let a=this.here();if(!a)break;let c=Math.floor((a.length-this.p)/(s?2:1)),l=Math.min(i,c);if(l<=0){this.p=a.length;continue}let p=a.subarray(this.p,this.p+l*(s?2:1));r+=s?p.toString("utf16le"):p.toString("latin1"),this.p+=p.length,i-=l}return r}};function Di(e){let t=new Ut(e),n=[];try{t.u32();let r=t.u32();for(let i=0;i<r&&!t.done;i+=1){let s=t.u16(),o=t.u8(),a=o&8?t.u16():0,c=o&4?t.u32():0;n.push(t.chars(s,(o&1)===1)),t.skip(a*4+c)}}catch{}return n}function Xn(e,t,n,r){if(t+2>e.length)return"";let i=e.readUInt16LE(t);if(!n)return r.decode(e.subarray(t+2,t+2+i));let s=e[t+2],o=t+3;return s&8&&(o+=2),s&4&&(o+=4),s&1?e.subarray(o,o+i*2).toString("utf16le"):e.subarray(o,o+i).toString("latin1")}function ze(e){let t;if(e&2)t=e>>2;else{let n=Buffer.alloc(8);n.writeUInt32LE(0,0),n.writeUInt32LE((e&4294967292)>>>0,4),t=n.readDoubleLE(0)}return e&1?t/100:t}var pt=e=>Number.isFinite(e)?String(e):"";function Ni(e){let t=e.streams.get("Workbook")??e.streams.get("Book"),n=!0,r=ve,i=[],s=new Set,o=[],a=[],c=-1,l=null,p=0,u=(A,N,b)=>{if(c<0||!b)return;let I=a[c],f=I.get(A)??new Map;f.set(N,b),I.set(A,f)},h=0;for(;h+4<=t.length;){let A=t.readUInt16LE(h),N=t.readUInt16LE(h+2),b=t.subarray(h+4,Math.min(h+4+N,t.length)),I=h+4+N;switch(A){case 2057:p+=1,b.length>=4&&(n=b.readUInt16LE(0)===1536),p===1&&b.length>=4&&b.readUInt16LE(2)!==5&&(c=a.length,a.push(new Map));break;case 10:p=Math.max(0,p-1);break;case 47:return{kind:"xls",reason:Be};case 66:if(b.length>=2&&!n){let f=b.readUInt16LE(0);r=f===1200?ve:Gn(`windows-${f}`)}break;case 133:if(b.length>6){let f=b[6];if(n){let P=b[7]&1;o.push(P?b.subarray(8,8+f*2).toString("utf16le"):b.subarray(8,8+f).toString("latin1"))}else o.push(r.decode(b.subarray(7,7+f)))}break;case 252:{let f=[b];for(;I+4<=t.length&&t.readUInt16LE(I)===60;){let P=t.readUInt16LE(I+2);f.push(t.subarray(I+4,Math.min(I+4+P,t.length))),I+=4+P}i=Di(f);break}case 253:if(b.length>=10){let f=b.readUInt32LE(6);s.add(f),u(b.readUInt16LE(0),b.readUInt16LE(2),i[f]??"")}break;case 516:case 214:b.length>=8&&u(b.readUInt16LE(0),b.readUInt16LE(2),Xn(b,6,n,r));break;case 515:b.length>=14&&u(b.readUInt16LE(0),b.readUInt16LE(2),pt(b.readDoubleLE(6)));break;case 638:b.length>=10&&u(b.readUInt16LE(0),b.readUInt16LE(2),pt(ze(b.readUInt32LE(6))));break;case 189:{if(b.length>=6){let f=b.readUInt16LE(0),P=b.readUInt16LE(2);for(let R=4;R+6<=b.length-2;R+=6)u(f,P++,pt(ze(b.readUInt32LE(R+2))))}break}case 6:if(b.length>=14){let f=b.readUInt16LE(0),P=b.readUInt16LE(2);b.readUInt16LE(12)===65535?l=b[6]===0?[f,P]:null:u(f,P,pt(b.readDoubleLE(6)))}break;case 519:l&&u(l[0],l[1],Xn(b,0,n,r)),l=null;break}h=I}let y=[];a.forEach((A,N)=>{y.push(o[N]??"");for(let b of[...A.keys()].sort((I,f)=>I-f)){let I=A.get(b);y.push([...I.keys()].sort((f,P)=>f-P).map(f=>I.get(f)).join(" "))}y.push("")});let _=i.filter((A,N)=>!s.has(N));return _.length&&y.push(..._),Ue(y.join(`
26
+ `))}function Fi(e){if(e.streams.has("EncryptedSummary"))return{kind:"ppt",reason:Be};let t=e.streams.get("PowerPoint Document"),n=[],r=0;for(;r+8<=t.length;){let i=t.readUInt16LE(r)&15,s=t.readUInt16LE(r+2),o=t.readUInt32LE(r+4);if(s===12052)return{kind:"ppt",reason:Be};if(i===15){r+=8;continue}let a=t.subarray(r+8,Math.min(r+8+o,t.length));s===4e3||s===4026?n.push(a.toString("utf16le")):s===4008&&n.push(ve.decode(a)),r+=8+o}return Ue(n.join(`
27
+ `))}function Mi(e){let t=[];for(let[n,r]of e.paths){if(n.startsWith("__attach_"))continue;let i=/(?:^|\/)__substg1\.0_([0-9A-F]{4})(001F|001E)$/i.exec(n);i&&t.push(i[2].toUpperCase()==="001F"?r.toString("utf16le"):ve.decode(r))}return Ue(t.join(`
28
+ `))}function Zn(e){let t=new Map;for(let[n,r]of e.paths){let i=/^(__attach_version1\.0_#[0-9A-F]{8})\/__substg1\.0_(3707|3704|3701)(001F|0102)$/i.exec(n);if(!i)continue;let s=t.get(i[1])??{};i[2]==="3701"&&i[3]==="0102"?s.data=r:i[2]==="3707"?s.name=r.toString("utf16le").replace(/\0+$/,""):i[2]==="3704"&&(s.short=r.toString("utf16le").replace(/\0+$/,"")),t.set(i[1],s)}return[...t.values()].filter(n=>n.data).map((n,r)=>({name:n.name||n.short||`attachment-${r+1}`,data:n.data}))}function zt(e,t){let n=Bt(e);if(!n)return{kind:null,reason:"damaged Office 97-2003 file"};let r=Ci(n);if(!r)return{kind:null,reason:"a compound file that is not a Word, Excel, PowerPoint or Outlook file"};if(r==="encrypted-ooxml")return{kind:r,reason:Be};let i;try{i=r==="doc"?Oi(n):r==="xls"?Ni(n):r==="ppt"?Fi(n):Mi(n)}catch{i={kind:r,reason:"damaged Office 97-2003 file"}}if(typeof i!="string")return i;if(!i.trim()&&!(r==="msg"&&Zn(n).length))return{kind:r,reason:"no text inside (an empty file, or only pictures)"};let s=Pi(i,t),o=r==="msg"?Zn(n):[];return{kind:r,text:s.text,truncated:s.truncated,parts:[`cfb:${r}`],...o.length?{attachments:o}:{}}}var ji=0,Hi=2,Bi=4,Ui=5,zi=6,Wi=7,Vi=8,Xi=9,Zi=10,Gi=13,Ki=15,Ji=16,Yi=17,qi=18,Qi=19,es=156;function*Wt(e){let t=0,n=r=>{let i=0;for(let s=0;s<r;s++){if(t>=e.length)return null;let o=e[t++];if(i|=(o&127)<<7*s,!(o&128))return i>>>0}return i>>>0};for(;t<e.length;){let r=n(2),i=n(4);if(r===null||i===null||t+i>e.length)return;yield[r,e.subarray(t,t+i)],t+=i}}function ht(e,t){if(t+4>e.length)return"";let n=e.readUInt32LE(t);return n===4294967295?"":e.subarray(t+4,Math.min(e.length,t+4+n*2)).toString("utf16le")}var mt=e=>Number.isFinite(e)?String(e):"";function Kn(e){let t=se(e);if(!t)return null;let n=new Map(t.map(p=>[p.name,p])),r=p=>{let u=n.get(p);return u?oe(e,u):null},i=[],s=r("xl/sharedStrings.bin");if(s)for(let[p,u]of Wt(s))p===Qi&&i.push(ht(u,1));let o=[],a=r("xl/workbook.bin");if(a)for(let[p,u]of Wt(a)){if(p!==es||u.length<12)continue;let h=u.readUInt32LE(8),y=12+(h===4294967295?0:h*2);o.push(ht(u,y))}let c=[...n.keys()].filter(p=>/^xl\/worksheets\/sheet\d+\.bin$/.test(p)).sort((p,u)=>Number(/(\d+)\.bin$/.exec(p)[1])-Number(/(\d+)\.bin$/.exec(u)[1])),l=[];return c.forEach((p,u)=>{let h=r(p);if(!h)return;let y=new Map,_=0,A=-1,N=P=>{if(!P)return;let R=y.get(_)??new Map;R.set(A,P),y.set(_,R)},b=(P,R)=>{P.length>=4&&(A=P.readUInt32LE(0),N(R))},I=P=>{A+=1,N(P)};for(let[P,R]of Wt(h))switch(P){case ji:R.length>=4&&(_=R.readUInt32LE(0),A=-1);break;case qi:I(R.length>=8?i[R.readUInt32LE(4)]??"":"");break;case Yi:I(ht(R,4));break;case Ji:I(R.length>=12?mt(R.readDoubleLE(4)):"");break;case Gi:I(R.length>=8?mt(ze(R.readUInt32LE(4))):"");break;case Ki:I(R.length>=5?R[4]?"TRUE":"FALSE":"");break;case 12:case 14:A+=1;break;case Wi:R.length>=12&&b(R,i[R.readUInt32LE(8)]??"");break;case zi:case Vi:b(R,ht(R,8));break;case Ui:case Xi:R.length>=16&&b(R,mt(R.readDoubleLE(8)));break;case Hi:R.length>=12&&b(R,mt(ze(R.readUInt32LE(8))));break;case Bi:case Zi:R.length>=9&&b(R,R[8]?"TRUE":"FALSE");break}let f=[...y.keys()].sort((P,R)=>P-R).map(P=>{let R=y.get(P),G=Math.max(...R.keys());return Array.from({length:Math.min(G+1,1024)},(K,ee)=>R.get(ee)??"").join(" ")});f.length&&l.push([(o[u]||`Sheet${u+1}`).replace(/\s+/g," "),...f].join(`
29
+ `))}),l.length?l.join(`
31
30
 
32
- `)}var ke=new Set([".xlsx",".xlsm",".xltx",".xltm",".docx",".docm",".dotx",".dotm",".pptx",".pptm",".ppsx",".ppsm",".potx"]),Se=new Set([".odt",".ods",".odp",".ott",".ots",".otp"]),ze=new Set([".doc",".dot",".xls",".xlt",".ppt",".pps",".pot",".msg"]),Ht=new Set([".rtf"]);function Di(e){return/^\.(xls[xm]|xlt[xm])$/.test(e)?".xlsx":/^\.(doc[xm]|dot[xm])$/.test(e)?".docx":/^\.(ppt[xm]|pps[xm]|potx)$/.test(e)?".pptx":e}var ve=8*1024*1024,Ni=101010256,Fi=33639248,Mi=67324752;function pe(e){let t=Math.min(e.length,67584),n=-1;for(let o=e.length-22;o>=e.length-t&&o>=0;o-=1)if(e.readUInt32LE(o)===Ni){n=o;break}if(n<0)return null;let r=e.readUInt16LE(n+10),i=e.readUInt32LE(n+16);if(i>=e.length)return null;let s=[];for(let o=0;o<r&&!(i+46>e.length||e.readUInt32LE(i)!==Fi);o+=1){let a=e.readUInt16LE(i+8),l=e.readUInt16LE(i+10),c=e.readUInt32LE(i+20),h=e.readUInt32LE(i+24),u=e.readUInt16LE(i+28),p=e.readUInt16LE(i+30),_=e.readUInt16LE(i+32),x=e.readUInt32LE(i+42),$=e.subarray(i+46,i+46+u).toString("utf8");s.push({name:$,flags:a,method:l,compSize:c,uncompSize:h,localHeaderOffset:x}),i+=46+u+p+_}return s}function he(e,t,n=256*1024*1024){let r=t.localHeaderOffset;if(r+30>e.length||e.readUInt32LE(r)!==Mi)return null;let i=e.readUInt16LE(r+26),s=e.readUInt16LE(r+28),o=r+30+i+s,a=o+t.compSize;if(a>e.length)return null;let l=e.subarray(o,a);try{if(t.method===0)return l.length<=n?Buffer.from(l):null;if(t.method===8)return Oi(l,{maxOutputLength:n})}catch{return null}return null}function ji(e,t){return he(e,t)?.toString("utf8")??null}var Hi={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&apos;":"'"};function me(e){return e.replace(/&(amp|lt|gt|quot|apos);/g,t=>Hi[t]??t).replace(/&#(\d+);/g,(t,n)=>{let r=Number(n);return r>0&&r<1114112?String.fromCodePoint(r):""}).replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let r=parseInt(n,16);return r>0&&r<1114112?String.fromCodePoint(r):""})}function Bi(e){return me(e.replace(/<[^>]*>/g,`
31
+ `):null}import{TextDecoder as Jn}from"node:util";var ts=new Set(["fonttbl","colortbl","stylesheet","listtable","listoverridetable","rsidtbl","generator","pict","object","objdata","themedata","colorschememapping","datastore","latentstyles","xmlnstbl","mmathpr","filetbl","revtbl","pgdsctbl","bkmkstart","bkmkend","fldinst","shppict","nonshppict","blipuid","panose","falt","wgrffmtfilter","defchp","defpap"]),Yn=e=>{try{return new Jn(e===65001?"utf-8":`windows-${e}`)}catch{return new Jn("windows-1252")}};function We(e){return e.length>=5&&e.subarray(0,5).toString("latin1")==="{\\rtf"}function Vt(e){let t=Yn(1252),n=[],r=[],i=()=>{r.length&&(n.push(t.decode(Uint8Array.from(r))),r=[])},s=[],o=!1,a=1,c=0,l=0,p=e.length;for(;l<p;){let u=e[l];if(u==="{"){i(),s.push({skip:o,uc:a}),l+=1,e.startsWith("\\*",l)&&(o=!0);continue}if(u==="}"){i();let h=s.pop();h&&(o=h.skip,a=h.uc),l+=1;continue}if(u==="\\"){let h=e[l+1];if(h==="'"){let N=parseInt(e.substr(l+2,2),16);if(l+=4,c>0){c-=1;continue}!o&&Number.isFinite(N)&&r.push(N);continue}if(h==="\\"||h==="{"||h==="}"){o||(i(),n.push(h)),l+=2;continue}if(h==="~"){o||n.push(" "),l+=2;continue}let y=/^([a-zA-Z]+)(-?\d+)? ?/.exec(e.slice(l+1,l+40));if(!y){l+=2;continue}l+=1+y[0].length;let _=y[1].toLowerCase(),A=y[2]!==void 0?Number(y[2]):null;if(ts.has(_)){o=!0;continue}_==="ansicpg"&&A?t=Yn(A):_==="uc"&&A!==null?a=A:_==="u"&&A!==null?(i(),o||n.push(String.fromCharCode(A<0?A+65536:A)),c=a):!o&&(_==="par"||_==="line"||_==="row"||_==="sect"||_==="page")?(i(),n.push(`
32
+ `)):!o&&(_==="tab"||_==="cell")&&(i(),n.push(" "));continue}if(u==="\r"||u===`
33
+ `){l+=1;continue}if(c>0){c-=1,l+=1;continue}o||(i(),n.push(u)),l+=1}return i(),n.join("").replace(/\n{3,}/g,`
34
+
35
+ `)}var ke=new Set([".xlsx",".xlsm",".xltx",".xltm",".docx",".docm",".dotx",".dotm",".pptx",".pptm",".ppsx",".ppsm",".potx"]),Se=new Set([".odt",".ods",".odp",".ott",".ots",".otp"]),Ve=new Set([".doc",".dot",".xls",".xlt",".ppt",".pps",".pot",".msg"]),Xt=new Set([".rtf"]);function rs(e){return/^\.(xls[xm]|xlt[xm])$/.test(e)?".xlsx":/^\.(doc[xm]|dot[xm])$/.test(e)?".docx":/^\.(ppt[xm]|pps[xm]|potx)$/.test(e)?".pptx":e}var de=8*1024*1024,is=101010256,ss=33639248,os=67324752;function se(e){let t=Math.min(e.length,67584),n=-1;for(let o=e.length-22;o>=e.length-t&&o>=0;o-=1)if(e.readUInt32LE(o)===is){n=o;break}if(n<0)return null;let r=e.readUInt16LE(n+10),i=e.readUInt32LE(n+16);if(i>=e.length)return null;let s=[];for(let o=0;o<r&&!(i+46>e.length||e.readUInt32LE(i)!==ss);o+=1){let a=e.readUInt16LE(i+8),c=e.readUInt16LE(i+10),l=e.readUInt32LE(i+20),p=e.readUInt32LE(i+24),u=e.readUInt16LE(i+28),h=e.readUInt16LE(i+30),y=e.readUInt16LE(i+32),_=e.readUInt32LE(i+42),A=e.subarray(i+46,i+46+u).toString("utf8");s.push({name:A,flags:a,method:c,compSize:l,uncompSize:p,localHeaderOffset:_}),i+=46+u+h+y}return s}function oe(e,t,n=256*1024*1024){let r=t.localHeaderOffset;if(r+30>e.length||e.readUInt32LE(r)!==os)return null;let i=e.readUInt16LE(r+26),s=e.readUInt16LE(r+28),o=r+30+i+s,a=o+t.compSize;if(a>e.length)return null;let c=e.subarray(o,a);try{if(t.method===0)return c.length<=n?Buffer.from(c):null;if(t.method===8)return ns(c,{maxOutputLength:n})}catch{return null}return null}function as(e,t){return oe(e,t)?.toString("utf8")??null}var cs={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&apos;":"'"};function ae(e){return e.replace(/&(amp|lt|gt|quot|apos);/g,t=>cs[t]??t).replace(/&#(\d+);/g,(t,n)=>{let r=Number(n);return r>0&&r<1114112?String.fromCodePoint(r):""}).replace(/&#x([0-9a-fA-F]+);/g,(t,n)=>{let r=parseInt(n,16);return r>0&&r<1114112?String.fromCodePoint(r):""})}function ls(e){return ae(e.replace(/<[^>]*>/g,`
33
36
  `)).replace(/\n{2,}/g,`
34
- `)}function Ui(e,t,n){let r=new RegExp(`<${t}\\b[^>]*\\b${n}="([^"]*)"`,"g"),i=[],s;for(;(s=r.exec(e))!==null;)s[1]&&i.push(me(s[1]));return i}function zi(e,t){let n=[];if(Se.has(e)){for(let r of t)(r==="content.xml"||r==="styles.xml"||r==="meta.xml")&&n.push(r);return n}e=Di(e);for(let r of t)(r==="docProps/core.xml"||r==="docProps/app.xml")&&n.push(r);if(e===".xlsx"||e===".xlsm")for(let r of t)(r==="xl/sharedStrings.xml"||r==="xl/workbook.xml"||/^xl\/worksheets\/sheet\d+\.xml$/.test(r)||/^xl\/comments\d*\.xml$/.test(r))&&n.push(r);else if(e===".docx")for(let r of t)(r==="word/document.xml"||/^word\/(header|footer|footnotes|endnotes|comments)\d*\.xml$/.test(r))&&n.push(r);else if(e===".pptx")for(let r of t)/^ppt\/(slides|notesSlides)\/(slide|notesSlide)\d+\.xml$/.test(r)&&n.push(r);return n}function Wi(e,t){let n=pe(e);if(!n||n.length===0)return null;let r=new Map(n.map(c=>[c.name,c])),i=zi(t,n.map(c=>c.name));if(i.length===0)return null;let s=[],o=[],a=0,l=!1;for(let c of i){if(a>=ve){l=!0;break}let h=r.get(c);if(!h)continue;let u=ji(e,h);if(u===null)continue;let p=Bi(u);if(c==="xl/workbook.xml"){let _=Ui(u,"sheet","name");_.length&&(p+=`
35
- `+_.join(`
36
- `))}a+p.length>ve&&(p=p.slice(0,Math.max(0,ve-a)),l=!0),p.trim().length!==0&&(s.push(p),o.push(c),a+=p.length)}return s.length===0?null:{text:s.join(`
37
- `),truncated:l,parts:o}}function Xn(e,t,n={}){if(xe(e)){let r=Mt(e,ve);return"text"in r?{ok:!0,result:{text:r.text,truncated:r.truncated,parts:r.parts,attachments:r.attachments}}:{ok:!1,reason:r.reason}}if(Ue(e)){let r=jt(e.toString("latin1"));if(!r.trim())return{ok:!1,reason:"no text inside (an empty file, or only pictures)"};let i=r.length>ve;return{ok:!0,result:{text:i?r.slice(0,ve):r,truncated:i,parts:["rtf"]}}}if(ke.has(t)||Se.has(t)){let r=Wi(e,t);return r?{ok:!0,result:r}:{ok:!1,reason:"damaged, or not really an Office file"}}if(Fe.has(t)){let r=je(e,n);return r?{ok:!0,result:{text:r.text,truncated:r.truncated,parts:[`pdf:${r.engine}`],engine:r.engine,uncertain:r.uncertain}}:{ok:!1,reason:Fn(e)}}return ze.has(t)?{ok:!1,reason:"not a Word, Excel, PowerPoint or Outlook file inside, despite its name"}:{ok:!1,reason:"unsupported format"}}var _a=new Set([...ke,...Se,...ze,...Ht,...Fe]);import{execFileSync as Vi}from"node:child_process";import{existsSync as Ee,mkdirSync as Jn,readFileSync as Xi,writeFileSync as qn}from"node:fs";import{createRequire as Gi}from"node:module";import{homedir as Ki}from"node:os";import{dirname as Zi,join as ee}from"node:path";import{gunzipSync as Ji}from"node:zlib";var ut="7.0.0",qi="1.0.0",Bt=["heb","eng"],Ae=()=>process.env.NODATA_OCR_DIR||ee(Ki(),".nodata","ocr"),Yi=5*6e4,Qi=2*6e4,es=6e4;function dt(){return/^(0|off|false|no)$/i.test(process.env.NODATA_OCR_DOWNLOAD??"")}function Gn(){let e=process.env.NODATA_OCR_MODULE;try{let t=Gi(ee(Ae(),"package.json"));return t(e||"tesseract.js")}catch{return null}}function ts(){let e=process.env.npm_execpath;if(e&&/npm-cli\.js$/.test(e)&&Ee(e))return e;let t=Zi(process.execPath);for(let n of[ee(t,"node_modules","npm","bin","npm-cli.js"),ee(t,"..","lib","node_modules","npm","bin","npm-cli.js")])if(Ee(n))return n;return null}function ns(){let e=ts();if(!e)return"npm was not found on this computer";let t=Ae();try{return Jn(t,{recursive:!0}),Ee(ee(t,"package.json"))||qn(ee(t,"package.json"),JSON.stringify({private:!0,description:"NoData picture reader (tesseract.js), fetched once"})),Vi(process.execPath,[e,"install","--prefix",t,"--ignore-scripts","--no-audit","--no-fund","--save-exact",`tesseract.js@${ut}`,`tesseract.js-core@${ut}`,...Bt.map(n=>`@tesseract.js-data/${n}@${qi}`)],{stdio:["ignore","pipe","pipe"],timeout:Yi,windowsHide:!0}),null}catch{return"the picture reader could not be downloaded (offline, or a proxy blocked npm)"}}function Kn(){let e=ee(Ae(),"tessdata");try{Jn(e,{recursive:!0});for(let t of Bt){let n=ee(e,`${t}.traineddata`);if(Ee(n))continue;let r=ee(Ae(),"node_modules","@tesseract.js-data",t,"4.0.0_best_int",`${t}.traineddata.gz`);if(!Ee(r))return null;qn(n,Ji(Xi(r)))}return e}catch{return null}}function Zn(e,t,n){return new Promise((r,i)=>{let s=setTimeout(()=>i(new Error(n)),t);s.unref?.(),e.then(o=>{clearTimeout(s),r(o)},o=>{clearTimeout(s),i(o)})})}async function Ut(){let e=Gn(),t=process.env.NODATA_TESSDATA_PATH||Kn(),n=null;if(!e||!t){if(dt())return{error:"the built-in picture reader is not downloaded here (NODATA_OCR_DOWNLOAD=off)"};let s=ns();if(s)return{error:s};if(e=Gn(),t=process.env.NODATA_TESSDATA_PATH||Kn(),!e||!t)return{error:"the picture reader was downloaded but could not start"};n=`NoData downloaded its picture reader once (tesseract.js ${ut} with Hebrew and English, into ${Ae()}) \u2014 it runs only on this computer`}let r={langPath:t,gzip:!Ee(ee(t,"eng.traineddata")),cachePath:ee(Ae(),"tessdata"),errorHandler:()=>{}},i=null;try{let s=e.createWorker(Bt,1,r);i=await Zn(s,Qi,"start");let o=i;return{ocr:{note:n,recognize:async a=>(await Zn(o.recognize(a),es,"picture")).data.text,close:async()=>{await o.terminate().catch(()=>{})}}}}catch{return{error:"the built-in picture reader could not start on this computer"}}}var We=4096,X=(e,t,n)=>n.every((r,i)=>e[t+i]===r),B=(e,t,n)=>e.length>=t+n.length&&e.subarray(t,t+n.length).toString("latin1")===n,rs=new Set([".jpg",".jpeg",".png",".gif",".bmp",".tif",".tiff",".webp",".heic",".heif",".ico",".jfif",".avif"]),is=new Set([".zip",".rar",".7z",".tar",".gz",".tgz",".bz2",".xz",".zst",".cab",".iso",".jar",".apk"]),ss=new Set([".mp3",".mp4",".m4a",".m4v",".mov",".avi",".mkv",".webm",".wav",".flac",".ogg",".opus",".aac",".wmv",".wma",".flv",".3gp"]),Yn=new Set([".exe",".dll",".so",".dylib",".msi",".msp",".msm",".bin",".pyc",".class",".o",".a",".lib",".sys",".appx",".msix",".dmg",".pkg",".deb",".rpm"]),Qn=new Set([".ttf",".otf",".woff",".woff2",".eot"]),os=new Set([".psd",".ai",".fla",".dwg",".dxf",".sketch",".fig",".indd",".blend",".fbx",".obj",".stl"]),as=new Set([".sqlite",".sqlite3",".db",".mdb",".accdb",".dbf",".sdf"]),ce="an image \u2014 text in a picture (a photographed ID, a screenshot) is not read yet",Ie="an archive \u2014 the files inside are not opened yet",zt="a database file \u2014 its tables are not read here",le=e=>({cls:"no_text",format:e,reader:null,reason:`${e} \u2014 no text to read`});function Wt(e,t,n){let r=e.toLowerCase();if(B(n,0,"%PDF"))return{cls:"document",format:"PDF",reader:"document",docExt:".pdf"};if(Ue(n))return{cls:"document",format:"RTF",reader:"document",docExt:".rtf"};if(xe(n))return Yn.has(t)?le("an installer"):r==="thumbs.db"?le("a Windows thumbnail cache"):{cls:"document",format:t===".msg"?"Outlook message":ke.has(t)?"Office (password-protected)":ze.has(t)?`Office 97-2003 (${t})`:"Office 97-2003",reader:"document",docExt:t};if(X(n,0,[80,75,3,4])||X(n,0,[80,75,5,6]))return ke.has(t)?{cls:"document",format:`Office (${t})`,reader:"document",docExt:t}:Se.has(t)?{cls:"document",format:`OpenDocument (${t})`,reader:"document",docExt:t}:t===".xlsb"?{cls:"document",format:"Excel binary workbook (.xlsb)",reader:null,reason:"an Excel binary workbook (.xlsb) \u2014 not read yet; save it as .xlsx to scan it"}:{cls:"archive",format:"zip archive",reader:null,reason:Ie};if(X(n,0,[255,216,255]))return{cls:"image",format:"jpeg image",reader:null,reason:ce};if(X(n,0,[137,80,78,71]))return{cls:"image",format:"png image",reader:null,reason:ce};if(B(n,0,"GIF8"))return{cls:"image",format:"gif image",reader:null,reason:ce};if(B(n,0,"RIFF")&&B(n,8,"WEBP"))return{cls:"image",format:"webp image",reader:null,reason:ce};if(X(n,0,[73,73,42,0])||X(n,0,[77,77,0,42]))return{cls:"image",format:"tiff image",reader:null,reason:ce};if(B(n,4,"ftyp")&&/^(heic|heix|mif1|msf1|avif)/.test(n.subarray(8,12).toString("latin1")))return{cls:"image",format:"heic image",reader:null,reason:ce};if(B(n,0,"BM")&&t===".bmp")return{cls:"image",format:"bmp image",reader:null,reason:ce};if(B(n,0,"Rar!"))return{cls:"archive",format:"rar archive",reader:null,reason:Ie};if(X(n,0,[55,122,188,175,39,28]))return{cls:"archive",format:"7z archive",reader:null,reason:Ie};if(X(n,0,[31,139]))return{cls:"archive",format:"gzip archive",reader:null,reason:Ie};if(B(n,0,"BZh")||X(n,0,[253,55,122,88,90,0])||X(n,0,[40,181,47,253])||B(n,0,"MSCF"))return{cls:"archive",format:"compressed archive",reader:null,reason:Ie};if(B(n,0,"SQLite format 3\0"))return{cls:"database",format:"SQLite database",reader:null,reason:zt};if(B(n,4,"Standard Jet DB")||B(n,4,"Standard ACE DB"))return{cls:"database",format:"Access database",reader:null,reason:zt};if(B(n,0,"MZ")||X(n,0,[127,69,76,70])||X(n,0,[207,250,237,254])||X(n,0,[202,254,186,190]))return le("a program");if(B(n,4,"ftyp")||B(n,0,"OggS")||B(n,0,"fLaC")||B(n,0,"ID3")||X(n,0,[26,69,223,163])||B(n,0,"RIFF")&&(B(n,8,"WAVE")||B(n,8,"AVI ")))return le("audio or video");if(B(n,0,"wOFF")||B(n,0,"wOF2")||B(n,0,"OTTO")||X(n,0,[0,1,0,0,0])&&Qn.has(t))return le("a font");if(rs.has(t))return{cls:"image",format:`${t.slice(1)} image`,reader:null,reason:ce};if(is.has(t))return{cls:"archive",format:`${t.slice(1)} archive`,reader:null,reason:Ie};if(as.has(t))return{cls:"database",format:`${t.slice(1)} database`,reader:null,reason:zt};if(ss.has(t))return le("audio or video");if(Yn.has(t))return le("a program");if(Qn.has(t))return le("a font");if(os.has(t))return{cls:"unknown",format:`${t.slice(1)} design file`,reader:null,reason:"a design file \u2014 its text is not read"};let i=ke.has(t)||ze.has(t)||Se.has(t)||Ht.has(t)||Fe.has(t);if(X(n,0,[255,254]))return{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16le"};if(X(n,0,[254,255]))return{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16be"};if(n.length===0)return{cls:"text",format:"empty file",reader:"text"};let s=0,o=0,a=0;for(let l=0;l<n.length;l+=1){let c=n[l];c===0?(s+=1,l%2===1&&(o+=1)):(c<9||c>13&&c<32||c===127)&&(a+=1)}return n.length>=16&&o/(n.length/2)>.4&&s-o<n.length*.02?{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16le"}:s/n.length>.05||a/n.length>.1?i?{cls:"document",format:`${t} (not a known container)`,reader:null,reason:"damaged, or not really the format its name says"}:{cls:"unknown",format:t?`${t.slice(1)} binary`:"binary",reader:null,reason:"a binary file of a type NoData does not read"}:{cls:i?"document":"text",format:i?`${t.slice(1)} saved as text`:"text",reader:"text"}}function Vt(e){if(X(e,0,[137,80,78,71])&&e.length>=24)return{w:e.readUInt32BE(16),h:e.readUInt32BE(20)};if(B(e,0,"GIF8")&&e.length>=10)return{w:e.readUInt16LE(6),h:e.readUInt16LE(8)};if(B(e,0,"BM")&&e.length>=26)return{w:e.readInt32LE(18),h:Math.abs(e.readInt32LE(22))};if(X(e,0,[255,216])){let t=2;for(;t+9<e.length;){if(e[t]!==255)return null;let n=e[t+1],r=e.readUInt16BE(t+2);if(n>=192&&n<=207&&n!==196&&n!==200&&n!==204)return{w:e.readUInt16BE(t+7),h:e.readUInt16BE(t+5)};t+=2+r}}return null}var Da=[...Oe].sort((e,t)=>+(t.subkind==="iban")-+(e.subkind==="iban"));function ft(e){let t=e.trim();return/^\[[A-Z_]+(?:-\d+)?\]$/.test(t)||/^[\d]{0,4}[*•xX]{3,}[\d]{0,4}$/.test(t)}var tr=10;function nr(e){let t=e.replace(/<rPh\b[\s\S]*?<\/rPh>/g,""),n="";for(let r of t.matchAll(/<t(?:\s[^>]*)?>([\s\S]*?)<\/t>/g))n+=r[1];return me(n)}function ls(e){return e?[...e.matchAll(/<si\b[^>]*>([\s\S]*?)<\/si>|<si\b[^>]*\/>/g)].map(t=>nr(t[1]??"")):[]}var us=/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g;function er(e,t){let n=new RegExp(`\\b${t}="([^"]*)"`).exec(e);return n?n[1]:null}function Ve(e,t){if(e.type==="s"){let r=/<v>([^<]*)<\/v>/.exec(e.inner);return r?t[Number(r[1])]??null:null}if(e.type==="inlineStr"){let r=/<is>([\s\S]*?)<\/is>/.exec(e.inner);return r?nr(r[1]):null}if(e.type==="b"||e.type==="e")return null;let n=/<v>([^<]*)<\/v>/.exec(e.inner);return n?me(n[1]):null}function ds(e){let t=[];for(let n of e.matchAll(us)){let r=er(n[1],"r"),i=r?/^([A-Z]+)(\d+)$/.exec(r):null;if(!i)return null;t.push({full:n[0],attrs:n[1],inner:n[2]??"",col:i[1],row:Number(i[2]),type:er(n[1],"t")??"n"})}return t}function fs(e,t){let n=[...new Set(e.map(r=>r.row))].sort((r,i)=>r-i).slice(0,tr);for(let r of n){let i=new Map;for(let s of e.filter(o=>o.row===r)){let o=Ve(s,t),a=o?be(o):null;a&&i.set(s.col,{type:a.type,header:o.trim()})}if(i.size>0)return{row:r,cols:i}}return{row:-1,cols:new Map}}var ps=/^xl\/worksheets\/sheet\d+\.xml$/,hs=200;function ms(e){let t=e.trim();return/^[\d.,\-+/:%$₪€\s]+$/.test(t)||t.length>60}function gs(e,t){let n=[...new Set(e.map(s=>s.row))].sort((s,o)=>s-o).slice(0,tr),r=-1,i=-1/0;for(let s of n){let o=e.filter(c=>c.row===s).map(c=>(Ve(c,t)??"").trim()).filter(Boolean);if(o.length<2)continue;let a=o.filter(c=>!ms(c)).length,l=a*2-(o.length-a);l>i&&(i=l,r=s)}return r}function ys(e,t,n){let r=fs(t,n),i=Ce();if(!i)return r;let s=r.row>=0?r.row:gs(t,n);if(s<0)return r;let o=t.filter(u=>u.row===s).map(u=>({col:u.col,text:(Ve(u,n)??"").trim()})).filter(u=>u.text),a=new Map(o.map((u,p)=>[u.col,p])),l=new Map;for(let u of t){if(u.row<=s)continue;let p=a.get(u.col);if(p!==void 0){if(!l.has(u.row)){if(l.size>=hs)continue;l.set(u.row,o.map(()=>""))}l.get(u.row)[p]=Ve(u,n)??""}}let c=new Map(s===r.row?r.cols:[]),h=o.map(u=>u.text);for(let u of i({name:e,headers:h,rows:[...l.values()]})){let p=h.indexOf(u.column);p<0||c.set(o[p].col,{type:u.type,header:u.column,category:u.category,severity:u.severity,how:u.how})}return{row:s,cols:c}}function Kt(e){let t=pe(e);if(!t||t.length===0)return null;let n=s=>{let o=t.find(l=>l.name===s),a=o?he(e,o):null;return a?a.toString("utf8"):null},r=ls(n("xl/sharedStrings.xml")),i=[];for(let s of t.filter(o=>ps.test(o.name))){let o=n(s.name),a=o?ds(o):null;if(!a)continue;let l=s.name.replace(/^xl\/worksheets\//,"").replace(/\.xml$/,""),c=ys(l,a,r);for(let[h,u]of c.cols){let p=a.filter(_=>{let x=_.col===h&&_.row>c.row?(Ve(_,r)??"").trim():"";return x!==""&&!ft(x)}).length;p>0&&i.push({...u,col:h,sheet:l,count:p})}}return i}var Wa=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e})();function ir(e){let t=/\r?\n\r?\n/.exec(e);return t?{head:e.slice(0,t.index),body:e.slice(t.index+t[0].length)}:{head:e,body:""}}function Zt(e,t){let n=e.replace(/\r?\n[ \t]+/g," "),r=new RegExp(`^${t}:[ \\t]*(.*)$`,"im").exec(n);return r?r[1].trim():""}function Jt(e,t){let n=new RegExp(`${t}\\*?=\\s*(?:"([^"]*)"|([^;\\s]+))`,"i").exec(e);return n?(n[1]??n[2]??"").replace(/^utf-8''/i,""):""}function bs(e){let t=e.replace(/=\r?\n/g,""),n=[];for(let r=0;r<t.length;r++){let i=t[r];if(i==="="&&/^[0-9A-Fa-f]{2}$/.test(t.slice(r+1,r+3)))n.push(parseInt(t.slice(r+1,r+3),16)),r+=2;else for(let s of Buffer.from(i,"utf8"))n.push(s)}return Buffer.from(n)}function rr(e,t){let n=t.toLowerCase();return n==="base64"?Buffer.from(e.replace(/[^A-Za-z0-9+/=]/g,""),"base64"):n==="quoted-printable"?bs(e):Buffer.from(e,"utf8")}function sr(e){let{head:t}=ir(e.slice(0,65536));return/^(?:mime-version|content-type|content-transfer-encoding):/im.test(t)}function or(e){let t=[],n=[],r=0,i=(s,o,a)=>{if(r++>500||o>8)return;let{head:l,body:c}=ir(s);a!==void 0&&t.push(l);let h=Zt(l,"Content-Type")||"text/plain",u=Zt(l,"Content-Transfer-Encoding"),p=Zt(l,"Content-Disposition"),_=Jt(h,"boundary");if(/^multipart\//i.test(h)&&_){let N=`--${_}`;for(let b of c.split(N).slice(1)){if(b.startsWith("--"))break;i(b.replace(/^\r?\n/,""),o+1)}return}if(/^message\/rfc822/i.test(h)){i(rr(c,u).toString("utf8"),o+1,"");return}let x=Jt(p,"filename")||Jt(h,"name"),$=rr(c,u);x||/attachment/i.test(p)||!/^text\//i.test(h)?n.push({name:(x||`part-${r}`).replace(/[\\/]/g,"_"),data:$}):t.push($.toString("utf8"))};return i(e,0,""),{text:t.join(`
38
- `),attachments:n}}import{createHash as _s}from"node:crypto";var qt=/(^|\/)(\.env(\.[\w.-]+)?|[\w.-]+\.env(\.[\w.-]+)?)$/i,xs=/(SECRET|PASSWORD|PASSWD|PASS|PWD|TOKEN|PRIVATE|CREDENTIAL|API_?KEY|_KEY|KEY_ID|DSN|DATABASE_URL|_URI|POOLER_URL|SALT|PEPPER)$/i,ws=/(^NEXT_PUBLIC_|^VITE_|^EXPO_PUBLIC_|ANON_KEY$|PUBLISHABLE_KEY$|PUBLIC_KEY$)/i,ar=/(ENCRYPT|CIPHER|PII|DATA_?KEY|KMS|MASTER_?KEY|BLIND_?INDEX|VAULT_?KEY)/i,vs=12;var pt=class{byHash=new Map;add(t,n){for(let r of n.split(/\r?\n/)){let i=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(r);if(!i)continue;let s=i[1];if(!xs.test(s)||ws.test(s))continue;let o=i[2].trim();if(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o=o.slice(1,-1):o=o.replace(/\s+#.*$/,""),o.length<vs||/^\$\{?[A-Z_]+\}?$/.test(o))continue;let a=/^[a-z][a-z0-9+.-]*:\/\/[^:/@\s]+:([^@\s]+)@/i.exec(o);if(/^[a-z][a-z0-9+.-]*:\/\//i.test(o)&&!a)continue;let l=a?ks(a[1]):o;if(l.length<8)continue;let c=_s("sha256").update(l).digest("hex"),h=this.byHash.get(c)??[];h.some(u=>u.file===t&&u.name===s)||h.push({file:t,name:s}),this.byHash.set(c,h)}}groups(){let t=[];for(let n of this.byHash.values()){let r=[...new Set(n.map(o=>o.name))].sort(),i=[...new Set(n.map(o=>o.file))].sort();if(r.length<2&&i.length<2)continue;let s=r.some(o=>ar.test(o));t.push({names:r,files:i,encryption:s&&r.some(o=>!ar.test(o))})}return t}};function ks(e){try{return decodeURIComponent(e)}catch{return e}}function cr(e){let t=[];e.names.length>1&&t.push(`one secret is used as ${e.names.length} variables (${e.names.join(", ")})`),e.files.length>1&&t.push(`${e.names.length===1?e.names[0]:"the same secret"} is copied in ${e.files.length} files (${e.files.join(", ")})`);let n=`Shared secret: ${t.join("; and ")}.`;return e.encryption?n+=" \u26A0 It is ALSO a data-encryption key: do NOT rotate it like a normal key \u2014 everything already encrypted with it would stop decrypting. First give the other uses their own new secret, then change the encryption key only in a planned re-encryption.":e.names.length>1?n+=" Replacing it breaks every use at once \u2014 give each use its own secret first, then retire the shared one.":n+=" Every copy has to be removed or updated when the key is replaced; keep one source (the vault) instead.",n}var _r={4:"critical",3:"high",2:"medium",1:"info"},Yt=10,Cs=5e3,Ls=5e4,ge=64*1024*1024,mt=4*1024*1024,dr=500,Qt=5e5,en=2,fr=512*1024*1024,Ps=1024*1024*1024,pr=5e3,Os=()=>Math.max(0,Number(process.env.NODATA_OCR_MAX_IMAGES)||2e3),Ds=()=>Math.max(10,Number(process.env.NODATA_SCAN_SECONDS)||480)*1e3,Ns=5e3,Fs=2e3;var Ms=1024,js=256*1024*1024,Hs=120,hr=new br("utf-8",{fatal:!0}),Bs=new br("windows-1255");function Us(e){try{return hr.decode(e)}catch{try{return hr.decode(e.subarray(0,Math.max(0,e.length-3)))}catch{return Bs.decode(e)}}}function zs(){return!dt()||!!process.env.NODATA_OCR_MODULE||As(Xe(process.env.NODATA_OCR_DIR||Xe(Rs(),".nodata","ocr"),"node_modules","tesseract.js"))}function mr(){let e=re();return!!e.pdftoppm&&!!e.tesseract&&e.ocrLangs.length>0}function Ws(e,t){let n=Is(e,"r");try{let r=Buffer.alloc(t),i=$s(n,r,0,t,0);return r.subarray(0,i)}finally{Es(n)}}var gr=new Set(["node_modules",".git",".hg",".svn"]),yr=new Set([".cache",".cargo",".rustup",".npm",".pnpm-store",".yarn",".gradle",".m2",".nuget",".conda",".pyenv",".rbenv",".nvm",".volta",".bun",".deno",".docker",".android",".vscode-server",".agents",".agent",".codeium",".continue","antigravity",".antigravity","__pycache__",".venv","venv","site-packages",".next",".turbo",".expo",".nx",".parcel-cache",".svelte-kit","appdata",".trash","$recycle.bin"].map(e=>e.toLowerCase())),Vs=/(^|\/)\.(vscode|cursor|windsurf|antigravity|vscode-server)\/extensions$/i;var tn=40,Xs=/^(agent|bot|model|service|tool|app|job|task|queue|test|qa|suite|runner|worker|host|server|project|repo|package|file|table|column|field)[_-]?name$/i,Gs={critical:"high",high:"medium",medium:"low",low:"info",info:"info"},Ks=[{re:/\b\d{3}-\d{2}-\d{4}\b/,kind:"pii_unencrypted",subkind:"ssn",severity:"high",hint:"US Social Security Number pattern in plaintext."},{re:/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i,kind:"pii_unencrypted",subkind:"email",severity:"low",hint:"Email addresses in plaintext."},{re:/(passport|teudat.?zehut|(?<![א-ת])תעודת.?זהות(?![א-ת])|(?<![א-ת])ת["'׳״]?\.?ז(?![א-ת]))/i,kind:"pii_unencrypted",subkind:"passport_keyword",severity:"low",hint:"Mentions the word passport / national ID \u2014 a word, not a number. The numbers themselves are reported by the ID rules."}],Zs=[{re:/(salary|payroll|משכורת|ssn|social.?security|passport|דרכון|תעודת.?זהות)/i,kind:"pii_unencrypted",subkind:"sensitive_filename",severity:"medium",hint:"Filename suggests sensitive PII content."},{re:/\.(env|env\.local|pem|key|p12|pfx)$/i,kind:"pii_unencrypted",subkind:"secret_file",severity:"high",hint:"File extension implies secret / credential bundle in plaintext."}],Js=/\d{3}|@|[A-Z]{2}\d{2}/;function nn(e,t){return Js.test(e)?`column ${t}`:e}function qs(e){let t=e.lastIndexOf(".");return t<0?"":e.slice(t).toLowerCase()}async function rn(e){let t=Date.now(),n=[],r=new pt,i=new Map,s=[],o=0,a=0,l=0,c=0,h=e.time_budget_ms??Ds(),u="",p=Date.now(),_=Date.now();async function x(){let d=Date.now();if(!(d-p<100)&&(p=d,await new Promise(w=>setImmediate(w)),e.onProgress&&d-_>=Ns)){_=d;try{e.onProgress({walked:o,read:a,current:u})}catch{}}}let $=0,N=(d,w)=>d===0?!0:$+w>js?!1:($+=w,!0),b=[];function T(d,w,y,g){let R=f.not_read_by_format??={};R[y]=(R[y]??0)+1,(f.not_read??=[]).length<dr&&f.not_read.push({path:d,cls:w,format:y,reason:g}),e.onFileChecked?.(d,!1)}let f={hit_file_cap:!1,hit_depth_cap:!1,max_files:Math.min(Math.max(1,e.max_files??Cs),Ls),max_depth:Yt,tool_dirs_skipped:0,tool_dir_names:[],not_reached:[],skipped_by_extension:0,documents_extracted:0,documents_truncated:0,documents_unreadable:0,files_too_large:0,files_sampled_only:0,sample_bytes:mt};function V(d){return(d.startsWith(e.target_path)?d.slice(e.target_path.length).replace(/^[\\/]+/,"")||ur(d):d).replace(/\\/g,"/")}function Q(d,w,y,g,R){let I=V(d);I!==""&&s.push({target_id:e.target_id,path:I,kind:w,size_bytes:y,modified_at:g?g.toISOString():null,child_count:R})}function K(d,w){n.push({target_id:e.target_id,relative_path:d,finding_kind:w.kind,finding_subkind:w.subkind,severity:w.severity,remediation_hint:w.hint})}function G(d,w,y,g,R,I=!1){I&&It.test(d)?R=`${R??""} (In a test / sample file, but not a published test number \u2014 this looks real.)`.trim():w!=="hardcoded_secret"&&It.test(d)&&(y=Gs[y],R=`${R??""} (Test / sample / minified file \u2014 probably sample data; check before acting.)`.trim()),n.push({target_id:e.target_id,relative_path:d,finding_kind:w,finding_subkind:g,severity:y,remediation_hint:R})}function te(d,w){let y=w.replace(/\.[^.]+$/,"");if(/\d{7}/.test(y.replace(/[\s-]/g,"")))for(let g of De(y))G(d,"pii_unencrypted","high",`${g.subkind}_in_name`,`The FILE NAME holds ${g.count===1?"a":g.count} ${g.subkind.replace(/_/g," ")} value${g.count===1?"":"s"}. Anyone who sees the folder sees it, and a lock keeps the name: rename it first.`,(g.real??0)>0)}function ue(d,w){if(o+=1,o>f.max_files){f.hit_file_cap=!0;return}let y=V(d);if(te(y,w),Date.now()-t>=h){f.hit_time_cap=!0,f.time_skipped=(f.time_skipped??0)+1,T(y,"unknown","not reached (time limit)",`the scan's time limit (${Math.round(h/6e4)} min) was reached before this file \u2014 scan its folder on its own`);let v=(f.by_class??={}).unknown??={total:0,read:0};v.total+=1;return}let g=0,R;try{g=ht(d).size,R=Ws(d,We)}catch{e.onFileChecked?.(y,!1);return}u=y;let I=Date.now();se(y,w,g,R,v=>{let m=Ts(d,{flag:"r"});return v&&m.length>v?m.subarray(0,v):m},0),ye(y,Date.now()-I)}function ye(d,w){if(w<Fs)return;let y=f.slow_files??=[];y.push({path:d,ms:w}),y.sort((g,R)=>R.ms-g.ms),y.length>5&&(y.length=5)}function un(d,w,y){let g=pe(w);if(!g)return{ok:!1,reason:"a damaged archive \u2014 could not be opened"};let R=Ps,I=0;for(let v of g){if(v.name.endsWith("/"))continue;I+=1;let m=`${d}!/${v.name}`,S=v.name.split("/").pop()??v.name,E=D=>{let P=f.not_read_by_format??={};P["file inside an archive"]=(P["file inside an archive"]??0)+1,(f.not_read??=[]).length<dr&&f.not_read.push({path:m,cls:"archive",format:"file inside an archive",reason:D}),e.onFileChecked?.(m,!1)};if(Date.now()-t>=h){f.hit_time_cap=!0,E(`the scan's time limit (${Math.round(h/6e4)} min) was reached \u2014 the rest of the archive was not opened`);break}if(I>pr){E(`the archive holds more than ${pr} files \u2014 the rest were not opened`);break}if(v.flags&1){E("password-protected inside the archive \u2014 not read");continue}if(v.method!==0&&v.method!==8){E("compressed with a method NoData does not read");continue}let A=Math.min(ge,R);if(v.uncompSize>A){E(R<ge?"the archive expands past the reading limit \u2014 the rest were not opened":`larger than ${ge/(1024*1024)} MB \u2014 not read`);continue}let j=he(w,v,A);if(!j){E("could not be unpacked (damaged, or larger than it claimed)");continue}R-=j.length,f.archive_entries=(f.archive_entries??0)+1,se(m,S,j.length,j.subarray(0,We),D=>D&&j.length>D?j.subarray(0,D):j,y+1)}return{ok:!0}}function se(d,w,y,g,R,I){for(let O of Zs)O.re.test(w)&&K(d,O);let v=qs(w),m=Wt(w,v,g),S=f.by_class??={},E=S[m.cls]??={total:0,read:0};E.total+=1;let A=O=>T(d,m.cls,m.format,O);if(m.cls==="archive"&&m.format==="zip archive"){if(I>=en){A("an archive inside an archive inside an archive \u2014 not opened");return}if(y>fr){f.files_too_large+=1,A(`an archive larger than ${fr/(1024*1024)} MB \u2014 not opened`);return}let O;try{O=R()}catch{A("could not be opened (in use, or no permission)");return}let L=un(d,O,I);L.ok?E.read+=1:A(L.reason);return}if(m.cls==="image"){if(!Pt[m.format]){A(m.format==="heic image"?"a HEIC photo \u2014 save it as JPEG to have its text read":m.reason??"not read");return}let O=Vt(g);if(y<Ms||O&&Math.max(O.w,O.h)<Hs){A("a small icon or thumbnail \u2014 no text to read");return}if(y>ge){f.files_too_large+=1,A(`larger than ${ge/(1024*1024)} MB \u2014 not read`);return}if(!at()&&!zs()){A(`an image \u2014 its text is read by OCR on this computer once Tesseract is installed (${ne})`);return}if(!N(I,y)){A("a picture inside an archive \u2014 the memory set aside for pictures from archives is used up; unpack the archive and scan it");return}b.push({kind:"image",rel:d,name:w,ext:v,format:m.format,load:R,row:E,size:y});return}if(!m.reader){m.cls==="document"?(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=m.reason??"not read")):f.skipped_by_extension+=1,A(m.reason??"not read");return}let j=m.reader==="document";if(j&&y>ge){f.files_too_large+=1,A(`larger than ${ge/(1024*1024)} MB \u2014 not read`);return}let D;try{D=j?R():R(mt)}catch{A("could not be opened (in use, or no permission)");return}let P,J=!1;if(j){let O=Xn(D,m.docExt??v,{ocr:!1});if(!O.ok&&(m.docExt??v)===".pdf"&&/scanned image/.test(O.reason)&&mr()&&N(I,y)){b.push({kind:"pdf",rel:d,name:w,ext:".pdf",format:m.format,load:R,row:E,size:y});return}if(!O.ok){f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=O.reason),A(O.reason);return}let L=O.result;if((m.docExt??v)===".pdf"&&L.engine!=="ocr"&&Tn(D,L.text)){if(mr()&&N(I,y)){b.push({kind:"pdf",rel:d,name:w,ext:".pdf",format:m.format,load:R,row:E,size:y,stamp:L.text});return}let M=`some of its pages are pictures (scanned): they need OCR, the rest was read. ${ne}`;J=!0,f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=M),A(M)}if(P=L.text,J||(f.documents_extracted+=1),L.truncated&&(f.documents_truncated+=1),L.engine==="pdftotext"||L.engine==="ocr"){let M=f.documents_by_engine??={};M[L.engine]=(M[L.engine]??0)+1,L.engine==="ocr"&&(f.ocr_files??=[]).length<500&&f.ocr_files.push(d)}L.uncertain&&(f.uncertain_files??=[]).length<500&&f.uncertain_files.push(d);for(let M of L.attachments??[]){if(I>=en)break;f.archive_entries=(f.archive_entries??0)+1,se(`${d}!/${M.name}`,M.name,M.data.length,M.data.subarray(0,We),Y=>Y&&M.data.length>Y?M.data.subarray(0,Y):M.data,I+1)}}else if(m.reader==="utf16le"||m.reader==="utf16be"){let O=D.subarray(D[0]===255||D[0]===254?2:0),L=O.subarray(0,O.length-O.length%2);P=m.reader==="utf16le"?L.toString("utf16le"):Buffer.from(L).swap16().toString("utf16le"),y>mt&&(f.files_sampled_only+=1)}else{let O=0;for(let L=0;L<D.length;L+=1)D[L]===0&&(O+=1);if(D.length>0&&O/D.length>.05){f.skipped_by_extension+=1,E.total-=1;let L=S.unknown??={total:0,read:0};L.total+=1,A("binary content under a text name \u2014 not read");return}if(P=Us(D),y>mt&&(f.files_sampled_only+=1),v===".eml"&&sr(P)){let L=or(P);P=`${P}
39
- ${L.text}`;for(let M of L.attachments){if(I>=en){T(`${d}!/${M.name}`,"archive","file attached to an email","attached inside nested mail or archives deeper than the scan opens: not read"),J=!0;continue}f.archive_entries=(f.archive_entries??0)+1,se(`${d}!/${M.name}`,M.name,M.data.length,M.data.subarray(0,We),Y=>Y&&M.data.length>Y?M.data.subarray(0,Y):M.data,I+1)}}}J||(a+=1,E.read+=1,e.onFileChecked?.(d,!0)),Re(d,w,v,P,j?D:null)}function Re(d,w,y,g,R){let I=R??Buffer.alloc(0),v=new Set;if(qt.test(d)&&r.add(d,g),e.lexicon){let m=[];try{m=e.lexicon(g)}catch{}for(let S of m)n.push({target_id:e.target_id,relative_path:d,finding_kind:"custom_lexicon",finding_subkind:`lexicon:${S.term_id}`,severity:_r[S.tier]??"info",remediation_hint:`"${S.label}" \u2014 one of your scan terms, tier ${S.tier}: handle the file at that tier.`,hit_count:S.hit_count,label:S.label,tier:S.tier})}for(let m of Ks)if(m.re.test(g)){let S=`${m.subkind}::${d}`;v.has(S)||(v.add(S),K(d,m))}for(let m of De(g,(S,E)=>{if(S!=="israeli_id"&&S!=="credit_card"&&S!=="iban")return;let A=Ss("sha256").update(`${S}:${E}`).digest("hex"),j=i.get(A)??new Set;j.add(d),i.set(A,j)})){let S=`validated::${m.subkind}::${d}`;v.has(S)||(v.add(S),G(d,"pii_unencrypted",m.severity,m.subkind,`${m.hint} ${m.count} distinct value${m.count===1?"":"s"} in this file.`,(m.real??0)>0))}if(!hn.test(d)){let m=At(),S=g.split(`
40
- `),E=Math.min(S.length,Qt);S.length>Qt&&T(d,"text","text",`only its first ${Qt.toLocaleString("en-US")} lines were checked for keys and passwords: the rest were not`);for(let A=0;A<E;A++){let j=S[A];if(!j)continue;let D=j.trimStart();if(!(D.startsWith("//")||D.startsWith("/*")||D.startsWith("*")||D.startsWith("#"))&&!/process\.env/.test(j)&&!/\$\{[A-Z_]+/.test(j)){for(let P of m)if(P.pattern.test(j)){let J=`secret::${P.id}::${d}::${A+1}`;if(v.has(J))break;v.add(J);let O=mn.test(d);G(d,"hardcoded_secret",O?"critical":P.severity,P.id,O?`A real-looking ${P.name} in an EXAMPLE file near line ${A+1}. Example files are committed to Git and shared on purpose \u2014 rotate this key at its source and put a placeholder in the example.`:`Looks like a ${P.name} hardcoded near line ${A+1}. Move to an env var or secret manager.`);break}}}}if(w==="package.json"&&!d.includes("node_modules"))try{let S=gn(g);for(let E of S){let A=`vuln::${E.name}::${d}`;v.has(A)||(v.add(A),G(d,"vulnerable_dependency",E.vuln.severity,E.name,`${E.name}@${E.version} is below ${E.vuln.below} (${E.vuln.cve} \xB7 ${E.vuln.desc}). Bump to ${E.vuln.below} or higher.`))}}catch{}if(y===".csv"||y===".tsv"){let m=y===".tsv"?" ":",",S=g.split(/\r?\n/);if(S.length>0){let E=Ne(S[0]??"",m),A=S.slice(1,51).map(D=>Ne(D??"",m)),j=Ce();if(j){let D=S.slice(1,201).filter(P=>P!=="").map(P=>Ne(P,m));for(let P of j({name:"table",headers:E,rows:D})){let J=`header::${d}::${P.column}::${P.type}`;if(v.has(J))continue;let O=E.indexOf(P.column);if(O>=0&&D.length>0&&D.every(M=>!(M[O]??"").trim()||ft(M[O]??"")))continue;v.add(J);let L=nn(P.column,O+1);G(d,"pii_header_match",P.severity,`${P.type}:${L}`,`Column "${L}" holds ${P.category} (${P.how==="value"?`${P.hits} sampled values matched`:"by its header"}). Wrap with envelope or keep a clean copy for work.`)}}j||E.forEach((D,P)=>{let J=(D??"").trim();if(!J)return;let L=be(J)?.type??null;if(!L){let M=[];for(let Ge of A){let vt=Ge[P];if(vt&&vt.trim().length>0&&M.push(vt),M.length>=50)break}let Y=C(M);Y&&(L=Y)}if(L){let M=Ke(L)??Je[L]??"medium",Y=`header::${d}::${J}::${L}`;if(v.has(Y))return;v.add(Y);let Ge=nn(J,P+1);G(d,"pii_header_match",M,`${L}:${Ge}`,`Column "${Ge}" looks like ${L} data. Wrap with envelope or move to a vault-backed reference.`)}})}}if(y===".xlsx"||y===".xlsm")for(let m of Kt(I)??[]){let S=`xlsxheader::${d}::${m.sheet}::${m.header}::${m.type}`;if(v.has(S))continue;v.add(S);let E=nn(m.header,m.col);G(d,"pii_header_match",m.severity??Ke(m.type)??Je[m.type]??"medium",`${m.type}:${E}`,`Column "${E}" (${m.sheet}) holds ${m.category??`${m.type} data`}${m.how==="value"?" (found by its values)":""} \u2014 ${m.count} filled cell${m.count===1?"":"s"}. Wrap with envelope or keep a clean copy for work.`)}if(y===".json"&&!w.endsWith(".nodata-proof.json"))try{let m=JSON.parse(g),S=Array.isArray(m)?m[0]:m;if(S&&typeof S=="object")for(let E of Object.keys(S)){let A=be(E);if(A){let j=A.type==="name"&&Xs.test(E),D=j?"low":Ke(A.type)??Je[A.type]??"medium",P=`jsonkey::${d}::${E}::${A.type}`;if(v.has(P))continue;v.add(P),G(d,"pii_header_match",D,`${A.type}:${E}`,j?`JSON key "${E}" is usually the name of a system (an agent, bot or service), not a person \u2014 check if yours holds people.`:`JSON key "${E}" looks like ${A.type} data.`)}}}catch{}/\.(txt|log|md|csv|tsv|json|jsonl|xml|html?|yaml|yml|sql)$/i.test(w)&&k(g,d,v)}let de=Oe.find(d=>d.subkind==="israeli_phone");function k(d,w,y){let g=d.split(`
41
- `),R=Math.min(g.length,1e3),I=-1,v=-1,m=-1;for(let S=0;S<R;S++){let E=g[S]??"";if(m<0){let A=E.match(/\b\d{9}\b/);A&&qe(A[0])&&!Ye(A[0])&&!Le(A[0])&&(m=S+1)}if(I<0){de.pattern.lastIndex=0;for(let A of E.matchAll(de.pattern))if(de.validate(A[0])){I=S+1;break}}if(v<0&&(Pe.lastIndex=0,Pe.test(E)&&(v=S+1)),m>0&&I>0&&v>0)break}m>0&&!y.has(`ilid::${w}`)&&(y.add(`ilid::${w}`),G(w,"israeli_id_value","critical",`near_line:${m}`,`Israeli ID with valid Luhn checksum detected near line ${m}. Strong signal that real customer IDs are in plaintext.`,!0)),I>0&&!y.has(`ilphone::${w}`)&&(y.add(`ilphone::${w}`),G(w,"israeli_phone_value","high",`near_line:${I}`,`Israeli phone number detected near line ${I}.`)),v>0&&!y.has(`iliban::${w}`)&&(y.add(`iliban::${w}`),G(w,"israeli_iban_value","critical",`near_line:${v}`,`Israeli IBAN (IL prefix) detected near line ${v}.`))}function C(d){if(d.length===0)return null;let w=0,y=0,g=0;for(let I of d)typeof I=="string"&&(qe(I)&&w++,$t.lastIndex=0,$t.test(I)&&y++,Pe.lastIndex=0,Pe.test(I)&&g++);let R=d.length;return w/R>=.3?"id":y/R>=.3?"phone":g/R>=.3?"financial":null}async function U(d,w){if(w>Yt){f.hit_depth_cap=!0;return}if(o>f.max_files){f.hit_file_cap=!0;return}let y;try{y=lr(d)}catch{return}for(let g=0;g<y.length;g++){let R=y[g];if(o>f.max_files){f.hit_file_cap=!0;let m=V(d);m&&!f.not_reached.includes(`${m} (partly)`)&&f.not_reached.length<tn&&f.not_reached.push(`${m} (partly)`);for(let S of y.slice(g)){if(f.not_reached.length>=tn)break;try{ht(Xe(d,S)).isDirectory()&&!gr.has(S)&&!yr.has(S.toLowerCase())&&f.not_reached.push(V(Xe(d,S)))}catch{}}return}let I=Xe(d,R),v;try{v=ht(I)}catch{continue}if(!v.isSymbolicLink()){if(v.isDirectory()){if(gr.has(R))continue;if(!e.include_tool_dirs&&(yr.has(R.toLowerCase())||Vs.test(V(I)))){f.tool_dirs_skipped+=1,!f.tool_dir_names.includes(R)&&f.tool_dir_names.length<tn&&f.tool_dir_names.push(R);continue}let m=null;try{m=lr(I).length}catch{m=null}Q(I,"folder",null,v.mtime??null,m),await U(I,w+1)}else if(v.isFile()){if(e.skip_own_file?.(V(I))){f.own_files_skipped=(f.own_files_skipped??0)+1;continue}Q(I,"file",v.size,v.mtime??null,null),ue(I,R),await x()}}}}let z,F=null;try{let d=ht(e.target_path);z=d.isDirectory()||d.isFile(),d.isFile()&&(F={size:d.size,mtime:d.mtime??null})}catch{z=!1}if(!z)return{target_id:e.target_id,target_label:e.target_label,target_path:e.target_path,files_walked:0,files_inspected:0,duration_ms:Date.now()-t,findings:[],inventory:[],coverage:f,error:"target_path_not_found_or_not_directory"};if(e.log.info("folder-scanner: starting",{target_label:e.target_label,target_path:e.target_path,max_files:f.max_files,max_depth:Yt}),F?(Q(e.target_path,"file",F.size,F.mtime,null),ue(e.target_path,ur(e.target_path))):await U(e.target_path,0),b.length){b.sort((g,R)=>g.size-R.size),e.onProgress?.({walked:o,read:a,current:`reading ${b.length} picture(s) / scanned PDF(s)`});let d=null,w=()=>Date.now()-t>=h||l>=Os(),y=g=>{f.hit_time_cap=!0,f.ocr_skipped=(f.ocr_skipped??0)+1,g.kind==="pdf"&&(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&f.unreadable_files.push(g.rel)),T(g.rel,g.kind==="pdf"?"document":"image",g.format,`${g.kind==="pdf"?"a scanned PDF":"a picture"} \u2014 the scan's time limit was reached before OCR got to it; scan its folder on its own`)};try{for(let g of b){if(w()){y(g);continue}u=g.rel,await x();let R=Date.now(),I=null,v="an image with no readable text (a photo, or text OCR could not make out)",m=!1;try{if(g.kind==="pdf"&&g.stamp!==void 0){let E=Lt(g.load()),A=E?.text?.trim();I=A?`${A}
42
- ${g.stamp}`:null,m=!!E?.truncated,v="a scanned PDF (pictures with a little text) that OCR could not read"}else if(g.kind==="pdf"){let E=je(g.load(),{ocr:!0});I=E?.text?.trim()||null,m=!!E?.truncated,v="a scanned PDF OCR could not read"}else at()?I=Ot(g.load(),g.format):(d??=await Ut(),"error"in d?v=`an image \u2014 ${d.error}. Installing Tesseract also works (${ne})`:(d.ocr.note&&(f.ocr_note=d.ocr.note),f.ocr_engine="built-in",I=(await d.ocr.recognize(g.load())).trim()||null))}catch{I=null}if(l+=1,c+=Date.now()-R,ye(g.rel,Date.now()-R),!I){g.kind==="pdf"&&(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&f.unreadable_files.push(g.rel)),T(g.rel,g.kind==="pdf"?"document":"image",g.format,v);continue}let S=f.documents_by_engine??={};S.ocr=(S.ocr??0)+1,(f.ocr_files??=[]).length<500&&f.ocr_files.push(g.rel),g.kind==="pdf"&&(f.documents_extracted+=1),a+=1,g.row.read+=1,e.onFileChecked?.(g.rel,!0),Re(g.rel,g.name,g.ext,I,null),m&&(f.documents_truncated+=1,T(g.rel,"document",g.format,"only its first pages were read by OCR (the page cap): the rest were not read; raise NODATA_OCR_MAX_PAGES or scan it on its own"))}}finally{d&&!("error"in d)&&await d.ocr.close()}}let oe=new Map;for(let d of i.values())if(!(d.size<2))for(let w of d){let y=oe.get(w)??new Set;for(let g of d)g!==w&&y.add(g);oe.set(w,y)}for(let d of n){let w=oe.get(d.relative_path);if(!w||d.finding_kind!=="pii_unencrypted"||!["israeli_id","credit_card","iban"].includes(d.finding_subkind??""))continue;let y=[...w].sort();d.remediation_hint=`${d.remediation_hint??""} The same value also appears in ${y.length} other file${y.length===1?"":"s"}: ${y.slice(0,5).join(", ")}${y.length>5?` \u2026 +${y.length-5}`:""} \u2014 likely one real person copied across files.`.trim()}for(let d of r.groups()){let w=cr(d);for(let y of d.files)G(y,"secret_reuse",d.encryption?"critical":"high",d.encryption?"shared_encryption_key":d.names.length>1?"shared_secret":"copied_secret",w)}return{target_id:e.target_id,target_label:e.target_label,target_path:e.target_path,files_walked:o,files_inspected:a,duration_ms:Date.now()-t,findings:n,inventory:s,coverage:f}}var sn={info(){}};var vc=Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=","base64");var to=["Put the new key where the app reads it (for a developer machine: the NoData vault + nodata_run, not a .env file).","Check that the app still works with the new key.","Only then delete / revoke the OLD key \u2014 until you do, whoever copied it can still use it."],H=(e,t,n)=>({provider:e,url:t,steps:[...n,...to]}),Dc={"aws-access-key":H("AWS","https://console.aws.amazon.com/iam/home#/security_credentials",["Open IAM \u2192 your user \u2192 Security credentials.","Create a NEW access key (you see its secret once \u2014 keep it only in the vault)."]),"aws-secret-key":H("AWS","https://console.aws.amazon.com/iam/home#/security_credentials",["Open IAM \u2192 your user \u2192 Security credentials.","Create a NEW access key (you see its secret once \u2014 keep it only in the vault).","Mark the old key Inactive before deleting it."]),"gcp-api-key":H("Google Cloud","https://console.cloud.google.com/apis/credentials",["Open APIs & Services \u2192 Credentials.","Pick the key \u2192 Regenerate key (or create a new one and restrict it to the APIs you use)."]),"gcp-service-account":H("Google Cloud (service account)","https://console.cloud.google.com/iam-admin/serviceaccounts",["Open IAM & Admin \u2192 Service accounts \u2192 the account \u2192 Keys.","Add key \u2192 Create new key (JSON). Keep the file out of Git and out of shared folders."]),"firebase-key":H("Firebase / Google Cloud","https://console.cloud.google.com/apis/credentials",["A Firebase web key is meant to be public \u2014 restrict it instead: Credentials \u2192 the key \u2192 Application restrictions (your domains only).","If it is not a web key, regenerate it."]),"github-token":H("GitHub","https://github.com/settings/tokens",["Open Settings \u2192 Developer settings \u2192 Personal access tokens.","Generate a new token with only the scopes you need."]),"github-fine-grained":H("GitHub","https://github.com/settings/tokens?type=beta",["Open Fine-grained tokens.","Regenerate the token (or create a new one for only the repositories you need)."]),"gitlab-token":H("GitLab","https://gitlab.com/-/user_settings/personal_access_tokens",["Open Access tokens.","Create a new token with only the scopes you need."]),"stripe-secret":H("Stripe","https://dashboard.stripe.com/apikeys",["Open Developers \u2192 API keys.","Roll the secret key (Stripe can keep the old one alive for a short overlap)."]),"stripe-restricted":H("Stripe","https://dashboard.stripe.com/apikeys",["Open Developers \u2192 API keys \u2192 Restricted keys.","Roll the key, or create a new restricted key."]),"slack-token":H("Slack","https://api.slack.com/apps",["Open your app \u2192 OAuth & Permissions.","Rotate / reinstall to get a new token."]),"slack-webhook":H("Slack","https://api.slack.com/apps",["Open your app \u2192 Incoming Webhooks.","Add a new webhook URL for the channel."]),"twilio-api-key":H("Twilio","https://console.twilio.com/us1/account/keys-credentials/api-keys",["Open Account \u2192 API keys & tokens.","Create a new API key."]),"sendgrid-api-key":H("SendGrid","https://app.sendgrid.com/settings/api_keys",["Open Settings \u2192 API Keys.","Create a new key with only the permissions you need."]),"openai-key":H("OpenAI","https://platform.openai.com/api-keys",["Open API keys.","Create a new secret key."]),"openai-project-key":H("OpenAI","https://platform.openai.com/api-keys",["Open API keys (per project).","Create a new secret key for the same project."]),"anthropic-key":H("Anthropic","https://console.anthropic.com/settings/keys",["Open Settings \u2192 API keys.","Create a new key."]),"supabase-key":H("Supabase","https://supabase.com/dashboard/project/_/settings/api-keys",["Open the project \u2192 Project Settings \u2192 API Keys.","Create a new SECRET key (a service_role / secret key bypasses every database rule \u2014 treat it like a root password).","Older projects with JWT keys: rotating the JWT secret replaces every key and signs everyone out \u2014 plan it."]),"supabase-access-token":H("Supabase (personal access token \u2014 reaches every project of the account)","https://supabase.com/dashboard/account/tokens",["Open Account \u2192 Access Tokens.","Revoke this token, then generate a new one only where it is needed (CLI, MCP) \u2014 prefer a read-only MCP."]),"supabase-secret-key":H("Supabase","https://supabase.com/dashboard/project/_/settings/api-keys",["Open the project \u2192 Project Settings \u2192 API Keys.","Create a new secret key, switch your servers to it, then delete this one."]),"postgres-uri":H("PostgreSQL (the password in the connection string)","https://supabase.com/dashboard/project/_/settings/database",["Change the database user's password: in Supabase \u2192 Project Settings \u2192 Database \u2192 Reset password; elsewhere, your host's console or ALTER USER \u2026 WITH PASSWORD.","Update the connection string with the new password."]),"mongodb-uri":H("MongoDB","https://cloud.mongodb.com/",["Open Atlas \u2192 Database Access \u2192 the user \u2192 Edit \u2192 Edit password.","Update the connection string."]),"redis-uri":H("Redis","",["Reset the password in your Redis host's console (or CONFIG SET requirepass on your own server).","Update the connection string."]),"private-key":H("Private key (SSH / TLS / signing)","",["Generate a new key pair.","Register the new PUBLIC key where the old one was trusted (server authorized_keys, certificate, service settings)."]),"jwt-secret":H("Your app's JWT secret","",["Set a new long random secret in the app's configuration.","Every signed-in user will be signed out \u2014 plan the moment."]),"password-in-code":H("A password in code","",["Change the password in the system it belongs to."]),"bearer-token":H("An access token","",["Revoke the token in the service that issued it and issue a new one."])},Nc=H("A credential","",["Find the service it belongs to and issue a new credential there."]);var Mc=768*1024*1024;var ro=8*1024*1024;var io=[{type:"id_number",patterns:[/\b\d{9}\b/g,/ת\.?ז\.?\s*:?\s*(\d{9})/g,/זהות\s*:?\s*(\d{9})/g],confidence:.9,replacement:()=>"[\u05EA.\u05D6. \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"phone",patterns:[/\b0[2-9]\d[\s\-]?\d{7}\b/g,/\b05[0-9][\s\-]?\d{7}\b/g,/\+972[\s\-]?[2-9]\d[\s\-]?\d{7}\b/g],confidence:.95,replacement:()=>"[\u05D8\u05DC\u05E4\u05D5\u05DF \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"email",patterns:[/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g],confidence:.99,replacement:e=>{let[,t]=e.split("@");return`[\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC: ***@${t}]`}},{type:"full_name",patterns:[/(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק)[:\s]+([א-ת][א-ת"'\-\s]{2,30}?)(?=[,\n\d]|ת\.ז)/g,/(?:עו"ד|ד"ר|פרופ'|מר|גברת)\s+([א-ת][א-ת"'\-\s]{2,25}?)(?=[,\n])/g],confidence:.75,replacement:()=>"[\u05E9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"bank_account",patterns:[/\b\d{2}[\-]\d{5,9}[\-]\d{2,3}\b/g,/(?:חשבון|ח-ן)\s*:?\s*(\d[\d\-]{8,15})/g],confidence:.88,replacement:()=>"[\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"medical",patterns:[/(?<![א-ת])[בהוכלמש]{0,2}(?:סוכרת|יתר לחץ דם|אסתמה|דיכאון|חרדה|סרטן|אי ספיקת לב|אפילפסיה)(?![א-ת])/g,/\b(?:Metformin|Lisinopril|Atorvastatin|Amlodipine|Sertraline|Fluoxetine|Omeprazole|Warfarin|Aspirin|Insulin)\b/gi,/\bHbA1c\s*:?\s*[\d.]+%?/g,/\bBMI\s*:?\s*[\d.]+/g,/(?<![א-ת])[בהוכלמש]{0,2}אבחנ[הות]\s*:?\s*[^,\n.]{2,40}/g],confidence:.85,replacement:()=>"[\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"financial_amount",patterns:[/[\d,]+(?:\.\d{2})?\s*(?:₪|ש"ח|NIS|שקל(?:ים)?)/g,/(?:₪|NIS)\s*[\d,]+(?:\.\d{2})?/g],confidence:.92,replacement:()=>"[\u05E1\u05DB\u05D5\u05DD \u05DB\u05E1\u05E4\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"birth_date",patterns:[/(?:תאריך לידה|נולד|נולדה|ד\.ל\.)\s*:?\s*\d{1,2}[\/\.\-]\d{1,2}[\/\.\-]\d{2,4}/g,/(?<![א-ת])[בהוכלמש]{0,2}גיל\s*:?\s*\d{1,3}\b/g],confidence:.88,replacement:()=>"[\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"address",patterns:[/רחוב\s+[א-ת][א-ת\s"'\-]{2,30}\s+\d{1,5}/g,/(?:רח'|רח\.)\s+[א-ת][א-ת\s"'\-]{2,30}\d{1,5}/g],confidence:.72,replacement:()=>"[\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"},{type:"license_plate",patterns:[/\b\d{2,3}[\-]\d{2,3}[\-]\d{2,3}\b/g],confidence:.8,replacement:()=>"[\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"}];function so(e){if(e.length!==9)return!1;let t=e.split("").map(Number),n=0;for(let r=0;r<9;r++){let i=t[r]*(r%2===0?1:2);i>9&&(i-=9),n+=i}return n%10===0}var $e=class{constructor(t){this.enabledTypes=new Set(t)}detect(t){let n=[],r=new Set;for(let s of io)if(this.enabledTypes.has(s.type))for(let o of s.patterns){let a=new RegExp(o.source,o.flags),l;for(;(l=a.exec(t))!==null;){let c=l[0],h=`${s.type}:${l.index}`;if(!r.has(h)){if(r.add(h),s.type==="id_number"){let u=c.replace(/\D/g,"");if(/^\d{9}$/.test(c)&&u.length===9&&!so(u))continue}n.push({type:s.type,value:c,startIndex:l.index,endIndex:l.index+c.length,confidence:s.confidence,replacement:s.replacement(c,s.type)})}}}n.sort((s,o)=>s.startIndex-o.startIndex||o.confidence-s.confidence);let i=[];for(let s of n)i.some(a=>s.startIndex<a.endIndex&&s.endIndex>a.startIndex)||i.push(s);return i}};var W=["GDPR","CPRA","PPL"],oo=["GDPR-9","CPRA","PPL"],ao=[{id:"person_name",type:"name",sensitivity:"high",regulations:[...W],en:["firstname","lastname","fname","lname","middle name","maiden name","birth name","preferred name","display name","nickname","surname","given name","full name"],he:["\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0","\u05DB\u05D9\u05E0\u05D5\u05D9","\u05E9\u05DD \u05E0\u05E2\u05D5\u05E8\u05D9\u05DD"],ar:["\u0627\u0644\u0627\u0633\u0645","\u0627\u0633\u0645 \u0627\u0644\u0639\u0627\u0626\u0644\u0629","\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0643\u0627\u0645\u0644"],ru:["\u0438\u043C\u044F","\u0444\u0430\u043C\u0438\u043B\u0438\u044F","\u043E\u0442\u0447\u0435\u0441\u0442\u0432\u043E","\u0444\u0438\u043E"]},{id:"birth_place",type:"location",sensitivity:"medium",regulations:[...W],en:["birth place","birthplace","place of birth"],he:["\u05DE\u05E7\u05D5\u05DD \u05DC\u05D9\u05D3\u05D4","\u05D0\u05E8\u05E5 \u05DC\u05D9\u05D3\u05D4"],ar:["\u0645\u0643\u0627\u0646 \u0627\u0644\u0645\u064A\u0644\u0627\u062F"],ru:["\u043C\u0435\u0441\u0442\u043E \u0440\u043E\u0436\u0434\u0435\u043D\u0438\u044F"]},{id:"citizenship",type:"sensitive_personal",sensitivity:"high",regulations:[...W],en:["citizenship","nationality"],he:["\u05D0\u05D6\u05E8\u05D7\u05D5\u05EA","\u05DC\u05D0\u05D5\u05DD"],ar:["\u0627\u0644\u062C\u0646\u0633\u064A\u0629"],ru:["\u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u0442\u0432\u043E"]},{id:"marital_status",type:"sensitive_personal",sensitivity:"high",regulations:[...W],en:["marital status"],he:["\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9"],ar:["\u0627\u0644\u062D\u0627\u0644\u0629 \u0627\u0644\u0627\u062C\u062A\u0645\u0627\u0639\u064A\u0629"],ru:["\u0441\u0435\u043C\u0435\u0439\u043D\u043E\u0435 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435"]},{id:"government_id",type:"id",sensitivity:"critical",regulations:[...W],en:["ssn","national id","passport","driver license","drivers license","tax id","social security","national insurance","military id","voter id","resident id","residence permit","visa number"],he:["\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7 \u05DC\u05D0\u05D5\u05DE\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D0\u05D9\u05E9\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D5\u05D9\u05D6\u05D4","\u05EA\u05E2\u05D5\u05D3\u05EA \u05EA\u05D5\u05E9\u05D1","\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05E1\u05E7"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0647\u0648\u064A\u0629","\u062C\u0648\u0627\u0632 \u0627\u0644\u0633\u0641\u0631","\u0631\u062E\u0635\u0629 \u0627\u0644\u0642\u064A\u0627\u062F\u0629"],ru:["\u043F\u0430\u0441\u043F\u043E\u0440\u0442","\u0441\u043D\u0438\u043B\u0441","\u0438\u043D\u043D","\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0443\u0434\u043E\u0441\u0442\u043E\u0432\u0435\u0440\u0435\u043D\u0438\u0435"]},{id:"institution_person_id",type:"tracking",sensitivity:"medium",regulations:[...W],en:["employee id","employee number","employee no","student id","student number","user id","userid","customer id","customer number","customer no","client id","member id","subscriber id","participant id","profile id","person id","person uuid","lead id","crm contact","account id"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05D1\u05D3","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D8\u05D5\u05D3\u05E0\u05D8","\u05DE\u05E1\u05E4\u05E8 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05D6\u05D4\u05D4 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E0\u05D5\u05D9","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05E9\u05EA\u05DE\u05E9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0648\u0638\u0641","\u0631\u0642\u0645 \u0627\u0644\u0639\u0645\u064A\u0644"],ru:["\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440","\u043D\u043E\u043C\u0435\u0440 \u043A\u043B\u0438\u0435\u043D\u0442\u0430"]},{id:"patient_id",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["patient id","patient number","mrn","medical record number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D8\u05D5\u05E4\u05DC","\u05DE\u05E1\u05E4\u05E8 \u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0631\u064A\u0636"],ru:["\u043D\u043E\u043C\u0435\u0440 \u043F\u0430\u0446\u0438\u0435\u043D\u0442\u0430"]},{id:"email",type:"email",sensitivity:"high",regulations:[...W],en:["emailaddress","e mail","recovery email","contact email"],he:["\u05D3\u05D5\u05D0\u05DC","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"],ar:["\u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0644\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A"],ru:["\u043F\u043E\u0447\u0442\u0430","\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430\u044F \u043F\u043E\u0447\u0442\u0430","email"]},{id:"phone",type:"phone",sensitivity:"high",regulations:[...W],en:["cellphone","contact number","work phone","home phone","whatsapp","recovery phone","telephone"],he:["\u05D8\u05DC\u05E4\u05D5\u05DF \u05D1\u05D9\u05EA","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D5\u05D5\u05D8\u05E1\u05D0\u05E4","\u05DE\u05E1\u05E4\u05E8 \u05E0\u05D9\u05D9\u05D3"],ar:["\u0647\u0627\u062A\u0641","\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062A\u0641","\u062C\u0648\u0627\u0644"],ru:["\u0442\u0435\u043B\u0435\u0444\u043E\u043D","\u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0439"]},{id:"social_handle",type:"tracking",sensitivity:"medium",regulations:[...W],en:["telegram","linkedin","facebook","twitter","instagram","tiktok","social profile"],he:["\u05D8\u05DC\u05D2\u05E8\u05DD","\u05DC\u05D9\u05E0\u05E7\u05D3\u05D0\u05D9\u05DF","\u05E4\u05D9\u05D9\u05E1\u05D1\u05D5\u05E7","\u05D0\u05D9\u05E0\u05E1\u05D8\u05D2\u05E8\u05DD"]},{id:"address",type:"address",sensitivity:"high",regulations:[...W],en:["house number","apartment","apt","billing address","shipping address","postal code","zip code","postcode","street"],he:["\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05EA","\u05D3\u05D9\u05E8\u05D4","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05DE\u05E9\u05DC\u05D5\u05D7","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05D7\u05D9\u05D5\u05D1","\u05EA.\u05D3","\u05EA\u05D0 \u05D3\u05D5\u05D0\u05E8"],ar:["\u0627\u0644\u0639\u0646\u0648\u0627\u0646","\u0627\u0644\u0634\u0627\u0631\u0639","\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A"],ru:["\u0430\u0434\u0440\u0435\u0441","\u0443\u043B\u0438\u0446\u0430","\u0438\u043D\u0434\u0435\u043A\u0441","\u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430"]},{id:"geo",type:"location",sensitivity:"high",regulations:[...W],en:["geo location","geolocation","latitude","longitude","coordinates","home location","current location"],he:["\u05DE\u05D9\u05E7\u05D5\u05DD","\u05E7\u05D5\u05D0\u05D5\u05E8\u05D3\u05D9\u05E0\u05D8\u05D5\u05EA"],ar:["\u0627\u0644\u0645\u0648\u0642\u0639"],ru:["\u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442\u044B"]},{id:"bank_card",type:"financial",sensitivity:"critical",regulations:[...W],en:["bank account","iban","swift","bic","routing number","credit card","creditcard","card number","cvv","card expiry","cc exp","paypal","wallet address","crypto wallet","bitcoin address"],he:["\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05D0\u05E8\u05E0\u05E7 \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5","\u05D0\u05E8\u05E0\u05E7 \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9"],ar:["\u062D\u0633\u0627\u0628 \u0628\u0646\u0643\u064A","\u0631\u0642\u0645 \u0627\u0644\u062D\u0633\u0627\u0628","\u0628\u0637\u0627\u0642\u0629 \u0627\u0626\u062A\u0645\u0627\u0646"],ru:["\u0440\u0430\u0441\u0447\u0435\u0442\u043D\u044B\u0439 \u0441\u0447\u0435\u0442","\u043D\u043E\u043C\u0435\u0440 \u0441\u0447\u0435\u0442\u0430","\u043D\u043E\u043C\u0435\u0440 \u043A\u0430\u0440\u0442\u044B","\u043A\u0440\u0435\u0434\u0438\u0442\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430"]},{id:"income_tax",type:"financial",sensitivity:"high",regulations:[...W],en:["salary","income","wage","tax record","tax return","payment history","credit score","net worth","salary grade"],he:["\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4","\u05EA\u05DC\u05D5\u05E9 \u05E9\u05DB\u05E8","\u05D3\u05D5\u05D7 \u05DE\u05E1","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD","\u05D3\u05D9\u05E8\u05D5\u05D2 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05D5\u05D5\u05D9 \u05E0\u05E7\u05D9","\u05D3\u05E8\u05D2\u05EA \u05E9\u05DB\u05E8"],ar:["\u0627\u0644\u0631\u0627\u062A\u0628","\u0627\u0644\u062F\u062E\u0644"],ru:["\u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430","\u0434\u043E\u0445\u043E\u0434"]},{id:"assets",type:"financial",sensitivity:"high",regulations:[...W],en:["property id","land record","ownership record","title deed","holdings"],he:["\u05D2\u05D5\u05E9 \u05D7\u05DC\u05E7\u05D4","\u05E0\u05E1\u05D7 \u05D8\u05D0\u05D1\u05D5","\u05E8\u05D9\u05E9\u05D5\u05DD \u05DE\u05E7\u05E8\u05E7\u05E2\u05D9\u05DF","\u05D1\u05E2\u05DC\u05D5\u05EA","\u05D0\u05D7\u05D6\u05E7\u05D5\u05EA"],ru:["\u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0441\u0442\u044C","\u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u044C"]},{id:"vehicle",type:"tracking",sensitivity:"medium",regulations:[...W],en:["vin","vehicle id","license plate","registration number","plate number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E9\u05DC\u05D3\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1","\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9"],ru:["\u043D\u043E\u043C\u0435\u0440 \u0430\u0432\u0442\u043E\u043C\u043E\u0431\u0438\u043B\u044F","vin"]},{id:"health",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["medical record","health condition","health data","lab result","lab results","vaccination","mental health","hospitalization","hospitalisation","disability","insurance number","diagnosis","allergy","prescription","medication","blood type"],he:["\u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05DE\u05E2\u05D1\u05D3\u05D4","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4","\u05D7\u05D9\u05E1\u05D5\u05E0\u05D9\u05DD","\u05D1\u05E8\u05D9\u05D0\u05D5\u05EA \u05E0\u05E4\u05E9","\u05D0\u05E9\u05E4\u05D5\u05D6","\u05E0\u05DB\u05D5\u05EA","\u05DE\u05E6\u05D1 \u05D1\u05E8\u05D9\u05D0\u05D5\u05EA\u05D9"],ar:["\u0627\u0644\u062A\u0634\u062E\u064A\u0635","\u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u0637\u0628\u064A","\u0627\u0644\u0623\u062F\u0648\u064A\u0629"],ru:["\u0434\u0438\u0430\u0433\u043D\u043E\u0437","\u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0430\u044F \u043A\u0430\u0440\u0442\u0430","\u0430\u043D\u0430\u043B\u0438\u0437\u044B"]},{id:"biometric",type:"biometric",sensitivity:"critical",regulations:["GDPR-9","CPRA","PPL"],en:["face embedding","face scan","iris scan","retina scan","voice print","voiceprint","voice signature","hand geometry","biometric template","biometric data","dna","genetic data","genome"],he:["\u05D8\u05D1\u05D9\u05E2\u05EA \u05E7\u05D5\u05DC","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E4\u05E0\u05D9\u05DD","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E7\u05E9\u05EA\u05D9\u05EA","\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D2\u05E0\u05D8\u05D9\u05D9\u05DD",'\u05D3\u05E0"\u05D0'],ar:["\u0628\u0635\u0645\u0629"],ru:["\u0431\u0438\u043E\u043C\u0435\u0442\u0440\u0438\u044F","\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A"]},{id:"employment",type:"employment",sensitivity:"medium",regulations:[...W],en:["employer","job title","employment status","hire date","start date of employment","termination date","performance review","disciplinary"],he:["\u05DE\u05E2\u05E1\u05D9\u05E7","\u05DE\u05E7\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05E4\u05E7\u05D9\u05D3 \u05D4\u05E2\u05D5\u05D1\u05D3","\u05EA\u05D0\u05E8\u05D9\u05DA \u05EA\u05D7\u05D9\u05DC\u05EA \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05D0\u05E8\u05D9\u05DA \u05E1\u05D9\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D4\u05E2\u05E8\u05DB\u05EA \u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD","\u05E9\u05D9\u05DE\u05D5\u05E2"],ar:["\u062C\u0647\u0629 \u0627\u0644\u0639\u0645\u0644","\u0627\u0644\u0645\u0633\u0645\u0649 \u0627\u0644\u0648\u0638\u064A\u0641\u064A"],ru:["\u0440\u0430\u0431\u043E\u0442\u043E\u0434\u0430\u0442\u0435\u043B\u044C","\u0434\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u044C"]},{id:"manager",type:"name",sensitivity:"medium",regulations:[...W],en:["manager","supervisor"],he:["\u05DE\u05E0\u05D4\u05DC \u05D9\u05E9\u05D9\u05E8"]},{id:"education",type:"education",sensitivity:"medium",regulations:[...W],en:["school","university","college","degree","transcript","education history","gpa"],he:["\u05D1\u05D9\u05EA \u05E1\u05E4\u05E8","\u05D0\u05D5\u05E0\u05D9\u05D1\u05E8\u05E1\u05D9\u05D8\u05D4","\u05DE\u05DB\u05DC\u05DC\u05D4","\u05D2\u05D9\u05DC\u05D9\u05D5\u05DF \u05E6\u05D9\u05D5\u05E0\u05D9\u05DD","\u05D4\u05E9\u05DB\u05DC\u05D4","\u05EA\u05D5\u05D0\u05E8 \u05D0\u05E7\u05D3\u05DE\u05D9"],ar:["\u0627\u0644\u062C\u0627\u0645\u0639\u0629","\u0627\u0644\u0645\u062F\u0631\u0633\u0629"],ru:["\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435","\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442"]},{id:"device_online",type:"tracking",sensitivity:"medium",regulations:[...W],en:["ip","ipaddress","ip address","mac address","device id","deviceid","advertising id","idfa","gaid","android id","apple id","cookie id","cookieid","browser fingerprint","user agent","imei"],he:["\u05DB\u05EA\u05D5\u05D1\u05EA ip","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"],ru:["ip \u0430\u0434\u0440\u0435\u0441"]},{id:"account",type:"tracking",sensitivity:"medium",regulations:[...W],en:["username","user name","login","screen name"],he:["\u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9"],ru:["\u043B\u043E\u0433\u0438\u043D"]},{id:"credential",type:"auth",sensitivity:"critical",regulations:[...W],en:["password","password hash","mfa secret","otp secret","security question","security answer","session id","session token","api key"],he:["\u05E1\u05D9\u05E1\u05DE\u05D4","\u05E1\u05D9\u05E1\u05DE\u05D0","\u05E9\u05D0\u05DC\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4"],ar:["\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631"],ru:["\u043F\u0430\u0440\u043E\u043B\u044C"]},{id:"behavior",type:"behavior",sensitivity:"high",regulations:[...W],en:["purchase history","search history","browsing history","clickstream","usage pattern","behavior profile","behaviour profile"],he:["\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05E8\u05DB\u05D9\u05E9\u05D5\u05EA","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D2\u05DC\u05D9\u05E9\u05D4","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA"]},{id:"special_category",type:"sensitive_personal",sensitivity:"critical",regulations:[...oo],en:["race","ethnicity","religion","political opinion","political party","union membership","trade union","sexual orientation","gender identity","criminal record"],he:["\u05D2\u05D6\u05E2","\u05D3\u05EA","\u05D4\u05E9\u05E7\u05E4\u05D4 \u05E4\u05D5\u05DC\u05D9\u05D8\u05D9\u05EA","\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05D9\u05D2\u05D5\u05D3","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA","\u05D6\u05D4\u05D5\u05EA \u05DE\u05D2\u05D3\u05E8\u05D9\u05EA","\u05E8\u05D9\u05E9\u05D5\u05DD \u05E4\u05DC\u05D9\u05DC\u05D9"],ar:["\u0627\u0644\u062F\u064A\u0627\u0646\u0629","\u0627\u0644\u0639\u0631\u0642"],ru:["\u0440\u0435\u043B\u0438\u0433\u0438\u044F","\u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C"]},{id:"family_names",type:"name",sensitivity:"high",regulations:[...W],en:["mother name","father name","spouse","partner name","emergency contact","next of kin","family member","guardian","beneficiary"],he:["\u05E9\u05DD \u05D4\u05D0\u05DD","\u05E9\u05DD \u05D4\u05D0\u05D1","\u05D1\u05DF \u05D6\u05D5\u05D2","\u05D1\u05EA \u05D6\u05D5\u05D2","\u05D0\u05D9\u05E9 \u05E7\u05E9\u05E8 \u05DC\u05D7\u05D9\u05E8\u05D5\u05DD","\u05E7\u05E8\u05D5\u05D1 \u05DE\u05E9\u05E4\u05D7\u05D4","\u05D0\u05E4\u05D5\u05D8\u05E8\u05D5\u05E4\u05D5\u05E1","\u05DE\u05D5\u05D8\u05D1"],ar:["\u0627\u0633\u0645 \u0627\u0644\u0623\u0645","\u0627\u0633\u0645 \u0627\u0644\u0623\u0628","\u0627\u0644\u0632\u0648\u062C"],ru:["\u0441\u0443\u043F\u0440\u0443\u0433","\u043E\u043F\u0435\u043A\u0443\u043D"]},{id:"children",type:"minor_data",sensitivity:"critical",regulations:[...W],en:["children","child name","dependents","dependants"],he:["\u05D9\u05DC\u05D3\u05D9\u05DD","\u05E9\u05DE\u05D5\u05EA \u05D4\u05D9\u05DC\u05D3\u05D9\u05DD"],ar:["\u0627\u0644\u0623\u0637\u0641\u0627\u0644"],ru:["\u0434\u0435\u0442\u0438"]}];function co(e){return e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim()}function kr(){return ao.map(e=>{let t=[...e.en,...e.he??[],...e.ar??[],...e.ru??[]].map(co).filter(Boolean);return{type:e.type,tokens:t.filter(n=>!n.includes(" ")),phrases:t.filter(n=>n.includes(" "))}})}var lo=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם_אדם|שם הלקוח|שם_הלקוח|שם בן זוג|שם בן_זוג|שם המבוטח|שם_המבוטח|שם המוטב|שם_המוטב|שם מבוטח|שם_מבוטח|שם מוטב|שם_מוטב|שם הילד|שם_הילד|שם הקטין|שם_הקטין|firstname_he|lastname_he|shem|shem_mishpacha|shem_prati)$/i,type:"name",label:"Person name (Hebrew)",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מספר_זהות|מס' זהות|מס_זהות|מס' ת"ז|teudat_zehut|tz|t_z|israeli_id|il_id)$/i,type:"id",label:"Israeli ID",labelHe:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|מס דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה|מס רישיון|דרכון_מספר)$/i,type:"id",label:"Passport / DL (Hebrew)",labelHe:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|דואר_אלקטרוני|אימייל|כתובת מייל|כתובת_מייל|כתובת דואר|כתובת_דואר)$/i,type:"email",label:"Email (Hebrew)",labelHe:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|מספר_טלפון|טלפון נייד|טלפון_נייד|מס נייד|מס_נייד|מס' טל)$/i,type:"phone",label:"Phone (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|כתובת_מגורים|רחוב|מס בית|מספר בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|כתובת_מלאה|מען)$/i,type:"address",label:"Address (Hebrew)",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|תאריך_לידה|ת לידה|תאריך הולדת|תאריך_הולדת|יום הולדת|יום_הולדת|גיל)$/i,type:"dob",label:"Date of birth (Hebrew)",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|חשבון_בנק|מספר חשבון|מספר_חשבון|מס חשבון|מס' חשבון|בנק|סניף|מס סניף|iban|iban_il)$/i,type:"financial",label:"Bank account (Hebrew)",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|כרטיס_אשראי|מספר אשראי|מס אשראי|מס' אשראי|cvv|אשראי|מס כרטיס|מס_כרטיס)$/i,type:"financial",label:"Credit card (Hebrew)",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר_ברוטו|שכר נטו|שכר_נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"Salary / income (Hebrew)",labelHe:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|בדיקה_רפואית|מצב רפואי|מצב_רפואי|חיסון|תוצאת בדיקה|תוצאת_בדיקה|רופא|רגישות|אלרגיה|סוג דם|סוג_דם)$/i,type:"medical",label:"Medical (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מספר_פוליסה|מס פוליסה|מס' פוליסה|פוליסה|מספר חבר|מספר_חבר|מס חבר|מספר ביטוח|מספר_ביטוח|policy_?number|policy_?no|policy_?id)$/i,type:"policy",label:"Insurance policy number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"},{pattern:/^(?:מספר סוכן|מספר_סוכן|מס סוכן|מס' סוכן|מס_סוכן|קוד סוכן|קוד_סוכן|מספר משווק|מספר_משווק|מספר יצרן|סוכן ביטוח|agent_?number|agent_?no|agent_?id|agent_?code|broker_?id|broker_?number)$/i,type:"agent_id",label:"Insurance agent / broker number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"},{pattern:/^(?:שם הילד|שם_הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|מספר_ילדים|תעודת לידה|ת לידה ילד)$/i,type:"minor_data",label:"Minor data (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|נטייה_מינית|השקפה פוליטית|השקפה_פוליטית|מצב משפחתי|מצב_משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"Sensitive personal (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מספר_רכב|מס רכב|מס' רכב|לוחית רישוי|לוחית_רישוי|מספר רישוי|מספר_רישוי)$/i,type:"tracking",label:"Vehicle ID (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}];function on(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let i=0;i<9;i++){let s=parseInt(n[i]??"0",10)*(i%2+1);s>9&&(s-=9),r+=s}return r%10===0&&parseInt(n,10)>0}var gt=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g,yt=/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi,bt=/\bIL\d{2}\s?(?:\d{4}\s?){4}\d{3}\b/g;function Sr(e){let t=String(e??"").replace(/\D/g,"");if(t.length<13||t.length>19||!/^[2-6]/.test(t))return!1;let n=0,r=!1;for(let i=t.length-1;i>=0;i--){let s=t.charCodeAt(i)-48;if(s<0||s>9)return!1;r&&(s*=2,s>9&&(s-=9)),n+=s,r=!r}return n%10===0}function Er(e){if(!e)return null;let t=e.trim();for(let n of lo)if(n.pattern.test(t))return{type:n.type,label:n.label,labelHe:n.labelHe};return null}var uo=[{type:"biometric",tokens:["biometric","fingerprint","\u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"],phrases:["face id","\u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2"]},{type:"medical",tokens:["diagnosis","medical","disease","medication","prescription","allergy","vaccine","\u05D0\u05D1\u05D7\u05D5\u05DF","\u05D0\u05D1\u05D7\u05E0\u05D4","\u05DE\u05D7\u05DC\u05D4","\u05EA\u05E8\u05D5\u05E4\u05D4","\u05DE\u05E8\u05E9\u05DD","\u05D7\u05D9\u05E1\u05D5\u05DF","\u05D0\u05DC\u05E8\u05D2\u05D9\u05D4"],phrases:["medical record","blood type","\u05DE\u05E6\u05D1 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05E1\u05D5\u05D2 \u05D3\u05DD"]},{type:"sensitive_personal",tokens:["religion","ethnicity","nationality","\u05D3\u05EA","\u05DC\u05D0\u05D5\u05DD","\u05E2\u05D3\u05D4","\u05DE\u05D5\u05E6\u05D0"],phrases:["sexual orientation","marital status","\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA"]},{type:"minor_data",tokens:["minor","\u05E7\u05D8\u05D9\u05DF"],phrases:["child name","\u05E9\u05DD \u05D4\u05D9\u05DC\u05D3","\u05E9\u05DD \u05D4\u05E7\u05D8\u05D9\u05DF"]},{type:"id",tokens:["ssn","passport","\u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF"],phrases:["national id","id number","identity number","social security","driver license","driving license","drivers license","passport number","tax id","\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05DE\u05E1\u05E4\u05E8 \u05D6\u05D4\u05D5\u05EA","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"]},{type:"financial",tokens:["iban","swift","bic","salary","income","wage","\u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4"],phrases:["bank account","account number","credit card","card number","routing number","sort code","\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"]},{type:"policy",tokens:["policy","\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"],phrases:["policy number","member number","\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"]},{type:"agent_id",tokens:["\u05DE\u05E9\u05D5\u05D5\u05E7"],phrases:["agent number","agent code","broker id","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"]},{type:"dob",tokens:["dob","birthdate","birthday","\u05DC\u05D9\u05D3\u05D4","\u05D4\u05D5\u05DC\u05D3\u05EA","\u05D2\u05D9\u05DC"],phrases:["date of birth","birth date","\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"]},{type:"phone",tokens:["phone","tel","mobile","cell","fax","\u05D8\u05DC\u05E4\u05D5\u05DF","\u05E0\u05D9\u05D9\u05D3","\u05E4\u05DC\u05D0\u05E4\u05D5\u05DF","\u05E1\u05DC\u05D5\u05DC\u05E8\u05D9"],phrases:["phone number","mobile number","cell phone","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E0\u05D9\u05D9\u05D3"]},{type:"email",tokens:["email","mail","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC","\u05DE\u05D9\u05D9\u05DC","\u05D3\u05D5\u05D0\u05DC"],phrases:["email address","e mail","\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D9\u05D9\u05DC"]},{type:"address",tokens:["address","street","city","zipcode","zip","postcode","\u05DB\u05EA\u05D5\u05D1\u05EA","\u05E8\u05D7\u05D5\u05D1","\u05E2\u05D9\u05E8","\u05D9\u05E9\u05D5\u05D1","\u05D9\u05D9\u05E9\u05D5\u05D1","\u05DE\u05D9\u05E7\u05D5\u05D3","\u05DE\u05E2\u05DF"],phrases:["home address","postal code","street address","zip code","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D2\u05D5\u05E8\u05D9\u05DD"]},{type:"location",tokens:["gps","latitude","longitude","geolocation","\u05DE\u05D9\u05E7\u05D5\u05DD"],phrases:["gps coordinates"]},{type:"tracking",tokens:["plate","vehicle","\u05E8\u05DB\u05D1","\u05E8\u05D9\u05E9\u05D5\u05D9"],phrases:["license plate","vehicle number","plate number","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"]},...kr(),{type:"name",tokens:["name","\u05E9\u05DD"],phrases:["first name","last name","full name","family name","given name","surname","\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0"]}];function _t(e){if(!e||/^\[[A-Z_]+(?:-\d+)?\]$/.test(e.trim()))return null;let t=e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim();if(!t)return null;let n=new Set(t.match(/[\p{L}\p{N}]+/gu)??[]);for(let r of uo)if(r.phrases?.some(s=>t.includes(s))||r.tokens?.some(s=>n.has(s)))return{type:r.type,label:r.type,labelHe:xt(r.type)};return null}function xt(e){return{id:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA",agent_id:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF",employment:"\u05E4\u05E8\u05D8\u05D9 \u05EA\u05E2\u05E1\u05D5\u05E7\u05D4",education:"\u05D4\u05E9\u05DB\u05DC\u05D4",behavior:"\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA",policy:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4",name:"\u05E9\u05DD \u05D0\u05D3\u05DD",email:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9",phone:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF",address:"\u05DB\u05EA\u05D5\u05D1\u05EA",dob:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4",financial:"\u05E4\u05E8\u05D8\u05D9\u05DD \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9\u05D9\u05DD",medical:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9",minor_data:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF",sensitive_personal:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9",biometric:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9",auth:"\u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA/\u05E1\u05D5\u05D3\u05D5\u05EA",tracking:"\u05DE\u05D6\u05D4\u05D9 \u05DE\u05E2\u05E7\u05D1",location:"\u05DE\u05D9\u05E7\u05D5\u05DD"}[e]??"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9"}function Ar(e){let t=0,n=0,r=0,i=0,s=0;for(let a of e)typeof a=="string"&&(on(a)&&t++,gt.lastIndex=0,gt.test(a)&&n++,yt.lastIndex=0,yt.test(a)&&r++,bt.lastIndex=0,bt.test(a)&&i++,Sr(a)&&s++);let o=e.length||1;return t/o>=.3?{type:"id",label:"Israeli ID (sniffed)",matchedSample:t}:i/o>=.3?{type:"financial",label:"IBAN-IL (sniffed)",matchedSample:i}:n/o>=.3?{type:"phone",label:"IL phone (sniffed)",matchedSample:n}:r/o>=.3?{type:"email",label:"Email (sniffed)",matchedSample:r}:s/o>=.3?{type:"financial",label:"Credit card (sniffed)",matchedSample:s}:null}var fo=[{type:"full_name",kind:"name",severity:"medium",hint:`A person's name in free text (after a role word such as \u05DC\u05E7\u05D5\u05D7 / \u05DE\u05E8 / \u05E2\u05D5"\u05D3, or Client: / Mr.).`},{type:"bank_account",kind:"bank_account",severity:"high",hint:"An Israeli bank account number (branch-account-check form) in plaintext."},{type:"medical",kind:"medical",severity:"high",hint:"Medical information (diagnosis, medication, lab value) in plaintext."},{type:"birth_date",kind:"dob",severity:"medium",hint:"A date of birth in plaintext."},{type:"address",kind:"address",severity:"medium",hint:"A street address in plaintext."},{type:"license_plate",kind:"plate",severity:"low",hint:"A vehicle licence plate in plaintext."}],po=/^(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק|עו"ד|ד"ר|פרופ'|מר|גברת|חשבון|ח-ן|[בהוכלמש]{0,2}אבחנ[הות]|תאריך לידה|נולד|נולדה|ד\.ל\.|[בהוכלמש]{0,2}גיל)\s*:?\s*/;function ho(e,t,n,r){if(r==="address")return{start:t,end:n};let i=po.exec(e.slice(t,n));return i&&t+i[0].length<n?{start:t+i[0].length,end:n}:{start:t,end:n}}function ie(e,t,n=()=>!0){let r=[],i=new RegExp(e.source,e.flags.includes("g")?e.flags:e.flags+"g");for(let s of t.matchAll(i)){let o=s[1];if(!o||!n(o))continue;let a=(s.index??0)+s[0].indexOf(o);r.push({start:a,end:a+o.length})}return r}var Ir=String.raw`[A-Z][a-z']+(?:-[A-Z]?[a-z']+)*`,an=String.raw`${Ir}(?:[ \t]+${Ir}){0,2}`,mo=new RegExp(String.raw`\b(?:Mr|Mrs|Ms|Miss|Dr|Prof)\.?[ \t]+(${an})`),go=new RegExp(String.raw`\b(?:Client|Customer|Patient|Name|Full name|Beneficiary|Insured|Applicant|Tenant|Employee|Holder|Investor)[ \t]*:[ \t]*(${an})`),yo=new RegExp(String.raw`\b(${an})(?=,[ \t]*\d{1,3}[ \t]*,|[ \t]*\(\d{1,3}\))`,"g"),bo=/^(?:Figure|Fig|Table|Step|Section|Chapter|Page|Shot|Scene|Part|Item|Note|Appendix|Version|Level|Phase|Round|Room|Floor|Line|Act|Episode|Season|Slide|Clip|Take)$/,_o=/\b(\d{1,5}[ \t]+(?:[A-Z][A-Za-z'-]*[ \t]+){1,3}(?:Street|St|Road|Rd|Avenue|Ave|Boulevard|Blvd|Lane|Ln|Drive|Way|Court|Ct|Place|Pl)\b\.?)/,xo=/\b(?:policy|claim|account|member|customer|client|contract|case|reference|ref|company|registration)[ \t]+(?:number|no\.?|num\.?|#)[ \t]*:?[ \t]*([A-Z]{0,4}-?\d[\d-]{3,}\d[A-Z]?)\b/i,wo=String.raw`\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{2,4}|\d{4}[\/\-.]\d{1,2}[\/\-.]\d{1,2}|\d{1,2}\s+[A-Z][a-z]{2,8}\s+\d{4}|[A-Z][a-z]{2,8}\s+\d{1,2},?\s+\d{4}`,vo=new RegExp(String.raw`\b(?:date\s+of\s+birth|birth\s*date|d\.?o\.?b\.?|born(?:\s+on)?)\s*[:\-]?\s*(${wo})`,"i"),ko=/\b((?!000|666|9\d\d)\d{3}-(?!00)\d{2}-(?!0000)\d{4})\b/,So=/\b((?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\s?\d{2}\s?\d{2}\s?\d{2}\s?[A-D])\b/,Eo=/(?<![\w+])(\+(?!972)[1-9][\d\s().-]{7,20}\d)/,$r=e=>e.replace(/\D/g,"").length,Ao=[{kind:"name",severity:"medium",hint:"A person's name in free text (after Mr. / Dr. / Client: \u2026, or with an age beside it).",find:e=>[...ie(mo,e),...ie(go,e),...ie(yo,e,t=>!bo.test(t.split(/[ \t]/).pop()??""))]},{kind:"address",severity:"medium",hint:"A street address in plaintext.",find:e=>ie(_o,e)},{kind:"reference",severity:"medium",hint:"A policy, claim, account or company number in plaintext.",find:e=>ie(xo,e)},{kind:"dob",severity:"medium",hint:"A date of birth in plaintext.",find:e=>ie(vo,e)},{kind:"national_id",severity:"high",hint:"A national ID number (US SSN, UK NINO) in plaintext.",find:e=>[...ie(ko,e),...ie(So,e)]},{kind:"phone",severity:"high",hint:"A phone number in international form in plaintext.",find:e=>ie(Eo,e,t=>$r(t)>=8&&$r(t)<=15)}];function Io(e){let t=new Map;for(let n of e){let r=t.get(n.kind);t.set(n.kind,r?{...r,find:i=>[...r.find(i),...n.find(i)]}:n)}return[...t.values()]}function Tr(){let e=fo.map(({type:t,kind:n,severity:r,hint:i})=>{let s=new $e([t]);return{kind:n,severity:r,hint:i,find:o=>s.detect(o).map(a=>ho(o,a.startIndex,a.endIndex,n))}});return Io([...e,...Ao])}var Te={_comment:"CANONICAL secret ruleset \u2014 the SINGLE SOURCE OF TRUTH for hardcoded-secret detection, loaded by BOTH the web scanner (lib/soc/exposure-map.ts) and the installed Capsule agent (apps/desktop/src-tauri/src/scanner.rs, via include_str!). Patterns are written in the regex subset both JavaScript and the Rust `regex` crate accept (no lookaround, no backreferences). A connection string counts only WITH credentials (user:pass@). Edit here once and both engines stay aligned.",rules:[{id:"aws-access-key",subkind:"aws_access_key",name:"AWS Access Key",severity:"critical",pattern:"(?:^|[^A-Z0-9])AKIA[A-Z2-7]{16}(?:[^A-Z2-7]|$)",hint:"AWS access key id detected. Rotate via IAM and move to an environment variable."},{id:"aws-secret-key",subkind:"aws_secret_key",name:"AWS Secret Key",severity:"critical",pattern:`(?:aws_secret_access_key|aws_secret_key|secret_access_key)\\s*[=:]\\s*['"]?[A-Za-z0-9/+=]{40}['"]?`,hint:"AWS secret access key detected. Rotate immediately."},{id:"gcp-api-key",subkind:"gcp_api_key",name:"GCP API Key",severity:"critical",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Google API key detected. Restrict or rotate it in the Google Cloud console."},{id:"gcp-service-account",subkind:"gcp_service_account",name:"GCP Service Account",severity:"critical",pattern:'"type"\\s*:\\s*"service_account"',hint:"GCP service-account JSON detected. Move it out of the repo and rotate the key."},{id:"github-token",subkind:"github_token",name:"GitHub Token",severity:"critical",pattern:"gh[pousr]_[0-9a-zA-Z]{36,}",hint:"GitHub token detected. Revoke at https://github.com/settings/tokens."},{id:"github-fine-grained",subkind:"github_fine_grained_token",name:"GitHub Fine-Grained Token",severity:"critical",pattern:"github_pat_[0-9a-zA-Z_]{22,}",hint:"GitHub fine-grained token detected. Revoke it in GitHub settings."},{id:"gitlab-token",subkind:"gitlab_token",name:"GitLab Token",severity:"critical",pattern:"glpat-[0-9a-zA-Z_-]{20,}",hint:"GitLab token detected. Revoke it in GitLab access tokens."},{id:"stripe-secret",subkind:"stripe_key",name:"Stripe Secret Key",severity:"critical",pattern:"sk_live_[0-9a-zA-Z]{24,}",hint:"Stripe live secret key detected. Roll it in the Stripe dashboard."},{id:"stripe-restricted",subkind:"stripe_restricted_key",name:"Stripe Restricted Key",severity:"critical",pattern:"rk_live_[0-9a-zA-Z]{24,}",hint:"Stripe restricted key detected. Roll it in the Stripe dashboard."},{id:"slack-token",subkind:"slack_token",name:"Slack Token",severity:"high",pattern:"xox[baprs]-[0-9a-zA-Z-]{10,}",hint:"Slack token detected. Revoke it in the Slack app settings."},{id:"slack-webhook",subkind:"slack_webhook",name:"Slack Webhook",severity:"high",pattern:"hooks\\.slack\\.com/services/T[0-9A-Z]{8,}/B[0-9A-Z]{8,}/[0-9a-zA-Z]{24}",hint:"Slack incoming-webhook URL detected. Regenerate it."},{id:"twilio-api-key",subkind:"twilio_api_key",name:"Twilio API Key",severity:"high",pattern:"SK[0-9a-fA-F]{32}",hint:"Twilio API key detected. Rotate it in the Twilio console."},{id:"sendgrid-api-key",subkind:"sendgrid_api_key",name:"SendGrid API Key",severity:"critical",pattern:"SG\\.[0-9a-zA-Z_-]{22}\\.[0-9a-zA-Z_-]{43}",hint:"SendGrid API key detected. Rotate it in the SendGrid console."},{id:"postgres-uri",subkind:"postgres_uri",name:"PostgreSQL Connection String",severity:"critical",pattern:`postgres(?:ql)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"PostgreSQL connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"mongodb-uri",subkind:"mongodb_uri",name:"MongoDB Connection String",severity:"critical",pattern:`mongodb(?:\\+srv)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"MongoDB connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"redis-uri",subkind:"redis_uri",name:"Redis Connection String",severity:"high",pattern:`redis(?:s)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"Redis connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"openai-key",subkind:"openai_key",name:"OpenAI API Key",severity:"critical",pattern:"sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}",hint:"OpenAI API key detected. Rotate at https://platform.openai.com/api-keys."},{id:"anthropic-key",subkind:"anthropic_key",name:"Anthropic API Key",severity:"critical",pattern:"sk-ant-[0-9a-zA-Z_-]{40,}",hint:"Anthropic API key detected. Rotate at https://console.anthropic.com/."},{id:"firebase-key",subkind:"firebase_key",name:"Firebase API Key",severity:"high",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Firebase API key detected. Restrict it in the Firebase console."},{id:"supabase-key",subkind:"supabase_key",name:"Supabase Service Key",severity:"critical",pattern:"eyJ[0-9a-zA-Z_-]{100,}",hint:"Long JWT (possible Supabase service key) detected. Rotate it and keep it server-side only."},{id:"private-key",subkind:"private_key",name:"Private Key",severity:"critical",pattern:"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----",hint:"Private key material in plaintext. Rotate immediately and move to a key manager (KMS/Vault).",skipPlaceholder:!0},{id:"jwt-secret",subkind:"jwt_secret",name:"JWT/Generic Secret",severity:"high",pattern:`(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded signing/API secret detected. Move it to an environment variable and rotate it."},{id:"password-in-code",subkind:"password_in_code",name:"Password in Code",severity:"high",pattern:`(?:password|passwd|pwd)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded password detected. Move it to a secret manager and rotate it."},{id:"bearer-token",subkind:"bearer_token",name:"Bearer Token in Code",severity:"high",pattern:`['"]Bearer\\s+[0-9a-zA-Z._-]{20,}['"]`,hint:"Hardcoded bearer token detected. Move it to a secret manager and rotate it."},{id:"hex-secret-32",subkind:"hex_secret",name:"Hardcoded 32+ Hex Secret",severity:"medium",pattern:`['"][0-9a-f]{32,}['"]`,hint:"Long hex string that looks like a secret/hash. Confirm it is not a live credential."},{id:"base64-secret",subkind:"base64_secret",name:"Hardcoded Base64 Secret (long)",severity:"medium",pattern:`['"][A-Za-z0-9+/]{64,}={0,2}['"]`,hint:"Long base64 blob that looks like an embedded secret. Confirm it is not a live credential."}]};var Ro=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D6\u05D4\u05D4"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Financial data",labelHe:"\u05E0\u05EA\u05D5\u05DF \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(ip_?address)$/i,type:"tracking",label:"IP address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA IP"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D3\u05E8\u05DB\u05D5\u05DF"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license",labelHe:"\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"},{pattern:/^(iban|swift_?code|bic)$/i,type:"financial",label:"Banking code",labelHe:"\u05E7\u05D5\u05D3 \u05D1\u05E0\u05E7\u05D0\u05D9"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E1"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Member ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7/\u05D7\u05D1\u05E8"},{pattern:/^(blood_?type|allergy|allergies|prescription)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation",labelHe:"\u05DE\u05D9\u05E7\u05D5\u05DD \u05D2\u05D9\u05D0\u05D5\u05D2\u05E8\u05E4\u05D9"},{pattern:/^(mac_?address|device_?fingerprint|imei|serial_?number)$/i,type:"tracking",label:"Device identifier",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"},{pattern:/^(ethnicity|race|religion|political_?affiliation|sexual_?orientation)$/i,type:"sensitive_personal",label:"Sensitive personal",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(minor|child_?name|child_?age|dependent)$/i,type:"minor_data",label:"Minor data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05E0\u05D9\u05DD"},{pattern:/^(signature|digital_?signature)$/i,type:"id",label:"Signature",labelHe:"\u05D7\u05EA\u05D9\u05DE\u05D4"},{pattern:/^(vehicle_?number|license_?plate|plate_?number)$/i,type:"tracking",label:"Vehicle ID",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05E8\u05DB\u05D1"}],Co=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|sort_?order|position|enabled|active|public|version|metadata|config|settings|options|data|content|body|raw|json|text|note|comment|label|color|icon|image|avatar|logo|thumbnail|preview|template|schema|format|mode|level|priority|severity|source|target|parent|child|owner|creator|modifier|assignee|project|workspace|organization|team|group|channel|thread|room|session|device|platform|browser|locale|timezone|currency|country|region|city|zip|postal|state|province|name|display_?name|user_?agent|password_?hash|secret|token|private_?key|auth_?token|constraint|index|sequence|trigger|function|procedure|database|namespace|migration|revision)$/i,Lo=/^(beacon_?registr|device_?config|hardware|sensor|firmware|telemetry|metric|analytic|log_?event|audit_?log|system_?config|cache|queue|job|migration|schema_?version|spatial_?ref)/i,Po=/^(minor|major|uuid|rssi|tx_?power|beacon_?id|device_?type|firmware_?version|batch_?id|zone_?id)$/i;function Rr(e,t){if(Co.test(e)||/^name$/i.test(e)||t&&Lo.test(t)||Po.test(e))return null;for(let r of Ro)if(r.pattern.test(e))return r.type;let n=Er(e);return n?n.type:null}var ru=Te.rules.map(e=>({id:e.id,name:e.name,pattern:new RegExp(e.pattern),severity:e.severity}));var iu=512*1024,su=50*1024*1024;var Oo=new Set(["hex-secret-32","base64-secret"]),hu=Te.rules.filter(e=>!Oo.has(e.id)).map(e=>new RegExp(e.pattern,"g"));var Lr={id:"critical",agent_id:"high",policy:"high",financial:"critical",medical:"critical",sensitive_personal:"critical",minor_data:"critical",biometric:"critical",auth:"critical",name:"high",email:"high",phone:"high",address:"high",dob:"high",location:"high",tracking:"medium",employment:"high",education:"medium",behavior:"high"};function Pr(e){return Lr[e]}function Do(e){return Lr[e]??"low"}function Or(e,t){let n=[];for(let r of t){let i=r.rows.length;for(let s=0;s<r.headers.length;s++){let o=r.headers[s]??"",a=o?Rr(o.trim().replace(/["'`׳״:]/g,"").replace(/\s+/g,"_"),r.name)??_t(o)?.type??null:null,l=[];for(let h of r.rows){let u=h[s];typeof u=="string"&&u.length>0&&l.push(u)}let c=l.length>0?Ar(l):null;c?n.push(Cr(e,r.name,o,c.type,c.label,"value",c.matchedSample,i)):a&&n.push(Cr(e,r.name,o,a,xt(a),"header",0,i))}}return n}function Cr(e,t,n,r,i,s,o,a){return{file:e,location:t,column:n,type:r,label:i,category:xt(r),severity:Do(r),matchKind:s,hits:o,sampleSize:a}}var No=new Set(["hex-secret-32","base64-secret"]),Fo=[/(?:[$€£]|USD|EUR|GBP)\s?\d[\d,]*(?:\.\d+)?/g,/\d[\d,]*(?:\.\d+)?\s?(?:[$€£]|USD|EUR|GBP|דולר|יורו)/g,/\b\d{1,3}(?:,\d{3})+(?:\.\d+)?\b/g];function Mo(e){let t=new $e(["financial_amount"]);return{kind:"amount",severity:"medium",hint:"A money amount (the amounts dial is on: amounts are treated as sensitive here).",find:n=>{if(!e())return[];let r=t.detect(n).map(s=>({start:s.startIndex,end:s.endIndex}));for(let s of Fo){s.lastIndex=0;for(let o of n.matchAll(s))r.push({start:o.index,end:o.index+o[0].length})}r.sort((s,o)=>s.start-o.start||o.end-s.end);let i=[];for(let s of r){let o=i[i.length-1];o&&s.start<o.end?o.end=Math.max(o.end,s.end):i.push({...s})}return i}}}function Dr(e={}){let t=e.amounts??(()=>!1),n=[...Tr(),Mo(t)],r=Te.rules.filter(i=>!No.has(i.id)).map(i=>({id:i.id,name:i.name,severity:i.severity,pattern:new RegExp(i.pattern)}));return{text:n,amounts:t,header:i=>{let s=_t(i);return s?{type:s.type,label:s.labelHe||s.label}:null},secrets:r,table:i=>Or("",[i]).filter(s=>s.column).map(s=>({column:s.column,type:s.type,category:s.category,severity:s.severity,hits:s.hits,how:s.matchKind==="value"?"value":"header"})),severity:i=>Pr(i)}}import{existsSync as jo,mkdirSync as ku,readFileSync as Ho,writeFileSync as Su}from"node:fs";import{homedir as Bo}from"node:os";import{join as Uo}from"node:path";var Nr=()=>Uo(Bo(),".nodata","prefs.json");function cn(){try{return jo(Nr())&&JSON.parse(Ho(Nr(),"utf8")).amounts_sensitive===!0}catch{return!1}}var Fr=!1;function Mr(){Fr||(Fr=!0,kt(Dr({amounts:cn})))}var zo=/[֑-ׇ]/g;function Wo(e){return e.normalize("NFC").replace(zo,"").toLowerCase()}function Vo(e,t){if(!t)return 0;let n=0,r=e.indexOf(t);for(;r!==-1&&(n++,!(n>=1e5));)r=e.indexOf(t,r+t.length);return n}function jr(e,t){if(!e||e.terms.length===0||!t)return[];let n=Wo(t);if(!n)return[];let r=[];for(let i of e.terms){let s=Vo(n,i.needle);s>0&&r.push({term_id:i.id,label:i.label,tier:i.tier,access_class:i.access_class,...i.flag?{flag:i.flag}:{},hit_count:s})}return r}import{basename as Xo,extname as Go,isAbsolute as Bu,join as Uu,relative as zu,resolve as Wu}from"node:path";var Ko=["claude-code","cursor","windsurf","codex","gemini","vscode","claude-desktop"],ln=e=>typeof e=="string"&&e.trim()?e.trim().toLowerCase():void 0,Gu={action:{cardinality:"scalar",ops:["eq","ne","in","not_in"],enumValues:["read","search","run","write","browse","interact"],label:"what the agent does (read, search, run, write; on a site: browse, interact)",extract:e=>e.action},"time.hour":{cardinality:"scalar",ops:["between","gte","lte","eq"],label:"hour on this computer (0-23; 18..6 wraps overnight)",extract:e=>e.now.getHours()},"time.weekday":{cardinality:"scalar",ops:["in","not_in","between","eq"],label:"weekday on this computer (0 Sunday \u2026 6 Saturday)",extract:e=>e.now.getDay()},"file.ext":{cardinality:"scalar",ops:["eq","ne","in","not_in"],label:"file type (.xlsx, .pdf, .env \u2026)",extract:e=>Go(e.path).toLowerCase()||void 0},"file.name":{cardinality:"scalar",ops:["eq","in","prefix"],label:"file name",extract:e=>Xo(e.path).toLowerCase()},agent:{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:`which agent (${Ko.join(", ")} \u2026)`,extract:e=>ln(e.who?.host)},"agent.type":{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:"sub-agent type inside the agent (main = the main conversation; general-purpose, explore \u2026)",extract:e=>ln(e.who?.type)},org:{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:"which organisation the agent works for (the one its folder is bound to)",extract:e=>ln(e.who?.org)}};function Hr(e){return t=>jr(e,t).map(n=>({term_id:n.term_id,label:n.label,tier:n.tier,hit_count:n.hit_count}))}function Br(e){return/\.ndc$/i.test(e)||/\.clean\.[A-Za-z0-9]+$/.test(e)||Zo(e)}function Zo(e){return/(^|[\\/])\.nodata[\\/]/.test(e)}console.log=console.error;console.info=console.error;Mr();wt?.on("message",e=>{(async()=>{try{let t=new Set,n=new Set,i={r:await rn({target_id:"mcp",target_label:e.label,target_path:e.target,log:sn,...e.max_files?{max_files:e.max_files}:{},...e.include_tool_dirs?{include_tool_dirs:!0}:{},...e.time_budget_ms?{time_budget_ms:e.time_budget_ms}:{},onProgress:({walked:s,read:o})=>wt?.postMessage({type:"progress",walked:s,read:o}),onFileChecked:(s,o)=>(o?t:n).add(s.split("!/")[0]),skip_own_file:Br,...e.lexicon?{lexicon:Hr(e.lexicon)}:{}}),readTop:[...t],notReadTop:[...n]};wt?.postMessage({type:"done",value:i})}catch(t){wt?.postMessage({type:"error",error:t instanceof Error?t.message:String(t)})}})()});
37
+ `)}var us=new Set([".ods",".ots"]),ds=64;function fs(e){return ae(e.replace(/<text:(?:tab|line-break)\b[^>]*\/>/g," ").replace(/<\/text:p>/g," ").replace(/<[^>]*>/g,"")).replace(/\s+/g," ").trim()}function ps(e){let t=[],n=/<table:table\b([^>]*)>([\s\S]*?)<\/table:table>/g;for(let r of e.matchAll(n)){let i=ae(/table:name="([^"]*)"/.exec(r[1]??"")?.[1]??"")||"Sheet",s=[],o=/<table:table-row\b[^>]*?(?:\/>|>([\s\S]*?)<\/table:table-row>)/g;for(let a of(r[2]??"").matchAll(o)){let c=[],l=/<table:(?:covered-)?table-cell\b([^>]*?)(?:\/>|>([\s\S]*?)<\/table:(?:covered-)?table-cell>)/g;for(let p of(a[1]??"").matchAll(l)){let u=fs(p[2]??""),h=Number(/table:number-columns-repeated="(\d+)"/.exec(p[1]??"")?.[1]??"1")||1;for(let y=0;y<(u?Math.min(h,1024):Math.min(h,ds));y++)c.push(u)}for(;c.length&&!c[c.length-1];)c.pop();c.length&&s.push(c.join(" "))}s.length&&t.push([i.replace(/\s+/g," "),...s].join(`
38
+ `))}return t.length?t.join(`
39
+
40
+ `):null}function hs(e,t,n){let r=new RegExp(`<${t}\\b[^>]*\\b${n}="([^"]*)"`,"g"),i=[],s;for(;(s=r.exec(e))!==null;)s[1]&&i.push(ae(s[1]));return i}function ms(e,t){let n=[];if(Se.has(e)){for(let r of t)(r==="content.xml"||r==="styles.xml"||r==="meta.xml")&&n.push(r);return n}e=rs(e);for(let r of t)(r==="docProps/core.xml"||r==="docProps/app.xml")&&n.push(r);if(e===".xlsx"||e===".xlsm")for(let r of t)(r==="xl/sharedStrings.xml"||r==="xl/workbook.xml"||/^xl\/worksheets\/sheet\d+\.xml$/.test(r)||/^xl\/comments\d*\.xml$/.test(r))&&n.push(r);else if(e===".docx")for(let r of t)(r==="word/document.xml"||/^word\/(header|footer|footnotes|endnotes|comments)\d*\.xml$/.test(r))&&n.push(r);else if(e===".pptx")for(let r of t)/^ppt\/(slides|notesSlides)\/(slide|notesSlide)\d+\.xml$/.test(r)&&n.push(r);return n}function gs(e,t){let n=se(e);if(!n||n.length===0)return null;let r=new Map(n.map(l=>[l.name,l])),i=ms(t,n.map(l=>l.name));if(i.length===0)return null;let s=[],o=[],a=0,c=!1;for(let l of i){if(a>=de){c=!0;break}let p=r.get(l);if(!p)continue;let u=as(e,p);if(u===null)continue;let h=us.has(t)&&l==="content.xml"&&ps(u)||ls(u);if(l==="xl/workbook.xml"){let y=hs(u,"sheet","name");y.length&&(h+=`
41
+ `+y.join(`
42
+ `))}a+h.length>de&&(h=h.slice(0,Math.max(0,de-a)),c=!0),h.trim().length!==0&&(s.push(h),o.push(l),a+=h.length)}return s.length===0?null:{text:s.join(`
43
+ `),truncated:c,parts:o}}function qn(e,t,n={}){if(we(e)){let r=zt(e,de);return"text"in r?{ok:!0,result:{text:r.text,truncated:r.truncated,parts:r.parts,attachments:r.attachments}}:{ok:!1,reason:r.reason}}if(We(e)){let r=Vt(e.toString("latin1"));if(!r.trim())return{ok:!1,reason:"no text inside (an empty file, or only pictures)"};let i=r.length>de;return{ok:!0,result:{text:i?r.slice(0,de):r,truncated:i,parts:["rtf"]}}}if(t===".xlsb"){let r=Kn(e);if(!r)return{ok:!1,reason:"damaged, or an Excel binary workbook with no cells to read"};let i=r.length>de;return{ok:!0,result:{text:i?r.slice(0,de):r,truncated:i,parts:["xlsb"]}}}if(ke.has(t)||Se.has(t)){let r=gs(e,t);return r?{ok:!0,result:r}:{ok:!1,reason:"damaged, or not really an Office file"}}if(Me.has(t)){let r=He(e,n);return r?{ok:!0,result:{text:r.text,truncated:r.truncated,parts:[`pdf:${r.engine}`],engine:r.engine,uncertain:r.uncertain}}:{ok:!1,reason:zn(e)}}return Ve.has(t)?{ok:!1,reason:"not a Word, Excel, PowerPoint or Outlook file inside, despite its name"}:{ok:!1,reason:"unsupported format"}}var ec=new Set([...ke,...Se,...Ve,...Xt,...Me,".xlsb"]);import{execFileSync as ys}from"node:child_process";import{existsSync as Ee,mkdirSync as nr,readFileSync as bs,writeFileSync as rr}from"node:fs";import{createRequire as _s}from"node:module";import{homedir as xs}from"node:os";import{dirname as ws,join as te}from"node:path";import{gunzipSync as vs}from"node:zlib";var gt="7.0.0",ks="1.0.0",Zt=["heb","eng"],Ae=()=>process.env.NODATA_OCR_DIR||te(xs(),".nodata","ocr"),Ss=5*6e4,Es=2*6e4,As=6e4;function yt(){return/^(0|off|false|no)$/i.test(process.env.NODATA_OCR_DOWNLOAD??"")}function Qn(){let e=process.env.NODATA_OCR_MODULE;try{let t=_s(te(Ae(),"package.json"));return t(e||"tesseract.js")}catch{return null}}function Is(){let e=process.env.npm_execpath;if(e&&/npm-cli\.js$/.test(e)&&Ee(e))return e;let t=ws(process.execPath);for(let n of[te(t,"node_modules","npm","bin","npm-cli.js"),te(t,"..","lib","node_modules","npm","bin","npm-cli.js")])if(Ee(n))return n;return null}function Ts(){let e=Is();if(!e)return"npm was not found on this computer";let t=Ae();try{return nr(t,{recursive:!0}),Ee(te(t,"package.json"))||rr(te(t,"package.json"),JSON.stringify({private:!0,description:"NoData picture reader (tesseract.js), fetched once"})),ys(process.execPath,[e,"install","--prefix",t,"--ignore-scripts","--no-audit","--no-fund","--save-exact",`tesseract.js@${gt}`,`tesseract.js-core@${gt}`,...Zt.map(n=>`@tesseract.js-data/${n}@${ks}`)],{stdio:["ignore","pipe","pipe"],timeout:Ss,windowsHide:!0}),null}catch{return"the picture reader could not be downloaded (offline, or a proxy blocked npm)"}}function er(){let e=te(Ae(),"tessdata");try{nr(e,{recursive:!0});for(let t of Zt){let n=te(e,`${t}.traineddata`);if(Ee(n))continue;let r=te(Ae(),"node_modules","@tesseract.js-data",t,"4.0.0_best_int",`${t}.traineddata.gz`);if(!Ee(r))return null;rr(n,vs(bs(r)))}return e}catch{return null}}function tr(e,t,n){return new Promise((r,i)=>{let s=setTimeout(()=>i(new Error(n)),t);s.unref?.(),e.then(o=>{clearTimeout(s),r(o)},o=>{clearTimeout(s),i(o)})})}async function Gt(){let e=Qn(),t=process.env.NODATA_TESSDATA_PATH||er(),n=null;if(!e||!t){if(yt())return{error:"the built-in picture reader is not downloaded here (NODATA_OCR_DOWNLOAD=off)"};let s=Ts();if(s)return{error:s};if(e=Qn(),t=process.env.NODATA_TESSDATA_PATH||er(),!e||!t)return{error:"the picture reader was downloaded but could not start"};n=`NoData downloaded its picture reader once (tesseract.js ${gt} with Hebrew and English, into ${Ae()}) \u2014 it runs only on this computer`}let r={langPath:t,gzip:!Ee(te(t,"eng.traineddata")),cachePath:te(Ae(),"tessdata"),errorHandler:()=>{}},i=null;try{let s=e.createWorker(Zt,1,r);i=await tr(s,Es,"start");let o=i;return{ocr:{note:n,recognize:async a=>(await tr(o.recognize(a),As,"picture")).data.text,close:async()=>{await o.terminate().catch(()=>{})}}}}catch{return{error:"the built-in picture reader could not start on this computer"}}}var Xe=4096,J=(e,t,n)=>n.every((r,i)=>e[t+i]===r),W=(e,t,n)=>e.length>=t+n.length&&e.subarray(t,t+n.length).toString("latin1")===n,$s=new Set([".jpg",".jpeg",".png",".gif",".bmp",".tif",".tiff",".webp",".heic",".heif",".ico",".jfif",".avif"]),Rs=new Set([".zip",".rar",".7z",".tar",".gz",".tgz",".bz2",".xz",".zst",".cab",".iso",".jar",".apk"]),Ls=new Set([".mp3",".mp4",".m4a",".m4v",".mov",".avi",".mkv",".webm",".wav",".flac",".ogg",".opus",".aac",".wmv",".wma",".flv",".3gp"]),ir=new Set([".exe",".dll",".so",".dylib",".msi",".msp",".msm",".bin",".pyc",".class",".o",".a",".lib",".sys",".appx",".msix",".dmg",".pkg",".deb",".rpm"]),sr=new Set([".ttf",".otf",".woff",".woff2",".eot"]),Cs=new Set([".psd",".ai",".fla",".dwg",".dxf",".sketch",".fig",".indd",".blend",".fbx",".obj",".stl"]),Ps=new Set([".sqlite",".sqlite3",".db",".mdb",".accdb",".dbf",".sdf"]),fe="an image \u2014 text in a picture (a photographed ID, a screenshot) is not read yet",Ie="an archive \u2014 the files inside are not opened yet",Kt="a database file \u2014 its tables are not read here",pe=e=>({cls:"no_text",format:e,reader:null,reason:`${e} \u2014 no text to read`});function Jt(e,t,n){let r=e.toLowerCase();if(W(n,0,"%PDF"))return{cls:"document",format:"PDF",reader:"document",docExt:".pdf"};if(We(n))return{cls:"document",format:"RTF",reader:"document",docExt:".rtf"};if(we(n))return ir.has(t)?pe("an installer"):r==="thumbs.db"?pe("a Windows thumbnail cache"):{cls:"document",format:t===".msg"?"Outlook message":ke.has(t)?"Office (password-protected)":Ve.has(t)?`Office 97-2003 (${t})`:"Office 97-2003",reader:"document",docExt:t};if(J(n,0,[80,75,3,4])||J(n,0,[80,75,5,6]))return ke.has(t)?{cls:"document",format:`Office (${t})`,reader:"document",docExt:t}:Se.has(t)?{cls:"document",format:`OpenDocument (${t})`,reader:"document",docExt:t}:t===".xlsb"?{cls:"document",format:"Excel binary workbook (.xlsb)",reader:"document",docExt:".xlsb"}:{cls:"archive",format:"zip archive",reader:null,reason:Ie};if(J(n,0,[255,216,255]))return{cls:"image",format:"jpeg image",reader:null,reason:fe};if(J(n,0,[137,80,78,71]))return{cls:"image",format:"png image",reader:null,reason:fe};if(W(n,0,"GIF8"))return{cls:"image",format:"gif image",reader:null,reason:fe};if(W(n,0,"RIFF")&&W(n,8,"WEBP"))return{cls:"image",format:"webp image",reader:null,reason:fe};if(J(n,0,[73,73,42,0])||J(n,0,[77,77,0,42]))return{cls:"image",format:"tiff image",reader:null,reason:fe};if(W(n,4,"ftyp")&&/^(heic|heix|mif1|msf1|avif)/.test(n.subarray(8,12).toString("latin1")))return{cls:"image",format:"heic image",reader:null,reason:fe};if(W(n,0,"BM")&&t===".bmp")return{cls:"image",format:"bmp image",reader:null,reason:fe};if(W(n,0,"Rar!"))return{cls:"archive",format:"rar archive",reader:null,reason:Ie};if(J(n,0,[55,122,188,175,39,28]))return{cls:"archive",format:"7z archive",reader:null,reason:Ie};if(J(n,0,[31,139]))return{cls:"archive",format:"gzip archive",reader:null,reason:Ie};if(W(n,0,"BZh")||J(n,0,[253,55,122,88,90,0])||J(n,0,[40,181,47,253])||W(n,0,"MSCF"))return{cls:"archive",format:"compressed archive",reader:null,reason:Ie};if(W(n,0,"SQLite format 3\0"))return{cls:"database",format:"SQLite database",reader:null,reason:Kt};if(W(n,4,"Standard Jet DB")||W(n,4,"Standard ACE DB"))return{cls:"database",format:"Access database",reader:null,reason:Kt};if(W(n,0,"MZ")||J(n,0,[127,69,76,70])||J(n,0,[207,250,237,254])||J(n,0,[202,254,186,190]))return pe("a program");if(W(n,4,"ftyp")||W(n,0,"OggS")||W(n,0,"fLaC")||W(n,0,"ID3")||J(n,0,[26,69,223,163])||W(n,0,"RIFF")&&(W(n,8,"WAVE")||W(n,8,"AVI ")))return pe("audio or video");if(W(n,0,"wOFF")||W(n,0,"wOF2")||W(n,0,"OTTO")||J(n,0,[0,1,0,0,0])&&sr.has(t))return pe("a font");if($s.has(t))return{cls:"image",format:`${t.slice(1)} image`,reader:null,reason:fe};if(Rs.has(t))return{cls:"archive",format:`${t.slice(1)} archive`,reader:null,reason:Ie};if(Ps.has(t))return{cls:"database",format:`${t.slice(1)} database`,reader:null,reason:Kt};if(Ls.has(t))return pe("audio or video");if(ir.has(t))return pe("a program");if(sr.has(t))return pe("a font");if(Cs.has(t))return{cls:"unknown",format:`${t.slice(1)} design file`,reader:null,reason:"a design file \u2014 its text is not read"};let i=ke.has(t)||Ve.has(t)||Se.has(t)||Xt.has(t)||Me.has(t);if(J(n,0,[255,254]))return{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16le"};if(J(n,0,[254,255]))return{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16be"};if(n.length===0)return{cls:"text",format:"empty file",reader:"text"};let s=0,o=0,a=0;for(let c=0;c<n.length;c+=1){let l=n[c];l===0?(s+=1,c%2===1&&(o+=1)):(l<9||l>13&&l<32||l===127)&&(a+=1)}return n.length>=16&&o/(n.length/2)>.4&&s-o<n.length*.02?{cls:i?"document":"text",format:"UTF-16 text",reader:"utf16le"}:s/n.length>.05||a/n.length>.1?i?{cls:"document",format:`${t} (not a known container)`,reader:null,reason:"damaged, or not really the format its name says"}:{cls:"unknown",format:t?`${t.slice(1)} binary`:"binary",reader:null,reason:"a binary file of a type NoData does not read"}:{cls:i?"document":"text",format:i?`${t.slice(1)} saved as text`:"text",reader:"text"}}function Yt(e){if(J(e,0,[137,80,78,71])&&e.length>=24)return{w:e.readUInt32BE(16),h:e.readUInt32BE(20)};if(W(e,0,"GIF8")&&e.length>=10)return{w:e.readUInt16LE(6),h:e.readUInt16LE(8)};if(W(e,0,"BM")&&e.length>=26)return{w:e.readInt32LE(18),h:Math.abs(e.readInt32LE(22))};if(J(e,0,[255,216])){let t=2;for(;t+9<e.length;){if(e[t]!==255)return null;let n=e[t+1],r=e.readUInt16BE(t+2);if(n>=192&&n<=207&&n!==196&&n!==200&&n!==204)return{w:e.readUInt16BE(t+7),h:e.readUInt16BE(t+5)};t+=2+r}}return null}var gc=[...De].sort((e,t)=>+(t.subkind==="iban")-+(e.subkind==="iban"));function bt(e){let t=e.trim();return/^\[[A-Z_]+(?:-\d+)?\]$/.test(t)||/^[\d]{0,4}[*•xX]{3,}[\d]{0,4}$/.test(t)}var ar=10;function cr(e){let t=e.replace(/<rPh\b[\s\S]*?<\/rPh>/g,""),n="";for(let r of t.matchAll(/<t(?:\s[^>]*)?>([\s\S]*?)<\/t>/g))n+=r[1];return ae(n)}function Ds(e){return e?[...e.matchAll(/<si\b[^>]*>([\s\S]*?)<\/si>|<si\b[^>]*\/>/g)].map(t=>cr(t[1]??"")):[]}var Ns=/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g;function or(e,t){let n=new RegExp(`\\b${t}="([^"]*)"`).exec(e);return n?n[1]:null}function Ze(e,t){if(e.type==="s"){let r=/<v>([^<]*)<\/v>/.exec(e.inner);return r?t[Number(r[1])]??null:null}if(e.type==="inlineStr"){let r=/<is>([\s\S]*?)<\/is>/.exec(e.inner);return r?cr(r[1]):null}if(e.type==="b"||e.type==="e")return null;let n=/<v>([^<]*)<\/v>/.exec(e.inner);return n?ae(n[1]):null}function Fs(e){let t=[];for(let n of e.matchAll(Ns)){let r=or(n[1],"r"),i=r?/^([A-Z]+)(\d+)$/.exec(r):null;if(!i)return null;t.push({full:n[0],attrs:n[1],inner:n[2]??"",col:i[1],row:Number(i[2]),type:or(n[1],"t")??"n"})}return t}function Ms(e,t){let n=[...new Set(e.map(r=>r.row))].sort((r,i)=>r-i).slice(0,ar);for(let r of n){let i=new Map;for(let s of e.filter(o=>o.row===r)){let o=Ze(s,t),a=o?_e(o):null;a&&i.set(s.col,{type:a.type,header:o.trim()})}if(i.size>0)return{row:r,cols:i}}return{row:-1,cols:new Map}}var js=/^xl\/worksheets\/sheet\d+\.xml$/,Hs=200;function Bs(e){let t=e.trim();return/^[\d.,\-+/:%$₪€\s]+$/.test(t)||t.length>60}function Us(e,t){let n=[...new Set(e.map(s=>s.row))].sort((s,o)=>s-o).slice(0,ar),r=-1,i=-1/0;for(let s of n){let o=e.filter(l=>l.row===s).map(l=>(Ze(l,t)??"").trim()).filter(Boolean);if(o.length<2)continue;let a=o.filter(l=>!Bs(l)).length,c=a*2-(o.length-a);c>i&&(i=c,r=s)}return r}function zs(e,t,n){let r=Ms(t,n),i=Ce();if(!i)return r;let s=r.row>=0?r.row:Us(t,n);if(s<0)return r;let o=t.filter(u=>u.row===s).map(u=>({col:u.col,text:(Ze(u,n)??"").trim()})).filter(u=>u.text),a=new Map(o.map((u,h)=>[u.col,h])),c=new Map;for(let u of t){if(u.row<=s)continue;let h=a.get(u.col);if(h!==void 0){if(!c.has(u.row)){if(c.size>=Hs)continue;c.set(u.row,o.map(()=>""))}c.get(u.row)[h]=Ze(u,n)??""}}let l=new Map(s===r.row?r.cols:[]),p=o.map(u=>u.text);for(let u of i({name:e,headers:p,rows:[...c.values()]})){let h=p.indexOf(u.column);h<0||l.set(o[h].col,{type:u.type,header:u.column,category:u.category,severity:u.severity,how:u.how})}return{row:s,cols:l}}function en(e){let t=se(e);if(!t||t.length===0)return null;let n=s=>{let o=t.find(c=>c.name===s),a=o?oe(e,o):null;return a?a.toString("utf8"):null},r=Ds(n("xl/sharedStrings.xml")),i=[];for(let s of t.filter(o=>js.test(o.name))){let o=n(s.name),a=o?Fs(o):null;if(!a)continue;let c=s.name.replace(/^xl\/worksheets\//,"").replace(/\.xml$/,""),l=zs(c,a,r);for(let[p,u]of l.cols){let h=a.filter(y=>{let _=y.col===p&&y.row>l.row?(Ze(y,r)??"").trim():"";return _!==""&&!bt(_)}).length;h>0&&i.push({...u,col:p,sheet:c,count:h})}}return i}var Ec=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let n=t;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;e[t]=n>>>0}return e})();function ur(e){let t=/\r?\n\r?\n/.exec(e);return t?{head:e.slice(0,t.index),body:e.slice(t.index+t[0].length)}:{head:e,body:""}}function tn(e,t){let n=e.replace(/\r?\n[ \t]+/g," "),r=new RegExp(`^${t}:[ \\t]*(.*)$`,"im").exec(n);return r?r[1].trim():""}function nn(e,t){let n=new RegExp(`${t}\\*?=\\s*(?:"([^"]*)"|([^;\\s]+))`,"i").exec(e);return n?(n[1]??n[2]??"").replace(/^utf-8''/i,""):""}function Ws(e){let t=e.replace(/=\r?\n/g,""),n=[];for(let r=0;r<t.length;r++){let i=t[r];if(i==="="&&/^[0-9A-Fa-f]{2}$/.test(t.slice(r+1,r+3)))n.push(parseInt(t.slice(r+1,r+3),16)),r+=2;else for(let s of Buffer.from(i,"utf8"))n.push(s)}return Buffer.from(n)}function lr(e,t){let n=t.toLowerCase();return n==="base64"?Buffer.from(e.replace(/[^A-Za-z0-9+/=]/g,""),"base64"):n==="quoted-printable"?Ws(e):Buffer.from(e,"utf8")}function dr(e){let{head:t}=ur(e.slice(0,65536));return/^(?:mime-version|content-type|content-transfer-encoding):/im.test(t)}function fr(e){let t=[],n=[],r=0,i=(s,o,a)=>{if(r++>500||o>8)return;let{head:c,body:l}=ur(s);a!==void 0&&t.push(c);let p=tn(c,"Content-Type")||"text/plain",u=tn(c,"Content-Transfer-Encoding"),h=tn(c,"Content-Disposition"),y=nn(p,"boundary");if(/^multipart\//i.test(p)&&y){let N=`--${y}`;for(let b of l.split(N).slice(1)){if(b.startsWith("--"))break;i(b.replace(/^\r?\n/,""),o+1)}return}if(/^message\/rfc822/i.test(p)){i(lr(l,u).toString("utf8"),o+1,"");return}let _=nn(h,"filename")||nn(p,"name"),A=lr(l,u);_||/attachment/i.test(h)||!/^text\//i.test(p)?n.push({name:(_||`part-${r}`).replace(/[\\/]/g,"_"),data:A}):t.push(A.toString("utf8"))};return i(e,0,""),{text:t.join(`
44
+ `),attachments:n}}import{createHash as Vs}from"node:crypto";var rn=/(^|\/)(\.env(\.[\w.-]+)?|[\w.-]+\.env(\.[\w.-]+)?)$/i,Xs=/(SECRET|PASSWORD|PASSWD|PASS|PWD|TOKEN|PRIVATE|CREDENTIAL|API_?KEY|_KEY|KEY_ID|DSN|DATABASE_URL|_URI|POOLER_URL|SALT|PEPPER)$/i,Zs=/(^NEXT_PUBLIC_|^VITE_|^EXPO_PUBLIC_|ANON_KEY$|PUBLISHABLE_KEY$|PUBLIC_KEY$)/i,pr=/(ENCRYPT|CIPHER|PII|DATA_?KEY|KMS|MASTER_?KEY|BLIND_?INDEX|VAULT_?KEY)/i,Gs=12;var _t=class{byHash=new Map;add(t,n){for(let r of n.split(/\r?\n/)){let i=/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(r);if(!i)continue;let s=i[1];if(!Xs.test(s)||Zs.test(s))continue;let o=i[2].trim();if(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o=o.slice(1,-1):o=o.replace(/\s+#.*$/,""),o.length<Gs||/^\$\{?[A-Z_]+\}?$/.test(o))continue;let a=/^[a-z][a-z0-9+.-]*:\/\/[^:/@\s]+:([^@\s]+)@/i.exec(o);if(/^[a-z][a-z0-9+.-]*:\/\//i.test(o)&&!a)continue;let c=a?Ks(a[1]):o;if(c.length<8)continue;let l=Vs("sha256").update(c).digest("hex"),p=this.byHash.get(l)??[];p.some(u=>u.file===t&&u.name===s)||p.push({file:t,name:s}),this.byHash.set(l,p)}}groups(){let t=[];for(let n of this.byHash.values()){let r=[...new Set(n.map(o=>o.name))].sort(),i=[...new Set(n.map(o=>o.file))].sort();if(r.length<2&&i.length<2)continue;let s=r.some(o=>pr.test(o));t.push({names:r,files:i,encryption:s&&r.some(o=>!pr.test(o))})}return t}};function Ks(e){try{return decodeURIComponent(e)}catch{return e}}function hr(e){let t=[];e.names.length>1&&t.push(`one secret is used as ${e.names.length} variables (${e.names.join(", ")})`),e.files.length>1&&t.push(`${e.names.length===1?e.names[0]:"the same secret"} is copied in ${e.files.length} files (${e.files.join(", ")})`);let n=`Shared secret: ${t.join("; and ")}.`;return e.encryption?n+=" \u26A0 It is ALSO a data-encryption key: do NOT rotate it like a normal key \u2014 everything already encrypted with it would stop decrypting. First give the other uses their own new secret, then change the encryption key only in a planned re-encryption.":e.names.length>1?n+=" Replacing it breaks every use at once \u2014 give each use its own secret first, then retire the shared one.":n+=" Every copy has to be removed or updated when the key is replaced; keep one source (the vault) instead.",n}var Er={4:"critical",3:"high",2:"medium",1:"info"},sn=10,ro=5e3,io=5e4,ye=64*1024*1024,wt=4*1024*1024,yr=500,on=5e5,an=2,br=512*1024*1024,so=1024*1024*1024,_r=5e3,oo=()=>Math.max(0,Number(process.env.NODATA_OCR_MAX_IMAGES)||2e3),ao=()=>Math.max(10,Number(process.env.NODATA_SCAN_SECONDS)||480)*1e3,co=5e3,lo=2e3;var uo=1024,fo=256*1024*1024,po=120,xr=new Sr("utf-8",{fatal:!0}),ho=new Sr("windows-1255");function mo(e){try{return xr.decode(e)}catch{try{return xr.decode(e.subarray(0,Math.max(0,e.length-3)))}catch{return ho.decode(e)}}}function go(){return!yt()||!!process.env.NODATA_OCR_MODULE||qs(Ge(process.env.NODATA_OCR_DIR||Ge(no(),".nodata","ocr"),"node_modules","tesseract.js"))}function wr(){let e=ie();return!!e.pdftoppm&&!!e.tesseract&&e.ocrLangs.length>0}function yo(e,t){let n=Qs(e,"r");try{let r=Buffer.alloc(t),i=eo(n,r,0,t,0);return r.subarray(0,i)}finally{Ys(n)}}var vr=new Set(["node_modules",".git",".hg",".svn"]),kr=new Set([".cache",".cargo",".rustup",".npm",".pnpm-store",".yarn",".gradle",".m2",".nuget",".conda",".pyenv",".rbenv",".nvm",".volta",".bun",".deno",".docker",".android",".vscode-server",".agents",".agent",".codeium",".continue","antigravity",".antigravity","__pycache__",".venv","venv","site-packages",".next",".turbo",".expo",".nx",".parcel-cache",".svelte-kit","appdata",".trash","$recycle.bin"].map(e=>e.toLowerCase())),bo=/(^|\/)\.(vscode|cursor|windsurf|antigravity|vscode-server)\/extensions$/i;var cn=40,_o=/^(agent|bot|model|service|tool|app|job|task|queue|test|qa|suite|runner|worker|host|server|project|repo|package|file|table|column|field)[_-]?name$/i,xo={critical:"high",high:"medium",medium:"low",low:"info",info:"info"},wo=[{re:/\b\d{3}-\d{2}-\d{4}\b/,kind:"pii_unencrypted",subkind:"ssn",severity:"high",hint:"US Social Security Number pattern in plaintext."},{re:/(?<!:\/\/[^\s/@]*)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i,kind:"pii_unencrypted",subkind:"email",severity:"low",hint:"Email addresses in plaintext."},{re:/(passport|teudat.?zehut|(?<![א-ת])תעודת.?זהות(?![א-ת])|(?<![א-ת])ת["'׳״]?\.?ז(?![א-ת]))/i,kind:"pii_unencrypted",subkind:"passport_keyword",severity:"low",hint:"Mentions the word passport / national ID \u2014 a word, not a number. The numbers themselves are reported by the ID rules."}],vo=[{re:/(salary|payroll|משכורת|ssn|social.?security|passport|דרכון|תעודת.?זהות)/i,kind:"pii_unencrypted",subkind:"sensitive_filename",severity:"medium",hint:"Filename suggests sensitive PII content."},{re:/\.(env|env\.local|pem|key|p12|pfx)$/i,kind:"pii_unencrypted",subkind:"secret_file",severity:"high",hint:"File extension implies secret / credential bundle in plaintext."}],ko=/\d{3}|@|[A-Z]{2}\d{2}/;function ln(e,t){return ko.test(e)?`column ${t}`:e}function So(e){let t=e.lastIndexOf(".");return t<0?"":e.slice(t).toLowerCase()}async function un(e){let t=Date.now(),n=[],r=new _t,i=new Map,s=[],o=0,a=0,c=0,l=0,p=e.time_budget_ms??ao(),u="",h=Date.now(),y=Date.now();async function _(){let d=Date.now();if(!(d-h<100)&&(h=d,await new Promise(w=>setImmediate(w)),e.onProgress&&d-y>=co)){y=d;try{e.onProgress({walked:o,read:a,current:u})}catch{}}}let A=0,N=(d,w)=>d===0?!0:A+w>fo?!1:(A+=w,!0),b=[];function I(d,w,g,m){let L=f.not_read_by_format??={};L[g]=(L[g]??0)+1,(f.not_read??=[]).length<yr&&f.not_read.push({path:d,cls:w,format:g,reason:m}),e.onFileChecked?.(d,!1)}let f={hit_file_cap:!1,hit_depth_cap:!1,max_files:Math.min(Math.max(1,e.max_files??ro),io),max_depth:sn,tool_dirs_skipped:0,tool_dir_names:[],not_reached:[],skipped_by_extension:0,documents_extracted:0,documents_truncated:0,documents_unreadable:0,files_too_large:0,files_sampled_only:0,sample_bytes:wt};function P(d){return(d.startsWith(e.target_path)?d.slice(e.target_path.length).replace(/^[\\/]+/,"")||gr(d):d).replace(/\\/g,"/")}function R(d,w,g,m,L){let $=P(d);$!==""&&s.push({target_id:e.target_id,path:$,kind:w,size_bytes:g,modified_at:m?m.toISOString():null,child_count:L})}function G(d,w){n.push({target_id:e.target_id,relative_path:d,finding_kind:w.kind,finding_subkind:w.subkind,severity:w.severity,remediation_hint:w.hint})}function K(d,w,g,m,L,$=!1){$&&Ct.test(d)?L=`${L??""} (In a test / sample file, but not a published test number \u2014 this looks real.)`.trim():w!=="hardcoded_secret"&&Ct.test(d)&&(g=xo[g],L=`${L??""} (Test / sample / minified file \u2014 probably sample data; check before acting.)`.trim()),n.push({target_id:e.target_id,relative_path:d,finding_kind:w,finding_subkind:m,severity:g,remediation_hint:L})}function ee(d,w){let g=w.replace(/\.[^.]+$/,"");if(/\d{7}/.test(g.replace(/[\s-]/g,"")))for(let m of Ne(g))K(d,"pii_unencrypted","high",`${m.subkind}_in_name`,`The FILE NAME holds ${m.count===1?"a":m.count} ${m.subkind.replace(/_/g," ")} value${m.count===1?"":"s"}. Anyone who sees the folder sees it, and a lock keeps the name: rename it first.`,(m.real??0)>0)}function he(d,w){if(o+=1,o>f.max_files){f.hit_file_cap=!0;return}let g=P(d);if(ee(g,w),Date.now()-t>=p){f.hit_time_cap=!0,f.time_skipped=(f.time_skipped??0)+1,I(g,"unknown","not reached (time limit)",`the scan's time limit (${Math.round(p/6e4)} min) was reached before this file \u2014 scan its folder on its own`);let v=(f.by_class??={}).unknown??={total:0,read:0};v.total+=1;return}let m=0,L;try{m=xt(d).size,L=yo(d,Xe)}catch{e.onFileChecked?.(g,!1);return}u=g;let $=Date.now();ce(g,w,m,L,v=>{let T=to(d,{flag:"r"});return v&&T.length>v?T.subarray(0,v):T},0),be(g,Date.now()-$)}function be(d,w){if(w<lo)return;let g=f.slow_files??=[];g.push({path:d,ms:w}),g.sort((m,L)=>L.ms-m.ms),g.length>5&&(g.length=5)}function gn(d,w,g){let m=se(w);if(!m)return{ok:!1,reason:"a damaged archive \u2014 could not be opened"};let L=so,$=0;for(let v of m){if(v.name.endsWith("/"))continue;$+=1;let T=`${d}!/${v.name}`,x=v.name.split("/").pop()??v.name,k=M=>{let z=f.not_read_by_format??={};z["file inside an archive"]=(z["file inside an archive"]??0)+1,(f.not_read??=[]).length<yr&&f.not_read.push({path:T,cls:"archive",format:"file inside an archive",reason:M}),e.onFileChecked?.(T,!1)};if(Date.now()-t>=p){f.hit_time_cap=!0,k(`the scan's time limit (${Math.round(p/6e4)} min) was reached \u2014 the rest of the archive was not opened`);break}if($>_r){k(`the archive holds more than ${_r} files \u2014 the rest were not opened`);break}if(v.flags&1){k("password-protected inside the archive \u2014 not read");continue}if(v.method!==0&&v.method!==8){k("compressed with a method NoData does not read");continue}let E=Math.min(ye,L);if(v.uncompSize>E){k(L<ye?"the archive expands past the reading limit \u2014 the rest were not opened":`larger than ${ye/(1024*1024)} MB \u2014 not read`);continue}let F=oe(w,v,E);if(!F){k("could not be unpacked (damaged, or larger than it claimed)");continue}L-=F.length,f.archive_entries=(f.archive_entries??0)+1,ce(T,x,F.length,F.subarray(0,Xe),M=>M&&F.length>M?F.subarray(0,M):F,g+1)}return{ok:!0}}function ce(d,w,g,m,L,$){for(let O of vo)O.re.test(w)&&G(d,O);let v=So(w),T=Jt(w,v,m),x=f.by_class??={},k=x[T.cls]??={total:0,read:0};k.total+=1;let E=O=>I(d,T.cls,T.format,O);if(T.cls==="archive"&&T.format==="zip archive"){if($>=an){E("an archive inside an archive inside an archive \u2014 not opened");return}if(g>br){f.files_too_large+=1,E(`an archive larger than ${br/(1024*1024)} MB \u2014 not opened`);return}let O;try{O=L()}catch{E("could not be opened (in use, or no permission)");return}let D=gn(d,O,$);D.ok?k.read+=1:E(D.reason);return}if(T.cls==="image"){if(!Mt[T.format]){E(T.format==="heic image"?"a HEIC photo \u2014 save it as JPEG to have its text read":T.reason??"not read");return}let O=Yt(m);if(g<uo||O&&Math.max(O.w,O.h)<po){E("a small icon or thumbnail \u2014 no text to read");return}if(g>ye){f.files_too_large+=1,E(`larger than ${ye/(1024*1024)} MB \u2014 not read`);return}if(!dt()&&!go()){E(`an image \u2014 its text is read by OCR on this computer once Tesseract is installed (${re})`);return}if(!N($,g)){E("a picture inside an archive \u2014 the memory set aside for pictures from archives is used up; unpack the archive and scan it");return}b.push({kind:"image",rel:d,name:w,ext:v,format:T.format,load:L,row:k,size:g});return}if(!T.reader){T.cls==="document"?(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=T.reason??"not read")):f.skipped_by_extension+=1,E(T.reason??"not read");return}let F=T.reader==="document";if(F&&g>ye){f.files_too_large+=1,E(`larger than ${ye/(1024*1024)} MB \u2014 not read`);return}let M;try{M=F?L():L(wt)}catch{E("could not be opened (in use, or no permission)");return}let z,B=!1;if(F){let O=qn(M,T.docExt??v,{ocr:!1});if(!O.ok&&(T.docExt??v)===".pdf"&&/scanned image/.test(O.reason)&&wr()&&N($,g)){b.push({kind:"pdf",rel:d,name:w,ext:".pdf",format:T.format,load:L,row:k,size:g});return}if(!O.ok){f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=O.reason),E(O.reason);return}let D=O.result;if((T.docExt??v)===".pdf"&&D.engine!=="ocr"&&Dn(M,D.text)){if(wr()&&N($,g)){b.push({kind:"pdf",rel:d,name:w,ext:".pdf",format:T.format,load:L,row:k,size:g,stamp:D.text});return}let j=`some of its pages are pictures (scanned): they need OCR, the rest was read. ${re}`;B=!0,f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&(f.unreadable_files.push(d),(f.unreadable_reasons??={})[d]=j),E(j)}if(z=D.text,B||(f.documents_extracted+=1),D.truncated&&(f.documents_truncated+=1),D.engine==="pdftotext"||D.engine==="ocr"){let j=f.documents_by_engine??={};j[D.engine]=(j[D.engine]??0)+1,D.engine==="ocr"&&(f.ocr_files??=[]).length<500&&f.ocr_files.push(d)}D.uncertain&&(f.uncertain_files??=[]).length<500&&f.uncertain_files.push(d);for(let j of D.attachments??[]){if($>=an)break;f.archive_entries=(f.archive_entries??0)+1,ce(`${d}!/${j.name}`,j.name,j.data.length,j.data.subarray(0,Xe),q=>q&&j.data.length>q?j.data.subarray(0,q):j.data,$+1)}}else if(T.reader==="utf16le"||T.reader==="utf16be"){let O=M.subarray(M[0]===255||M[0]===254?2:0),D=O.subarray(0,O.length-O.length%2);z=T.reader==="utf16le"?D.toString("utf16le"):Buffer.from(D).swap16().toString("utf16le"),g>wt&&(f.files_sampled_only+=1)}else{let O=0;for(let D=0;D<M.length;D+=1)M[D]===0&&(O+=1);if(M.length>0&&O/M.length>.05){f.skipped_by_extension+=1,k.total-=1;let D=x.unknown??={total:0,read:0};D.total+=1,E("binary content under a text name \u2014 not read");return}if(z=mo(M),g>wt&&(f.files_sampled_only+=1),v===".eml"&&dr(z)){let D=fr(z);z=`${z}
45
+ ${D.text}`;for(let j of D.attachments){if($>=an){I(`${d}!/${j.name}`,"archive","file attached to an email","attached inside nested mail or archives deeper than the scan opens: not read"),B=!0;continue}f.archive_entries=(f.archive_entries??0)+1,ce(`${d}!/${j.name}`,j.name,j.data.length,j.data.subarray(0,Xe),q=>q&&j.data.length>q?j.data.subarray(0,q):j.data,$+1)}}}B||(a+=1,k.read+=1,e.onFileChecked?.(d,!0)),Re(d,w,v,z,F?M:null)}function Re(d,w,g,m,L){let $=L??Buffer.alloc(0),v=new Set;if(rn.test(d)&&r.add(d,m),e.lexicon){let x=[];try{x=e.lexicon(m)}catch{}for(let k of x)n.push({target_id:e.target_id,relative_path:d,finding_kind:"custom_lexicon",finding_subkind:`lexicon:${k.term_id}`,severity:Er[k.tier]??"info",remediation_hint:`"${k.label}" \u2014 one of your scan terms, tier ${k.tier}: handle the file at that tier.`,hit_count:k.hit_count,label:k.label,tier:k.tier})}for(let x of wo)if(x.re.test(m)){let k=`${x.subkind}::${d}`;v.has(k)||(v.add(k),G(d,x))}for(let x of Ne(m,(k,E)=>{if(k!=="israeli_id"&&k!=="credit_card"&&k!=="iban")return;let F=Js("sha256").update(`${k}:${E}`).digest("hex"),M=i.get(F)??new Set;M.add(d),i.set(F,M)})){let k=`validated::${x.subkind}::${d}`;v.has(k)||(v.add(k),K(d,"pii_unencrypted",x.severity,x.subkind,`${x.hint} ${x.count} distinct value${x.count===1?"":"s"} in this file.`,(x.real??0)>0))}if(!xn.test(d)){let x=Lt(),k=m.split(`
46
+ `),E=Math.min(k.length,on);k.length>on&&I(d,"text","text",`only its first ${on.toLocaleString("en-US")} lines were checked for keys and passwords: the rest were not`);for(let F=0;F<E;F++){let M=k[F];if(!M)continue;let z=M.trimStart();if(!(z.startsWith("//")||z.startsWith("/*")||z.startsWith("*")||z.startsWith("#"))&&!/process\.env/.test(M)&&!/\$\{[A-Z_]+/.test(M)){for(let B of x)if(B.pattern.test(M)){let O=`secret::${B.id}::${d}::${F+1}`;if(v.has(O))break;v.add(O);let D=wn.test(d);K(d,"hardcoded_secret",D?"critical":B.severity,B.id,D?`A real-looking ${B.name} in an EXAMPLE file near line ${F+1}. Example files are committed to Git and shared on purpose \u2014 rotate this key at its source and put a placeholder in the example.`:`Looks like a ${B.name} hardcoded near line ${F+1}. Move to an env var or secret manager.`);break}}}}if(w==="package.json"&&!d.includes("node_modules"))try{let k=vn(m);for(let E of k){let F=`vuln::${E.name}::${d}`;v.has(F)||(v.add(F),K(d,"vulnerable_dependency",E.vuln.severity,E.name,`${E.name}@${E.version} is below ${E.vuln.below} (${E.vuln.cve} \xB7 ${E.vuln.desc}). Bump to ${E.vuln.below} or higher.`))}}catch{}let T=g===".csv"||g===".tsv"?[{lines:m.split(/\r?\n/),sep:g===".tsv"?" ":","}]:g===".xls"||g===".xlt"||g===".ods"||g===".ots"||g===".xlsb"?m.split(/\n{2,}/).map(x=>x.split(`
47
+ `).slice(1)).filter(x=>x.length>1&&x[0].includes(" ")).map(x=>({lines:x,sep:" "})):[];for(let{lines:x,sep:k}of T)if(x.length>0){let E=Fe(x[0]??"",k),F=x.slice(1,51).map(z=>Fe(z??"",k)),M=Ce();if(M){let z=x.slice(1,201).filter(B=>B!=="").map(B=>Fe(B,k));for(let B of M({name:"table",headers:E,rows:z})){let O=`header::${d}::${B.column}::${B.type}`;if(v.has(O))continue;let D=E.indexOf(B.column);if(D>=0&&z.length>0&&z.every(q=>!(q[D]??"").trim()||bt(q[D]??"")))continue;v.add(O);let j=ln(B.column,D+1);K(d,"pii_header_match",B.severity,`${B.type}:${j}`,`Column "${j}" holds ${B.category} (${B.how==="value"?`${B.hits} sampled values matched`:"by its header"}). Wrap with envelope or keep a clean copy for work.`)}}M||E.forEach((z,B)=>{let O=(z??"").trim();if(!O)return;let j=_e(O)?.type??null;if(!j){let q=[];for(let Je of F){let It=Je[B];if(It&&It.trim().length>0&&q.push(It),q.length>=50)break}let Le=C(q);Le&&(j=Le)}if(j){let q=Ye(j)??Qe[j]??"medium",Le=`header::${d}::${O}::${j}`;if(v.has(Le))return;v.add(Le);let Je=ln(O,B+1);K(d,"pii_header_match",q,`${j}:${Je}`,`Column "${Je}" looks like ${j} data. Wrap with envelope or move to a vault-backed reference.`)}})}if(g===".xlsx"||g===".xlsm")for(let x of en($)??[]){let k=`xlsxheader::${d}::${x.sheet}::${x.header}::${x.type}`;if(v.has(k))continue;v.add(k);let E=ln(x.header,x.col);K(d,"pii_header_match",x.severity??Ye(x.type)??Qe[x.type]??"medium",`${x.type}:${E}`,`Column "${E}" (${x.sheet}) holds ${x.category??`${x.type} data`}${x.how==="value"?" (found by its values)":""} \u2014 ${x.count} filled cell${x.count===1?"":"s"}. Wrap with envelope or keep a clean copy for work.`)}if(g===".json"&&!w.endsWith(".nodata-proof.json"))try{let x=JSON.parse(m),k=Array.isArray(x)?x[0]:x;if(k&&typeof k=="object")for(let E of Object.keys(k)){let F=_e(E);if(F){let M=F.type==="name"&&_o.test(E),z=M?"low":Ye(F.type)??Qe[F.type]??"medium",B=`jsonkey::${d}::${E}::${F.type}`;if(v.has(B))continue;v.add(B),K(d,"pii_header_match",z,`${F.type}:${E}`,M?`JSON key "${E}" is usually the name of a system (an agent, bot or service), not a person \u2014 check if yours holds people.`:`JSON key "${E}" looks like ${F.type} data.`)}}}catch{}/\.(txt|log|md|csv|tsv|json|jsonl|xml|html?|yaml|yml|sql)$/i.test(w)&&S(m,d,v)}let me=De.find(d=>d.subkind==="israeli_phone");function S(d,w,g){let m=d.split(`
48
+ `),L=Math.min(m.length,1e3),$=-1,v=-1,T=-1;for(let x=0;x<L;x++){let k=m[x]??"";if(T<0){let E=k.match(/\b\d{9}\b/);E&&et(E[0])&&!nt(E[0])&&!Pe(E[0])&&(T=x+1)}if($<0){me.pattern.lastIndex=0;for(let E of k.matchAll(me.pattern))if(me.validate(E[0])){$=x+1;break}}if(v<0){Oe.lastIndex=0;for(let E of k.matchAll(Oe))if(tt(E[0])){v=x+1;break}}if(T>0&&$>0&&v>0)break}T>0&&!g.has(`ilid::${w}`)&&(g.add(`ilid::${w}`),K(w,"israeli_id_value","critical",`near_line:${T}`,`Israeli ID with valid Luhn checksum detected near line ${T}. Strong signal that real customer IDs are in plaintext.`,!0)),$>0&&!g.has(`ilphone::${w}`)&&(g.add(`ilphone::${w}`),K(w,"israeli_phone_value","high",`near_line:${$}`,`Israeli phone number detected near line ${$}.`)),v>0&&!g.has(`iliban::${w}`)&&(g.add(`iliban::${w}`),K(w,"israeli_iban_value","critical",`near_line:${v}`,`Israeli IBAN (IL prefix) detected near line ${v}.`))}function C(d){if(d.length===0)return null;let w=0,g=0,m=0;for(let $ of d)typeof $=="string"&&(/^(?:\d{5,9}|\d{8}-\d)$/.test($.trim())&&et($)&&w++,Pt.lastIndex=0,Pt.test($)&&g++,Oe.lastIndex=0,[...$.matchAll(Oe)].some(v=>tt(v[0]))&&m++);let L=d.length;return w/L>=.3?"id":g/L>=.3?"phone":m/L>=.3?"financial":null}async function V(d,w){if(w>sn){f.hit_depth_cap=!0;return}if(o>f.max_files){f.hit_file_cap=!0;return}let g;try{g=mr(d)}catch{return}for(let m=0;m<g.length;m++){let L=g[m];if(o>f.max_files){f.hit_file_cap=!0;let T=P(d);T&&!f.not_reached.includes(`${T} (partly)`)&&f.not_reached.length<cn&&f.not_reached.push(`${T} (partly)`);for(let x of g.slice(m)){if(f.not_reached.length>=cn)break;try{xt(Ge(d,x)).isDirectory()&&!vr.has(x)&&!kr.has(x.toLowerCase())&&f.not_reached.push(P(Ge(d,x)))}catch{}}return}let $=Ge(d,L),v;try{v=xt($)}catch{continue}if(!v.isSymbolicLink()){if(v.isDirectory()){if(vr.has(L))continue;if(!e.include_tool_dirs&&(kr.has(L.toLowerCase())||bo.test(P($)))){f.tool_dirs_skipped+=1,!f.tool_dir_names.includes(L)&&f.tool_dir_names.length<cn&&f.tool_dir_names.push(L);continue}let T=null;try{T=mr($).length}catch{T=null}R($,"folder",null,v.mtime??null,T),await V($,w+1)}else if(v.isFile()){if(e.skip_own_file?.(P($))){f.own_files_skipped=(f.own_files_skipped??0)+1;continue}R($,"file",v.size,v.mtime??null,null),he($,L),await _()}}}}let X,H=null;try{let d=xt(e.target_path);X=d.isDirectory()||d.isFile(),d.isFile()&&(H={size:d.size,mtime:d.mtime??null})}catch{X=!1}if(!X)return{target_id:e.target_id,target_label:e.target_label,target_path:e.target_path,files_walked:0,files_inspected:0,duration_ms:Date.now()-t,findings:[],inventory:[],coverage:f,error:"target_path_not_found_or_not_directory"};if(e.log.info("folder-scanner: starting",{target_label:e.target_label,target_path:e.target_path,max_files:f.max_files,max_depth:sn}),H?(R(e.target_path,"file",H.size,H.mtime,null),he(e.target_path,gr(e.target_path))):await V(e.target_path,0),b.length){b.sort((m,L)=>m.size-L.size),e.onProgress?.({walked:o,read:a,current:`reading ${b.length} picture(s) / scanned PDF(s)`});let d=null,w=()=>Date.now()-t>=p||c>=oo(),g=m=>{f.hit_time_cap=!0,f.ocr_skipped=(f.ocr_skipped??0)+1,m.kind==="pdf"&&(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&f.unreadable_files.push(m.rel)),I(m.rel,m.kind==="pdf"?"document":"image",m.format,`${m.kind==="pdf"?"a scanned PDF":"a picture"} \u2014 the scan's time limit was reached before OCR got to it; scan its folder on its own`)};try{for(let m of b){if(w()){g(m);continue}u=m.rel,await _();let L=Date.now(),$=null,v="an image with no readable text (a photo, or text OCR could not make out)",T=!1;try{if(m.kind==="pdf"&&m.stamp!==void 0){let k=Ft(m.load()),E=k?.text?.trim();$=E?`${E}
49
+ ${m.stamp}`:null,T=!!k?.truncated,v="a scanned PDF (pictures with a little text) that OCR could not read"}else if(m.kind==="pdf"){let k=He(m.load(),{ocr:!0});$=k?.text?.trim()||null,T=!!k?.truncated,v="a scanned PDF OCR could not read"}else dt()?$=jt(m.load(),m.format):(d??=await Gt(),"error"in d?v=`an image \u2014 ${d.error}. Installing Tesseract also works (${re})`:(d.ocr.note&&(f.ocr_note=d.ocr.note),f.ocr_engine="built-in",$=(await d.ocr.recognize(m.load())).trim()||null))}catch{$=null}if(c+=1,l+=Date.now()-L,be(m.rel,Date.now()-L),!$){m.kind==="pdf"&&(f.documents_unreadable+=1,(f.unreadable_files??=[]).length<500&&f.unreadable_files.push(m.rel)),I(m.rel,m.kind==="pdf"?"document":"image",m.format,v);continue}let x=f.documents_by_engine??={};x.ocr=(x.ocr??0)+1,(f.ocr_files??=[]).length<500&&f.ocr_files.push(m.rel),m.kind==="pdf"&&(f.documents_extracted+=1),a+=1,m.row.read+=1,e.onFileChecked?.(m.rel,!0),Re(m.rel,m.name,m.ext,$,null),T&&(f.documents_truncated+=1,I(m.rel,"document",m.format,"only its first pages were read by OCR (the page cap): the rest were not read; raise NODATA_OCR_MAX_PAGES or scan it on its own"))}}finally{d&&!("error"in d)&&await d.ocr.close()}}let le=new Map;for(let d of i.values())if(!(d.size<2))for(let w of d){let g=le.get(w)??new Set;for(let m of d)m!==w&&g.add(m);le.set(w,g)}for(let d of n){let w=le.get(d.relative_path);if(!w||d.finding_kind!=="pii_unencrypted"||!["israeli_id","credit_card","iban"].includes(d.finding_subkind??""))continue;let g=[...w].sort();d.remediation_hint=`${d.remediation_hint??""} The same value also appears in ${g.length} other file${g.length===1?"":"s"}: ${g.slice(0,5).join(", ")}${g.length>5?` \u2026 +${g.length-5}`:""} \u2014 likely one real person copied across files.`.trim()}for(let d of r.groups()){let w=hr(d);for(let g of d.files)K(g,"secret_reuse",d.encryption?"critical":"high",d.encryption?"shared_encryption_key":d.names.length>1?"shared_secret":"copied_secret",w)}return{target_id:e.target_id,target_label:e.target_label,target_path:e.target_path,files_walked:o,files_inspected:a,duration_ms:Date.now()-t,findings:n,inventory:s,coverage:f}}var dn={info(){}};var rl=Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=","base64");var To=["Put the new key where the app reads it (for a developer machine: the NoData vault + nodata_run, not a .env file).","Check that the app still works with the new key.","Only then delete / revoke the OLD key \u2014 until you do, whoever copied it can still use it."],U=(e,t,n)=>({provider:e,url:t,steps:[...n,...To]}),gl={"aws-access-key":U("AWS","https://console.aws.amazon.com/iam/home#/security_credentials",["Open IAM \u2192 your user \u2192 Security credentials.","Create a NEW access key (you see its secret once \u2014 keep it only in the vault)."]),"aws-secret-key":U("AWS","https://console.aws.amazon.com/iam/home#/security_credentials",["Open IAM \u2192 your user \u2192 Security credentials.","Create a NEW access key (you see its secret once \u2014 keep it only in the vault).","Mark the old key Inactive before deleting it."]),"gcp-api-key":U("Google Cloud","https://console.cloud.google.com/apis/credentials",["Open APIs & Services \u2192 Credentials.","Pick the key \u2192 Regenerate key (or create a new one and restrict it to the APIs you use)."]),"gcp-service-account":U("Google Cloud (service account)","https://console.cloud.google.com/iam-admin/serviceaccounts",["Open IAM & Admin \u2192 Service accounts \u2192 the account \u2192 Keys.","Add key \u2192 Create new key (JSON). Keep the file out of Git and out of shared folders."]),"firebase-key":U("Firebase / Google Cloud","https://console.cloud.google.com/apis/credentials",["A Firebase web key is meant to be public \u2014 restrict it instead: Credentials \u2192 the key \u2192 Application restrictions (your domains only).","If it is not a web key, regenerate it."]),"github-token":U("GitHub","https://github.com/settings/tokens",["Open Settings \u2192 Developer settings \u2192 Personal access tokens.","Generate a new token with only the scopes you need."]),"github-fine-grained":U("GitHub","https://github.com/settings/tokens?type=beta",["Open Fine-grained tokens.","Regenerate the token (or create a new one for only the repositories you need)."]),"gitlab-token":U("GitLab","https://gitlab.com/-/user_settings/personal_access_tokens",["Open Access tokens.","Create a new token with only the scopes you need."]),"stripe-secret":U("Stripe","https://dashboard.stripe.com/apikeys",["Open Developers \u2192 API keys.","Roll the secret key (Stripe can keep the old one alive for a short overlap)."]),"stripe-restricted":U("Stripe","https://dashboard.stripe.com/apikeys",["Open Developers \u2192 API keys \u2192 Restricted keys.","Roll the key, or create a new restricted key."]),"slack-token":U("Slack","https://api.slack.com/apps",["Open your app \u2192 OAuth & Permissions.","Rotate / reinstall to get a new token."]),"slack-webhook":U("Slack","https://api.slack.com/apps",["Open your app \u2192 Incoming Webhooks.","Add a new webhook URL for the channel."]),"twilio-api-key":U("Twilio","https://console.twilio.com/us1/account/keys-credentials/api-keys",["Open Account \u2192 API keys & tokens.","Create a new API key."]),"sendgrid-api-key":U("SendGrid","https://app.sendgrid.com/settings/api_keys",["Open Settings \u2192 API Keys.","Create a new key with only the permissions you need."]),"openai-key":U("OpenAI","https://platform.openai.com/api-keys",["Open API keys.","Create a new secret key."]),"openai-project-key":U("OpenAI","https://platform.openai.com/api-keys",["Open API keys (per project).","Create a new secret key for the same project."]),"anthropic-key":U("Anthropic","https://console.anthropic.com/settings/keys",["Open Settings \u2192 API keys.","Create a new key."]),"supabase-key":U("Supabase","https://supabase.com/dashboard/project/_/settings/api-keys",["Open the project \u2192 Project Settings \u2192 API Keys.","Create a new SECRET key (a service_role / secret key bypasses every database rule \u2014 treat it like a root password).","Older projects with JWT keys: rotating the JWT secret replaces every key and signs everyone out \u2014 plan it."]),"supabase-access-token":U("Supabase (personal access token \u2014 reaches every project of the account)","https://supabase.com/dashboard/account/tokens",["Open Account \u2192 Access Tokens.","Revoke this token, then generate a new one only where it is needed (CLI, MCP) \u2014 prefer a read-only MCP."]),"supabase-secret-key":U("Supabase","https://supabase.com/dashboard/project/_/settings/api-keys",["Open the project \u2192 Project Settings \u2192 API Keys.","Create a new secret key, switch your servers to it, then delete this one."]),"postgres-uri":U("PostgreSQL (the password in the connection string)","https://supabase.com/dashboard/project/_/settings/database",["Change the database user's password: in Supabase \u2192 Project Settings \u2192 Database \u2192 Reset password; elsewhere, your host's console or ALTER USER \u2026 WITH PASSWORD.","Update the connection string with the new password."]),"mongodb-uri":U("MongoDB","https://cloud.mongodb.com/",["Open Atlas \u2192 Database Access \u2192 the user \u2192 Edit \u2192 Edit password.","Update the connection string."]),"redis-uri":U("Redis","",["Reset the password in your Redis host's console (or CONFIG SET requirepass on your own server).","Update the connection string."]),"private-key":U("Private key (SSH / TLS / signing)","",["Generate a new key pair.","Register the new PUBLIC key where the old one was trusted (server authorized_keys, certificate, service settings)."]),"jwt-secret":U("Your app's JWT secret","",["Set a new long random secret in the app's configuration.","Every signed-in user will be signed out \u2014 plan the moment."]),"password-in-code":U("A password in code","",["Change the password in the system it belongs to."]),"bearer-token":U("An access token","",["Revoke the token in the service that issued it and issue a new one."])},yl=U("A credential","",["Find the service it belongs to and issue a new credential there."]);var _l=768*1024*1024;var Ro=8*1024*1024;var Lo=[{type:"id_number",patterns:[/\b\d{9}\b/g,/ת\.?ז\.?\s*:?\s*(\d{9})/g,/זהות\s*:?\s*(\d{9})/g],confidence:.9,replacement:()=>"[\u05EA.\u05D6. \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"phone",patterns:[/\b0[2-9]\d[\s\-]?\d{7}\b/g,/\b05[0-9][\s\-]?\d{7}\b/g,/\+972[\s\-]?[2-9]\d[\s\-]?\d{7}\b/g],confidence:.95,replacement:()=>"[\u05D8\u05DC\u05E4\u05D5\u05DF \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"email",patterns:[/[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}/g],confidence:.99,replacement:e=>{let[,t]=e.split("@");return`[\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC: ***@${t}]`}},{type:"full_name",patterns:[/(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק)[:\s]+([א-ת][א-ת"'\-\s]{2,30}?)(?=[,\n\d]|ת\.ז)/g,/(?:עו"ד|ד"ר|פרופ'|מר|גברת)\s+([א-ת][א-ת"'\-\s]{2,25}?)(?=[,\n])/g],confidence:.75,replacement:()=>"[\u05E9\u05DD \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"bank_account",patterns:[/\b\d{2}[\-]\d{5,9}[\-]\d{2,3}\b/g,/(?:חשבון|ח-ן)\s*:?\s*(\d[\d\-]{8,15})/g],confidence:.88,replacement:()=>"[\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"medical",patterns:[/(?<![א-ת])[בהוכלמש]{0,2}(?:סוכרת|יתר לחץ דם|אסתמה|דיכאון|חרדה|סרטן|אי ספיקת לב|אפילפסיה)(?![א-ת])/g,/\b(?:Metformin|Lisinopril|Atorvastatin|Amlodipine|Sertraline|Fluoxetine|Omeprazole|Warfarin|Aspirin|Insulin)\b/gi,/\bHbA1c\s*:?\s*[\d.]+%?/g,/\bBMI\s*:?\s*[\d.]+/g,/(?<![א-ת])[בהוכלמש]{0,2}אבחנ[הות]\s*:?\s*[^,\n.]{2,40}/g,/\b(?:Diagnosis|diagnosed\s+with)\s*:?\s*[^,\n.]{2,40}/gi,/\b(?:(?:type\s*[12]\s+)?diabetes(?:\s+mellitus)?|hypertension|asthma|epilepsy|schizophrenia|bipolar\s+disorder|HIV|hepatitis(?:\s+[A-C]\b)?|heart\s+failure|COPD|multiple\s+sclerosis|Crohn'?s\s+disease)\b/gi,/(?<![א-ת])[בהוכלמש]{0,2}(?:אינסולין|מטפורמין|אספירין|קומדין|אומפרדקס|פרוזק|ציפרלקס|אטורבסטטין|אמלודיפין)(?![א-ת])/g],confidence:.85,replacement:()=>"[\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"financial_amount",patterns:[/[\d,]+(?:\.\d{2})?\s*(?:₪|ש"ח|NIS|שקל(?:ים)?)/g,/(?:₪|NIS)\s*[\d,]+(?:\.\d{2})?/g],confidence:.92,replacement:()=>"[\u05E1\u05DB\u05D5\u05DD \u05DB\u05E1\u05E4\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"birth_date",patterns:[/(?:תאריך לידה|נולד|נולדה|ד\.ל\.)\s*:?\s*\d{1,2}[\/\.\-]\d{1,2}[\/\.\-]\d{2,4}/g,/(?<![א-ת])[בהוכלמש]{0,2}גיל\s*:?\s*\d{1,3}\b/g],confidence:.88,replacement:()=>"[\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4 \u05DE\u05D5\u05E1\u05EA\u05E8]"},{type:"address",patterns:[/רחוב\s+[א-ת][א-ת\s"'\-]{2,30}\s+\d{1,5}/g,/(?:רח'|רח\.)\s+[א-ת][א-ת\s"'\-]{2,30}\d{1,5}/g],confidence:.72,replacement:()=>"[\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"},{type:"license_plate",patterns:[/\b\d{2,3}[\-]\d{2,3}[\-]\d{2,3}\b/g],confidence:.8,replacement:()=>"[\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9 \u05DE\u05D5\u05E1\u05EA\u05E8\u05EA]"}];function Co(e){if(e.length!==9)return!1;let t=e.split("").map(Number),n=0;for(let r=0;r<9;r++){let i=t[r]*(r%2===0?1:2);i>9&&(i-=9),n+=i}return n%10===0}var Te=class{constructor(t){this.enabledTypes=new Set(t)}detect(t){let n=[],r=new Set;for(let s of Lo)if(this.enabledTypes.has(s.type))for(let o of s.patterns){let a=new RegExp(o.source,o.flags),c;for(;(c=a.exec(t))!==null;){let l=c[0],p=`${s.type}:${c.index}`;if(!r.has(p)){if(r.add(p),s.type==="id_number"){let u=l.replace(/\D/g,"");if(/^\d{9}$/.test(l)&&u.length===9&&!Co(u))continue}n.push({type:s.type,value:l,startIndex:c.index,endIndex:c.index+l.length,confidence:s.confidence,replacement:s.replacement(l,s.type)})}}}n.sort((s,o)=>s.startIndex-o.startIndex||o.confidence-s.confidence);let i=[];for(let s of n)i.some(a=>s.startIndex<a.endIndex&&s.endIndex>a.startIndex)||i.push(s);return i}};var Z=["GDPR","CPRA","PPL"],Po=["GDPR-9","CPRA","PPL"],Oo=[{id:"person_name",type:"name",sensitivity:"high",regulations:[...Z],en:["firstname","lastname","fname","lname","middle name","maiden name","birth name","preferred name","display name","nickname","surname","given name","full name"],he:["\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0","\u05DB\u05D9\u05E0\u05D5\u05D9","\u05E9\u05DD \u05E0\u05E2\u05D5\u05E8\u05D9\u05DD"],ar:["\u0627\u0644\u0627\u0633\u0645","\u0627\u0633\u0645 \u0627\u0644\u0639\u0627\u0626\u0644\u0629","\u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0643\u0627\u0645\u0644"],ru:["\u0438\u043C\u044F","\u0444\u0430\u043C\u0438\u043B\u0438\u044F","\u043E\u0442\u0447\u0435\u0441\u0442\u0432\u043E","\u0444\u0438\u043E"]},{id:"birth_place",type:"location",sensitivity:"medium",regulations:[...Z],en:["birth place","birthplace","place of birth"],he:["\u05DE\u05E7\u05D5\u05DD \u05DC\u05D9\u05D3\u05D4","\u05D0\u05E8\u05E5 \u05DC\u05D9\u05D3\u05D4"],ar:["\u0645\u0643\u0627\u0646 \u0627\u0644\u0645\u064A\u0644\u0627\u062F"],ru:["\u043C\u0435\u0441\u0442\u043E \u0440\u043E\u0436\u0434\u0435\u043D\u0438\u044F"]},{id:"citizenship",type:"sensitive_personal",sensitivity:"high",regulations:[...Z],en:["citizenship","nationality"],he:["\u05D0\u05D6\u05E8\u05D7\u05D5\u05EA","\u05DC\u05D0\u05D5\u05DD"],ar:["\u0627\u0644\u062C\u0646\u0633\u064A\u0629"],ru:["\u0433\u0440\u0430\u0436\u0434\u0430\u043D\u0441\u0442\u0432\u043E"]},{id:"marital_status",type:"sensitive_personal",sensitivity:"high",regulations:[...Z],en:["marital status"],he:["\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9"],ar:["\u0627\u0644\u062D\u0627\u0644\u0629 \u0627\u0644\u0627\u062C\u062A\u0645\u0627\u0639\u064A\u0629"],ru:["\u0441\u0435\u043C\u0435\u0439\u043D\u043E\u0435 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435"]},{id:"government_id",type:"id",sensitivity:"critical",regulations:[...Z],en:["ssn","national id","passport","driver license","drivers license","tax id","social security","national insurance","military id","voter id","resident id","residence permit","visa number"],he:["\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7 \u05DC\u05D0\u05D5\u05DE\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D0\u05D9\u05E9\u05D9","\u05DE\u05E1\u05E4\u05E8 \u05D5\u05D9\u05D6\u05D4","\u05EA\u05E2\u05D5\u05D3\u05EA \u05EA\u05D5\u05E9\u05D1","\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05E1\u05E7"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0647\u0648\u064A\u0629","\u062C\u0648\u0627\u0632 \u0627\u0644\u0633\u0641\u0631","\u0631\u062E\u0635\u0629 \u0627\u0644\u0642\u064A\u0627\u062F\u0629"],ru:["\u043F\u0430\u0441\u043F\u043E\u0440\u0442","\u0441\u043D\u0438\u043B\u0441","\u0438\u043D\u043D","\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0443\u0434\u043E\u0441\u0442\u043E\u0432\u0435\u0440\u0435\u043D\u0438\u0435"]},{id:"institution_person_id",type:"tracking",sensitivity:"medium",regulations:[...Z],en:["employee id","employee number","employee no","student id","student number","user id","userid","customer id","customer number","customer no","client id","member id","subscriber id","participant id","profile id","person id","person uuid","lead id","crm contact","account id"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E2\u05D5\u05D1\u05D3","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D8\u05D5\u05D3\u05E0\u05D8","\u05DE\u05E1\u05E4\u05E8 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05D6\u05D4\u05D4 \u05DC\u05E7\u05D5\u05D7","\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E0\u05D5\u05D9","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05E9\u05EA\u05DE\u05E9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0648\u0638\u0641","\u0631\u0642\u0645 \u0627\u0644\u0639\u0645\u064A\u0644"],ru:["\u0442\u0430\u0431\u0435\u043B\u044C\u043D\u044B\u0439 \u043D\u043E\u043C\u0435\u0440","\u043D\u043E\u043C\u0435\u0440 \u043A\u043B\u0438\u0435\u043D\u0442\u0430"]},{id:"patient_id",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["patient id","patient number","mrn","medical record number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D8\u05D5\u05E4\u05DC","\u05DE\u05E1\u05E4\u05E8 \u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9"],ar:["\u0631\u0642\u0645 \u0627\u0644\u0645\u0631\u064A\u0636"],ru:["\u043D\u043E\u043C\u0435\u0440 \u043F\u0430\u0446\u0438\u0435\u043D\u0442\u0430"]},{id:"email",type:"email",sensitivity:"high",regulations:[...Z],en:["emailaddress","e mail","recovery email","contact email"],he:["\u05D3\u05D5\u05D0\u05DC","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"],ar:["\u0627\u0644\u0628\u0631\u064A\u062F \u0627\u0644\u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A"],ru:["\u043F\u043E\u0447\u0442\u0430","\u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430\u044F \u043F\u043E\u0447\u0442\u0430","email"]},{id:"phone",type:"phone",sensitivity:"high",regulations:[...Z],en:["cellphone","contact number","work phone","home phone","whatsapp","recovery phone","telephone"],he:["\u05D8\u05DC\u05E4\u05D5\u05DF \u05D1\u05D9\u05EA","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D5\u05D5\u05D8\u05E1\u05D0\u05E4","\u05DE\u05E1\u05E4\u05E8 \u05E0\u05D9\u05D9\u05D3"],ar:["\u0647\u0627\u062A\u0641","\u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062A\u0641","\u062C\u0648\u0627\u0644"],ru:["\u0442\u0435\u043B\u0435\u0444\u043E\u043D","\u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u0439"]},{id:"social_handle",type:"tracking",sensitivity:"medium",regulations:[...Z],en:["telegram","linkedin","facebook","twitter","instagram","tiktok","social profile"],he:["\u05D8\u05DC\u05D2\u05E8\u05DD","\u05DC\u05D9\u05E0\u05E7\u05D3\u05D0\u05D9\u05DF","\u05E4\u05D9\u05D9\u05E1\u05D1\u05D5\u05E7","\u05D0\u05D9\u05E0\u05E1\u05D8\u05D2\u05E8\u05DD"]},{id:"address",type:"address",sensitivity:"high",regulations:[...Z],en:["house number","apartment","apt","billing address","shipping address","postal code","zip code","postcode","street"],he:["\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05EA","\u05D3\u05D9\u05E8\u05D4","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05DE\u05E9\u05DC\u05D5\u05D7","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DC\u05D7\u05D9\u05D5\u05D1","\u05EA.\u05D3","\u05EA\u05D0 \u05D3\u05D5\u05D0\u05E8"],ar:["\u0627\u0644\u0639\u0646\u0648\u0627\u0646","\u0627\u0644\u0634\u0627\u0631\u0639","\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A"],ru:["\u0430\u0434\u0440\u0435\u0441","\u0443\u043B\u0438\u0446\u0430","\u0438\u043D\u0434\u0435\u043A\u0441","\u043A\u0432\u0430\u0440\u0442\u0438\u0440\u0430"]},{id:"geo",type:"location",sensitivity:"high",regulations:[...Z],en:["geo location","geolocation","latitude","longitude","coordinates","home location","current location"],he:["\u05DE\u05D9\u05E7\u05D5\u05DD","\u05E7\u05D5\u05D0\u05D5\u05E8\u05D3\u05D9\u05E0\u05D8\u05D5\u05EA"],ar:["\u0627\u0644\u0645\u0648\u0642\u0639"],ru:["\u043C\u0435\u0441\u0442\u043E\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u043A\u043E\u043E\u0440\u0434\u0438\u043D\u0430\u0442\u044B"]},{id:"bank_card",type:"financial",sensitivity:"critical",regulations:[...Z],en:["bank account","iban","swift","bic","routing number","credit card","creditcard","card number","cvv","card expiry","cc exp","paypal","wallet address","crypto wallet","bitcoin address"],he:["\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05D0\u05E8\u05E0\u05E7 \u05E7\u05E8\u05D9\u05E4\u05D8\u05D5","\u05D0\u05E8\u05E0\u05E7 \u05D3\u05D9\u05D2\u05D9\u05D8\u05DC\u05D9"],ar:["\u062D\u0633\u0627\u0628 \u0628\u0646\u0643\u064A","\u0631\u0642\u0645 \u0627\u0644\u062D\u0633\u0627\u0628","\u0628\u0637\u0627\u0642\u0629 \u0627\u0626\u062A\u0645\u0627\u0646"],ru:["\u0440\u0430\u0441\u0447\u0435\u0442\u043D\u044B\u0439 \u0441\u0447\u0435\u0442","\u043D\u043E\u043C\u0435\u0440 \u0441\u0447\u0435\u0442\u0430","\u043D\u043E\u043C\u0435\u0440 \u043A\u0430\u0440\u0442\u044B","\u043A\u0440\u0435\u0434\u0438\u0442\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430"]},{id:"income_tax",type:"financial",sensitivity:"high",regulations:[...Z],en:["salary","income","wage","tax record","tax return","payment history","credit score","net worth","salary grade"],he:["\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4","\u05EA\u05DC\u05D5\u05E9 \u05E9\u05DB\u05E8","\u05D3\u05D5\u05D7 \u05DE\u05E1","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05EA\u05E9\u05DC\u05D5\u05DE\u05D9\u05DD","\u05D3\u05D9\u05E8\u05D5\u05D2 \u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05D5\u05D5\u05D9 \u05E0\u05E7\u05D9","\u05D3\u05E8\u05D2\u05EA \u05E9\u05DB\u05E8"],ar:["\u0627\u0644\u0631\u0627\u062A\u0628","\u0627\u0644\u062F\u062E\u0644"],ru:["\u0437\u0430\u0440\u043F\u043B\u0430\u0442\u0430","\u0434\u043E\u0445\u043E\u0434"]},{id:"assets",type:"financial",sensitivity:"high",regulations:[...Z],en:["property id","land record","ownership record","title deed","holdings"],he:["\u05D2\u05D5\u05E9 \u05D7\u05DC\u05E7\u05D4","\u05E0\u05E1\u05D7 \u05D8\u05D0\u05D1\u05D5","\u05E8\u05D9\u05E9\u05D5\u05DD \u05DE\u05E7\u05E8\u05E7\u05E2\u05D9\u05DF","\u05D1\u05E2\u05DC\u05D5\u05EA","\u05D0\u05D7\u05D6\u05E7\u05D5\u05EA"],ru:["\u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0441\u0442\u044C","\u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u044C"]},{id:"vehicle",type:"tracking",sensitivity:"medium",regulations:[...Z],en:["vin","vehicle id","license plate","registration number","plate number"],he:["\u05DE\u05E1\u05E4\u05E8 \u05E9\u05DC\u05D3\u05D4","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1","\u05DC\u05D5\u05D7\u05D9\u05EA \u05E8\u05D9\u05E9\u05D5\u05D9"],ru:["\u043D\u043E\u043C\u0435\u0440 \u0430\u0432\u0442\u043E\u043C\u043E\u0431\u0438\u043B\u044F","vin"]},{id:"health",type:"medical",sensitivity:"critical",regulations:["GDPR-9","HIPAA","PPL"],en:["medical record","health condition","health data","lab result","lab results","vaccination","mental health","hospitalization","hospitalisation","disability","insurance number","diagnosis","allergy","prescription","medication","blood type"],he:["\u05EA\u05D9\u05E7 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05DE\u05E2\u05D1\u05D3\u05D4","\u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05D1\u05D3\u05D9\u05E7\u05D4","\u05D7\u05D9\u05E1\u05D5\u05E0\u05D9\u05DD","\u05D1\u05E8\u05D9\u05D0\u05D5\u05EA \u05E0\u05E4\u05E9","\u05D0\u05E9\u05E4\u05D5\u05D6","\u05E0\u05DB\u05D5\u05EA","\u05DE\u05E6\u05D1 \u05D1\u05E8\u05D9\u05D0\u05D5\u05EA\u05D9"],ar:["\u0627\u0644\u062A\u0634\u062E\u064A\u0635","\u0627\u0644\u0633\u062C\u0644 \u0627\u0644\u0637\u0628\u064A","\u0627\u0644\u0623\u062F\u0648\u064A\u0629"],ru:["\u0434\u0438\u0430\u0433\u043D\u043E\u0437","\u043C\u0435\u0434\u0438\u0446\u0438\u043D\u0441\u043A\u0430\u044F \u043A\u0430\u0440\u0442\u0430","\u0430\u043D\u0430\u043B\u0438\u0437\u044B"]},{id:"biometric",type:"biometric",sensitivity:"critical",regulations:["GDPR-9","CPRA","PPL"],en:["face embedding","face scan","iris scan","retina scan","voice print","voiceprint","voice signature","hand geometry","biometric template","biometric data","dna","genetic data","genome"],he:["\u05D8\u05D1\u05D9\u05E2\u05EA \u05E7\u05D5\u05DC","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E4\u05E0\u05D9\u05DD","\u05E1\u05E8\u05D9\u05E7\u05EA \u05E7\u05E9\u05EA\u05D9\u05EA","\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05D2\u05E0\u05D8\u05D9\u05D9\u05DD",'\u05D3\u05E0"\u05D0'],ar:["\u0628\u0635\u0645\u0629"],ru:["\u0431\u0438\u043E\u043C\u0435\u0442\u0440\u0438\u044F","\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A"]},{id:"employment",type:"employment",sensitivity:"medium",regulations:[...Z],en:["employer","job title","employment status","hire date","start date of employment","termination date","performance review","disciplinary"],he:["\u05DE\u05E2\u05E1\u05D9\u05E7","\u05DE\u05E7\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05E4\u05E7\u05D9\u05D3 \u05D4\u05E2\u05D5\u05D1\u05D3","\u05EA\u05D0\u05E8\u05D9\u05DA \u05EA\u05D7\u05D9\u05DC\u05EA \u05E2\u05D1\u05D5\u05D3\u05D4","\u05EA\u05D0\u05E8\u05D9\u05DA \u05E1\u05D9\u05D5\u05DD \u05E2\u05D1\u05D5\u05D3\u05D4","\u05D4\u05E2\u05E8\u05DB\u05EA \u05D1\u05D9\u05E6\u05D5\u05E2\u05D9\u05DD","\u05E9\u05D9\u05DE\u05D5\u05E2"],ar:["\u062C\u0647\u0629 \u0627\u0644\u0639\u0645\u0644","\u0627\u0644\u0645\u0633\u0645\u0649 \u0627\u0644\u0648\u0638\u064A\u0641\u064A"],ru:["\u0440\u0430\u0431\u043E\u0442\u043E\u0434\u0430\u0442\u0435\u043B\u044C","\u0434\u043E\u043B\u0436\u043D\u043E\u0441\u0442\u044C"]},{id:"manager",type:"name",sensitivity:"medium",regulations:[...Z],en:["manager","supervisor"],he:["\u05DE\u05E0\u05D4\u05DC \u05D9\u05E9\u05D9\u05E8"]},{id:"education",type:"education",sensitivity:"medium",regulations:[...Z],en:["school","university","college","degree","transcript","education history","gpa"],he:["\u05D1\u05D9\u05EA \u05E1\u05E4\u05E8","\u05D0\u05D5\u05E0\u05D9\u05D1\u05E8\u05E1\u05D9\u05D8\u05D4","\u05DE\u05DB\u05DC\u05DC\u05D4","\u05D2\u05D9\u05DC\u05D9\u05D5\u05DF \u05E6\u05D9\u05D5\u05E0\u05D9\u05DD","\u05D4\u05E9\u05DB\u05DC\u05D4","\u05EA\u05D5\u05D0\u05E8 \u05D0\u05E7\u05D3\u05DE\u05D9"],ar:["\u0627\u0644\u062C\u0627\u0645\u0639\u0629","\u0627\u0644\u0645\u062F\u0631\u0633\u0629"],ru:["\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435","\u0443\u043D\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442"]},{id:"device_online",type:"tracking",sensitivity:"medium",regulations:[...Z],en:["ip","ipaddress","ip address","mac address","device id","deviceid","advertising id","idfa","gaid","android id","apple id","cookie id","cookieid","browser fingerprint","user agent","imei"],he:["\u05DB\u05EA\u05D5\u05D1\u05EA ip","\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"],ru:["ip \u0430\u0434\u0440\u0435\u0441"]},{id:"account",type:"tracking",sensitivity:"medium",regulations:[...Z],en:["username","user name","login","screen name"],he:["\u05E9\u05DD \u05DE\u05E9\u05EA\u05DE\u05E9"],ru:["\u043B\u043E\u0433\u0438\u043D"]},{id:"credential",type:"auth",sensitivity:"critical",regulations:[...Z],en:["password","password hash","mfa secret","otp secret","security question","security answer","session id","session token","api key"],he:["\u05E1\u05D9\u05E1\u05DE\u05D4","\u05E1\u05D9\u05E1\u05DE\u05D0","\u05E9\u05D0\u05DC\u05EA \u05D0\u05D1\u05D8\u05D7\u05D4"],ar:["\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631"],ru:["\u043F\u0430\u0440\u043E\u043B\u044C"]},{id:"behavior",type:"behavior",sensitivity:"high",regulations:[...Z],en:["purchase history","search history","browsing history","clickstream","usage pattern","behavior profile","behaviour profile"],he:["\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05E8\u05DB\u05D9\u05E9\u05D5\u05EA","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D7\u05D9\u05E4\u05D5\u05E9","\u05D4\u05D9\u05E1\u05D8\u05D5\u05E8\u05D9\u05D9\u05EA \u05D2\u05DC\u05D9\u05E9\u05D4","\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA"]},{id:"special_category",type:"sensitive_personal",sensitivity:"critical",regulations:[...Po],en:["race","ethnicity","religion","political opinion","political party","union membership","trade union","sexual orientation","gender identity","criminal record"],he:["\u05D2\u05D6\u05E2","\u05D3\u05EA","\u05D4\u05E9\u05E7\u05E4\u05D4 \u05E4\u05D5\u05DC\u05D9\u05D8\u05D9\u05EA","\u05D7\u05D1\u05E8\u05D5\u05EA \u05D1\u05D0\u05D9\u05D2\u05D5\u05D3","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA","\u05D6\u05D4\u05D5\u05EA \u05DE\u05D2\u05D3\u05E8\u05D9\u05EA","\u05E8\u05D9\u05E9\u05D5\u05DD \u05E4\u05DC\u05D9\u05DC\u05D9"],ar:["\u0627\u0644\u062F\u064A\u0627\u0646\u0629","\u0627\u0644\u0639\u0631\u0642"],ru:["\u0440\u0435\u043B\u0438\u0433\u0438\u044F","\u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C"]},{id:"family_names",type:"name",sensitivity:"high",regulations:[...Z],en:["mother name","father name","spouse","partner name","emergency contact","next of kin","family member","guardian","beneficiary"],he:["\u05E9\u05DD \u05D4\u05D0\u05DD","\u05E9\u05DD \u05D4\u05D0\u05D1","\u05D1\u05DF \u05D6\u05D5\u05D2","\u05D1\u05EA \u05D6\u05D5\u05D2","\u05D0\u05D9\u05E9 \u05E7\u05E9\u05E8 \u05DC\u05D7\u05D9\u05E8\u05D5\u05DD","\u05E7\u05E8\u05D5\u05D1 \u05DE\u05E9\u05E4\u05D7\u05D4","\u05D0\u05E4\u05D5\u05D8\u05E8\u05D5\u05E4\u05D5\u05E1","\u05DE\u05D5\u05D8\u05D1"],ar:["\u0627\u0633\u0645 \u0627\u0644\u0623\u0645","\u0627\u0633\u0645 \u0627\u0644\u0623\u0628","\u0627\u0644\u0632\u0648\u062C"],ru:["\u0441\u0443\u043F\u0440\u0443\u0433","\u043E\u043F\u0435\u043A\u0443\u043D"]},{id:"children",type:"minor_data",sensitivity:"critical",regulations:[...Z],en:["children","child name","dependents","dependants"],he:["\u05D9\u05DC\u05D3\u05D9\u05DD","\u05E9\u05DE\u05D5\u05EA \u05D4\u05D9\u05DC\u05D3\u05D9\u05DD"],ar:["\u0627\u0644\u0623\u0637\u0641\u0627\u0644"],ru:["\u0434\u0435\u0442\u0438"]}];function Do(e){return e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim()}function $r(){return Oo.map(e=>{let t=[...e.en,...e.he??[],...e.ar??[],...e.ru??[]].map(Do).filter(Boolean);return{type:e.type,tokens:t.filter(n=>!n.includes(" ")),phrases:t.filter(n=>n.includes(" "))}})}var No=[{pattern:/^(?:שם|שם_מלא|שם פרטי|שם_פרטי|שם משפחה|שם_משפחה|שם_אדם|שם הלקוח|שם_הלקוח|שם בן זוג|שם בן_זוג|שם המבוטח|שם_המבוטח|שם המוטב|שם_המוטב|שם מבוטח|שם_מבוטח|שם מוטב|שם_מוטב|שם הילד|שם_הילד|שם הקטין|שם_הקטין|firstname_he|lastname_he|shem|shem_mishpacha|shem_prati)$/i,type:"name",label:"Person name (Hebrew)",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(?:ת"ז|ת\.ז|ת ז|תז|תעודת זהות|תעודת_זהות|מספר זהות|מספר_זהות|מס' זהות|מס_זהות|מס' ת"ז|teudat_zehut|tz|t_z|israeli_id|il_id)$/i,type:"id",label:"Israeli ID",labelHe:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA"},{pattern:/^(?:דרכון|מספר דרכון|מס דרכון|רישיון נהיגה|רישיון_נהיגה|רשיון נהיגה|מס רישיון|דרכון_מספר)$/i,type:"id",label:"Passport / DL (Hebrew)",labelHe:"\u05D3\u05E8\u05DB\u05D5\u05DF/\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF"},{pattern:/^(?:מייל|דוא"ל|דוא_ל|דואר אלקטרוני|דואר_אלקטרוני|אימייל|כתובת מייל|כתובת_מייל|כתובת דואר|כתובת_דואר)$/i,type:"email",label:"Email (Hebrew)",labelHe:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9"},{pattern:/^(?:טלפון|טל'|נייד|פלאפון|סלולרי|מספר טלפון|מספר_טלפון|טלפון נייד|טלפון_נייד|מס נייד|מס_נייד|מס' טל)$/i,type:"phone",label:"Phone (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(?:כתובת|כתובת מגורים|כתובת_מגורים|רחוב|מס בית|מספר בית|עיר|ישוב|יישוב|מיקוד|כתובת מלאה|כתובת_מלאה|מען)$/i,type:"address",label:"Address (Hebrew)",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(?:תאריך לידה|תאריך_לידה|ת לידה|תאריך הולדת|תאריך_הולדת|יום הולדת|יום_הולדת|גיל)$/i,type:"dob",label:"Date of birth (Hebrew)",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(?:חשבון בנק|חשבון_בנק|מספר חשבון|מספר_חשבון|מס חשבון|מס' חשבון|בנק|סניף|מס סניף|iban|iban_il)$/i,type:"financial",label:"Bank account (Hebrew)",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(?:כרטיס אשראי|כרטיס_אשראי|מספר אשראי|מס אשראי|מס' אשראי|cvv|אשראי|מס כרטיס|מס_כרטיס)$/i,type:"financial",label:"Credit card (Hebrew)",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(?:שכר|משכורת|הכנסה|פרמיה|שכר ברוטו|שכר_ברוטו|שכר נטו|שכר_נטו|תגמול|בונוס|פיצוי)$/i,type:"financial",label:"Salary / income (Hebrew)",labelHe:"\u05E9\u05DB\u05E8/\u05D4\u05DB\u05E0\u05E1\u05D4"},{pattern:/^(?:אבחון|אבחנה|מחלה|תרופה|מרשם|בדיקה רפואית|בדיקה_רפואית|מצב רפואי|מצב_רפואי|חיסון|תוצאת בדיקה|תוצאת_בדיקה|רופא|רגישות|אלרגיה|סוג דם|סוג_דם)$/i,type:"medical",label:"Medical (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(?:מספר פוליסה|מספר_פוליסה|מס פוליסה|מס' פוליסה|פוליסה|מספר חבר|מספר_חבר|מס חבר|מספר ביטוח|מספר_ביטוח|policy_?number|policy_?no|policy_?id)$/i,type:"policy",label:"Insurance policy number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"},{pattern:/^(?:מספר סוכן|מספר_סוכן|מס סוכן|מס' סוכן|מס_סוכן|קוד סוכן|קוד_סוכן|מספר משווק|מספר_משווק|מספר יצרן|סוכן ביטוח|agent_?number|agent_?no|agent_?id|agent_?code|broker_?id|broker_?number)$/i,type:"agent_id",label:"Insurance agent / broker number (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"},{pattern:/^(?:שם הילד|שם_הילד|תעודת זהות של ילד|ילדים|קטין|מספר ילדים|מספר_ילדים|תעודת לידה|ת לידה ילד)$/i,type:"minor_data",label:"Minor data (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF"},{pattern:/^(?:דת|לאום|מין|נטייה מינית|נטייה_מינית|השקפה פוליטית|השקפה_פוליטית|מצב משפחתי|מצב_משפחתי|עדה|מוצא)$/i,type:"sensitive_personal",label:"Sensitive personal (Hebrew)",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(?:מספר רכב|מספר_רכב|מס רכב|מס' רכב|לוחית רישוי|לוחית_רישוי|מספר רישוי|מספר_רישוי)$/i,type:"tracking",label:"Vehicle ID (Hebrew)",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"}];function Ke(e){let t=String(e??"").replace(/\D/g,"");if(t.length===0||t.length>9)return!1;let n=t.padStart(9,"0"),r=0;for(let i=0;i<9;i++){let s=parseInt(n[i]??"0",10)*(i%2+1);s>9&&(s-=9),r+=s}return r%10===0&&parseInt(n,10)>0}var vt=/(?<!\d)(?<!\d[.,])(?:\+972[\s-]?|0)(?:5[0-9]|7[0-9]|[2-4]|[89])(?:[\s-]?\d){7}(?!\d)(?![.,]\d)/g,kt=/(?<!:\/\/[^\s/@]*)[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi;var fn=/\b[A-Z]{2}\d{2}(?: ?[A-Z0-9]{4}){2,7}(?: ?[A-Z0-9]{1,4})?\b/g;function Rr(e){let t=String(e??"").replace(/\s/g,"").toUpperCase();if(!/^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$/.test(t))return!1;let n=t.slice(4)+t.slice(0,4),r=0;for(let i of n){let s=i>="A"&&i<="Z"?String(i.charCodeAt(0)-55):i;for(let o of s)r=(r*10+Number(o))%97}return r===1}function Lr(e){let t=String(e??"").replace(/\D/g,"");if(t.length<13||t.length>19||!/^[2-6]/.test(t))return!1;let n=0,r=!1;for(let i=t.length-1;i>=0;i--){let s=t.charCodeAt(i)-48;if(s<0||s>9)return!1;r&&(s*=2,s>9&&(s-=9)),n+=s,r=!r}return n%10===0}function Cr(e){if(!e)return null;let t=e.trim();for(let n of No)if(n.pattern.test(t))return{type:n.type,label:n.label,labelHe:n.labelHe};return null}var Fo=[{type:"biometric",tokens:["biometric","fingerprint","\u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"],phrases:["face id","\u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2"]},{type:"medical",tokens:["diagnosis","medical","disease","medication","prescription","allergy","vaccine","\u05D0\u05D1\u05D7\u05D5\u05DF","\u05D0\u05D1\u05D7\u05E0\u05D4","\u05DE\u05D7\u05DC\u05D4","\u05EA\u05E8\u05D5\u05E4\u05D4","\u05DE\u05E8\u05E9\u05DD","\u05D7\u05D9\u05E1\u05D5\u05DF","\u05D0\u05DC\u05E8\u05D2\u05D9\u05D4"],phrases:["medical record","blood type","\u05DE\u05E6\u05D1 \u05E8\u05E4\u05D5\u05D0\u05D9","\u05E1\u05D5\u05D2 \u05D3\u05DD"]},{type:"sensitive_personal",tokens:["religion","ethnicity","nationality","\u05D3\u05EA","\u05DC\u05D0\u05D5\u05DD","\u05E2\u05D3\u05D4","\u05DE\u05D5\u05E6\u05D0"],phrases:["sexual orientation","marital status","\u05DE\u05E6\u05D1 \u05DE\u05E9\u05E4\u05D7\u05EA\u05D9","\u05E0\u05D8\u05D9\u05D9\u05D4 \u05DE\u05D9\u05E0\u05D9\u05EA"]},{type:"minor_data",tokens:["minor","\u05E7\u05D8\u05D9\u05DF"],phrases:["child name","\u05E9\u05DD \u05D4\u05D9\u05DC\u05D3","\u05E9\u05DD \u05D4\u05E7\u05D8\u05D9\u05DF"]},{type:"id",tokens:["ssn","passport","\u05D6\u05D4\u05D5\u05EA","\u05D3\u05E8\u05DB\u05D5\u05DF"],phrases:["national id","id number","identity number","social security","driver license","driving license","drivers license","passport number","tax id","\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA","\u05DE\u05E1\u05E4\u05E8 \u05D6\u05D4\u05D5\u05EA","\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"]},{type:"financial",tokens:["iban","swift","bic","salary","income","wage","\u05D0\u05E9\u05E8\u05D0\u05D9","\u05E9\u05DB\u05E8","\u05DE\u05E9\u05DB\u05D5\u05E8\u05EA","\u05D4\u05DB\u05E0\u05E1\u05D4"],phrases:["bank account","account number","credit card","card number","routing number","sort code","\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7","\u05DE\u05E1\u05E4\u05E8 \u05D7\u05E9\u05D1\u05D5\u05DF","\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"]},{type:"policy",tokens:["policy","\u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"],phrases:["policy number","member number","\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4"]},{type:"agent_id",tokens:["\u05DE\u05E9\u05D5\u05D5\u05E7"],phrases:["agent number","agent code","broker id","\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF"]},{type:"dob",tokens:["dob","birthdate","birthday","\u05DC\u05D9\u05D3\u05D4","\u05D4\u05D5\u05DC\u05D3\u05EA","\u05D2\u05D9\u05DC"],phrases:["date of birth","birth date","\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"]},{type:"phone",tokens:["phone","tel","mobile","cell","fax","\u05D8\u05DC\u05E4\u05D5\u05DF","\u05E0\u05D9\u05D9\u05D3","\u05E4\u05DC\u05D0\u05E4\u05D5\u05DF","\u05E1\u05DC\u05D5\u05DC\u05E8\u05D9"],phrases:["phone number","mobile number","cell phone","\u05D8\u05DC\u05E4\u05D5\u05DF \u05E0\u05D9\u05D9\u05D3"]},{type:"email",tokens:["email","mail","\u05D0\u05D9\u05DE\u05D9\u05D9\u05DC","\u05DE\u05D9\u05D9\u05DC","\u05D3\u05D5\u05D0\u05DC"],phrases:["email address","e mail","\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D9\u05D9\u05DC"]},{type:"address",tokens:["address","street","city","zipcode","zip","postcode","\u05DB\u05EA\u05D5\u05D1\u05EA","\u05E8\u05D7\u05D5\u05D1","\u05E2\u05D9\u05E8","\u05D9\u05E9\u05D5\u05D1","\u05D9\u05D9\u05E9\u05D5\u05D1","\u05DE\u05D9\u05E7\u05D5\u05D3","\u05DE\u05E2\u05DF"],phrases:["home address","postal code","street address","zip code","\u05DB\u05EA\u05D5\u05D1\u05EA \u05DE\u05D2\u05D5\u05E8\u05D9\u05DD"]},{type:"location",tokens:["gps","latitude","longitude","geolocation","\u05DE\u05D9\u05E7\u05D5\u05DD"],phrases:["gps coordinates"]},{type:"tracking",tokens:["plate","vehicle","\u05E8\u05DB\u05D1","\u05E8\u05D9\u05E9\u05D5\u05D9"],phrases:["license plate","vehicle number","plate number","\u05DE\u05E1\u05E4\u05E8 \u05E8\u05DB\u05D1"]},...$r(),{type:"name",tokens:["name","\u05E9\u05DD"],phrases:["first name","last name","full name","family name","given name","surname","\u05E9\u05DD \u05E4\u05E8\u05D8\u05D9","\u05E9\u05DD \u05DE\u05E9\u05E4\u05D7\u05D4","\u05E9\u05DD \u05DE\u05DC\u05D0"]}];function St(e){if(!e||/^\[[A-Z_]+(?:-\d+)?\]$/.test(e.trim()))return null;let t=e.trim().toLowerCase().replace(/["'`׳״]/g,"").replace(/[_\-.]+/g," ").replace(/\s+/g," ").trim();if(!t)return null;let n=new Set(t.match(/[\p{L}\p{N}]+/gu)??[]);for(let r of Fo)if(r.phrases?.some(s=>t.includes(s))||r.tokens?.some(s=>n.has(s)))return{type:r.type,label:r.type,labelHe:Et(r.type)};return null}function Et(e){return{id:"\u05EA\u05E2\u05D5\u05D3\u05EA \u05D6\u05D4\u05D5\u05EA",agent_id:"\u05DE\u05E1\u05E4\u05E8 \u05E1\u05D5\u05DB\u05DF",employment:"\u05E4\u05E8\u05D8\u05D9 \u05EA\u05E2\u05E1\u05D5\u05E7\u05D4",education:"\u05D4\u05E9\u05DB\u05DC\u05D4",behavior:"\u05E4\u05E8\u05D5\u05E4\u05D9\u05DC \u05D4\u05EA\u05E0\u05D4\u05D2\u05D5\u05EA",policy:"\u05DE\u05E1\u05E4\u05E8 \u05E4\u05D5\u05DC\u05D9\u05E1\u05D4",name:"\u05E9\u05DD \u05D0\u05D3\u05DD",email:"\u05D3\u05D5\u05D0\u05E8 \u05D0\u05DC\u05E7\u05D8\u05E8\u05D5\u05E0\u05D9",phone:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF",address:"\u05DB\u05EA\u05D5\u05D1\u05EA",dob:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4",financial:"\u05E4\u05E8\u05D8\u05D9\u05DD \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9\u05D9\u05DD",medical:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9",minor_data:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05DF",sensitive_personal:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9",biometric:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9",auth:"\u05E1\u05D9\u05E1\u05DE\u05D0\u05D5\u05EA/\u05E1\u05D5\u05D3\u05D5\u05EA",tracking:"\u05DE\u05D6\u05D4\u05D9 \u05DE\u05E2\u05E7\u05D1",location:"\u05DE\u05D9\u05E7\u05D5\u05DD"}[e]??"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9"}var Mo=/^(?:\d{5,9}|\d{8}-\d)$/;function Pr(e){let t=0,n=0,r=0,i=0,s=0;for(let a of e)typeof a=="string"&&(Mo.test(a.trim())&&Ke(a)&&t++,vt.lastIndex=0,vt.test(a)&&n++,kt.lastIndex=0,kt.test(a)&&r++,fn.lastIndex=0,[...a.matchAll(fn)].some(c=>Rr(c[0]))&&i++,Lr(a)&&s++);let o=e.length||1;return t/o>=.3?{type:"id",label:"Israeli ID (sniffed)",matchedSample:t}:i/o>=.3?{type:"financial",label:"IBAN-IL (sniffed)",matchedSample:i}:n/o>=.3?{type:"phone",label:"IL phone (sniffed)",matchedSample:n}:r/o>=.3?{type:"email",label:"Email (sniffed)",matchedSample:r}:s/o>=.3?{type:"financial",label:"Credit card (sniffed)",matchedSample:s}:null}var jo=[{type:"full_name",kind:"name",severity:"medium",hint:`A person's name in free text (after a role word such as \u05DC\u05E7\u05D5\u05D7 / \u05DE\u05E8 / \u05E2\u05D5"\u05D3, or Client: / Mr.).`},{type:"bank_account",kind:"bank_account",severity:"high",hint:"An Israeli bank account number (branch-account-check form) in plaintext."},{type:"medical",kind:"medical",severity:"high",hint:"Medical information (diagnosis, medication, lab value) in plaintext."},{type:"birth_date",kind:"dob",severity:"medium",hint:"A date of birth in plaintext."},{type:"address",kind:"address",severity:"medium",hint:"A street address in plaintext."},{type:"license_plate",kind:"plate",severity:"low",hint:"A vehicle licence plate in plaintext."}],Ho=/^(?:לקוח|מטופל|מועמד|שם|נהג|מבוטח|תובע|נתבע|שוכר|מחזיק|עו"ד|ד"ר|פרופ'|מר|גברת|חשבון|ח-ן|[בהוכלמש]{0,2}אבחנ[הות]|תאריך לידה|נולד|נולדה|ד\.ל\.|[בהוכלמש]{0,2}גיל|[Dd]iagnosis|[Dd]iagnosed\s+with)\s*:?\s*/;function Bo(e,t,n,r){if(r==="address")return{start:t,end:n};let i=Ho.exec(e.slice(t,n));return i&&t+i[0].length<n?{start:t+i[0].length,end:n}:{start:t,end:n}}function ne(e,t,n=()=>!0){let r=[],i=new RegExp(e.source,e.flags.includes("g")?e.flags:e.flags+"g");for(let s of t.matchAll(i)){let o=s[1];if(!o||!n(o))continue;let a=(s.index??0)+s[0].indexOf(o);r.push({start:a,end:a+o.length})}return r}var Or=String.raw`[A-Z][a-z']+(?:-[A-Z]?[a-z']+)*`,pn=String.raw`${Or}(?:[ \t]+${Or}){0,2}`,Uo=new RegExp(String.raw`\b(?:Mr|Mrs|Ms|Miss|Dr|Prof)\.?[ \t]+(${pn})`),zo=new RegExp(String.raw`\b(?:Client|Customer|Patient|Name|Full name|Beneficiary|Insured|Applicant|Tenant|Employee|Holder|Investor)[ \t]*:[ \t]*(${pn})`),Wo=new RegExp(String.raw`\b(${pn})(?=,[ \t]*\d{1,3}[ \t]*,|[ \t]*\(\d{1,3}\))`,"g"),Vo=/^(?:Figure|Fig|Table|Step|Section|Chapter|Page|Shot|Scene|Part|Item|Note|Appendix|Version|Level|Phase|Round|Room|Floor|Line|Act|Episode|Season|Slide|Clip|Take)$/,Xo=/\b(\d{1,5}[ \t]+(?:[A-Z][A-Za-z'-]*[ \t]+){1,3}(?:Street|St|Road|Rd|Avenue|Ave|Boulevard|Blvd|Lane|Ln|Drive|Way|Court|Ct|Place|Pl)\b\.?)/,Zo=/\b(?:policy|claim|account|member|customer|client|contract|case|reference|ref|company|registration)[ \t]+(?:number|no\.?|num\.?|#)[ \t]*:?[ \t]*([A-Z]{0,4}-?\d[\d-]{3,}\d[A-Z]?)\b/i,Go=String.raw`\d{1,2}[\/\-.]\d{1,2}[\/\-.]\d{2,4}|\d{4}[\/\-.]\d{1,2}[\/\-.]\d{1,2}|\d{1,2}\s+[A-Z][a-z]{2,8}\s+\d{4}|[A-Z][a-z]{2,8}\s+\d{1,2},?\s+\d{4}`,Ko=new RegExp(String.raw`\b(?:date\s+of\s+birth|birth\s*date|d\.?o\.?b\.?|born(?:\s+on)?)\s*[:\-]?\s*(${Go})`,"i"),Jo=/\b((?!000|666|9\d\d)\d{3}-(?!00)\d{2}-(?!0000)\d{4})\b/,Yo=/\b((?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\s?\d{2}\s?\d{2}\s?\d{2}\s?[A-D])\b/,qo=/(?<![\w+])(\+(?!972)[1-9][\d\s().-]{7,20}\d)/,Dr=e=>e.replace(/\D/g,"").length,Qo=String.raw`(?:(?<![א-ת])ת["'׳״]?\.?ז\.?|תעודת[\s_]?זהות|מספר[\s_]?זהות|מס['׳]?[\s_]?זהות|\bID[ \t]*(?:No\.?|Number|#)|\bnational[ \t]+ID|\bidentity[ \t]+(?:No\.?|number)|\bteudat[\s_]?zehut)`,ea=new RegExp(String.raw`${Qo}[ \t]*[:#.\-]?[ \t]*(\d[\d \t-]{6,10}\d)(?![\d-])`,"i"),ta=e=>{let t=e.replace(/\D/g,"");return t.length!==8&&t.length!==9||/^\d{9}$/.test(e)||/^\d{8}-\d$/.test(e)?!1:Ke(t)},na=/(?:(?<![א-ת])דרכון|\bpassport(?:[ \t]*(?:No\.?|Number|#))?)[ \t]*[:#.\-]?[ \t]*([A-Z]{0,2}\d{6,9})(?![\dA-Z])/i,ra=[{kind:"name",severity:"medium",hint:"A person's name in free text (after Mr. / Dr. / Client: \u2026, or with an age beside it).",find:e=>[...ne(Uo,e),...ne(zo,e),...ne(Wo,e,t=>!t.split(/[ \t]/).some(n=>Vo.test(n)))]},{kind:"address",severity:"medium",hint:"A street address in plaintext.",find:e=>ne(Xo,e)},{kind:"reference",severity:"medium",hint:"A policy, claim, account or company number in plaintext.",find:e=>ne(Zo,e)},{kind:"dob",severity:"medium",hint:"A date of birth in plaintext.",find:e=>ne(Ko,e)},{kind:"national_id",severity:"high",hint:"A national ID number (an Israeli ID after its word, US SSN, UK NINO) in plaintext.",find:e=>[...ne(Jo,e),...ne(Yo,e),...ne(ea,e,ta)]},{kind:"passport",severity:"high",hint:"A passport number, after the word that announces it, in plaintext.",find:e=>ne(na,e)},{kind:"phone",severity:"high",hint:"A phone number in international form in plaintext.",find:e=>ne(qo,e,t=>Dr(t)>=8&&Dr(t)<=15)}];function ia(e){let t=new Map;for(let n of e){let r=t.get(n.kind);t.set(n.kind,r?{...r,find:i=>[...r.find(i),...n.find(i)]}:n)}return[...t.values()]}function Nr(){let e=jo.map(({type:t,kind:n,severity:r,hint:i})=>{let s=new Te([t]);return{kind:n,severity:r,hint:i,find:o=>s.detect(o).map(a=>Bo(o,a.startIndex,a.endIndex,n))}});return ia([...e,...ra])}var $e={_comment:"CANONICAL secret ruleset \u2014 the SINGLE SOURCE OF TRUTH for hardcoded-secret detection, loaded by BOTH the web scanner (lib/soc/exposure-map.ts) and the installed Capsule agent (apps/desktop/src-tauri/src/scanner.rs, via include_str!). Patterns are written in the regex subset both JavaScript and the Rust `regex` crate accept (no lookaround, no backreferences). A connection string counts only WITH credentials (user:pass@). Edit here once and both engines stay aligned.",rules:[{id:"aws-access-key",subkind:"aws_access_key",name:"AWS Access Key",severity:"critical",pattern:"(?:^|[^A-Z0-9])AKIA(?!X{16})[A-Z2-7]{16}(?:[^A-Z2-7]|$)",hint:"AWS access key id detected. Rotate via IAM and move to an environment variable."},{id:"aws-secret-key",subkind:"aws_secret_key",name:"AWS Secret Key",severity:"critical",pattern:`(?:aws_secret_access_key|aws_secret_key|secret_access_key)\\s*[=:]\\s*['"]?[A-Za-z0-9/+=]{40}['"]?`,hint:"AWS secret access key detected. Rotate immediately."},{id:"gcp-api-key",subkind:"gcp_api_key",name:"GCP API Key",severity:"critical",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Google API key detected. Restrict or rotate it in the Google Cloud console."},{id:"gcp-service-account",subkind:"gcp_service_account",name:"GCP Service Account",severity:"critical",pattern:'"type"\\s*:\\s*"service_account"',hint:"GCP service-account JSON detected. Move it out of the repo and rotate the key."},{id:"github-token",subkind:"github_token",name:"GitHub Token",severity:"critical",pattern:"gh[pousr]_[0-9a-zA-Z]{36,}",hint:"GitHub token detected. Revoke at https://github.com/settings/tokens."},{id:"github-fine-grained",subkind:"github_fine_grained_token",name:"GitHub Fine-Grained Token",severity:"critical",pattern:"github_pat_[0-9a-zA-Z_]{22,}",hint:"GitHub fine-grained token detected. Revoke it in GitHub settings."},{id:"gitlab-token",subkind:"gitlab_token",name:"GitLab Token",severity:"critical",pattern:"glpat-[0-9a-zA-Z_-]{20,}",hint:"GitLab token detected. Revoke it in GitLab access tokens."},{id:"stripe-secret",subkind:"stripe_key",name:"Stripe Secret Key",severity:"critical",pattern:"sk_live_[0-9a-zA-Z]{24,}",hint:"Stripe live secret key detected. Roll it in the Stripe dashboard."},{id:"stripe-restricted",subkind:"stripe_restricted_key",name:"Stripe Restricted Key",severity:"critical",pattern:"rk_live_[0-9a-zA-Z]{24,}",hint:"Stripe restricted key detected. Roll it in the Stripe dashboard."},{id:"slack-token",subkind:"slack_token",name:"Slack Token",severity:"high",pattern:"xox[baprs]-[0-9a-zA-Z-]{10,}",hint:"Slack token detected. Revoke it in the Slack app settings."},{id:"slack-webhook",subkind:"slack_webhook",name:"Slack Webhook",severity:"high",pattern:"hooks\\.slack\\.com/services/T[0-9A-Z]{8,}/B[0-9A-Z]{8,}/[0-9a-zA-Z]{24}",hint:"Slack incoming-webhook URL detected. Regenerate it."},{id:"twilio-api-key",subkind:"twilio_api_key",name:"Twilio API Key",severity:"high",pattern:"SK[0-9a-fA-F]{32}",hint:"Twilio API key detected. Rotate it in the Twilio console."},{id:"sendgrid-api-key",subkind:"sendgrid_api_key",name:"SendGrid API Key",severity:"critical",pattern:"SG\\.[0-9a-zA-Z_-]{22}\\.[0-9a-zA-Z_-]{43}",hint:"SendGrid API key detected. Rotate it in the SendGrid console."},{id:"postgres-uri",subkind:"postgres_uri",name:"PostgreSQL Connection String",severity:"critical",pattern:`postgres(?:ql)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"PostgreSQL connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"mongodb-uri",subkind:"mongodb_uri",name:"MongoDB Connection String",severity:"critical",pattern:`mongodb(?:\\+srv)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"MongoDB connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"redis-uri",subkind:"redis_uri",name:"Redis Connection String",severity:"high",pattern:`redis(?:s)?://[^\\s'":/@]*:[^\\s'"@]+@[^\\s'"]+`,hint:"Redis connection string WITH credentials detected. Move it to a secret manager and rotate the password."},{id:"openai-key",subkind:"openai_key",name:"OpenAI API Key",severity:"critical",pattern:"sk-[0-9a-zA-Z]{20,}T3BlbkFJ[0-9a-zA-Z]{20,}",hint:"OpenAI API key detected. Rotate at https://platform.openai.com/api-keys."},{id:"anthropic-key",subkind:"anthropic_key",name:"Anthropic API Key",severity:"critical",pattern:"sk-ant-[0-9a-zA-Z_-]{40,}",hint:"Anthropic API key detected. Rotate at https://console.anthropic.com/."},{id:"firebase-key",subkind:"firebase_key",name:"Firebase API Key",severity:"high",pattern:"AIza[0-9A-Za-z_-]{35}",hint:"Firebase API key detected. Restrict it in the Firebase console."},{id:"supabase-key",subkind:"supabase_key",name:"Supabase Service Key",severity:"critical",pattern:"eyJ[0-9a-zA-Z_-]{100,}",hint:"Long JWT (possible Supabase service key) detected. Rotate it and keep it server-side only."},{id:"private-key",subkind:"private_key",name:"Private Key",severity:"critical",pattern:"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----",hint:"Private key material in plaintext. Rotate immediately and move to a key manager (KMS/Vault).",skipPlaceholder:!0},{id:"jwt-secret",subkind:"jwt_secret",name:"JWT/Generic Secret",severity:"high",pattern:`(?:jwt_secret|JWT_SECRET|secret_key|SECRET_KEY|api_secret|API_SECRET)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded signing/API secret detected. Move it to an environment variable and rotate it."},{id:"password-in-code",subkind:"password_in_code",name:"Password in Code",severity:"high",pattern:`(?:password|passwd|pwd)\\s*[=:]\\s*['"][^'"]{8,}['"]`,hint:"Hardcoded password detected. Move it to a secret manager and rotate it."},{id:"bearer-token",subkind:"bearer_token",name:"Bearer Token in Code",severity:"high",pattern:`['"]Bearer\\s+[0-9a-zA-Z._-]{20,}['"]`,hint:"Hardcoded bearer token detected. Move it to a secret manager and rotate it."},{id:"hex-secret-32",subkind:"hex_secret",name:"Hardcoded 32+ Hex Secret",severity:"medium",pattern:`['"][0-9a-f]{32,}['"]`,hint:"Long hex string that looks like a secret/hash. Confirm it is not a live credential."},{id:"base64-secret",subkind:"base64_secret",name:"Hardcoded Base64 Secret (long)",severity:"medium",pattern:`['"][A-Za-z0-9+/]{64,}={0,2}['"]`,hint:"Long base64 blob that looks like an embedded secret. Confirm it is not a live credential."}]};var aa=[{pattern:/^(full_?name|first_?name|last_?name|spouse_?name|beneficiary_?name)$/i,type:"name",label:"Person name",labelHe:"\u05E9\u05DD \u05D0\u05D3\u05DD"},{pattern:/^(email|e_?mail|email_?address)$/i,type:"email",label:"Email address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC"},{pattern:/^(phone|mobile|telephone|phone_?number|cell_?phone)$/i,type:"phone",label:"Phone number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D8\u05DC\u05E4\u05D5\u05DF"},{pattern:/^(id_?number|identity|ssn|social_?security|national_?id|teudat_?zehut)$/i,type:"id",label:"ID number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05D6\u05D4\u05D4"},{pattern:/^(address|street_?address|home_?address)$/i,type:"address",label:"Address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA"},{pattern:/^(date_?of_?birth|dob|birth_?date|birthday)$/i,type:"dob",label:"Date of birth",labelHe:"\u05EA\u05D0\u05E8\u05D9\u05DA \u05DC\u05D9\u05D3\u05D4"},{pattern:/^(bank_?account|iban|account_?number|bank_?details|routing_?number)$/i,type:"financial",label:"Bank account",labelHe:"\u05D7\u05E9\u05D1\u05D5\u05DF \u05D1\u05E0\u05E7"},{pattern:/^(credit_?card|card_?number|cvv|cc_?number)$/i,type:"financial",label:"Credit card",labelHe:"\u05DB\u05E8\u05D8\u05D9\u05E1 \u05D0\u05E9\u05E8\u05D0\u05D9"},{pattern:/^(salary|income|commission|premium|compensation)$/i,type:"financial",label:"Financial data",labelHe:"\u05E0\u05EA\u05D5\u05DF \u05E4\u05D9\u05E0\u05E0\u05E1\u05D9"},{pattern:/^(medical_?info|health_?conditions|diagnosis|medication)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(ip_?address)$/i,type:"tracking",label:"IP address",labelHe:"\u05DB\u05EA\u05D5\u05D1\u05EA IP"},{pattern:/^(passport|passport_?number|passport_?id)$/i,type:"id",label:"Passport number",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D3\u05E8\u05DB\u05D5\u05DF"},{pattern:/^(driver_?license|drivers_?license|dl_?number)$/i,type:"id",label:"Driver license",labelHe:"\u05E8\u05D9\u05E9\u05D9\u05D5\u05DF \u05E0\u05D4\u05D9\u05D2\u05D4"},{pattern:/^(iban|swift_?code|bic)$/i,type:"financial",label:"Banking code",labelHe:"\u05E7\u05D5\u05D3 \u05D1\u05E0\u05E7\u05D0\u05D9"},{pattern:/^(tax_?id|tin|vat_?number|ein)$/i,type:"financial",label:"Tax ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05DE\u05E1"},{pattern:/^(insurance_?number|policy_?number|member_?id)$/i,type:"id",label:"Insurance/Member ID",labelHe:"\u05DE\u05E1\u05E4\u05E8 \u05D1\u05D9\u05D8\u05D5\u05D7/\u05D7\u05D1\u05E8"},{pattern:/^(blood_?type|allergy|allergies|prescription)$/i,type:"medical",label:"Medical data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E8\u05E4\u05D5\u05D0\u05D9"},{pattern:/^(biometric|fingerprint|face_?id|retina)$/i,type:"biometric",label:"Biometric data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D1\u05D9\u05D5\u05DE\u05D8\u05E8\u05D9"},{pattern:/^(latitude|longitude|lat|lng|geo_?location|coordinates)$/i,type:"location",label:"Geolocation",labelHe:"\u05DE\u05D9\u05E7\u05D5\u05DD \u05D2\u05D9\u05D0\u05D5\u05D2\u05E8\u05E4\u05D9"},{pattern:/^(mac_?address|device_?fingerprint|imei|serial_?number)$/i,type:"tracking",label:"Device identifier",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05DE\u05DB\u05E9\u05D9\u05E8"},{pattern:/^(ethnicity|race|religion|political_?affiliation|sexual_?orientation)$/i,type:"sensitive_personal",label:"Sensitive personal",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05D0\u05D9\u05E9\u05D9 \u05E8\u05D2\u05D9\u05E9"},{pattern:/^(minor|child_?name|child_?age|dependent)$/i,type:"minor_data",label:"Minor data",labelHe:"\u05DE\u05D9\u05D3\u05E2 \u05E2\u05DC \u05E7\u05D8\u05D9\u05E0\u05D9\u05DD"},{pattern:/^(signature|digital_?signature)$/i,type:"id",label:"Signature",labelHe:"\u05D7\u05EA\u05D9\u05DE\u05D4"},{pattern:/^(vehicle_?number|license_?plate|plate_?number)$/i,type:"tracking",label:"Vehicle ID",labelHe:"\u05DE\u05D6\u05D4\u05D4 \u05E8\u05DB\u05D1"}],ca=/^(id|uuid|created_?at|updated_?at|deleted_?at|status|type|category|description|title|slug|url|path|key|value|sort_?order|position|enabled|active|public|version|metadata|config|settings|options|data|content|body|raw|json|text|note|comment|label|color|icon|image|avatar|logo|thumbnail|preview|template|schema|format|mode|level|priority|severity|source|target|parent|child|owner|creator|modifier|assignee|project|workspace|organization|team|group|channel|thread|room|session|device|platform|browser|locale|timezone|currency|country|region|city|zip|postal|state|province|name|display_?name|user_?agent|password_?hash|secret|token|private_?key|auth_?token|constraint|index|sequence|trigger|function|procedure|database|namespace|migration|revision)$/i,la=/^(beacon_?registr|device_?config|hardware|sensor|firmware|telemetry|metric|analytic|log_?event|audit_?log|system_?config|cache|queue|job|migration|schema_?version|spatial_?ref)/i,ua=/^(minor|major|uuid|rssi|tx_?power|beacon_?id|device_?type|firmware_?version|batch_?id|zone_?id)$/i;function Fr(e,t){if(ca.test(e)||/^name$/i.test(e)||t&&la.test(t)||ua.test(e))return null;for(let r of aa)if(r.pattern.test(e))return r.type;let n=Cr(e);return n?n.type:null}var Hu=$e.rules.map(e=>({id:e.id,name:e.name,pattern:new RegExp(e.pattern),severity:e.severity}));var Bu=512*1024,Uu=50*1024*1024;var da=new Set(["hex-secret-32","base64-secret"]),Yu=$e.rules.filter(e=>!da.has(e.id)).map(e=>new RegExp(e.pattern,"g"));var jr={id:"critical",agent_id:"high",policy:"high",financial:"critical",medical:"critical",sensitive_personal:"critical",minor_data:"critical",biometric:"critical",auth:"critical",name:"high",email:"high",phone:"high",address:"high",dob:"high",location:"high",tracking:"medium",employment:"high",education:"medium",behavior:"high"};function Hr(e){return jr[e]}function fa(e){return jr[e]??"low"}function Br(e,t){let n=[];for(let r of t){let i=r.rows.length;for(let s=0;s<r.headers.length;s++){let o=r.headers[s]??"",a=o?Fr(o.trim().replace(/["'`׳״:]/g,"").replace(/\s+/g,"_"),r.name)??St(o)?.type??null:null,c=[];for(let p of r.rows){let u=p[s];typeof u=="string"&&u.length>0&&c.push(u)}let l=c.length>0?Pr(c):null;l?n.push(Mr(e,r.name,o,l.type,l.label,"value",l.matchedSample,i)):a&&n.push(Mr(e,r.name,o,a,Et(a),"header",0,i))}}return n}function Mr(e,t,n,r,i,s,o,a){return{file:e,location:t,column:n,type:r,label:i,category:Et(r),severity:fa(r),matchKind:s,hits:o,sampleSize:a}}var pa=new Set(["hex-secret-32","base64-secret"]),ha=[/(?:[$€£]|USD|EUR|GBP)\s?\d[\d,]*(?:\.\d+)?/g,/\d[\d,]*(?:\.\d+)?\s?(?:[$€£]|USD|EUR|GBP|דולר|יורו)/g,/\b\d{1,3}(?:,\d{3})+(?:\.\d+)?\b/g];function ma(e){let t=new Te(["financial_amount"]);return{kind:"amount",severity:"medium",hint:"A money amount (the amounts dial is on: amounts are treated as sensitive here).",find:n=>{if(!e())return[];let r=t.detect(n).map(s=>({start:s.startIndex,end:s.endIndex}));for(let s of ha){s.lastIndex=0;for(let o of n.matchAll(s))r.push({start:o.index,end:o.index+o[0].length})}r.sort((s,o)=>s.start-o.start||o.end-s.end);let i=[];for(let s of r){let o=i[i.length-1];o&&s.start<o.end?o.end=Math.max(o.end,s.end):i.push({...s})}return i}}}function Ur(e={}){let t=e.amounts??(()=>!1),n=[...Nr(),ma(t)],r=$e.rules.filter(i=>!pa.has(i.id)).map(i=>({id:i.id,name:i.name,severity:i.severity,pattern:new RegExp(i.pattern)}));return{text:n,amounts:t,header:i=>{let s=St(i);return s?{type:s.type,label:s.labelHe||s.label}:null},secrets:r,table:i=>Br("",[i]).filter(s=>s.column).map(s=>({column:s.column,type:s.type,category:s.category,severity:s.severity,hits:s.hits,how:s.matchKind==="value"?"value":"header"})),severity:i=>Hr(i)}}import{existsSync as ga,mkdirSync as od,readFileSync as ya,writeFileSync as ad}from"node:fs";import{homedir as ba}from"node:os";import{join as _a}from"node:path";var zr=()=>_a(ba(),".nodata","prefs.json");function hn(){try{return ga(zr())&&JSON.parse(ya(zr(),"utf8")).amounts_sensitive===!0}catch{return!1}}var Wr=!1;function Vr(){Wr||(Wr=!0,Tt(Ur({amounts:hn})))}var xa=/[֑-ׇ]/g;function wa(e){return e.normalize("NFC").replace(xa,"").toLowerCase()}function va(e,t){if(!t)return 0;let n=0,r=e.indexOf(t);for(;r!==-1&&(n++,!(n>=1e5));)r=e.indexOf(t,r+t.length);return n}function Xr(e,t){if(!e||e.terms.length===0||!t)return[];let n=wa(t);if(!n)return[];let r=[];for(let i of e.terms){let s=va(n,i.needle);s>0&&r.push({term_id:i.id,label:i.label,tier:i.tier,access_class:i.access_class,...i.flag?{flag:i.flag}:{},hit_count:s})}return r}import{basename as ka,extname as Sa,isAbsolute as Sd,join as Ed,relative as Ad,resolve as Id}from"node:path";var Ea=["claude-code","cursor","windsurf","codex","gemini","vscode","claude-desktop"],mn=e=>typeof e=="string"&&e.trim()?e.trim().toLowerCase():void 0,Rd={action:{cardinality:"scalar",ops:["eq","ne","in","not_in"],enumValues:["read","search","run","write","browse","interact"],label:"what the agent does (read, search, run, write; on a site: browse, interact)",extract:e=>e.action},"time.hour":{cardinality:"scalar",ops:["between","gte","lte","eq"],label:"hour on this computer (0-23; 18..6 wraps overnight)",extract:e=>e.now.getHours()},"time.weekday":{cardinality:"scalar",ops:["in","not_in","between","eq"],label:"weekday on this computer (0 Sunday \u2026 6 Saturday)",extract:e=>e.now.getDay()},"file.ext":{cardinality:"scalar",ops:["eq","ne","in","not_in"],label:"file type (.xlsx, .pdf, .env \u2026)",extract:e=>Sa(e.path).toLowerCase()||void 0},"file.name":{cardinality:"scalar",ops:["eq","in","prefix"],label:"file name",extract:e=>ka(e.path).toLowerCase()},agent:{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:`which agent (${Ea.join(", ")} \u2026)`,extract:e=>mn(e.who?.host)},"agent.type":{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:"sub-agent type inside the agent (main = the main conversation; general-purpose, explore \u2026)",extract:e=>mn(e.who?.type)},org:{cardinality:"scalar",ops:["eq","ne","in","not_in"],agentScope:!0,label:"which organisation the agent works for (the one its folder is bound to)",extract:e=>mn(e.who?.org)}};function Zr(e){return t=>Xr(e,t).map(n=>({term_id:n.term_id,label:n.label,tier:n.tier,hit_count:n.hit_count}))}function Gr(e){return/\.ndc$/i.test(e)||/\.clean\.[A-Za-z0-9]+$/.test(e)||Aa(e)}function Aa(e){return/(^|[\\/])\.nodata[\\/]/.test(e)}console.log=console.error;console.info=console.error;Vr();At?.on("message",e=>{(async()=>{try{let t=new Set,n=new Set,i={r:await un({target_id:"mcp",target_label:e.label,target_path:e.target,log:dn,...e.max_files?{max_files:e.max_files}:{},...e.include_tool_dirs?{include_tool_dirs:!0}:{},...e.time_budget_ms?{time_budget_ms:e.time_budget_ms}:{},onProgress:({walked:s,read:o})=>At?.postMessage({type:"progress",walked:s,read:o}),onFileChecked:(s,o)=>(o?t:n).add(s.split("!/")[0]),skip_own_file:Gr,...e.lexicon?{lexicon:Zr(e.lexicon)}:{}}),readTop:[...t],notReadTop:[...n]};At?.postMessage({type:"done",value:i})}catch(t){At?.postMessage({type:"error",error:t instanceof Error?t.message:String(t)})}})()});