@privacyscrubber/mcp-server 2.3.8 → 2.3.9

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.
package/README.md CHANGED
@@ -443,7 +443,7 @@ Returns a visual dashboard showing your current tier, session request count, act
443
443
  * **Response Example (Free Tier):**
444
444
  ```
445
445
  ╔══════════════════════════════════════════════════╗
446
- ║ PrivacyScrubber MCP Server v2.3.7 ║
446
+ ║ PrivacyScrubber MCP Server v2.3.8 ║
447
447
  ╠══════════════════════════════════════════════════╣
448
448
  ║ 🔓 Tier: FREE ║
449
449
  ║ 📊 Session requests: 5 ║
package/index.js CHANGED
@@ -331,6 +331,118 @@ function buildCisoAuditTelemetry(currentTokenMap = {}) {
331
331
  };
332
332
  }
333
333
 
334
+ // ── PSR-2 Receipt Integrity (real SHA-256; parity with src/modules/receipt-integrity.js) ──
335
+ const PSR2_VERSION = 'PSR-2';
336
+ const PSR2_STATEMENTS = {
337
+ measured: [
338
+ 'Token Manifest SHA-256: digest of the sorted token labels held in this session (original values are never hashed or exported).',
339
+ 'Entity counts per type.',
340
+ 'Receipt SHA-256: digest of the canonical field string, so edits to this receipt are detectable.'
341
+ ],
342
+ byDesign: [
343
+ 'The sanitization engine runs locally in process memory and does not transmit prompt content. This is an architectural property and is not measured by this receipt.',
344
+ 'Token-to-original mappings are held in volatile memory for the session. This receipt does not record their contents.'
345
+ ],
346
+ limits: [
347
+ 'This receipt is not a digital signature and does not prove who generated it or when.',
348
+ 'No final output digest is recorded by this export (Output SHA-256: not recorded).',
349
+ 'Detection is pattern-based. Free-text narrative can contain indirect identifiers that remain after sanitization; review output before sharing.',
350
+ 'Regulatory references are informational technical-safeguard mappings, not a legal determination of compliance.'
351
+ ]
352
+ };
353
+ function psr2Sha256(input) {
354
+ return crypto.createHash('sha256').update(String(input == null ? '' : input), 'utf8').digest('hex');
355
+ }
356
+ function buildPsr2Receipt(tokenMap, timestamp = new Date().toISOString()) {
357
+ const labels = (tokenMap && typeof tokenMap === 'object' ? Object.keys(tokenMap) : []).slice().sort();
358
+ const counts = {};
359
+ for (const t of labels) {
360
+ const m = t.match(/\[([A-Z_]+)_\d+\]/);
361
+ const type = m ? m[1] : 'CUSTOM';
362
+ counts[type] = (counts[type] || 0) + 1;
363
+ }
364
+ const entityCounts = Object.keys(counts).sort().map(k => `${k}=${counts[k]}`).join(',') || 'none';
365
+ const manifestSha256 = psr2Sha256(labels.join('\n'));
366
+ const canonical = [PSR2_VERSION, timestamp, 'none', manifestSha256, entityCounts, 'na'].join('|');
367
+ return { version: PSR2_VERSION, timestamp, outputSha256: null, manifestSha256, entityCounts, tokensTotal: labels.length, tokensPresentInOutput: null, canonical, receiptSha256: psr2Sha256(canonical) };
368
+ }
369
+ function psr2Lines(r) {
370
+ return [
371
+ `Receipt Version: ${r.version}`,
372
+ `Timestamp (UTC): ${r.timestamp}`,
373
+ `Output SHA-256: not recorded`,
374
+ `Token Manifest SHA-256: ${r.manifestSha256}`,
375
+ `Entity Counts: ${r.entityCounts}`,
376
+ `Tokens In Final Output: not recorded`,
377
+ `Canonical: ${r.canonical}`,
378
+ `Receipt SHA-256: ${r.receiptSha256}`
379
+ ];
380
+ }
381
+ function formatPsr2Report({ format, receipt, telemetry, company_name, department, utmSource, utmMedium }) {
382
+ const entitySummary = Object.entries(telemetry.entities).map(([t, count]) => `[${t}]: ${count}`).join(', ') || 'None (Clean)';
383
+ const teamsUrl = `https://privacyscrubber.com/teams?tier=teams&utm_source=${utmSource}&utm_medium=${utmMedium}&utm_campaign=teams_upgrade`;
384
+ const sdkUrl = `https://privacyscrubber.com/sdk/?tier=sdk&utm_source=${utmSource}&utm_medium=${utmMedium}&utm_campaign=sdk_pipeline`;
385
+ if (format === 'json') {
386
+ return JSON.stringify({
387
+ protocol: 'Zero-Trust Data Sanitization (ZTDS)',
388
+ receipt_version: receipt.version,
389
+ company: company_name,
390
+ department,
391
+ timestamp: receipt.timestamp,
392
+ output_sha256: null,
393
+ token_manifest_sha256: receipt.manifestSha256,
394
+ entity_counts: receipt.entityCounts,
395
+ canonical: receipt.canonical,
396
+ receipt_sha256: receipt.receiptSha256,
397
+ risk_level: telemetry.riskLevel,
398
+ frameworks_referenced: telemetry.frameworksList,
399
+ total_masked_tokens: telemetry.totalCount,
400
+ entities_breakdown: telemetry.entities,
401
+ scope: { measured: PSR2_STATEMENTS.measured, by_design_not_measured: PSR2_STATEMENTS.byDesign, limits: PSR2_STATEMENTS.limits },
402
+ verification_url: 'https://privacyscrubber.com/features/audit-receipt/#verify',
403
+ licensing_and_governance: { teams_governance_url: teamsUrl, sdk_pipeline_url: sdkUrl }
404
+ }, null, 2);
405
+ }
406
+ if (format === 'summary') {
407
+ return `[PrivacyScrubber SHA-256 Receipt] ${receipt.version} | Receipt SHA-256: ${receipt.receiptSha256.substring(0, 16)}... | Organization: ${company_name} | Masked Tokens: ${telemetry.totalCount} | Risk: ${telemetry.riskLevel} | Frameworks (informational): ${telemetry.frameworksList.join(', ')}`;
408
+ }
409
+ return `# Zero-Trust Data Sanitization Receipt
410
+ **Organization:** ${company_name} (${department})
411
+ **Timestamp:** ${receipt.timestamp}
412
+ **Receipt Format:** ${receipt.version} (SHA-256 digests; not a digital signature)
413
+
414
+ ---
415
+
416
+ ### Sanitization Metrics & Risk Assessment
417
+ * **Overall Risk Rating:** **${telemetry.riskLevel}**
418
+ * **Total Sensitive Entities Masked:** \`${telemetry.totalCount}\`
419
+ * **Entity Breakdown:** ${entitySummary}
420
+
421
+ ### Informational Framework References
422
+ ${telemetry.frameworksList.map(f => `- ${f}`).join('\n')}
423
+
424
+ These are technical-safeguard mappings, not a legal determination of compliance.
425
+
426
+ ### Receipt Integrity (${receipt.version})
427
+ \`\`\`text
428
+ ${psr2Lines(receipt).join('\n')}
429
+ \`\`\`
430
+
431
+ ### Scope of This Receipt
432
+ **Measured:** ${PSR2_STATEMENTS.measured.join(' ')}
433
+
434
+ **Stated by design, not measured:** ${PSR2_STATEMENTS.byDesign.join(' ')}
435
+
436
+ **Limits:** ${PSR2_STATEMENTS.limits.join(' ')}
437
+
438
+ ### Enterprise & Team Governance
439
+ * **Team Governance & Encrypted Handoff:** Centrally deploy redaction rules and encrypted session handoff with **PrivacyScrubber TEAMS** ($99/mo flat): [privacyscrubber.com/teams](${teamsUrl})
440
+ * **Backend Microservices & RAG Pipelines:** Integrate in-memory sanitization (<1ms) into your Node.js/Python infrastructure with **Developer SDK** ($299/mo): [privacyscrubber.com/sdk](${sdkUrl})
441
+
442
+ *Generated locally by PrivacyScrubber Engine v${MCP_VERSION}*
443
+ *Verify locally (paste this receipt): https://privacyscrubber.com/features/audit-receipt/#verify*`;
444
+ }
445
+
334
446
  function formatAuditReceipt(telemetry, compact = false, wasTruncated = false, charLimit = 15000) {
335
447
  const isCompact = compact === true || process.env.PRIVACYSCRUBBER_COMPACT_RECEIPT === '1' || process.env.PRIVACYSCRUBBER_COMPACT_RECEIPT === 'true';
336
448
  const truncationLine = wasTruncated
@@ -360,7 +472,7 @@ function formatAuditReceipt(telemetry, compact = false, wasTruncated = false, ch
360
472
 
361
473
  const icon = telemetry.riskLevel.includes('CRITICAL') ? '🔴' : (telemetry.riskLevel.includes('MODERATE') ? '🟠' : '🟢');
362
474
 
363
- return `\n\n> 🛡️ **PrivacyScrubber Audit Receipt**\n> * **Risk Level:** ${icon} ${telemetry.riskLevel}\n> * **Compliance Enforced:** ${telemetry.frameworksList.join(', ')}\n> * **Tokens Masked:** ${telemetry.totalCount} (${entitiesList})\n${truncationLine}> * ⭐ **Star on GitHub:** [moxno/privacyscrubber-mcp](https://github.com/moxno/privacyscrubber-mcp) (\`gh repo star moxno/privacyscrubber-mcp\`) | **SDK & Enterprise:** [privacyscrubber.com/sdk](https://privacyscrubber.com/sdk/?tier=sdk&utm_source=mcp&utm_medium=audit_receipt&utm_campaign=sdk_pipeline)\n`;
475
+ return `\n\n> 🛡️ **PrivacyScrubber Audit Receipt**\n> * **Risk Level:** ${icon} ${telemetry.riskLevel}\n> * **Framework References (informational):** ${telemetry.frameworksList.join(', ')}\n> * **Tokens Masked:** ${telemetry.totalCount} (${entitiesList})\n${truncationLine}> * ⭐ **Star on GitHub:** [moxno/privacyscrubber-mcp](https://github.com/moxno/privacyscrubber-mcp) (\`gh repo star moxno/privacyscrubber-mcp\`) | **SDK & Enterprise:** [privacyscrubber.com/sdk](https://privacyscrubber.com/sdk/?tier=sdk&utm_source=mcp&utm_medium=audit_receipt&utm_campaign=sdk_pipeline)\n`;
364
476
  }
365
477
 
366
478
  function formatCefEvent(eventData = {}) {
@@ -461,7 +573,7 @@ function formatJsonlEvent(eventData = {}) {
461
573
  frameworks,
462
574
  session_hash: sessionHash,
463
575
  zero_egress: true,
464
- verification_mode: "100% Offline (In-Memory RAM)",
576
+ processing_mode: "local in-memory (by design, not measured)",
465
577
  ...(organization && { organization }),
466
578
  ...(department && { department }),
467
579
  ...(executionMs && { execution_ms: executionMs }),
@@ -2313,82 +2425,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
2313
2425
  const { format = "markdown", company_name = "PrivacyScrubber Client", department = "SecOps / Compliance" } = args || {};
2314
2426
  const telemetry = buildCisoAuditTelemetry(sessionMap);
2315
2427
 
2316
- const sessionHash = crypto.createHash('sha256')
2317
- .update(JSON.stringify(sessionMap) + Date.now().toString())
2318
- .digest('hex');
2319
-
2320
- const timestamp = new Date().toISOString();
2321
- const entitySummary = Object.entries(telemetry.entities)
2322
- .map(([t, count]) => `[${t}]: ${count}`)
2323
- .join(', ') || 'None (Clean)';
2324
-
2325
- if (format === "json") {
2326
- const jsonReport = {
2327
- protocol: "Zero-Trust Data Sanitization (ZTDS)",
2328
- certificate: `ZTDS-CERT-${sessionHash.substring(0, 16).toUpperCase()}`,
2329
- company: company_name,
2330
- department: department,
2331
- timestamp: timestamp,
2332
- session_hash: sessionHash,
2333
- verification_mode: "100% Offline (Local In-Memory RAM)",
2334
- compliance_status: "VERIFIED PASS",
2335
- risk_level: telemetry.riskLevel,
2336
- frameworks_enforced: telemetry.frameworksList,
2337
- total_masked_tokens: telemetry.totalCount,
2338
- entities_breakdown: telemetry.entities,
2339
- zero_egress_verified: true,
2340
- verification_url: `https://privacyscrubber.com/features/audit-receipt/#verify?hash=${sessionHash.substring(0, 16)}`,
2341
- licensing_and_governance: {
2342
- teams_governance_url: "https://privacyscrubber.com/teams?src=mcp_compliance_json",
2343
- sdk_pipeline_url: "https://privacyscrubber.com/sdk/?src=mcp_compliance_json"
2344
- }
2345
- };
2346
-
2347
- return {
2348
- content: [{ type: "text", text: JSON.stringify(jsonReport, null, 2) }]
2349
- };
2350
- }
2351
-
2352
- if (format === "summary") {
2353
- const summaryText = `[PrivacyScrubber Compliance Certificate] ID: ZTDS-${sessionHash.substring(0, 8).toUpperCase()} | Organization: ${company_name} | Masked Tokens: ${telemetry.totalCount} | Risk: ${telemetry.riskLevel} | Frameworks: ${telemetry.frameworksList.join(', ')} | Status: PASS (100% Air-Gapped)`;
2354
- return {
2355
- content: [{ type: "text", text: summaryText }]
2356
- };
2357
- }
2358
-
2359
- // Default: Comprehensive Markdown Certificate
2360
- const mdReport = `# 🛡️ Zero-Trust Data Sanitization Compliance Certificate
2361
- **Certificate ID:** \`ZTDS-CERT-${sessionHash.substring(0, 16).toUpperCase()}\`
2362
- **Organization:** ${company_name} (${department})
2363
- **Timestamp:** ${timestamp}
2364
- **Verification Mode:** 100% Local In-Memory Processing (Air-Gapped)
2365
- **Status:** **VERIFIED PASS** (Zero Network Egress)
2366
-
2367
- ---
2368
-
2369
- ### 📊 Sanitization Metrics & Risk Assessment
2370
- * **Overall Risk Rating:** **${telemetry.riskLevel}**
2371
- * **Total Sensitive Entities Masked:** \`${telemetry.totalCount}\`
2372
- * **Entity Breakdown:** ${entitySummary}
2373
- * **Network Data Transmitted:** \`0.00 KB (Zero-Trust Local RAM)\`
2374
-
2375
- ### 📜 Regulatory Frameworks Enforced
2376
- ${telemetry.frameworksList.map(f => `- **${f}**`).join('\n')}
2377
-
2378
- ### 🔒 CISO Compliance Declaration
2379
- 1. **EU AI Act (Art. 50) & GDPR (Art. 25 & 32):** Data minimization and local pseudonymization enforced prior to model interaction.
2380
- 2. **HIPAA Safe Harbor (§164.514) / SOC 2 Type II:** All direct and indirect identifiers sanitized locally without cloud processor liability.
2381
- 3. **Cryptographic Verification:** Tamper-evident session verification hash: \`${sessionHash}\`
2382
-
2383
- ### 🏢 Enterprise & Team Governance
2384
- * **Team Governance & Encrypted Handoff:** Centrally deploy redaction rules, audit logs, and zero-knowledge session handoff with **PrivacyScrubber TEAMS** ($99/mo flat): [privacyscrubber.com/teams](https://privacyscrubber.com/teams?src=mcp_compliance_report)
2385
- * **Backend Microservices & RAG Pipelines:** Integrate in-memory sanitization (<1ms) into your Node.js/Python infrastructure with **Developer SDK** ($299/mo): [privacyscrubber.com/sdk](https://privacyscrubber.com/sdk/?src=mcp_compliance_report)
2386
-
2387
- *Certified Offline by PrivacyScrubber Engine v${MCP_VERSION}*
2388
- *Verify at: https://privacyscrubber.com/features/audit-receipt/* | ⭐ *Star on GitHub: https://github.com/moxno/privacyscrubber-mcp*`;
2389
-
2428
+ const receipt = buildPsr2Receipt(sessionMap);
2390
2429
  return {
2391
- content: [{ type: "text", text: mdReport }]
2430
+ content: [{ type: "text", text: formatPsr2Report({ format, receipt, telemetry, company_name, department, utmSource: 'mcp_compliance_report', utmMedium: format === 'json' ? 'json' : 'markdown' }) }]
2392
2431
  };
2393
2432
  }
2394
2433
 
@@ -2971,11 +3010,9 @@ Before reading sensitive files, running terminal commands that may print credent
2971
3010
 
2972
3011
  const telemetry = buildCisoAuditTelemetry(targetSession);
2973
3012
 
2974
- const sessionHash = crypto.createHash('sha256')
2975
- .update(JSON.stringify(targetSession) + Date.now().toString())
2976
- .digest('hex');
2977
-
2978
3013
  const timestamp = new Date().toISOString();
3014
+ const receipt = buildPsr2Receipt(targetSession, timestamp);
3015
+ const sessionHash = receipt.receiptSha256;
2979
3016
 
2980
3017
  let outputText = "";
2981
3018
  const eventData = {
@@ -2996,60 +3033,8 @@ Before reading sensitive files, running terminal commands that may print credent
2996
3033
  outputText = formatCefEvent(eventData);
2997
3034
  } else if (format === "syslog") {
2998
3035
  outputText = formatSyslogEvent(eventData);
2999
- } else if (format === "json") {
3000
- outputText = JSON.stringify({
3001
- protocol: "Zero-Trust Data Sanitization (ZTDS)",
3002
- certificate: `ZTDS-CERT-${sessionHash.substring(0, 16).toUpperCase()}`,
3003
- company: company_name,
3004
- department,
3005
- timestamp,
3006
- session_hash: sessionHash,
3007
- verification_mode: "100% Offline (Local In-Memory RAM)",
3008
- compliance_status: "VERIFIED PASS",
3009
- risk_level: telemetry.riskLevel,
3010
- frameworks_enforced: telemetry.frameworksList,
3011
- total_masked_tokens: telemetry.totalCount,
3012
- entities_breakdown: telemetry.entities,
3013
- zero_egress_verified: true,
3014
- verification_url: `https://privacyscrubber.com/features/audit-receipt/#verify?hash=${sessionHash.substring(0, 16)}`,
3015
- licensing_and_governance: {
3016
- teams_governance_url: "https://privacyscrubber.com/teams?tier=teams&utm_source=mcp_audit_export&utm_medium=json&utm_campaign=teams_upgrade",
3017
- sdk_pipeline_url: "https://privacyscrubber.com/sdk/?tier=sdk&utm_source=mcp_audit_export&utm_medium=json&utm_campaign=sdk_pipeline"
3018
- }
3019
- }, null, 2);
3020
- } else if (format === "markdown") {
3021
- const entitySummary = Object.entries(telemetry.entities)
3022
- .map(([t, count]) => `[${t}]: ${count}`)
3023
- .join(', ') || 'None (Clean)';
3024
- outputText = `# 🛡️ Zero-Trust Data Sanitization Compliance Certificate
3025
- **Certificate ID:** \`ZTDS-CERT-${sessionHash.substring(0, 16).toUpperCase()}\`
3026
- **Organization:** ${company_name} (${department})
3027
- **Timestamp:** ${timestamp}
3028
- **Verification Mode:** 100% Local In-Memory Processing (Air-Gapped)
3029
- **Status:** **VERIFIED PASS** (Zero Network Egress)
3030
-
3031
- ---
3032
-
3033
- ### 📊 Sanitization Metrics & Risk Assessment
3034
- * **Overall Risk Rating:** **${telemetry.riskLevel}**
3035
- * **Total Sensitive Entities Masked:** \`${telemetry.totalCount}\`
3036
- * **Entity Breakdown:** ${entitySummary}
3037
- * **Network Data Transmitted:** \`0.00 KB (Zero-Trust Local RAM)\`
3038
-
3039
- ### 📜 Regulatory Frameworks Enforced
3040
- ${telemetry.frameworksList.map(f => `- **${f}**`).join('\n')}
3041
-
3042
- ### 🔒 CISO Compliance Declaration
3043
- 1. **EU AI Act (Art. 50) & GDPR (Art. 25 & 32):** Data minimization and local pseudonymization enforced prior to model interaction.
3044
- 2. **HIPAA Safe Harbor (§164.514) / SOC 2 Type II:** All direct and indirect identifiers sanitized locally without cloud processor liability.
3045
- 3. **Cryptographic Verification:** Tamper-evident session verification hash: \`${sessionHash}\`
3046
-
3047
- ### 🏢 Enterprise & Team Governance
3048
- * **Team Governance & Encrypted Handoff:** Centrally deploy redaction rules, audit logs, and zero-knowledge session handoff with **PrivacyScrubber TEAMS** ($99/mo flat): [privacyscrubber.com/teams](https://privacyscrubber.com/teams?tier=teams&utm_source=mcp_audit_export&utm_medium=markdown&utm_campaign=teams_upgrade)
3049
- * **Backend Microservices & RAG Pipelines:** Integrate in-memory sanitization (<1ms) into your Node.js/Python infrastructure with **Developer SDK** ($299/mo): [privacyscrubber.com/sdk](https://privacyscrubber.com/sdk/?tier=sdk&utm_source=mcp_audit_export&utm_medium=markdown&utm_campaign=sdk_pipeline)
3050
-
3051
- *Certified Offline by PrivacyScrubber Engine v${MCP_VERSION}*
3052
- *Verify at: https://privacyscrubber.com/features/audit-receipt/* | ⭐ *Star on GitHub: https://github.com/moxno/privacyscrubber-mcp*`;
3036
+ } else if (format === "json" || format === "markdown") {
3037
+ outputText = formatPsr2Report({ format, receipt, telemetry, company_name, department, utmSource: 'mcp_audit_export', utmMedium: format });
3053
3038
  } else {
3054
3039
  // Default: jsonl
3055
3040
  outputText = formatJsonlEvent(eventData);
package/manifest.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": "0.3",
3
3
  "name": "privacyscrubber/pii-masking-mcp",
4
- "version": "2.3.7",
4
+ "version": "2.3.9",
5
5
  "description": "CISO-Approved Zero-Trust PII & Secrets Redaction MCP Server for Cursor, Windsurf, and Claude Desktop. Prevent API leaks and comply with HIPAA/SOC 2 locally.",
6
6
  "author": {
7
7
  "name": "PrivacyScrubber",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@privacyscrubber/mcp-server",
3
- "version": "2.3.8",
3
+ "version": "2.3.9",
4
4
  "mcpName": "io.github.moxno/privacyscrubber-mcp",
5
5
  "description": "CISO-Approved Zero-Trust PII & Secrets Redaction MCP Server for Cursor, Windsurf, and Claude Desktop. Prevent API leaks and comply with HIPAA/SOC 2 locally.",
6
6
  "main": "index.js",
@@ -21,7 +21,6 @@
21
21
  "smithery.yaml",
22
22
  "server.json",
23
23
  "manifest.json",
24
- "bundle.mcpb",
25
24
  ".well-known"
26
25
  ],
27
26
  "bin": {
@@ -8,4 +8,4 @@
8
8
  * via any medium, is strictly prohibited. Protected by international copyright
9
9
  * laws and treaties.
10
10
  */
11
- function _0x31b8(_0x2f6d19,_0x2fefd1){_0x2f6d19=_0x2f6d19-0x1a1;const _0x25fd97=_0x25fd();let _0x31b8db=_0x25fd97[_0x2f6d19];if(_0x31b8['OlqvTu']===undefined){var _0x44bd40=function(_0x315d3c){const _0x2617b7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x162c86='',_0x4aca2e='';for(let _0xc6fbb0=0x0,_0x4a2d8d,_0x2c06f6,_0x8d6a2=0x0;_0x2c06f6=_0x315d3c['charAt'](_0x8d6a2++);~_0x2c06f6&&(_0x4a2d8d=_0xc6fbb0%0x4?_0x4a2d8d*0x40+_0x2c06f6:_0x2c06f6,_0xc6fbb0++%0x4)?_0x162c86+=String['fromCharCode'](0xff&_0x4a2d8d>>(-0x2*_0xc6fbb0&0x6)):0x0){_0x2c06f6=_0x2617b7['indexOf'](_0x2c06f6);}for(let _0x4b07ce=0x0,_0x1690cd=_0x162c86['length'];_0x4b07ce<_0x1690cd;_0x4b07ce++){_0x4aca2e+='%'+('00'+_0x162c86['charCodeAt'](_0x4b07ce)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4aca2e);};_0x31b8['aSTWLn']=_0x44bd40,_0x31b8['PiaBJK']={},_0x31b8['OlqvTu']=!![];}const _0x4c11d0=_0x25fd97[0x0],_0x26f77c=_0x2f6d19+_0x4c11d0,_0x49a25e=_0x31b8['PiaBJK'][_0x26f77c];return!_0x49a25e?(_0x31b8db=_0x31b8['aSTWLn'](_0x31b8db),_0x31b8['PiaBJK'][_0x26f77c]=_0x31b8db):_0x31b8db=_0x49a25e,_0x31b8db;}const _0x3aa646=_0x31b8,_0x2ab7f7=_0x31b8;(function(_0x28e9f4,_0x253280){const _0x42033c={_0x3dc3b7:0x1e5,_0x280e09:0x1db,_0x16e772:0x251,_0xa4476f:0x245,_0x4f56ba:0x224,_0x7e1688:0x1cb,_0x1940b6:0x252,_0x35ec97:0x26d},_0x190232=_0x31b8,_0x126962=_0x31b8,_0x388664=_0x28e9f4();while(!![]){try{const _0x59f84d=-parseInt(_0x190232(0x2ad))/0x1*(parseInt(_0x126962(0x1f5))/0x2)+parseInt(_0x126962(_0x42033c._0x3dc3b7))/0x3*(-parseInt(_0x190232(_0x42033c._0x280e09))/0x4)+parseInt(_0x190232(_0x42033c._0x16e772))/0x5*(-parseInt(_0x126962(0x1da))/0x6)+-parseInt(_0x190232(_0x42033c._0xa4476f))/0x7*(parseInt(_0x126962(_0x42033c._0x4f56ba))/0x8)+parseInt(_0x190232(0x1a2))/0x9*(-parseInt(_0x126962(_0x42033c._0x7e1688))/0xa)+-parseInt(_0x190232(_0x42033c._0x1940b6))/0xb*(parseInt(_0x190232(0x272))/0xc)+parseInt(_0x126962(_0x42033c._0x35ec97))/0xd;if(_0x59f84d===_0x253280)break;else _0x388664['push'](_0x388664['shift']());}catch(_0x1f8435){_0x388664['push'](_0x388664['shift']());}}}(_0x25fd,0x4f46f),function(_0x145722){const _0x355778={_0x1976b3:0x281,_0x2463d3:0x249,_0x1e9f8a:0x1c6,_0x593549:0x274,_0x529ae2:0x2af,_0x571a59:0x273,_0x2b6459:0x22e,_0x2277fb:0x22c,_0x177623:0x234,_0x4f34a1:0x286,_0xcff481:0x2bb,_0x221c23:0x1b4,_0x5d77d9:0x231,_0x5a9a8a:0x259,_0x1373cf:0x23d,_0x15b0f8:0x215,_0x1f0ca6:0x202,_0xc75aa3:0x1dd,_0xb8998d:0x1cc,_0x5ca3ef:0x1f1,_0x50a6d3:0x258,_0x54683c:0x276,_0x492852:0x211,_0x335899:0x2ba,_0xad33ba:0x1a9,_0x1b191a:0x256,_0x30af40:0x23e,_0x1289ef:0x205,_0x1ebc4b:0x1bc,_0x3690b5:0x1e9,_0x1a11f0:0x1cf,_0x4089a9:0x218,_0x487d4b:0x1df,_0x4b44d5:0x299,_0x3c41a8:0x1e8,_0x139a03:0x295,_0x1dc6f8:0x20d,_0x19b140:0x1fa,_0x3a4eae:0x223,_0x399162:0x21d,_0x5d98ec:0x25f,_0x36e14a:0x209,_0x2df4c1:0x1e2,_0x19d7f8:0x1f9,_0x4e0d10:0x1ec,_0x1b45a0:0x1b7,_0x2440b2:0x1af,_0xf24eab:0x22f,_0x2e38f4:0x263,_0x3149e3:0x26b,_0x5ab7bf:0x225,_0xfa3603:0x244,_0x59c028:0x250,_0x2b5982:0x27c,_0x1af69c:0x2c9,_0x2fad4d:0x2b3,_0x4d61d0:0x24e,_0x3f06db:0x2c0,_0x5e9b24:0x1dc,_0x117c3e:0x1e3,_0x17829d:0x20a,_0x374804:0x1e0,_0x2d90ae:0x257,_0x4a4217:0x1e4,_0x42f08d:0x1f2,_0x17a6e8:0x1c9,_0x472ed7:0x25a,_0x4c24de:0x207,_0x429816:0x1e1,_0x30d28b:0x2c2,_0x55ddd:0x1ad,_0x4ca088:0x2a7,_0x3f7051:0x1b9,_0x3df955:0x297,_0x4fd0af:0x1f3,_0xe86e0f:0x1d3,_0x374343:0x25c,_0x18cef3:0x2a2,_0x5e7676:0x233,_0x257f6a:0x2ca,_0x28dfe0:0x1ce,_0x2b0921:0x217,_0xafa465:0x213,_0x2e9807:0x219,_0x52e41b:0x210,_0x53f2f5:0x287,_0x344b4f:0x2b8,_0x5910e9:0x268,_0x27f993:0x285,_0x558668:0x25d,_0x712fb1:0x279,_0x389da0:0x28d,_0x3dbc98:0x2cb,_0x1c23a5:0x1c5,_0x2a9cfc:0x24c,_0x9a113d:0x28b,_0x4b4952:0x21b,_0x1f6441:0x1bf,_0x2e7438:0x227,_0x1ee148:0x241,_0x3247b7:0x222,_0x339bdb:0x2bf,_0xccd834:0x24d,_0x50c910:0x1eb,_0x2d623b:0x1a1,_0x12391d:0x1fe,_0x359b86:0x2b1,_0x180510:0x214,_0x64e0e2:0x293,_0x25a798:0x2ce,_0x3cda55:0x254,_0x22c663:0x29b,_0x2a1945:0x29e,_0x2a5a90:0x20e,_0x3636bb:0x1be,_0x5e6a58:0x1b8,_0x33330a:0x262,_0x45b3d9:0x2ae,_0x1c74df:0x289,_0x1f3ae9:0x1d2,_0x3e556d:0x1ca,_0xf95364:0x2ac,_0x36d9b9:0x1bb,_0x305ef7:0x1c8,_0x390ed2:0x1f6,_0x2f9c1e:0x208,_0x323b0c:0x1f0,_0xc96fb:0x229,_0x3486ba:0x240,_0x99d0d9:0x22e,_0x319ad2:0x1d4,_0x304b6b:0x2b6,_0x18afe4:0x1c1,_0x18c3f9:0x240,_0x11923c:0x1d4,_0x3d0f6b:0x2b6,_0x818133:0x22e,_0xe5ecf5:0x1c1,_0x283320:0x22e,_0x458684:0x29f,_0x6fa0d8:0x235,_0x1a5b89:0x235,_0x10b28a:0x203,_0x51f941:0x2b6},_0x41e941={_0x23d5f3:0x1a7,_0x4bc4d6:0x2d0,_0x39c720:0x1d6,_0x3c8a5c:0x246,_0xf40f45:0x267,_0x2c997f:0x20f,_0x30a3a0:0x24b,_0x260d26:0x206,_0x2b9927:0x22b,_0x259835:0x2a8,_0x3ee4a5:0x271,_0xfdf2f5:0x2a9,_0x111a69:0x1cd,_0x15014b:0x1bd,_0x3c89da:0x1bd,_0x48b0d4:0x278,_0x371238:0x27a,_0x16283a:0x296,_0x8d3bd3:0x283,_0x24c1cb:0x2a8,_0x32e237:0x23f,_0x4690e:0x2a8,_0x5b2d44:0x1c2,_0x39f364:0x228,_0x319866:0x228,_0x281fd1:0x2a0,_0x4572fb:0x2b2,_0xc01655:0x1b0,_0x5819b2:0x29d,_0x45c201:0x2ab,_0x17a9e8:0x238,_0x3efe6e:0x291,_0x27efdf:0x229,_0x431dfc:0x240,_0x17128c:0x22e,_0x57f41c:0x28a,_0x79346f:0x1c4,_0x3f57ee:0x25b,_0x806701:0x282,_0x2bc642:0x1c0,_0x24bb40:0x232,_0xbef654:0x23c,_0x162103:0x2a1,_0x24b3e9:0x1c0,_0xfa841a:0x23f,_0x43858c:0x27b,_0x19217e:0x243,_0x2df03c:0x1d1,_0x3604b6:0x274,_0x4ecc09:0x26f,_0x15a82a:0x1a6,_0x5be1b2:0x1d0,_0x4954f2:0x1ba,_0x377657:0x248,_0x5aa45:0x281,_0x420708:0x248,_0x562397:0x242,_0x219ef8:0x280,_0xb8f6c0:0x20c,_0x32a7a2:0x2b5,_0x24f06e:0x260,_0x61ed9a:0x2b4,_0x2c6ec9:0x255,_0x2070f6:0x1c0,_0x514fda:0x22a,_0x10693d:0x232,_0x3136a4:0x1d1,_0x54c2c4:0x1aa,_0x41c2ec:0x28a,_0x3aec84:0x29a,_0x593d6f:0x248,_0x3421da:0x281,_0x272efb:0x1a3,_0x4579f0:0x1c7,_0x3ed4c9:0x29c,_0x37b7cc:0x1b1,_0x23bc90:0x2a3,_0x51af69:0x2a5,_0x3387c7:0x237,_0x46d2d8:0x1c0,_0x549f43:0x2b7,_0x589662:0x1ed,_0x32be7d:0x23b,_0x1d088b:0x239,_0x4c5ee5:0x2aa,_0xdeac86:0x24f,_0x2e5f9f:0x1b2,_0x15634a:0x274,_0x36151a:0x23c,_0x19e96a:0x243,_0x1d863d:0x200,_0x180d58:0x22b,_0x4df5de:0x22b,_0x1e133b:0x298,_0x5dbbde:0x201,_0x46c6cc:0x27e,_0x148436:0x23c,_0x357f8a:0x27b,_0x16c2ac:0x1d1,_0x4f5404:0x21a,_0x24fcdd:0x23f,_0x55a17f:0x2cf,_0x5e67eb:0x1f7,_0x403dff:0x201,_0x75ef53:0x298,_0x21826d:0x201,_0x500a18:0x1d8,_0x194c6a:0x1ea,_0x4c556f:0x1ea,_0x23e945:0x290,_0x459ec0:0x1ea,_0xd292f3:0x248,_0x1e5e15:0x281,_0x5b5dc5:0x248,_0x32f291:0x281,_0x25e12b:0x2c7,_0x231aa7:0x29c,_0x52c900:0x1b1,_0x5b87e4:0x2c7,_0x3068c1:0x1fd,_0x33c454:0x28f},_0x4278f0={_0x276b3b:0x1ae,_0xe92fa4:0x26c,_0x3300dd:0x1c0,_0x228cfc:0x226,_0x1267c1:0x1ef,_0x12a03d:0x27d,_0x2ba035:0x284,_0x2f2f62:0x28e,_0x4b058f:0x1ee,_0x2d24c8:0x1c3,_0x43895b:0x26c,_0xc95d8c:0x28c,_0x12efb0:0x22d,_0x200ee2:0x1c3,_0x23047f:0x26a,_0x535f2d:0x27b},_0x4f162b={_0x5463ba:0x2a1,_0xd6ea7:0x1c0,_0x1be6fe:0x232,_0x573076:0x23c,_0x2dec3e:0x27b,_0x3a2fb1:0x243},_0x56aa25={_0x386b2e:0x23f,_0x1100ec:0x27b,_0x78be36:0x229,_0x3f7b88:0x2a6,_0x3a27ca:0x1c0,_0x28beaa:0x1c0,_0x1369c0:0x2cd,_0x3a1db5:0x23c,_0x3f996d:0x1d0},_0x3b9c90={_0x3e4b0c:0x2a6},_0x1dce29=_0x31b8,_0x4e5564=_0x31b8,_0x540145={'EzXqP':function(_0x18d9f5,_0x190f45){return _0x18d9f5%_0x190f45;},'rIKSe':function(_0x474e4a,_0x86126f){return _0x474e4a!==_0x86126f;},'Fvxrn':function(_0x5bf0ba,_0x505a20){return _0x5bf0ba<_0x505a20;},'tfxSG':function(_0xc746c4,_0x4e29ef,_0x57b5cc){return _0xc746c4(_0x4e29ef,_0x57b5cc);},'QcqfX':function(_0x2a6e5f,_0x2e6a62,_0x487fdf){return _0x2a6e5f(_0x2e6a62,_0x487fdf);},'diGBL':function(_0x106261,_0xf0f85){return _0x106261*_0xf0f85;},'kyBdx':function(_0x4294f6,_0x4227eb){return _0x4294f6/_0x4227eb;},'CCtLS':function(_0x3ca534,_0x5a76c8){return _0x3ca534>>_0x5a76c8;},'CPFgC':function(_0x3475b0,_0x240999){return _0x3475b0%_0x240999;},'tvvWe':function(_0x590bc2,_0x26be8a){return _0x590bc2+_0x26be8a;},'HhsZv':function(_0x3bf085,_0x4ffab3){return _0x3bf085^_0x4ffab3;},'msMzP':function(_0xdd5c81,_0x2a82cf){return _0xdd5c81>>>_0x2a82cf;},'mYtmN':function(_0x3840f5,_0x2bf3e1){return _0x3840f5^_0x2bf3e1;},'tDWPB':function(_0x42a7f9,_0x38cf7b,_0x6f9c78){return _0x42a7f9(_0x38cf7b,_0x6f9c78);},'Eywbt':function(_0x55bf8f,_0x512525){return _0x55bf8f|_0x512525;},'KFHhJ':function(_0x3c1ba8,_0x34b6aa){return _0x3c1ba8===_0x34b6aa;},'tFTDP':_0x1dce29(0x242)+_0x1dce29(0x221)+_0x4e5564(_0x355778._0x1976b3)+'d','lyfcv':_0x1dce29(_0x355778._0x2463d3)+_0x4e5564(_0x355778._0x1e9f8a),'QxuMA':function(_0x2a9491,_0x5c1a7b){return _0x2a9491(_0x5c1a7b);},'KQZKt':function(_0xc268f3,_0x2d84cc){return _0xc268f3<_0x2d84cc;},'xnDSf':function(_0x1373b0,_0x257054){return _0x1373b0+_0x257054;},'jnZcb':_0x4e5564(_0x355778._0x593549)+_0x1dce29(_0x355778._0x529ae2)+'-','TcCxw':_0x4e5564(0x1f4),'mUSqv':function(_0x182ccb,_0x44b6a4){return _0x182ccb+_0x44b6a4;},'xxfMS':function(_0x384fc7,_0x42e21a){return _0x384fc7<_0x42e21a;},'IyRpo':function(_0x528c1c,_0x362fa5){return _0x528c1c+_0x362fa5;},'yYeHP':function(_0x372b23,_0x4e0a93,_0x239983,_0x3d6abe){return _0x372b23(_0x4e0a93,_0x239983,_0x3d6abe);},'kbmCf':_0x4e5564(_0x355778._0x571a59),'cwLjQ':_0x4e5564(0x240)+_0x4e5564(_0x355778._0x2b6459)+'d'},_0x277bbd=BigInt(_0x1dce29(_0x355778._0x2277fb)+_0x4e5564(_0x355778._0x177623)+_0x1dce29(_0x355778._0x4f34a1)+_0x4e5564(0x2b0)+_0x1dce29(_0x355778._0xcff481)+_0x1dce29(_0x355778._0x221c23)+_0x4e5564(_0x355778._0x5d77d9)+_0x4e5564(_0x355778._0x5a9a8a)+_0x4e5564(_0x355778._0x1373cf)+_0x1dce29(0x1ab)+_0x1dce29(_0x355778._0x15b0f8)+_0x4e5564(_0x355778._0x1f0ca6)+_0x1dce29(0x277)+_0x4e5564(_0x355778._0xc75aa3)+_0x4e5564(_0x355778._0xb8998d)+_0x4e5564(_0x355778._0x5ca3ef)+_0x1dce29(0x21f)+_0x1dce29(_0x355778._0x50a6d3)+_0x4e5564(_0x355778._0x54683c)+_0x1dce29(_0x355778._0x492852)+_0x1dce29(0x294)+_0x1dce29(_0x355778._0x335899)+_0x4e5564(_0x355778._0xad33ba)+_0x4e5564(_0x355778._0x1b191a)+_0x4e5564(_0x355778._0x30af40)+_0x4e5564(_0x355778._0x1289ef)+_0x4e5564(_0x355778._0x1ebc4b)+_0x4e5564(0x27f)+_0x4e5564(_0x355778._0x3690b5)+_0x4e5564(0x1ff)+_0x1dce29(_0x355778._0x1a11f0)+_0x1dce29(_0x355778._0x4089a9)+_0x4e5564(_0x355778._0x487d4b)+_0x1dce29(_0x355778._0x4b44d5)+_0x1dce29(_0x355778._0x3c41a8)+_0x1dce29(_0x355778._0x139a03)+_0x4e5564(_0x355778._0x1dc6f8)+_0x1dce29(_0x355778._0x19b140)+_0x4e5564(_0x355778._0x3a4eae)+_0x1dce29(_0x355778._0x399162)+_0x4e5564(_0x355778._0x5d98ec)+_0x1dce29(0x1e7)+_0x4e5564(_0x355778._0x36e14a)+_0x4e5564(_0x355778._0x2df4c1)+_0x4e5564(_0x355778._0x19d7f8)+_0x1dce29(0x20b)+_0x4e5564(0x2bd)+_0x1dce29(_0x355778._0x4e0d10)+_0x4e5564(0x1a5)+_0x1dce29(_0x355778._0x1b45a0)+_0x4e5564(0x288)+_0x4e5564(_0x355778._0x2440b2)+_0x4e5564(_0x355778._0xf24eab)+_0x1dce29(0x270)+_0x4e5564(_0x355778._0x2e38f4)+_0x1dce29(0x2a4)+_0x4e5564(_0x355778._0x3149e3)+_0x1dce29(_0x355778._0x5ab7bf)+_0x1dce29(_0x355778._0xfa3603)+_0x1dce29(0x1fb)+_0x4e5564(0x212)+_0x1dce29(_0x355778._0x59c028)+_0x4e5564(_0x355778._0x2b5982)+_0x4e5564(_0x355778._0x1af69c)+_0x4e5564(_0x355778._0x2fad4d)+_0x4e5564(_0x355778._0x4d61d0)+_0x1dce29(_0x355778._0x3f06db)+_0x1dce29(_0x355778._0x5e9b24)+_0x4e5564(_0x355778._0x117c3e)+_0x4e5564(0x253)+_0x4e5564(_0x355778._0x17829d)+_0x4e5564(0x2be)+_0x4e5564(_0x355778._0x374804)+_0x4e5564(_0x355778._0x2d90ae)+_0x1dce29(0x216)+_0x4e5564(_0x355778._0x4a4217)+_0x4e5564(0x254)+_0x1dce29(_0x355778._0x42f08d)+_0x1dce29(_0x355778._0x17a6e8)+_0x4e5564(_0x355778._0x472ed7)+_0x4e5564(_0x355778._0x4c24de)+_0x4e5564(_0x355778._0x429816)+_0x1dce29(_0x355778._0x30d28b)+_0x1dce29(_0x355778._0x55ddd)+_0x1dce29(_0x355778._0x4ca088)+_0x4e5564(0x2c6)+_0x1dce29(_0x355778._0x3f7051)+_0x1dce29(_0x355778._0x3df955)+_0x1dce29(_0x355778._0x4fd0af)+_0x4e5564(_0x355778._0xe86e0f)+_0x1dce29(0x292)+_0x1dce29(_0x355778._0x374343)+_0x4e5564(0x1d5)+_0x4e5564(_0x355778._0x18cef3)+_0x4e5564(_0x355778._0x5e7676)+_0x4e5564(_0x355778._0x257f6a)+_0x4e5564(_0x355778._0x28dfe0)+_0x4e5564(_0x355778._0x2b0921)+_0x1dce29(0x21e)+_0x1dce29(_0x355778._0xafa465)+_0x1dce29(_0x355778._0x2e9807)+_0x1dce29(0x1d9)+_0x4e5564(_0x355778._0x52e41b)+_0x4e5564(0x1b3)+_0x4e5564(0x23a)+_0x1dce29(_0x355778._0x53f2f5)+_0x4e5564(0x1ac)+_0x4e5564(0x247)+_0x1dce29(_0x355778._0x344b4f)+_0x1dce29(_0x355778._0x5910e9)+_0x4e5564(_0x355778._0x27f993)+_0x1dce29(_0x355778._0x558668)+_0x1dce29(0x2c4)+_0x1dce29(0x2c5)+_0x1dce29(_0x355778._0x712fb1)+_0x1dce29(0x1f8)+_0x1dce29(_0x355778._0x389da0)+_0x4e5564(_0x355778._0x3dbc98)+_0x1dce29(_0x355778._0x1c23a5)+_0x1dce29(_0x355778._0x2a9cfc)+_0x4e5564(_0x355778._0x9a113d)+_0x4e5564(_0x355778._0x4b4952)+_0x4e5564(_0x355778._0x1f6441)+_0x4e5564(_0x355778._0x2e7438)+_0x4e5564(_0x355778._0x1ee148)+_0x4e5564(0x2cc)+_0x4e5564(_0x355778._0x3247b7)+_0x1dce29(0x1b5)+_0x4e5564(_0x355778._0x339bdb)+_0x1dce29(_0x355778._0xccd834)+_0x1dce29(_0x355778._0x50c910)+_0x4e5564(_0x355778._0x2d623b)+_0x1dce29(_0x355778._0x12391d)+_0x4e5564(_0x355778._0x359b86)+_0x1dce29(_0x355778._0x180510)+_0x4e5564(_0x355778._0x64e0e2)+_0x1dce29(_0x355778._0x25a798)+_0x1dce29(_0x355778._0x3cda55)+_0x1dce29(_0x355778._0x22c663)+_0x1dce29(_0x355778._0x2a1945)+_0x4e5564(_0x355778._0x2a5a90)+_0x4e5564(_0x355778._0x3636bb)+_0x4e5564(_0x355778._0x5e6a58)+_0x4e5564(_0x355778._0x33330a)+_0x1dce29(_0x355778._0x45b3d9)+_0x4e5564(_0x355778._0x1c74df)+_0x4e5564(_0x355778._0x1f3ae9)+_0x4e5564(_0x355778._0x3e556d)+_0x1dce29(_0x355778._0xf95364)+_0x1dce29(_0x355778._0x36d9b9)+_0x1dce29(_0x355778._0x305ef7)+_0x4e5564(_0x355778._0x390ed2)+_0x4e5564(_0x355778._0x2f9c1e)+_0x1dce29(_0x355778._0x323b0c)+'1'),_0x2643cd=0x10001n;function _0x4d0766(_0x338323,_0x305643,_0x42ecf5){const _0x3feafa=_0x1dce29;let _0x5c1f2c=0x1n;_0x338323=_0x338323%_0x42ecf5;while(_0x305643>0x0n){if(_0x305643%0x2n===0x1n)_0x5c1f2c=_0x540145[_0x3feafa(_0x3b9c90._0x3e4b0c)+'P'](_0x5c1f2c*_0x338323,_0x42ecf5);_0x305643=_0x305643/0x2n,_0x338323=_0x338323*_0x338323%_0x42ecf5;}return _0x5c1f2c;}function _0xca1567(_0x2f731f){const _0x2ac6a9=_0x4e5564,_0x3d0fde=_0x4e5564;let _0x3f3485=_0x2f731f[_0x2ac6a9(_0x56aa25._0x386b2e)+_0x3d0fde(_0x56aa25._0x1100ec)](0x10);if(_0x540145[_0x2ac6a9(_0x56aa25._0x78be36)+'e'](_0x540145[_0x3d0fde(_0x56aa25._0x3f7b88)+'P'](_0x3f3485[_0x2ac6a9(_0x56aa25._0x3a27ca)+'th'],0x2),0x0))_0x3f3485='0'+_0x3f3485;let _0x379d9a='';for(let _0x414940=0x0;_0x414940<_0x3f3485[_0x3d0fde(_0x56aa25._0x28beaa)+'th'];_0x414940+=0x2){_0x379d9a+=String[_0x3d0fde(_0x56aa25._0x1369c0)+_0x2ac6a9(0x21c)+_0x3d0fde(_0x56aa25._0x3a1db5)](parseInt(_0x3f3485[_0x2ac6a9(_0x56aa25._0x3f996d)+'tr'](_0x414940,0x2),0x10));}return _0x379d9a;}function _0x22b609(_0x3f384d){const _0x23ca45=_0x4e5564,_0x224130=_0x4e5564;let _0x128367='';for(let _0x55c8ca=0x0;_0x540145[_0x23ca45(_0x4f162b._0x5463ba)+'n'](_0x55c8ca,_0x3f384d[_0x224130(_0x4f162b._0xd6ea7)+'th']);_0x55c8ca++){_0x128367+=_0x3f384d[_0x23ca45(_0x4f162b._0x1be6fe)+_0x224130(_0x4f162b._0x573076)+'At'](_0x55c8ca)[_0x23ca45(0x23f)+_0x23ca45(_0x4f162b._0x2dec3e)](0x10)[_0x224130(_0x4f162b._0x3a2fb1)+_0x23ca45(0x1d1)](0x2,'0');}return BigInt('0x'+_0x128367);}function _0x5b0d01(_0x26791b){const _0x39f759={_0x5c705f:0x1de},_0x312a3a=_0x4e5564,_0x5bba81=_0x4e5564,_0x116e6c={'TcszZ':function(_0x64a4b0,_0x4e0cfa){return _0x64a4b0>>>_0x4e0cfa;}};function _0x4b618c(_0x113206,_0x400f6c){const _0x205c62=_0x31b8;return _0x116e6c[_0x205c62(_0x39f759._0x5c705f)+'Z'](_0x113206,_0x400f6c)|_0x113206<<0x20-_0x400f6c;}var _0x3048a7=Math[_0x312a3a(_0x4278f0._0x276b3b)],_0x4a5461=_0x540145[_0x5bba81(_0x4278f0._0xe92fa4)+'G'](_0x3048a7,0x2,0x20),_0x333993=_0x5bba81(_0x4278f0._0x3300dd)+'th',_0x54a08c,_0x481251,_0x36492f='',_0x4e83f1=[],_0x2a67dd=_0x26791b[_0x333993]*0x8,_0x14eddb=_0x5b0d01['h']=_0x5b0d01['h']||[],_0x2735c8=_0x5b0d01['k']=_0x5b0d01['k']||[],_0x5d7187=_0x2735c8[_0x333993],_0x2d4839={};for(var _0x452bf6=0x2;_0x5d7187<0x40;_0x452bf6++){if(!_0x2d4839[_0x452bf6]){for(_0x54a08c=0x0;_0x54a08c<0x139;_0x54a08c+=_0x452bf6){_0x2d4839[_0x54a08c]=_0x452bf6;}_0x14eddb[_0x5d7187]=_0x540145[_0x5bba81(_0x4278f0._0x228cfc)+'X'](_0x3048a7,_0x452bf6,0.5)*_0x4a5461|0x0,_0x2735c8[_0x5d7187++]=_0x540145[_0x312a3a(_0x4278f0._0x1267c1)+'L'](_0x3048a7(_0x452bf6,_0x540145[_0x312a3a(0x1a8)+'x'](0x1,0x3)),_0x4a5461)|0x0;}}_0x26791b+='\u0080';while(_0x26791b[_0x333993]%0x40-0x38)_0x26791b+='\x00';for(_0x54a08c=0x0;_0x54a08c<_0x26791b[_0x333993];_0x54a08c++){_0x481251=_0x26791b[_0x5bba81(0x232)+_0x5bba81(0x23c)+'At'](_0x54a08c);if(_0x540145[_0x312a3a(_0x4278f0._0x12a03d)+'S'](_0x481251,0x8))return;_0x4e83f1[_0x54a08c>>0x2]|=_0x481251<<_0x540145[_0x5bba81(_0x4278f0._0x2ba035)+'C'](0x3-_0x54a08c,0x4)*0x8;}_0x4e83f1[_0x4e83f1[_0x333993]]=_0x540145[_0x5bba81(0x1a8)+'x'](_0x2a67dd,_0x4a5461)|0x0,_0x4e83f1[_0x4e83f1[_0x333993]]=_0x2a67dd;for(_0x481251=0x0;_0x481251<_0x4e83f1[_0x333993];){var _0x5e5a54=_0x4e83f1[_0x312a3a(_0x4278f0._0x2f2f62)+'e'](_0x481251,_0x481251+=0x10),_0xf4b4ff=_0x14eddb;_0x14eddb=_0x14eddb[_0x5bba81(_0x4278f0._0x2f2f62)+'e'](0x0,0x8);for(_0x54a08c=0x0;_0x54a08c<0x40;_0x54a08c++){var _0x585188=_0x5e5a54[_0x54a08c-0xf],_0x368706=_0x5e5a54[_0x54a08c-0x2],_0x3eb675=_0x14eddb[0x0],_0xca75f5=_0x14eddb[0x4],_0x513bb0=_0x540145[_0x312a3a(_0x4278f0._0x4b058f)+'e'](_0x14eddb[0x7],_0x4b618c(_0xca75f5,0x6)^_0x4b618c(_0xca75f5,0xb)^_0x4b618c(_0xca75f5,0x19))+(_0xca75f5&_0x14eddb[0x5]^~_0xca75f5&_0x14eddb[0x6])+_0x2735c8[_0x54a08c]+(_0x5e5a54[_0x54a08c]=_0x54a08c<0x10?_0x5e5a54[_0x54a08c]:_0x5e5a54[_0x54a08c-0x10]+(_0x4b618c(_0x585188,0x7)^_0x4b618c(_0x585188,0x12)^_0x585188>>>0x3)+_0x5e5a54[_0x54a08c-0x7]+(_0x540145[_0x5bba81(_0x4278f0._0x2d24c8)+'v'](_0x4b618c(_0x368706,0x11),_0x540145[_0x312a3a(_0x4278f0._0x43895b)+'G'](_0x4b618c,_0x368706,0x13))^_0x540145[_0x312a3a(_0x4278f0._0xc95d8c)+'P'](_0x368706,0xa))|0x0),_0x220544=_0x540145[_0x312a3a(_0x4278f0._0x4b058f)+'e'](_0x540145[_0x5bba81(0x266)+'N'](_0x4b618c(_0x3eb675,0x2),_0x4b618c(_0x3eb675,0xd))^_0x540145[_0x312a3a(_0x4278f0._0x12efb0)+'B'](_0x4b618c,_0x3eb675,0x16),_0x540145[_0x5bba81(_0x4278f0._0x200ee2)+'v'](_0x3eb675&_0x14eddb[0x1],_0x3eb675&_0x14eddb[0x2])^_0x14eddb[0x1]&_0x14eddb[0x2]);_0x14eddb=[_0x513bb0+_0x220544|0x0][_0x5bba81(0x2c1)+'at'](_0x14eddb),_0x14eddb[0x4]=_0x540145[_0x312a3a(_0x4278f0._0x23047f)+'t'](_0x14eddb[0x4]+_0x513bb0,0x0);}for(_0x54a08c=0x0;_0x54a08c<0x8;_0x54a08c++){_0x14eddb[_0x54a08c]=_0x14eddb[_0x54a08c]+_0xf4b4ff[_0x54a08c]|0x0;}}for(_0x54a08c=0x0;_0x54a08c<0x8;_0x54a08c++){for(_0x481251=0x3;_0x481251+0x1;_0x481251--){var _0xfd24d7=_0x14eddb[_0x54a08c]>>_0x481251*0x8&0xff;_0x36492f+=_0x540145[_0x5bba81(_0x4278f0._0x4b058f)+'e'](_0xfd24d7<0x10?0x0:'',_0xfd24d7[_0x5bba81(0x23f)+_0x312a3a(_0x4278f0._0x535f2d)](0x10));}}return _0x36492f;}class LicenseManager{static validate(_0x159838,_0x41576d={}){const _0x9a5144=_0x1dce29,_0x4e3792=_0x1dce29;if(!_0x159838)return{'valid':![],'tier':null,'reason':_0x9a5144(_0x41e941._0x23d5f3)+_0x4e3792(_0x41e941._0x4bc4d6)+_0x9a5144(_0x41e941._0x39c720)+_0x4e3792(_0x41e941._0x3c8a5c)};const _0x4b53e6=_0x159838[_0x4e3792(_0x41e941._0xf40f45)](),_0x4a7afd=_0x4b53e6[_0x4e3792(_0x41e941._0x2c997f)+_0x4e3792(_0x41e941._0x30a3a0)+_0x9a5144(_0x41e941._0x260d26)](),_0x597e13=_0x4a7afd[_0x4e3792(_0x41e941._0x2b9927)+'t']('-'),_0x5085bf=_0x41576d[_0x4e3792(_0x41e941._0x259835)+_0x9a5144(0x271)]!==undefined&&_0x41576d[_0x9a5144(0x2a8)+_0x9a5144(_0x41e941._0x3ee4a5)]!==null?_0x41576d[_0x4e3792(_0x41e941._0x259835)+_0x9a5144(_0x41e941._0x3ee4a5)]:Date[_0x4e3792(_0x41e941._0xfdf2f5)]();let _0x1a036f=0x0;_0x41576d[_0x9a5144(_0x41e941._0x111a69)+_0x4e3792(_0x41e941._0x15014b)]&&(_0x1a036f=parseInt(_0x41576d[_0x4e3792(_0x41e941._0x111a69)+_0x4e3792(_0x41e941._0x3c89da)][_0x4e3792(_0x41e941._0x48b0d4)+_0x9a5144(0x1e6)](_0x9a5144(_0x41e941._0x371238)+_0x4e3792(0x264)+_0x4e3792(0x261)+_0x4e3792(_0x41e941._0x16283a)+'e')||'0',0xa),(_0x41576d[_0x4e3792(0x2a8)+_0x4e3792(_0x41e941._0x3ee4a5)]===undefined||_0x540145[_0x4e3792(_0x41e941._0x8d3bd3)+'J'](_0x41576d[_0x9a5144(_0x41e941._0x24c1cb)+_0x9a5144(0x271)],null))&&_0x41576d[_0x9a5144(0x1cd)+_0x4e3792(0x1bd)][_0x4e3792(0x265)+_0x9a5144(0x1e6)](_0x4e3792(_0x41e941._0x371238)+_0x9a5144(0x264)+_0x4e3792(0x261)+_0x9a5144(_0x41e941._0x16283a)+'e',_0x5085bf[_0x4e3792(_0x41e941._0x32e237)+_0x4e3792(0x27b)]()));if((_0x540145[_0x9a5144(_0x41e941._0x8d3bd3)+'J'](_0x41576d[_0x4e3792(0x2a8)+_0x4e3792(0x271)],undefined)||_0x41576d[_0x4e3792(_0x41e941._0x4690e)+_0x9a5144(0x271)]===null)&&_0x5085bf<_0x1a036f){if(_0x41576d[_0x4e3792(_0x41e941._0x5b2d44)+_0x4e3792(_0x41e941._0x39f364)+'y'])_0x41576d[_0x9a5144(_0x41e941._0x5b2d44)+_0x4e3792(_0x41e941._0x319866)+'y']();return{'valid':![],'tier':null,'reason':_0x4e3792(_0x41e941._0x281fd1)+_0x4e3792(_0x41e941._0x4572fb)+_0x9a5144(_0x41e941._0xc01655)+_0x9a5144(_0x41e941._0x5819b2)+_0x9a5144(0x236)+_0x4e3792(_0x41e941._0x45c201)+_0x4e3792(_0x41e941._0x17a9e8)+_0x9a5144(_0x41e941._0x3efe6e)};}const _0x4dbbbb=_0x540145[_0x4e3792(_0x41e941._0x27efdf)+'e'](typeof atob,_0x4e3792(_0x41e941._0x431dfc)+_0x4e3792(_0x41e941._0x17128c)+'d')?atob:_0x39f463=>Buffer[_0x4e3792(0x2cd)](_0x39f463,_0x4e3792(0x24a)+'64')[_0x9a5144(0x23f)+_0x9a5144(0x27b)](_0x9a5144(0x2c3)+'ry');if(_0x4a7afd[_0x9a5144(_0x41e941._0x57f41c)+_0x9a5144(_0x41e941._0x79346f)+'th'](_0x9a5144(0x1d7)+_0x4e3792(_0x41e941._0x3f57ee)+'-'))try{const _0x1de4d8=_0x4b53e6[_0x9a5144(0x1d0)+_0x4e3792(_0x41e941._0x806701)+'g'](0x9),_0x165718=_0x4dbbbb(_0x1de4d8),_0xd33f38=new Uint8Array(_0x165718[_0x4e3792(0x1c0)+'th']);for(let _0x5f416c=0x0;_0x5f416c<_0x165718[_0x9a5144(_0x41e941._0x2bc642)+'th'];_0x5f416c++){_0xd33f38[_0x5f416c]=_0x165718[_0x9a5144(_0x41e941._0x24bb40)+_0x4e3792(_0x41e941._0xbef654)+'At'](_0x5f416c);}let _0x569769='';for(let _0x180d73=0x0;_0x540145[_0x9a5144(_0x41e941._0x162103)+'n'](_0x180d73,_0xd33f38[_0x4e3792(_0x41e941._0x24b3e9)+'th']);_0x180d73++){_0x569769+=_0xd33f38[_0x180d73][_0x9a5144(_0x41e941._0xfa841a)+_0x9a5144(_0x41e941._0x43858c)](0x10)[_0x9a5144(_0x41e941._0x19217e)+_0x9a5144(_0x41e941._0x2df03c)](0x2,'0');}const _0x9c1a11=BigInt('0x'+_0x569769),_0x15b9d4=_0x4d0766(_0x9c1a11,_0x2643cd,_0x277bbd),_0x1de304=_0xca1567(_0x15b9d4);if(_0x1de304[_0x4e3792(0x28a)+_0x9a5144(_0x41e941._0x79346f)+'th'](_0x4e3792(_0x41e941._0x3604b6)+_0x4e3792(_0x41e941._0x4ecc09)+_0x4e3792(_0x41e941._0x15a82a))){const _0x27caf9=parseInt(_0x1de304[_0x4e3792(_0x41e941._0x5be1b2)+_0x9a5144(_0x41e941._0x806701)+'g'](0xb),0xa);if(!isNaN(_0x27caf9)){if(_0x5085bf<_0x27caf9)return{'valid':!![],'tier':_0x4e3792(_0x41e941._0x4954f2)+'S','expires':_0x27caf9};if(_0x41576d[_0x9a5144(_0x41e941._0x377657)+_0x4e3792(_0x41e941._0x5aa45)+'d'])_0x41576d[_0x4e3792(_0x41e941._0x420708)+_0x9a5144(_0x41e941._0x5aa45)+'d'](_0x9a5144(_0x41e941._0x562397)+'t');return{'valid':![],'tier':null,'reason':_0x540145[_0x4e3792(_0x41e941._0x219ef8)+'P']};}}}catch(_0x4cf2b9){return{'valid':![],'tier':null,'reason':_0x9a5144(0x242)+_0x4e3792(_0x41e941._0xb8f6c0)+_0x4e3792(_0x41e941._0x32a7a2)+_0x4e3792(0x275)+_0x9a5144(_0x41e941._0x24f06e)+_0x4e3792(_0x41e941._0x61ed9a)};}if(_0x4a7afd[_0x9a5144(_0x41e941._0x57f41c)+_0x9a5144(0x1c4)+'th'](_0x540145[_0x9a5144(_0x41e941._0x2c6ec9)+'v']))try{const _0x2fb1c5=_0x4b53e6[_0x9a5144(0x1d0)+_0x9a5144(_0x41e941._0x806701)+'g'](0x7),_0x576ac6=_0x540145[_0x4e3792(0x269)+'A'](_0x4dbbbb,_0x2fb1c5),_0x3ccfa6=new Uint8Array(_0x576ac6[_0x9a5144(_0x41e941._0x2070f6)+'th']);for(let _0x13fe86=0x0;_0x540145[_0x4e3792(_0x41e941._0x514fda)+'t'](_0x13fe86,_0x576ac6[_0x9a5144(_0x41e941._0x2bc642)+'th']);_0x13fe86++){_0x3ccfa6[_0x13fe86]=_0x576ac6[_0x4e3792(_0x41e941._0x10693d)+_0x4e3792(_0x41e941._0xbef654)+'At'](_0x13fe86);}let _0x2fb20c='';for(let _0x2fd2be=0x0;_0x2fd2be<_0x3ccfa6[_0x4e3792(_0x41e941._0x2070f6)+'th'];_0x2fd2be++){_0x2fb20c+=_0x3ccfa6[_0x2fd2be][_0x4e3792(0x23f)+_0x9a5144(0x27b)](0x10)[_0x9a5144(_0x41e941._0x19217e)+_0x9a5144(_0x41e941._0x3136a4)](0x2,'0');}const _0x549a61=BigInt(_0x540145[_0x9a5144(_0x41e941._0x54c2c4)+'f']('0x',_0x2fb20c)),_0x2f0c0b=_0x4d0766(_0x549a61,_0x2643cd,_0x277bbd),_0x5b6e7a=_0xca1567(_0x2f0c0b);if(_0x5b6e7a[_0x9a5144(_0x41e941._0x41c2ec)+_0x9a5144(_0x41e941._0x79346f)+'th'](_0x540145[_0x4e3792(_0x41e941._0x3aec84)+'b'])){const _0xc22f30=_0x5b6e7a[_0x9a5144(0x22b)+'t']('-');if(_0xc22f30[_0x9a5144(_0x41e941._0x2070f6)+'th']>=0x5){const _0xddae2a=_0xc22f30[0x2],_0x5885cb=parseInt(_0xc22f30[0x4],0xa);if(!isNaN(_0x5885cb)){if(_0x5085bf<_0x5885cb)return{'valid':!![],'tier':_0xddae2a,'expires':_0x5885cb};if(_0x41576d[_0x4e3792(_0x41e941._0x593d6f)+_0x4e3792(0x281)+'d'])_0x41576d[_0x9a5144(0x248)+_0x4e3792(_0x41e941._0x3421da)+'d'](_0x540145[_0x4e3792(_0x41e941._0x272efb)+'w']);return{'valid':![],'tier':null,'reason':_0x9a5144(0x2a3)+_0x4e3792(_0x41e941._0x4579f0)+_0x4e3792(_0x41e941._0x3ed4c9)+_0x4e3792(_0x41e941._0x37b7cc)};}}}}catch(_0xd429bb){return{'valid':![],'tier':null,'reason':_0x9a5144(_0x41e941._0x23bc90)+_0x9a5144(0x204)+_0x9a5144(_0x41e941._0x51af69)+_0x4e3792(_0x41e941._0x3387c7)+_0x9a5144(0x1fc)+'d'};}if(_0x597e13[_0x4e3792(_0x41e941._0x46d2d8)+'th']===0x4&&_0x597e13[0x0]==='PS'&&[_0x4e3792(_0x41e941._0x549f43),_0x4e3792(_0x41e941._0x4954f2)+'S',_0x4e3792(_0x41e941._0x589662),_0x9a5144(_0x41e941._0x32be7d),_0x9a5144(_0x41e941._0x1d088b)+_0x9a5144(_0x41e941._0x4c5ee5)+'SE'][_0x4e3792(_0x41e941._0xdeac86)+_0x4e3792(_0x41e941._0x2e5f9f)](_0x597e13[0x1])){const _0x4490d2=_0x597e13[0x1],_0x929307=_0x597e13[0x2],_0x1c6fe9=_0x597e13[0x3],_0x418e53=_0x9a5144(_0x41e941._0x15634a)+_0x4e3792(0x1a4)+_0x9a5144(0x2bc)+_0x4e3792(0x2c8)+'@#',_0x29961e=_0x540145[_0x4e3792(0x1ee)+'e'](_0x540145[_0x9a5144(0x1b6)+'v'](_0x929307,_0x418e53),_0x4490d2);let _0x2cb291=0x0;for(let _0x1136e7=0x0;_0x1136e7<_0x29961e[_0x9a5144(_0x41e941._0x2bc642)+'th'];_0x1136e7++){_0x2cb291+=_0x29961e[_0x9a5144(0x232)+_0x4e3792(_0x41e941._0x36151a)+'At'](_0x1136e7)*(_0x1136e7+0x1);}const _0x106c71=(_0x2cb291%0x270f)[_0x4e3792(0x23f)+_0x9a5144(0x27b)]()[_0x4e3792(_0x41e941._0x19e96a)+_0x9a5144(_0x41e941._0x2df03c)](0x4,'0');if(_0x1c6fe9===_0x106c71)return{'valid':!![],'tier':_0x4490d2};}if(_0x4b53e6[_0x9a5144(_0x41e941._0x57f41c)+_0x9a5144(_0x41e941._0x79346f)+'th'](_0x4e3792(_0x41e941._0x1d863d))&&_0x4b53e6[_0x4e3792(_0x41e941._0x180d58)+'t']('.')[_0x9a5144(_0x41e941._0x2bc642)+'th']===0x3)try{const [_0x180784,_0x43da9d,_0x21c1e1]=_0x4b53e6[_0x4e3792(_0x41e941._0x4df5de)+'t']('.');let _0x4fb2de=_0x21c1e1[_0x4e3792(_0x41e941._0x1e133b)+_0x9a5144(_0x41e941._0x5dbbde)](/-/g,'+')[_0x4e3792(0x298)+_0x9a5144(_0x41e941._0x5dbbde)](/_/g,'/');while(_0x4fb2de[_0x9a5144(_0x41e941._0x2070f6)+'th']%0x4)_0x4fb2de+='=';const _0x465c36=_0x4dbbbb(_0x4fb2de);let _0x174ad1='';for(let _0x20e4e5=0x0;_0x540145[_0x4e3792(_0x41e941._0x46c6cc)+'S'](_0x20e4e5,_0x465c36[_0x4e3792(_0x41e941._0x24b3e9)+'th']);_0x20e4e5++){_0x174ad1+=_0x465c36[_0x9a5144(_0x41e941._0x10693d)+_0x4e3792(_0x41e941._0x148436)+'At'](_0x20e4e5)[_0x4e3792(_0x41e941._0xfa841a)+_0x9a5144(_0x41e941._0x357f8a)](0x10)[_0x9a5144(_0x41e941._0x19e96a)+_0x9a5144(_0x41e941._0x16c2ac)](0x2,'0');}const _0x4bbbb2=BigInt(_0x540145[_0x9a5144(0x2b9)+'o']('0x',_0x174ad1)),_0x373b2c=_0x540145[_0x4e3792(_0x41e941._0x4f5404)+'P'](_0x4d0766,_0x4bbbb2,_0x2643cd,_0x277bbd);let _0x2405ba=_0x373b2c[_0x9a5144(_0x41e941._0x24fcdd)+_0x4e3792(_0x41e941._0x357f8a)](0x10);if(_0x540145[_0x9a5144(_0x41e941._0x27efdf)+'e'](_0x2405ba[_0x9a5144(0x1c0)+'th']%0x2,0x0))_0x2405ba='0'+_0x2405ba;const _0x54204b=_0x5b0d01(_0x180784+'.'+_0x43da9d);if(_0x2405ba[_0x4e3792(_0x41e941._0x55a17f)+_0x4e3792(_0x41e941._0x5e67eb)](_0x54204b)){const _0x4c1e0e=_0x4dbbbb(_0x43da9d[_0x4e3792(_0x41e941._0x1e133b)+_0x4e3792(_0x41e941._0x403dff)](/-/g,'+')[_0x4e3792(_0x41e941._0x75ef53)+_0x4e3792(_0x41e941._0x21826d)](/_/g,'/')),_0x3788a7=JSON[_0x4e3792(_0x41e941._0x500a18)+'e'](_0x4c1e0e);if(_0x3788a7[_0x4e3792(_0x41e941._0x194c6a)]&&_0x5085bf/0x3e8<_0x3788a7[_0x4e3792(_0x41e941._0x4c556f)])return{'valid':!![],'tier':_0x3788a7[_0x9a5144(_0x41e941._0x23e945)]||_0x4e3792(_0x41e941._0x549f43),'expires':_0x3788a7[_0x4e3792(_0x41e941._0x459ec0)]*0x3e8};else{if(_0x41576d[_0x4e3792(_0x41e941._0xd292f3)+_0x9a5144(_0x41e941._0x1e5e15)+'d'])_0x41576d[_0x9a5144(_0x41e941._0x5b5dc5)+_0x9a5144(_0x41e941._0x32f291)+'d'](_0x540145[_0x9a5144(0x230)+'f']);return{'valid':![],'tier':null,'reason':_0x4e3792(_0x41e941._0x25e12b)+_0x4e3792(_0x41e941._0x231aa7)+_0x9a5144(_0x41e941._0x52c900)};}}}catch(_0x15d03d){return{'valid':![],'tier':null,'reason':_0x4e3792(_0x41e941._0x5b87e4)+_0x9a5144(0x26e)+_0x9a5144(0x25e)+_0x4e3792(_0x41e941._0x3387c7)+_0x9a5144(0x1fc)+'d'};}return{'valid':![],'tier':null,'reason':_0x4e3792(0x220)+_0x9a5144(_0x41e941._0x3068c1)+_0x4e3792(_0x41e941._0x33c454)+'at'};}}_0x540145[_0x1dce29(_0x355778._0xc96fb)+'e'](typeof globalThis,_0x1dce29(_0x355778._0x3486ba)+_0x1dce29(_0x355778._0x99d0d9)+'d')&&(globalThis[_0x1dce29(_0x355778._0x319ad2)+_0x4e5564(_0x355778._0x304b6b)+_0x1dce29(_0x355778._0x18afe4)+'er']=LicenseManager),typeof _0x145722!==_0x1dce29(_0x355778._0x18c3f9)+_0x4e5564(_0x355778._0x2b6459)+'d'&&(_0x145722[_0x4e5564(_0x355778._0x11923c)+_0x1dce29(_0x355778._0x3d0f6b)+_0x4e5564(_0x355778._0x18afe4)+'er']=LicenseManager),typeof window!==_0x1dce29(_0x355778._0x3486ba)+_0x1dce29(_0x355778._0x818133)+'d'&&(window[_0x4e5564(0x1d4)+_0x4e5564(_0x355778._0x3d0f6b)+_0x4e5564(_0x355778._0xe5ecf5)+'er']=LicenseManager),typeof exports!==_0x4e5564(_0x355778._0x3486ba)+_0x1dce29(_0x355778._0x283320)+'d'&&(_0x540145[_0x1dce29(_0x355778._0xc96fb)+'e'](typeof module,_0x540145[_0x1dce29(_0x355778._0x458684)+'Q'])&&module[_0x4e5564(_0x355778._0x6fa0d8)+_0x1dce29(0x203)]&&(module[_0x1dce29(_0x355778._0x1a5b89)+_0x4e5564(_0x355778._0x10b28a)]=LicenseManager),exports[_0x4e5564(_0x355778._0x319ad2)+_0x4e5564(_0x355778._0x51f941)+_0x1dce29(_0x355778._0x18afe4)+'er']=LicenseManager);}(typeof globalThis!==_0x3aa646(0x240)+_0x3aa646(0x22e)+'d'?globalThis:typeof window!==_0x3aa646(0x240)+_0x3aa646(0x22e)+'d'?window:this));function _0x25fd(){const _0x3a71a4=['otG2oa','nJu1na','Dg9tDa','Dw5Kzq','mZG4nG','ugLSBW','CgfKuW','ndeYoq','mJyXnJzcCgv5y3e','zgvK','oti5na','B25fEa','ufmTuG','yMfZzq','CgvYqW','mZuYmq','mJC2nW','mJu4mq','Aw5JBa','nte1oa','mJK3mJm1DM1VD1L5','nJCXyM9jBLvw','odmXnW','odCYoq','BhLMyW','odeWnq','odK3oq','ota4ma','mZGWmW','otaYmG','suXpva','odu1oq','nJy4mq','zgf0Aq','ndyWoa','igzHAq','C2vLBG','ntaXnW','mZa5nG','yxn0xW','C2v0sq','BvL0Bq','DhjPBq','nde0oq','uxH1tq','rxL3yG','nZyWmW','Dgz4uW','mJeZmZa4mtzIuuzNzvC','DMfSAq','lvbjta','nta0na','vgLTzq','ntq5nZj3zgHQvxm','sLDu','wLreuW','DgLVBG','mJqYoa','nde1mW','z2v0sq','mZC2ma','ChnFBa','CMLUzW','nZm1oa','q0n0ta','EhHMtq','otaZnW','Dezura','CgLYzq','DhjPBG','s0ziAa','q1bgzW','mJK2ma','mta0ma','ntK2na','mdmXmq','mZq5na','C3rHCG','mtK3na','BxnnEG','nZmWoa','C2XPyW','zM9YBq','DgLLCG','DgvK','mZq4nG','odqYoq','nZyWnq','nJa4mW','x3rPBq','ody1mG','CMvWBa','ntmXoq','AM5AyW','ntG4na','zxHWAq','y2SGyq','nZa4nW','y3DmAG','q2XVyW','rNz4CG','mte3mq','uLnbia','odyYoa','Exb0Aq','rxPyCq','nJKZmG','Bw9JAW','BM93','uLbssq','BhKGza','mty0oa','nZu4oxzSDKDtwq','mdmYma','luXjqW','ntaZna','mZGXmW','AYbYBW','odyXmG','BgvK','y3j5Ca','BNnLtq','ufjp','nJiXmq','sxLsCa','nty5mG','ndy3oa','vf8Yma','ndG4mG','nJa1nG','mJa2nG','mdGYoq','y29UyW','nJi0mG','yMLUyq','mJuYnW','nta1oa','mZu0ma','sLDuia','mJzFiq','mtyYnG','mtmZnG','nZq3ma','nJmWmW','zNjVBq','mdG1nW','zw5KCW','zxKGCa','ndaWnW','ntGWndfuvK52rvm','vgndEa','x1nbta','ndy4ma','t1qT','tM8GAW','A3Lcza','mJe4oa','Eg5euW','nJG4na','mJa2nq','nZa2mq','Cg93','ndi1mW','BgXIyq','CMvK','DwrLCW','nZmXmG','mJmZna','nteXoq','BvvtCq','ntu0nW','otKWma','ndu2mG','vevbtq','mJyZnq','mZiXoq','ywDL','mZy5ma','ote4mG','BgvUzW','yw5HzW','B25bBG','sgHZwG','DhnxAq','ndKXnq','u0eT','A2v5ia','mtqXmq','nZCXnW','mdy5na','mtiWA0zfDLDS','nZu5nq','C3rVCG','ode0mG','nZyXna','C3vICW','DgfYDa','mtyWmG','nZqYna','tgLJzq','ody2mG','CM92Aq','ufmTua','CgfYCW','mJC2oq','nNH4EffiuW','ndHIuM5eBhy','nJC4mq','oda1nW','vgnZEG','mtKWnq','nJG5oq','odq5nW','mJCZna','odKYnq','odiZnW','mtu2otbVthjiqu8','DgvT','mta5nW','mJm4oq','ndyZnW','zxHW','mdu5mq','nZG2oq','u0rl','Dhz2vW','zgLhqG','ote2oq','mZyWoa','mZiYma','nJqYma','uLnb','nJjyAfv4B0W','nZCWnG','v2L0Aa','odiXmG','ndq3nW','mdC1na','mtu0oq','ywLSzq','BgLKia','mJG1mG','mJeYnW','zxLk','ywnL','ntaXoq','CNrZ','zgvJCG','mtiWmq','yxnL','ntGXoa','ntu4nW','mJCXmq','mtqYmq','mdq4nq','DcbKzq','nJq5oq','nJKXmG','Dg9vCa','nJi2ma','mtCYoq','nta4nG','nty3ma','nZq2mq','mJy4ma','mdy0nW','otm5nq','odG1nW','ntC0nG','EvLLsa','nZaYmG','q2HHCG','oteYnq','ndC3mG','otyWoq','sw52yq','DcbLEa','ntaZnG','otm3oq','mti4offuwhrxuq','mte0oq','uwnXzG','ndC5nG','B21HBa','CKLluW','s1fAsW','C3bSAq','mJeZmq','Derxua','zMLUzq','mdG2nq','A2jTqW','nti0mG','y2HHCG','nJm0nW','nZK3oq','zxHWBW','BM9Tyq','B24GzG','zxrLyW','ru5urq','ntC0oq','t0vn','q29Kzq'];_0x25fd=function(){return _0x3a71a4;};return _0x25fd();}
11
+ const _0x5a6bc0=_0x4b8b,_0x20bda8=_0x4b8b;function _0x4b8b(_0xa0bd5a,_0x432c96){_0xa0bd5a=_0xa0bd5a-0x14d;const _0x5c0d8c=_0x5c0d();let _0x4b8bc6=_0x5c0d8c[_0xa0bd5a];if(_0x4b8b['TZGCLi']===undefined){var _0x1c5328=function(_0x3e82c4){const _0x31fdd9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xd40b8d='',_0x536b76='';for(let _0x1657b6=0x0,_0x47eac7,_0x3abea1,_0x4139ab=0x0;_0x3abea1=_0x3e82c4['charAt'](_0x4139ab++);~_0x3abea1&&(_0x47eac7=_0x1657b6%0x4?_0x47eac7*0x40+_0x3abea1:_0x3abea1,_0x1657b6++%0x4)?_0xd40b8d+=String['fromCharCode'](0xff&_0x47eac7>>(-0x2*_0x1657b6&0x6)):0x0){_0x3abea1=_0x31fdd9['indexOf'](_0x3abea1);}for(let _0x409ff6=0x0,_0x5f472a=_0xd40b8d['length'];_0x409ff6<_0x5f472a;_0x409ff6++){_0x536b76+='%'+('00'+_0xd40b8d['charCodeAt'](_0x409ff6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x536b76);};_0x4b8b['epkeHl']=_0x1c5328,_0x4b8b['KweFCy']={},_0x4b8b['TZGCLi']=!![];}const _0x2f22a9=_0x5c0d8c[0x0],_0x2c2190=_0xa0bd5a+_0x2f22a9,_0x4c8d16=_0x4b8b['KweFCy'][_0x2c2190];return!_0x4c8d16?(_0x4b8bc6=_0x4b8b['epkeHl'](_0x4b8bc6),_0x4b8b['KweFCy'][_0x2c2190]=_0x4b8bc6):_0x4b8bc6=_0x4c8d16,_0x4b8bc6;}(function(_0x43981d,_0x3be4be){const _0x32fa0b={_0x1bee4e:0x186,_0x1e0858:0x17b,_0x28a7ba:0x260,_0x2e2158:0x1d9,_0x2aade5:0x192,_0x71d64c:0x1a7},_0x15d9c5=_0x4b8b,_0x49d9e6=_0x4b8b,_0x2153ab=_0x43981d();while(!![]){try{const _0x253dcc=-parseInt(_0x15d9c5(_0x32fa0b._0x1bee4e))/0x1+parseInt(_0x15d9c5(_0x32fa0b._0x1e0858))/0x2+-parseInt(_0x49d9e6(_0x32fa0b._0x28a7ba))/0x3+-parseInt(_0x49d9e6(_0x32fa0b._0x2e2158))/0x4+parseInt(_0x49d9e6(_0x32fa0b._0x2aade5))/0x5+-parseInt(_0x49d9e6(0x16a))/0x6*(parseInt(_0x49d9e6(0x1ea))/0x7)+parseInt(_0x49d9e6(0x18e))/0x8*(parseInt(_0x15d9c5(_0x32fa0b._0x71d64c))/0x9);if(_0x253dcc===_0x3be4be)break;else _0x2153ab['push'](_0x2153ab['shift']());}catch(_0x486fc7){_0x2153ab['push'](_0x2153ab['shift']());}}}(_0x5c0d,0x637e9),function(_0x322b78){const _0x2da1cf={_0x3d0ae7:0x191,_0x2857a6:0x1cd,_0x5c2a19:0x23e,_0x166649:0x197,_0x2b1f9f:0x18c,_0x3c079b:0x182,_0xa875bf:0x1dc,_0x180e73:0x187,_0x5541de:0x198,_0xf4aa03:0x26e,_0x43b6b7:0x248,_0x97c251:0x1f7,_0x34f0fb:0x1d8,_0x2589f4:0x20c,_0x3070eb:0x272,_0x390294:0x173,_0x2b1920:0x14d,_0x351c82:0x18b,_0x1b0605:0x227,_0x20140f:0x1f6,_0x529363:0x15d,_0x4dd70b:0x1ca,_0x38ec98:0x1cc,_0xc79d3b:0x162,_0x5d6e8a:0x167,_0x2df0a4:0x21a,_0x5c00cd:0x23d,_0x337ab3:0x1c8,_0x1947d1:0x204,_0x435ac5:0x247,_0x4364dd:0x280,_0x309619:0x211,_0x305f08:0x1e5,_0x276084:0x21b,_0x3ec973:0x201,_0x540a89:0x1dd,_0x1f9612:0x1e9,_0x176a0f:0x1ad,_0x23c2b3:0x275,_0xa8a83c:0x24c,_0x45b227:0x268,_0x470c78:0x25f,_0x503e91:0x242,_0x5989a2:0x1ae,_0x2e561d:0x202,_0x455f0b:0x1a3,_0x5836af:0x1bb,_0xed016f:0x26a,_0xf720c9:0x1ac,_0x410d3f:0x1a2,_0x3965c5:0x250,_0x1c0db1:0x228,_0x56e778:0x217,_0x43a0c6:0x25d,_0x4684ab:0x22c,_0x1da3ea:0x243,_0x26e618:0x1ba,_0x500880:0x203,_0x387250:0x1eb,_0x4a6020:0x218,_0x4c3001:0x15e,_0x255b8f:0x239,_0x2a347f:0x23c,_0x532060:0x1c4,_0x3cb5d6:0x1b4,_0x3809f3:0x1f4,_0x49cbf0:0x1fe,_0x3ec058:0x27e,_0x49f727:0x1c0,_0x275d0d:0x1b1,_0x5a6687:0x150,_0x4839c9:0x262,_0x108229:0x26d,_0x3f9518:0x24f,_0x450671:0x189,_0x4a8386:0x1f1,_0x4f3613:0x1d6,_0x6ad9b7:0x229,_0xae44bf:0x20d,_0xc2ad1b:0x16c,_0x1c2be2:0x183,_0x129745:0x24a,_0x25f325:0x1d4,_0x4d39cf:0x1db,_0x2c9adc:0x274,_0x17106f:0x163,_0x11f136:0x27b,_0x50aa9c:0x279,_0x5c350c:0x15f,_0x527329:0x194,_0x16a80d:0x1fc,_0x4796ae:0x232,_0x3b7eb8:0x23f,_0x112359:0x251,_0x1988d1:0x1f0,_0x373860:0x1bd,_0x206cbe:0x19b,_0x3af490:0x277,_0x368cc6:0x178,_0x18f171:0x253,_0x3dae4d:0x20f,_0x492614:0x1e0,_0x3da43a:0x1e8,_0x596067:0x26c,_0x220e7b:0x171,_0x56f511:0x151,_0x2365d9:0x1b8,_0x260abf:0x16e,_0x4f2b8f:0x190,_0xaec02b:0x244,_0x4d8346:0x1d5,_0x23e8e8:0x1a9,_0xed7753:0x16f,_0x3f63d7:0x276,_0x517076:0x17e,_0x430b97:0x266,_0x36d52b:0x25a,_0x1d2732:0x199,_0x2b60b7:0x21c,_0x65ba70:0x25b,_0x190310:0x27f,_0x1766bc:0x206,_0x3676f6:0x1f9,_0x1ef79d:0x156,_0x5a4578:0x27d,_0x2a91b8:0x245,_0x57d941:0x20e,_0x33bea3:0x238,_0x4ba80e:0x1b5,_0x2ff057:0x154,_0x39ef32:0x1af,_0x189310:0x1c2,_0x14ef4c:0x208,_0x5be717:0x222,_0x561668:0x1c6,_0x53aec4:0x161,_0x376e75:0x270,_0x4f0d43:0x160,_0x3374ef:0x152,_0x2e8aa0:0x19a,_0x1cc995:0x1bc,_0x5adfad:0x1de,_0x8123ad:0x1a4,_0x431af9:0x1cb,_0x3f4543:0x15c,_0xb7d299:0x1ff,_0xe2578c:0x18f,_0x35aee5:0x185,_0x30ebdb:0x15b,_0x3b61e2:0x265,_0x391c38:0x15d,_0x4a47c8:0x15d,_0x4ba03a:0x1ca,_0x146bcb:0x185,_0x1b9fcc:0x265,_0x2b210c:0x15d,_0x4eef46:0x1ca,_0x2e3077:0x1fb,_0x2440d5:0x185},_0x2fd1a1={_0x283332:0x225,_0x2d2b85:0x177,_0x53117e:0x17f,_0x3fd500:0x240,_0x3d7e1e:0x1b7,_0x526e42:0x209,_0x1ac5c9:0x23b,_0x2cad33:0x1df,_0x1ce44e:0x221,_0x5aa0b4:0x221,_0x1a5266:0x264,_0x3d4d9d:0x23b,_0x1781aa:0x205,_0x547350:0x180,_0x676ef:0x168,_0x289aac:0x255,_0x330ea9:0x23b,_0x10986b:0x1a1,_0x14c942:0x20a,_0x1b0892:0x1a1,_0xb5e36e:0x269,_0x5b4349:0x15d,_0x51c611:0x1ca,_0x2107cc:0x27c,_0x5a71ec:0x259,_0x2ac45c:0x22f,_0x31bdf9:0x267,_0x1f6911:0x22d,_0x21aff7:0x19d,_0x58da27:0x19d,_0xf9204f:0x1f8,_0x2f9192:0x19d,_0x29e5b8:0x168,_0x3598e7:0x1a0,_0x2ddaad:0x263,_0x55a2d0:0x254,_0x418b95:0x259,_0x441dd3:0x20c,_0x40b494:0x214,_0x401ff1:0x223,_0x5a5a59:0x22e,_0x4055ba:0x1d0,_0x2f78b4:0x1d0,_0x517b12:0x19f,_0x15006:0x1e3,_0x17091d:0x1d0,_0x5cbe1e:0x19f,_0x2a6eb7:0x1b0,_0x518ed7:0x1f2,_0x535ca1:0x1b2,_0x53997e:0x17a,_0xace37b:0x212,_0x479c3f:0x257,_0xfb5f4:0x216,_0x2956bd:0x219,_0x394be3:0x19d,_0x11c558:0x255,_0x25e484:0x27c,_0x40affc:0x174,_0x3f9f8a:0x19d,_0x30fa67:0x1c7,_0x2618d5:0x271,_0x2ef361:0x22e,_0x92b8e:0x1d0,_0x155e88:0x153,_0x58b15b:0x1fd,_0x593497:0x231,_0x2d39b6:0x181,_0xe0cfff:0x16b,_0x3cc0f7:0x18a,_0x22d502:0x176,_0x444b75:0x1aa,_0x3e66d8:0x27a,_0x230cbf:0x278,_0x93ba31:0x14f,_0x105029:0x23a,_0x152ea7:0x1a5,_0x3ab4e7:0x22b,_0x21c8fd:0x255,_0x3d1099:0x24d,_0x204515:0x1b7,_0x27fdd1:0x1c3,_0x3d9152:0x1c3,_0x735370:0x20b,_0x14e864:0x19d,_0x18ddf6:0x19d,_0x22b674:0x234,_0x501c18:0x215,_0x14e001:0x170,_0x44a0d9:0x20b,_0xd4bb75:0x230,_0x208e65:0x17c,_0x10fdbd:0x1ab,_0x4a3785:0x1aa,_0x1361e0:0x17c,_0x108ed4:0x22e,_0x329101:0x1d0,_0x4308c1:0x22e,_0x3195e5:0x1d0,_0x5cca8e:0x165,_0x41d2e2:0x18d,_0x542559:0x1be,_0x4c0bbb:0x18d,_0x1b6deb:0x1bf,_0x2d4464:0x1ec,_0x2ce4ec:0x224,_0x717b2a:0x18a,_0x1eda6e:0x210,_0xcafdd:0x207,_0x42dd5e:0x246},_0x4487e6={_0x14b9bb:0x155,_0x4166d1:0x233,_0x53667f:0x1f8,_0x367bea:0x219,_0x3796bc:0x1e7,_0x5f0bb3:0x159,_0x1babf8:0x19c,_0x56c287:0x1b6,_0x27b257:0x236,_0x24a6c8:0x200,_0x2d9655:0x1a8,_0x351217:0x184,_0x4a0263:0x1ee,_0x5aa65b:0x159,_0x170ee1:0x184,_0xa28e8f:0x1e4,_0x505985:0x1ef,_0xfe2b38:0x213,_0x7ec27e:0x258,_0x5efaa0:0x1ee,_0x17b177:0x249,_0x4b3ebf:0x1ce,_0x337340:0x200,_0x344885:0x193,_0x2969bc:0x168,_0x9f4149:0x255},_0xb67b61={_0x52706f:0x19d,_0x4bf22a:0x219,_0x2bea32:0x255,_0x29303c:0x1a0,_0xba1bb7:0x1d3},_0x26aed8={_0xf624df:0x168,_0xf900d1:0x1e2,_0x447352:0x19d,_0x3081e3:0x19d,_0x177fee:0x172,_0x155b39:0x179,_0x315a4e:0x219,_0x126ee7:0x216},_0x478545={_0x581b4f:0x169,_0x3430e0:0x1a6,_0x5e402f:0x1e2},_0x219c4e=_0x4b8b,_0x325e0=_0x4b8b,_0x1127d4={'IhViw':function(_0x127d8e,_0x342788){return _0x127d8e%_0x342788;},'wlUKY':function(_0x2bba80,_0x4725ae){return _0x2bba80*_0x4725ae;},'qstcY':function(_0xe3e9a3,_0x3edf60){return _0xe3e9a3%_0x3edf60;},'NEifM':function(_0x330114,_0x3e8eda){return _0x330114<_0x3e8eda;},'OSFHx':function(_0xadfabd,_0x51102f){return _0xadfabd(_0x51102f);},'ktPka':function(_0xe1ad51,_0x274940,_0x3f41c4){return _0xe1ad51(_0x274940,_0x3f41c4);},'dbkyh':function(_0x58f749,_0x5487db){return _0x58f749*_0x5487db;},'SRChA':function(_0x477e78,_0x157cde){return _0x477e78-_0x157cde;},'MWTMf':function(_0x37b0b2,_0x19bdf4){return _0x37b0b2|_0x19bdf4;},'jomOr':function(_0x4f2524,_0x5449bf){return _0x4f2524<_0x5449bf;},'gOhkp':function(_0x25825a,_0x33deb7){return _0x25825a-_0x33deb7;},'FqOOX':function(_0x570c3d,_0x5da045){return _0x570c3d+_0x5da045;},'BKoSN':function(_0x2bdfab,_0x15629f){return _0x2bdfab+_0x15629f;},'KwdKX':function(_0x4aa820,_0x4bc0f9){return _0x4aa820^_0x4bc0f9;},'Hhhzu':function(_0xd9754c,_0x59e2d2){return _0xd9754c&_0x59e2d2;},'kJsRs':function(_0x3d95f0,_0x410e14){return _0x3d95f0<_0x410e14;},'vTOoq':function(_0x4c01d6,_0x57960c){return _0x4c01d6-_0x57960c;},'jLjra':function(_0x43ffb7,_0x7f9f05,_0x73b842){return _0x43ffb7(_0x7f9f05,_0x73b842);},'NVPkB':function(_0x40437d,_0x40a45d){return _0x40437d>>>_0x40a45d;},'eEYuf':function(_0x4dd36a,_0x15caf1,_0x32e82c){return _0x4dd36a(_0x15caf1,_0x32e82c);},'fKrGp':function(_0x149715,_0x51e109){return _0x149715<_0x51e109;},'MMajY':function(_0x5a99d1,_0x473772){return _0x5a99d1>>_0x473772;},'szieR':_0x219c4e(_0x2da1cf._0x3d0ae7)+_0x219c4e(_0x2da1cf._0x2857a6)+_0x325e0(_0x2da1cf._0x5c2a19)+_0x325e0(_0x2da1cf._0x166649),'kwNQb':_0x219c4e(_0x2da1cf._0x2b1f9f)+_0x219c4e(_0x2da1cf._0x3c079b)+_0x219c4e(_0x2da1cf._0xa875bf)+_0x325e0(_0x2da1cf._0x180e73)+'e','xKTnd':function(_0x237cb0,_0x219014){return _0x237cb0===_0x219014;},'ApEdL':_0x219c4e(_0x2da1cf._0x5541de)+_0x219c4e(_0x2da1cf._0xf4aa03)+_0x219c4e(0x196)+_0x325e0(_0x2da1cf._0x43b6b7)+_0x325e0(_0x2da1cf._0x97c251)+_0x325e0(_0x2da1cf._0x34f0fb)+_0x219c4e(0x188)+_0x219c4e(0x21e),'aSTIq':function(_0x4532b1,_0x14fba1){return _0x4532b1<_0x14fba1;},'ckymD':function(_0x1ec80b,_0x174696){return _0x1ec80b+_0x174696;},'PUVtu':_0x219c4e(_0x2da1cf._0x2589f4)+_0x325e0(_0x2da1cf._0x3070eb)+'-','IaNSe':function(_0x4e5f6a,_0x1ddc35,_0x3cad64){return _0x4e5f6a(_0x1ddc35,_0x3cad64);},'CjENT':function(_0x5686be,_0x2c2261){return _0x5686be(_0x2c2261);},'iIeRN':_0x325e0(_0x2da1cf._0x390294),'Qfcpi':_0x219c4e(_0x2da1cf._0x2589f4)+_0x219c4e(_0x2da1cf._0x2b1920)+_0x325e0(_0x2da1cf._0x351c82)+_0x325e0(_0x2da1cf._0x1b0605)+'@#','QClhO':_0x219c4e(_0x2da1cf._0x20140f),'eidCF':function(_0x25e466,_0x2d4dda,_0x5587fa,_0x199886){return _0x25e466(_0x2d4dda,_0x5587fa,_0x199886);},'FnQbp':function(_0x180720,_0x87f799){return _0x180720/_0x87f799;},'KDPSQ':function(_0x2861d2,_0x130896){return _0x2861d2(_0x130896);},'Ogink':_0x325e0(_0x2da1cf._0x529363)+_0x325e0(_0x2da1cf._0x4dd70b)+'d'},_0x41cbce=_0x1127d4[_0x219c4e(_0x2da1cf._0x38ec98)+'Q'](BigInt,_0x325e0(_0x2da1cf._0xc79d3b)+_0x325e0(_0x2da1cf._0x5d6e8a)+_0x219c4e(_0x2da1cf._0x2df0a4)+_0x219c4e(0x273)+_0x219c4e(_0x2da1cf._0x5c00cd)+_0x325e0(_0x2da1cf._0x337ab3)+_0x325e0(_0x2da1cf._0x1947d1)+_0x325e0(0x237)+_0x325e0(_0x2da1cf._0x435ac5)+_0x219c4e(_0x2da1cf._0x4364dd)+_0x325e0(_0x2da1cf._0x309619)+_0x219c4e(_0x2da1cf._0x305f08)+_0x325e0(_0x2da1cf._0x276084)+_0x219c4e(_0x2da1cf._0x3ec973)+_0x219c4e(0x1d2)+_0x219c4e(_0x2da1cf._0x540a89)+_0x219c4e(_0x2da1cf._0x1f9612)+_0x219c4e(0x226)+_0x219c4e(_0x2da1cf._0x176a0f)+_0x325e0(0x22a)+_0x219c4e(0x21f)+_0x219c4e(0x1c5)+_0x325e0(_0x2da1cf._0x23c2b3)+_0x219c4e(0x1e1)+_0x219c4e(0x19e)+_0x219c4e(_0x2da1cf._0xa8a83c)+_0x219c4e(_0x2da1cf._0x45b227)+_0x325e0(_0x2da1cf._0x470c78)+_0x325e0(_0x2da1cf._0x503e91)+_0x219c4e(_0x2da1cf._0x5989a2)+_0x219c4e(_0x2da1cf._0x2e561d)+_0x219c4e(_0x2da1cf._0x455f0b)+_0x325e0(_0x2da1cf._0x5836af)+_0x325e0(_0x2da1cf._0xed016f)+_0x219c4e(_0x2da1cf._0xf720c9)+_0x219c4e(_0x2da1cf._0x410d3f)+_0x219c4e(_0x2da1cf._0x3965c5)+_0x325e0(_0x2da1cf._0x1c0db1)+_0x325e0(_0x2da1cf._0x56e778)+_0x219c4e(_0x2da1cf._0x43a0c6)+_0x325e0(0x25e)+_0x325e0(_0x2da1cf._0x4684ab)+_0x325e0(_0x2da1cf._0x1da3ea)+_0x219c4e(0x158)+_0x325e0(_0x2da1cf._0x26e618)+_0x219c4e(_0x2da1cf._0x500880)+_0x219c4e(0x164)+_0x219c4e(_0x2da1cf._0x387250)+_0x325e0(_0x2da1cf._0x4a6020)+_0x219c4e(_0x2da1cf._0x4c3001)+_0x219c4e(_0x2da1cf._0x255b8f)+_0x219c4e(_0x2da1cf._0x2a347f)+_0x325e0(_0x2da1cf._0x532060)+_0x219c4e(_0x2da1cf._0x3cb5d6)+_0x325e0(_0x2da1cf._0x3809f3)+_0x219c4e(_0x2da1cf._0x49cbf0)+_0x219c4e(_0x2da1cf._0x3ec058)+_0x219c4e(_0x2da1cf._0x49f727)+_0x219c4e(_0x2da1cf._0x275d0d)+_0x219c4e(_0x2da1cf._0x5a6687)+_0x325e0(_0x2da1cf._0x4839c9)+_0x219c4e(_0x2da1cf._0x108229)+_0x219c4e(_0x2da1cf._0x3f9518)+_0x325e0(_0x2da1cf._0x450671)+_0x219c4e(_0x2da1cf._0x4a8386)+_0x219c4e(_0x2da1cf._0x4f3613)+_0x219c4e(_0x2da1cf._0x6ad9b7)+_0x219c4e(_0x2da1cf._0xae44bf)+_0x325e0(_0x2da1cf._0xc2ad1b)+_0x325e0(_0x2da1cf._0x1c2be2)+_0x325e0(0x195)+_0x219c4e(0x24b)+_0x325e0(_0x2da1cf._0x129745)+_0x219c4e(_0x2da1cf._0x25f325)+_0x325e0(_0x2da1cf._0x4d39cf)+_0x219c4e(_0x2da1cf._0x2c9adc)+_0x219c4e(_0x2da1cf._0x17106f)+_0x219c4e(_0x2da1cf._0x11f136)+_0x219c4e(0x26f)+_0x325e0(_0x2da1cf._0x50aa9c)+_0x219c4e(_0x2da1cf._0x5c350c)+_0x325e0(0x24e)+_0x219c4e(_0x2da1cf._0x527329)+_0x219c4e(_0x2da1cf._0x16a80d)+_0x325e0(_0x2da1cf._0x4796ae)+_0x325e0(0x16d)+_0x325e0(_0x2da1cf._0x3b7eb8)+_0x219c4e(_0x2da1cf._0x112359)+_0x325e0(0x26b)+_0x219c4e(0x1ed)+_0x219c4e(_0x2da1cf._0x1988d1)+_0x325e0(_0x2da1cf._0x373860)+_0x219c4e(_0x2da1cf._0x206cbe)+_0x325e0(_0x2da1cf._0x3af490)+_0x219c4e(_0x2da1cf._0x368cc6)+_0x325e0(0x1e6)+_0x219c4e(_0x2da1cf._0x18f171)+_0x325e0(_0x2da1cf._0x3dae4d)+_0x325e0(0x17d)+_0x219c4e(_0x2da1cf._0x492614)+_0x325e0(_0x2da1cf._0x3da43a)+_0x219c4e(_0x2da1cf._0x596067)+_0x325e0(_0x2da1cf._0x220e7b)+_0x325e0(0x1d7)+_0x325e0(_0x2da1cf._0x56f511)+_0x325e0(_0x2da1cf._0x2365d9)+_0x219c4e(0x261)+_0x219c4e(_0x2da1cf._0x260abf)+_0x219c4e(_0x2da1cf._0x4f2b8f)+_0x219c4e(_0x2da1cf._0xaec02b)+_0x325e0(_0x2da1cf._0x4d8346)+_0x219c4e(_0x2da1cf._0x23e8e8)+_0x325e0(_0x2da1cf._0xed7753)+_0x325e0(_0x2da1cf._0x3f63d7)+_0x219c4e(_0x2da1cf._0x517076)+_0x325e0(_0x2da1cf._0x430b97)+_0x325e0(0x1fa)+_0x219c4e(_0x2da1cf._0x36d52b)+_0x325e0(_0x2da1cf._0x1d2732)+_0x219c4e(_0x2da1cf._0x2b60b7)+_0x219c4e(0x252)+_0x219c4e(_0x2da1cf._0x65ba70)+_0x325e0(0x241)+_0x325e0(_0x2da1cf._0x190310)+_0x219c4e(_0x2da1cf._0x1766bc)+_0x219c4e(_0x2da1cf._0x3676f6)+_0x219c4e(_0x2da1cf._0x1ef79d)+_0x325e0(_0x2da1cf._0x5a4578)+_0x325e0(_0x2da1cf._0x2a91b8)+_0x219c4e(_0x2da1cf._0x57d941)+_0x219c4e(_0x2da1cf._0x33bea3)+_0x325e0(_0x2da1cf._0x4ba80e)+_0x219c4e(_0x2da1cf._0x2ff057)+_0x325e0(_0x2da1cf._0x39ef32)+_0x219c4e(_0x2da1cf._0x189310)+_0x219c4e(_0x2da1cf._0x14ef4c)+_0x219c4e(_0x2da1cf._0x5be717)+_0x219c4e(_0x2da1cf._0x17106f)+_0x219c4e(_0x2da1cf._0x561668)+_0x325e0(0x256)+_0x219c4e(_0x2da1cf._0x53aec4)+_0x325e0(_0x2da1cf._0x376e75)+_0x219c4e(_0x2da1cf._0x4f0d43)+_0x325e0(_0x2da1cf._0x3374ef)+_0x219c4e(_0x2da1cf._0x2e8aa0)+_0x219c4e(_0x2da1cf._0x1cc995)+_0x325e0(0x166)+_0x325e0(_0x2da1cf._0x5adfad)+_0x219c4e(_0x2da1cf._0x8123ad)+_0x219c4e(_0x2da1cf._0x431af9)+_0x219c4e(0x1d1)+_0x325e0(_0x2da1cf._0x3f4543)+_0x219c4e(_0x2da1cf._0xb7d299)+_0x219c4e(_0x2da1cf._0xe2578c)+'1'),_0x316a68=0x10001n;function _0xb2ad95(_0x174784,_0xdd7b4d,_0x101298){const _0x5bbaa7=_0x219c4e,_0xe268c0=_0x219c4e;let _0xdc9b2e=0x1n;_0x174784=_0x1127d4[_0x5bbaa7(_0x478545._0x581b4f)+'w'](_0x174784,_0x101298);while(_0xdd7b4d>0x0n){if(_0x1127d4[_0x5bbaa7(0x169)+'w'](_0xdd7b4d,0x2n)===0x1n)_0xdc9b2e=_0x1127d4[_0x5bbaa7(_0x478545._0x3430e0)+'Y'](_0xdc9b2e,_0x174784)%_0x101298;_0xdd7b4d=_0xdd7b4d/0x2n,_0x174784=_0x1127d4[_0xe268c0(_0x478545._0x5e402f)+'Y'](_0x174784*_0x174784,_0x101298);}return _0xdc9b2e;}function _0x546a55(_0x35e3c8){const _0x35a39d=_0x325e0,_0x42be04=_0x325e0;let _0x169d63=_0x35e3c8[_0x35a39d(_0x26aed8._0xf624df)+_0x35a39d(0x255)](0x10);if(_0x1127d4[_0x35a39d(_0x26aed8._0xf900d1)+'Y'](_0x169d63[_0x35a39d(_0x26aed8._0x447352)+'th'],0x2)!==0x0)_0x169d63='0'+_0x169d63;let _0x238f1f='';for(let _0xd2bbea=0x0;_0xd2bbea<_0x169d63[_0x35a39d(_0x26aed8._0x3081e3)+'th'];_0xd2bbea+=0x2){_0x238f1f+=String[_0x42be04(_0x26aed8._0x177fee)+_0x42be04(_0x26aed8._0x155b39)+_0x42be04(_0x26aed8._0x315a4e)](parseInt(_0x169d63[_0x35a39d(_0x26aed8._0x126ee7)+'tr'](_0xd2bbea,0x2),0x10));}return _0x238f1f;}function _0x268f6f(_0x2a0451){const _0x6eeb76=_0x219c4e,_0x2519da=_0x219c4e;let _0x510d18='';for(let _0xe85f0d=0x0;_0x1127d4[_0x6eeb76(0x157)+'M'](_0xe85f0d,_0x2a0451[_0x2519da(_0xb67b61._0x52706f)+'th']);_0xe85f0d++){_0x510d18+=_0x2a0451[_0x6eeb76(0x1f8)+_0x2519da(_0xb67b61._0x4bf22a)+'At'](_0xe85f0d)[_0x6eeb76(0x168)+_0x2519da(_0xb67b61._0x2bea32)](0x10)[_0x2519da(_0xb67b61._0x29303c)+_0x6eeb76(0x263)](0x2,'0');}return _0x1127d4[_0x6eeb76(_0xb67b61._0xba1bb7)+'x'](BigInt,'0x'+_0x510d18);}function _0x29e9b6(_0x3922f9){const _0x1abb18=_0x219c4e,_0x2e6a30=_0x219c4e;function _0x47b66a(_0x37e3c7,_0x2505be){return _0x37e3c7>>>_0x2505be|_0x37e3c7<<0x20-_0x2505be;}var _0x484066=Math[_0x1abb18(_0x4487e6._0x14b9bb)],_0xb8feab=_0x484066(0x2,0x20),_0xdf4b21=_0x1abb18(0x19d)+'th',_0x18b21d,_0x3dde9c,_0x113eeb='',_0xa4435d=[],_0x505729=_0x3922f9[_0xdf4b21]*0x8,_0x1db25a=_0x29e9b6['h']=_0x29e9b6['h']||[],_0x262c74=_0x29e9b6['k']=_0x29e9b6['k']||[],_0x18798b=_0x262c74[_0xdf4b21],_0x1432cf={};for(var _0x22370c=0x2;_0x18798b<0x40;_0x22370c++){if(!_0x1432cf[_0x22370c]){for(_0x18b21d=0x0;_0x18b21d<0x139;_0x18b21d+=_0x22370c){_0x1432cf[_0x18b21d]=_0x22370c;}_0x1db25a[_0x18798b]=_0x1127d4[_0x2e6a30(_0x4487e6._0x4166d1)+'a'](_0x484066,_0x22370c,0.5)*_0xb8feab|0x0,_0x262c74[_0x18798b++]=_0x484066(_0x22370c,0x1/0x3)*_0xb8feab|0x0;}}_0x3922f9+='\u0080';while(_0x3922f9[_0xdf4b21]%0x40-0x38)_0x3922f9+='\x00';for(_0x18b21d=0x0;_0x18b21d<_0x3922f9[_0xdf4b21];_0x18b21d++){_0x3dde9c=_0x3922f9[_0x1abb18(_0x4487e6._0x53667f)+_0x2e6a30(_0x4487e6._0x367bea)+'At'](_0x18b21d);if(_0x3dde9c>>0x8)return;_0xa4435d[_0x18b21d>>0x2]|=_0x3dde9c<<_0x1127d4[_0x1abb18(_0x4487e6._0x3796bc)+'h'](_0x1127d4[_0x1abb18(0x1b9)+'A'](0x3,_0x18b21d)%0x4,0x8);}_0xa4435d[_0xa4435d[_0xdf4b21]]=_0x1127d4[_0x2e6a30(_0x4487e6._0x5f0bb3)+'f'](_0x505729/_0xb8feab,0x0),_0xa4435d[_0xa4435d[_0xdf4b21]]=_0x505729;for(_0x3dde9c=0x0;_0x1127d4[_0x1abb18(_0x4487e6._0x1babf8)+'r'](_0x3dde9c,_0xa4435d[_0xdf4b21]);){var _0x4d3918=_0xa4435d[_0x1abb18(_0x4487e6._0x56c287)+'e'](_0x3dde9c,_0x3dde9c+=0x10),_0x5da73c=_0x1db25a;_0x1db25a=_0x1db25a[_0x2e6a30(0x1b6)+'e'](0x0,0x8);for(_0x18b21d=0x0;_0x18b21d<0x40;_0x18b21d++){var _0x1da569=_0x4d3918[_0x18b21d-0xf],_0x2bf740=_0x4d3918[_0x1127d4[_0x2e6a30(_0x4487e6._0x27b257)+'p'](_0x18b21d,0x2)],_0x36dd35=_0x1db25a[0x0],_0x3a3ce7=_0x1db25a[0x4],_0x1116a7=_0x1127d4[_0x2e6a30(_0x4487e6._0x24a6c8)+'X'](_0x1127d4[_0x1abb18(_0x4487e6._0x2d9655)+'N'](_0x1db25a[0x7]+(_0x1127d4[_0x2e6a30(_0x4487e6._0x351217)+'X'](_0x47b66a(_0x3a3ce7,0x6),_0x47b66a(_0x3a3ce7,0xb))^_0x47b66a(_0x3a3ce7,0x19)),_0x1127d4[_0x2e6a30(_0x4487e6._0x4a0263)+'u'](_0x3a3ce7,_0x1db25a[0x5])^~_0x3a3ce7&_0x1db25a[0x6])+_0x262c74[_0x18b21d],_0x4d3918[_0x18b21d]=_0x1127d4[_0x2e6a30(0x1da)+'s'](_0x18b21d,0x10)?_0x4d3918[_0x18b21d]:_0x1127d4[_0x2e6a30(_0x4487e6._0x5aa65b)+'f'](_0x1127d4[_0x2e6a30(_0x4487e6._0x2d9655)+'N'](_0x4d3918[_0x18b21d-0x10]+_0x1127d4[_0x1abb18(_0x4487e6._0x170ee1)+'X'](_0x1127d4[_0x2e6a30(_0x4487e6._0x351217)+'X'](_0x47b66a(_0x1da569,0x7),_0x47b66a(_0x1da569,0x12)),_0x1da569>>>0x3),_0x4d3918[_0x1127d4[_0x2e6a30(_0x4487e6._0xa28e8f)+'q'](_0x18b21d,0x7)])+(_0x1127d4[_0x2e6a30(_0x4487e6._0x505985)+'a'](_0x47b66a,_0x2bf740,0x11)^_0x47b66a(_0x2bf740,0x13)^_0x1127d4[_0x1abb18(_0x4487e6._0xfe2b38)+'B'](_0x2bf740,0xa)),0x0)),_0x569d47=(_0x47b66a(_0x36dd35,0x2)^_0x1127d4[_0x2e6a30(_0x4487e6._0x7ec27e)+'f'](_0x47b66a,_0x36dd35,0xd)^_0x1127d4[_0x1abb18(0x1ef)+'a'](_0x47b66a,_0x36dd35,0x16))+(_0x36dd35&_0x1db25a[0x1]^_0x1127d4[_0x1abb18(_0x4487e6._0x5efaa0)+'u'](_0x36dd35,_0x1db25a[0x2])^_0x1db25a[0x1]&_0x1db25a[0x2]);_0x1db25a=[_0x1116a7+_0x569d47|0x0][_0x1abb18(_0x4487e6._0x17b177)+'at'](_0x1db25a),_0x1db25a[0x4]=_0x1db25a[0x4]+_0x1116a7|0x0;}for(_0x18b21d=0x0;_0x1127d4[_0x2e6a30(_0x4487e6._0x4b3ebf)+'p'](_0x18b21d,0x8);_0x18b21d++){_0x1db25a[_0x18b21d]=_0x1db25a[_0x18b21d]+_0x5da73c[_0x18b21d]|0x0;}}for(_0x18b21d=0x0;_0x18b21d<0x8;_0x18b21d++){for(_0x3dde9c=0x3;_0x1127d4[_0x2e6a30(_0x4487e6._0x337340)+'X'](_0x3dde9c,0x1);_0x3dde9c--){var _0x328ffd=_0x1127d4[_0x1abb18(_0x4487e6._0x5efaa0)+'u'](_0x1127d4[_0x2e6a30(_0x4487e6._0x344885)+'Y'](_0x1db25a[_0x18b21d],_0x3dde9c*0x8),0xff);_0x113eeb+=_0x1127d4[_0x2e6a30(0x200)+'X'](_0x1127d4[_0x1abb18(0x19c)+'r'](_0x328ffd,0x10)?0x0:'',_0x328ffd[_0x1abb18(_0x4487e6._0x2969bc)+_0x2e6a30(_0x4487e6._0x9f4149)](0x10));}}return _0x113eeb;}class LicenseManager{static validate(_0x31b7e8,_0x2d202f={}){const _0x730a9=_0x325e0,_0x2697a0=_0x325e0;if(!_0x31b7e8)return{'valid':![],'tier':null,'reason':_0x1127d4[_0x730a9(_0x2fd1a1._0x283332)+'R']};const _0x10e0c1=_0x31b7e8[_0x730a9(_0x2fd1a1._0x2d2b85)](),_0x437b45=_0x10e0c1[_0x2697a0(_0x2fd1a1._0x53117e)+_0x2697a0(0x25c)+_0x2697a0(_0x2fd1a1._0x3fd500)](),_0x3c088e=_0x437b45[_0x2697a0(_0x2fd1a1._0x3d7e1e)+'t']('-'),_0x4c49c3=_0x2d202f[_0x2697a0(_0x2fd1a1._0x526e42)+_0x730a9(_0x2fd1a1._0x1ac5c9)]!==undefined&&_0x2d202f[_0x2697a0(_0x2fd1a1._0x526e42)+_0x2697a0(_0x2fd1a1._0x1ac5c9)]!==null?_0x2d202f[_0x730a9(_0x2fd1a1._0x526e42)+_0x730a9(_0x2fd1a1._0x1ac5c9)]:Date[_0x730a9(0x1b3)]();let _0x68379f=0x0;_0x2d202f[_0x2697a0(_0x2fd1a1._0x2cad33)+_0x730a9(_0x2fd1a1._0x1ce44e)]&&(_0x68379f=parseInt(_0x2d202f[_0x730a9(_0x2fd1a1._0x2cad33)+_0x2697a0(_0x2fd1a1._0x5aa0b4)][_0x730a9(_0x2fd1a1._0x1a5266)+_0x2697a0(0x180)](_0x1127d4[_0x2697a0(0x15a)+'b'])||'0',0xa),(_0x2d202f[_0x2697a0(_0x2fd1a1._0x526e42)+_0x2697a0(_0x2fd1a1._0x1ac5c9)]===undefined||_0x2d202f[_0x2697a0(0x209)+_0x2697a0(_0x2fd1a1._0x3d4d9d)]===null)&&_0x2d202f[_0x2697a0(_0x2fd1a1._0x2cad33)+_0x2697a0(_0x2fd1a1._0x5aa0b4)][_0x2697a0(_0x2fd1a1._0x1781aa)+_0x2697a0(_0x2fd1a1._0x547350)](_0x1127d4[_0x730a9(0x15a)+'b'],_0x4c49c3[_0x2697a0(_0x2fd1a1._0x676ef)+_0x2697a0(_0x2fd1a1._0x289aac)]()));if((_0x2d202f[_0x730a9(0x209)+_0x2697a0(_0x2fd1a1._0x3d4d9d)]===undefined||_0x1127d4[_0x2697a0(0x176)+'d'](_0x2d202f[_0x2697a0(_0x2fd1a1._0x526e42)+_0x2697a0(_0x2fd1a1._0x330ea9)],null))&&_0x4c49c3<_0x68379f){if(_0x2d202f[_0x730a9(0x20a)+_0x730a9(_0x2fd1a1._0x10986b)+'y'])_0x2d202f[_0x730a9(_0x2fd1a1._0x14c942)+_0x730a9(_0x2fd1a1._0x1b0892)+'y']();return{'valid':![],'tier':null,'reason':_0x1127d4[_0x2697a0(_0x2fd1a1._0xb5e36e)+'L']};}const _0xbc480c=typeof atob!==_0x730a9(_0x2fd1a1._0x5b4349)+_0x2697a0(_0x2fd1a1._0x51c611)+'d'?atob:_0x5f0bbc=>Buffer[_0x2697a0(0x172)](_0x5f0bbc,_0x730a9(0x1f3)+'64')[_0x2697a0(0x168)+_0x730a9(0x255)](_0x730a9(0x1cf)+'ry');if(_0x437b45[_0x2697a0(_0x2fd1a1._0x2107cc)+_0x730a9(_0x2fd1a1._0x5a71ec)+'th'](_0x730a9(_0x2fd1a1._0x2ac45c)+_0x730a9(_0x2fd1a1._0x31bdf9)+'-'))try{const _0x20ac4f=_0x10e0c1[_0x2697a0(0x216)+_0x730a9(_0x2fd1a1._0x1f6911)+'g'](0x9),_0x505992=_0xbc480c(_0x20ac4f),_0x3b2120=new Uint8Array(_0x505992[_0x2697a0(_0x2fd1a1._0x21aff7)+'th']);for(let _0x311963=0x0;_0x1127d4[_0x730a9(0x1c1)+'q'](_0x311963,_0x505992[_0x2697a0(_0x2fd1a1._0x58da27)+'th']);_0x311963++){_0x3b2120[_0x311963]=_0x505992[_0x2697a0(_0x2fd1a1._0xf9204f)+_0x2697a0(0x219)+'At'](_0x311963);}let _0x5ab5b6='';for(let _0x1307d7=0x0;_0x1307d7<_0x3b2120[_0x2697a0(_0x2fd1a1._0x2f9192)+'th'];_0x1307d7++){_0x5ab5b6+=_0x3b2120[_0x1307d7][_0x730a9(_0x2fd1a1._0x29e5b8)+_0x730a9(_0x2fd1a1._0x289aac)](0x10)[_0x2697a0(_0x2fd1a1._0x3598e7)+_0x2697a0(_0x2fd1a1._0x2ddaad)](0x2,'0');}const _0x58e1c6=BigInt(_0x1127d4[_0x2697a0(_0x2fd1a1._0x55a2d0)+'D']('0x',_0x5ab5b6)),_0x28eea0=_0xb2ad95(_0x58e1c6,_0x316a68,_0x41cbce),_0x4ce590=_0x546a55(_0x28eea0);if(_0x4ce590[_0x2697a0(_0x2fd1a1._0x2107cc)+_0x730a9(_0x2fd1a1._0x418b95)+'th'](_0x730a9(_0x2fd1a1._0x441dd3)+_0x2697a0(_0x2fd1a1._0x40b494)+_0x2697a0(0x1f5))){const _0x5e9bf4=parseInt(_0x4ce590[_0x730a9(0x216)+_0x730a9(0x22d)+'g'](0xb),0xa);if(!isNaN(_0x5e9bf4)){if(_0x4c49c3<_0x5e9bf4)return{'valid':!![],'tier':_0x2697a0(_0x2fd1a1._0x401ff1)+'S','expires':_0x5e9bf4};if(_0x2d202f[_0x730a9(_0x2fd1a1._0x5a5a59)+_0x2697a0(_0x2fd1a1._0x4055ba)+'d'])_0x2d202f[_0x730a9(0x22e)+_0x730a9(_0x2fd1a1._0x2f78b4)+'d'](_0x730a9(0x19f)+'t');return{'valid':![],'tier':null,'reason':_0x730a9(_0x2fd1a1._0x517b12)+_0x2697a0(_0x2fd1a1._0x15006)+_0x2697a0(_0x2fd1a1._0x17091d)+'d'};}}}catch(_0x12becf){return{'valid':![],'tier':null,'reason':_0x730a9(_0x2fd1a1._0x5cbe1e)+_0x2697a0(_0x2fd1a1._0x2a6eb7)+_0x2697a0(_0x2fd1a1._0x518ed7)+_0x730a9(_0x2fd1a1._0x535ca1)+_0x2697a0(_0x2fd1a1._0x53997e)+_0x730a9(0x235)};}if(_0x437b45[_0x730a9(_0x2fd1a1._0x2107cc)+_0x2697a0(_0x2fd1a1._0x5a71ec)+'th'](_0x2697a0(_0x2fd1a1._0xace37b)+_0x2697a0(_0x2fd1a1._0x479c3f)))try{const _0x2fa0b7=_0x10e0c1[_0x2697a0(_0x2fd1a1._0xfb5f4)+_0x730a9(_0x2fd1a1._0x1f6911)+'g'](0x7),_0x4f57fe=_0xbc480c(_0x2fa0b7),_0x1e4c32=new Uint8Array(_0x4f57fe[_0x730a9(_0x2fd1a1._0x2f9192)+'th']);for(let _0x594270=0x0;_0x1127d4[_0x730a9(0x157)+'M'](_0x594270,_0x4f57fe[_0x730a9(0x19d)+'th']);_0x594270++){_0x1e4c32[_0x594270]=_0x4f57fe[_0x2697a0(_0x2fd1a1._0xf9204f)+_0x730a9(_0x2fd1a1._0x2956bd)+'At'](_0x594270);}let _0x4b1c14='';for(let _0x56285f=0x0;_0x56285f<_0x1e4c32[_0x730a9(_0x2fd1a1._0x394be3)+'th'];_0x56285f++){_0x4b1c14+=_0x1e4c32[_0x56285f][_0x2697a0(_0x2fd1a1._0x29e5b8)+_0x2697a0(_0x2fd1a1._0x11c558)](0x10)[_0x730a9(_0x2fd1a1._0x3598e7)+_0x2697a0(_0x2fd1a1._0x2ddaad)](0x2,'0');}const _0x1781b5=BigInt('0x'+_0x4b1c14),_0x49d926=_0xb2ad95(_0x1781b5,_0x316a68,_0x41cbce),_0x4d8517=_0x546a55(_0x49d926);if(_0x4d8517[_0x2697a0(_0x2fd1a1._0x25e484)+_0x730a9(_0x2fd1a1._0x5a71ec)+'th'](_0x1127d4[_0x2697a0(_0x2fd1a1._0x40affc)+'u'])){const _0x385910=_0x4d8517[_0x730a9(0x1b7)+'t']('-');if(_0x385910[_0x730a9(_0x2fd1a1._0x3f9f8a)+'th']>=0x5){const _0x21d5ba=_0x385910[0x2],_0x298b5d=_0x1127d4[_0x2697a0(_0x2fd1a1._0x30fa67)+'e'](parseInt,_0x385910[0x4],0xa);if(!_0x1127d4[_0x730a9(_0x2fd1a1._0x2618d5)+'T'](isNaN,_0x298b5d)){if(_0x4c49c3<_0x298b5d)return{'valid':!![],'tier':_0x21d5ba,'expires':_0x298b5d};if(_0x2d202f[_0x2697a0(_0x2fd1a1._0x2ef361)+_0x2697a0(_0x2fd1a1._0x92b8e)+'d'])_0x2d202f[_0x730a9(0x22e)+_0x730a9(_0x2fd1a1._0x17091d)+'d'](_0x730a9(_0x2fd1a1._0x155e88));return{'valid':![],'tier':null,'reason':_0x2697a0(_0x2fd1a1._0x58b15b)+_0x730a9(_0x2fd1a1._0x593497)+_0x2697a0(0x1be)+_0x730a9(_0x2fd1a1._0x2d39b6)};}}}}catch(_0x1caba3){return{'valid':![],'tier':null,'reason':_0x2697a0(0x1fd)+_0x730a9(0x14e)+_0x730a9(_0x2fd1a1._0xe0cfff)+_0x2697a0(0x224)+_0x730a9(_0x2fd1a1._0x3cc0f7)+'d'};}if(_0x3c088e[_0x2697a0(_0x2fd1a1._0x3f9f8a)+'th']===0x4&&_0x1127d4[_0x2697a0(_0x2fd1a1._0x22d502)+'d'](_0x3c088e[0x0],'PS')&&[_0x730a9(_0x2fd1a1._0x444b75),_0x2697a0(_0x2fd1a1._0x401ff1)+'S',_0x730a9(_0x2fd1a1._0x3e66d8),_0x1127d4[_0x2697a0(_0x2fd1a1._0x230cbf)+'N'],_0x730a9(_0x2fd1a1._0x93ba31)+_0x2697a0(_0x2fd1a1._0x105029)+'SE'][_0x2697a0(_0x2fd1a1._0x152ea7)+_0x2697a0(_0x2fd1a1._0x3ab4e7)](_0x3c088e[0x1])){const _0x5a9339=_0x3c088e[0x1],_0x276c4f=_0x3c088e[0x2],_0x104538=_0x3c088e[0x3],_0x69149f=_0x1127d4[_0x2697a0(0x21d)+'i'],_0x56868b=_0x276c4f+_0x69149f+_0x5a9339;let _0x1dbf2d=0x0;for(let _0x495c8d=0x0;_0x495c8d<_0x56868b[_0x730a9(_0x2fd1a1._0x2f9192)+'th'];_0x495c8d++){_0x1dbf2d+=_0x56868b[_0x2697a0(_0x2fd1a1._0xf9204f)+_0x2697a0(0x219)+'At'](_0x495c8d)*(_0x495c8d+0x1);}const _0x1ff00d=(_0x1dbf2d%0x270f)[_0x730a9(0x168)+_0x730a9(_0x2fd1a1._0x21c8fd)]()[_0x730a9(_0x2fd1a1._0x3598e7)+_0x2697a0(_0x2fd1a1._0x2ddaad)](0x4,'0');if(_0x104538===_0x1ff00d)return{'valid':!![],'tier':_0x5a9339};}if(_0x10e0c1[_0x730a9(_0x2fd1a1._0x25e484)+_0x2697a0(0x259)+'th'](_0x1127d4[_0x730a9(_0x2fd1a1._0x3d1099)+'O'])&&_0x10e0c1[_0x730a9(_0x2fd1a1._0x204515)+'t']('.')[_0x730a9(0x19d)+'th']===0x3)try{const [_0x238d77,_0x4587b9,_0x281f3e]=_0x10e0c1[_0x2697a0(_0x2fd1a1._0x3d7e1e)+'t']('.');let _0x35b482=_0x281f3e[_0x730a9(_0x2fd1a1._0x27fdd1)+_0x730a9(0x20b)](/-/g,'+')[_0x730a9(_0x2fd1a1._0x3d9152)+_0x730a9(_0x2fd1a1._0x735370)](/_/g,'/');while(_0x35b482[_0x2697a0(_0x2fd1a1._0x14e864)+'th']%0x4)_0x35b482+='=';const _0x16bcf5=_0x1127d4[_0x2697a0(0x271)+'T'](_0xbc480c,_0x35b482);let _0x5d134a='';for(let _0x42b38a=0x0;_0x42b38a<_0x16bcf5[_0x730a9(_0x2fd1a1._0x18ddf6)+'th'];_0x42b38a++){_0x5d134a+=_0x16bcf5[_0x2697a0(_0x2fd1a1._0xf9204f)+_0x730a9(_0x2fd1a1._0x2956bd)+'At'](_0x42b38a)[_0x730a9(0x168)+_0x2697a0(_0x2fd1a1._0x11c558)](0x10)[_0x2697a0(0x1a0)+_0x2697a0(_0x2fd1a1._0x2ddaad)](0x2,'0');}const _0x2d6cda=BigInt('0x'+_0x5d134a),_0x3a0bf9=_0x1127d4[_0x2697a0(_0x2fd1a1._0x22b674)+'F'](_0xb2ad95,_0x2d6cda,_0x316a68,_0x41cbce);let _0x1e28ff=_0x3a0bf9[_0x2697a0(0x168)+_0x2697a0(_0x2fd1a1._0x289aac)](0x10);if(_0x1e28ff[_0x730a9(0x19d)+'th']%0x2!==0x0)_0x1e28ff='0'+_0x1e28ff;const _0x50e9d7=_0x29e9b6(_0x238d77+'.'+_0x4587b9);if(_0x1e28ff[_0x2697a0(_0x2fd1a1._0x501c18)+_0x2697a0(_0x2fd1a1._0x14e001)](_0x50e9d7)){const _0xc060dc=_0xbc480c(_0x4587b9[_0x2697a0(0x1c3)+_0x2697a0(_0x2fd1a1._0x735370)](/-/g,'+')[_0x730a9(0x1c3)+_0x730a9(_0x2fd1a1._0x44a0d9)](/_/g,'/')),_0x300dd9=JSON[_0x730a9(_0x2fd1a1._0xd4bb75)+'e'](_0xc060dc);if(_0x300dd9[_0x730a9(0x17c)]&&_0x1127d4[_0x2697a0(0x1c9)+'p'](_0x4c49c3,0x3e8)<_0x300dd9[_0x730a9(_0x2fd1a1._0x208e65)])return{'valid':!![],'tier':_0x300dd9[_0x730a9(_0x2fd1a1._0x10fdbd)]||_0x730a9(_0x2fd1a1._0x4a3785),'expires':_0x300dd9[_0x730a9(_0x2fd1a1._0x1361e0)]*0x3e8};else{if(_0x2d202f[_0x730a9(_0x2fd1a1._0x108ed4)+_0x2697a0(_0x2fd1a1._0x329101)+'d'])_0x2d202f[_0x2697a0(_0x2fd1a1._0x4308c1)+_0x730a9(_0x2fd1a1._0x3195e5)+'d'](_0x730a9(_0x2fd1a1._0x5cca8e));return{'valid':![],'tier':null,'reason':_0x2697a0(_0x2fd1a1._0x41d2e2)+_0x2697a0(_0x2fd1a1._0x542559)+_0x730a9(0x181)};}}}catch(_0x35063b){return{'valid':![],'tier':null,'reason':_0x2697a0(_0x2fd1a1._0x4c0bbb)+_0x730a9(_0x2fd1a1._0x1b6deb)+_0x2697a0(_0x2fd1a1._0x2d4464)+_0x2697a0(_0x2fd1a1._0x2ce4ec)+_0x2697a0(_0x2fd1a1._0x717b2a)+'d'};}return{'valid':![],'tier':null,'reason':_0x730a9(_0x2fd1a1._0x1eda6e)+_0x730a9(_0x2fd1a1._0xcafdd)+_0x730a9(_0x2fd1a1._0x42dd5e)+'at'};}}typeof globalThis!==_0x325e0(0x15d)+_0x219c4e(0x1ca)+'d'&&(globalThis[_0x325e0(_0x2da1cf._0x35aee5)+_0x325e0(_0x2da1cf._0x30ebdb)+_0x219c4e(_0x2da1cf._0x3b61e2)+'er']=LicenseManager),typeof _0x322b78!==_0x219c4e(_0x2da1cf._0x391c38)+_0x219c4e(_0x2da1cf._0x4dd70b)+'d'&&(_0x322b78[_0x219c4e(0x185)+_0x325e0(0x15b)+_0x219c4e(0x265)+'er']=LicenseManager),typeof window!==_0x325e0(_0x2da1cf._0x4a47c8)+_0x325e0(_0x2da1cf._0x4ba03a)+'d'&&(window[_0x325e0(_0x2da1cf._0x146bcb)+_0x219c4e(_0x2da1cf._0x30ebdb)+_0x219c4e(_0x2da1cf._0x1b9fcc)+'er']=LicenseManager),typeof exports!==_0x219c4e(_0x2da1cf._0x2b210c)+_0x325e0(_0x2da1cf._0x4eef46)+'d'&&(typeof module!==_0x1127d4[_0x325e0(0x220)+'k']&&module[_0x219c4e(_0x2da1cf._0x2e3077)+_0x325e0(0x175)]&&(module[_0x219c4e(_0x2da1cf._0x2e3077)+_0x219c4e(0x175)]=LicenseManager),exports[_0x325e0(_0x2da1cf._0x2440d5)+_0x325e0(_0x2da1cf._0x30ebdb)+_0x325e0(_0x2da1cf._0x3b61e2)+'er']=LicenseManager);}(typeof globalThis!==_0x5a6bc0(0x15d)+_0x20bda8(0x1ca)+'d'?globalThis:typeof window!==_0x5a6bc0(0x15d)+_0x20bda8(0x1ca)+'d'?window:this));function _0x5c0d(){const _0x4e0afc=['C3vICW','otm3oq','ndy4ma','q29Kzq','mta0ma','nde1mW','mZuYmq','uwzJCa','DgvK','nZyWnq','t2DPBG','ywDL','mdG1nW','vevbtq','B24GzG','C3PPzq','ota4ma','mJzFiq','mdC1na','mdGYoq','mtCYoq','DwrLCW','mta5nW','DhjPBG','B25fEa','ufmTua','CgfYCW','A2v5ia','nJKZmG','A3rqAW','zwLKqW','BgvK','z09OAW','mZGWmW','mdu5mq','mdmXmq','uLbssq','vgLTzq','ndi1mW','ndy3oa','CM92Aq','ndu2mG','yxnL','ote4mG','ndyZnW','mJCXmq','nde0oq','mJa2nG','zM9YBq','otG2oa','y2SGyq','y29UyW','nJG5oq','nJa1nG','mtiWmq','uunSAa','odq5nW','nZm1oa','nJq5oq','ody1mG','mtK3na','ode0mG','y2T5Bq','CMLUzW','nZa4nW','u0eT','zuvzDq','DhnxAq','nZq3ma','nZaYmG','CgvYqW','oteYnq','ndyWoa','otaZnW','mJa4ndf3r2f4qK8','mJa2nq','nta4nG','DgfYDa','z2v0sq','yw5HzW','odiXmG','suXpva','mZiXoq','qxbfza','ntmXoq','nJqYma','mJC2oq','nte1oa','AYbYBW','nZCXnW','mZy5ma','q2PftG','luXjqW','ntaZna','odiZnW','mJe4oa','nta1oa','mte3mq','AuLLuG','otaYmG','u0rl','mZiYma','C3rHCG','nteXoq','nZyWmW','ndC5nG','nJG4na','x1nbta','zgvJCG','ru5urq','mtu0oq','ntC0oq','ntaXnW','uLnb','mJG1mG','Cg93','ntaZnG','tKvPzG','mJCZna','tvDutq','A3Douq','BNnLtq','nZCWnG','Dw5Kzq','ntu0nW','ntGXoa','otKWma','nJKXmG','mJeZmq','odCYoq','ndG4mG','sLDu','mtyWmG','nZK3oq','Dg9tDa','swHwAq','mJiYnKTYzwrtzW','Exb0Aq','odKYnq','mZu0ma','oti5na','mJuYnW','v2L0Aa','nJi2ma','zNjVBq','t0vn','ufvwDa','CNrZ','EeTuBG','DhjPBq','nJm0nW','q2HHCG','igzHAq','mteZnZC5oeL5uhzTEa','zxHW','ndC3mG','mZC2ma','Dg9vCa','DgvT','CMvK','yxn0xW','odmXnW','s3DKsW','tgLJzq','nde5mdy4u0P1EuTA','x3rPBq','zxrLyW','mtyYnG','ywLSzq','vf8Yma','ChnFBa','sLDuia','ndq1ntjqqLLpsxi','ote2oq','nJiXmq','tM8GAW','mti0ntG2nvP3C0TcBq','tu1HAG','nJi0mG','mtqYmq','BgXIyq','zgvK','q2XVyW','ndKXnq','mdmYma','ody2mG','AM9TtW','BgvUzW','nJu1na','ugLSBW','CgfKuW','B21HBa','nJa4mW','odG1nW','mty0oa','Aw5JBa','D2XvsW','mtiXnvHkCffPua','qKTVuW','nJy4mq','ufjp','DgLLCG','mJm4oq','mJqYoa','mJeYnW','mZGXmW','DcbKzq','ndeYoq','DgLVBG','BM93','nta0na','ndaWnW','C2XPyW','C3bSAq','ntK2na','u1jdAa','ndq3nW','mtKWnq','mZq5na','odu1oq','zxHWAq','DMfSAq','mte0oq','yvnusq','nZq2mq','CMvWBa','mdG2nq','nty5mG','ntG4na','swfouW','mJmZna','rM5ryG','zMLUzq','mJyZnq','s0rquW','zxKGCa','zKTYrW','yMLUyq','CgLYzq','mtqXmq','nZu5nq','t1ngsa','odK3oq','mJK2ma','mJu4mq','nZmXmG','BhKGza','mtG5nJe4nencDgjfwa','A0PZuG','mdy0nW','C2vLBG','mZyWoa','mdy5na','C3rVCG','nty3ma','odeWnq','Cxn0yW','DcbLEa','DLrpBW','ntaXoq','mtmZnG','zgjREq','ntC0nG','otyWoq','ndK0ow1VueH5Ba','nZG2oq','zgf0Aq','nZqYna','sgHOEG','AKXQCG','mZq4nG','odyXmG','y3j5Ca','yMfZzq','mZa5nG','t1qT','zxLk','BM9Tyq','y2HHCG','nJmWmW','nZmWoa','zxHWBW','nZa2mq','uLnbia','odyYoa','ntu4nW','rNfptW','oda1nW','nZyXna','mdq4nq','nti0mG','C2v0sq','mZG4nG','BgLKia','odqYoq','Bw9JAW','B25bBG','ywnL','wLreuW','nJC4mq','mJC2nW','otm5nq','sw52yq','mJy4ma','ufmTuG','tLzqAW','lvbjta','zw5KCW'];_0x5c0d=function(){return _0x4e0afc;};return _0x5c0d();}
package/ps-pii-engine.cjs CHANGED
@@ -253,8 +253,8 @@ let REGEX_RULES = [
253
253
  let PROFILE_RULES = {
254
254
  general: [],
255
255
  legal: [
256
- // Legal Party & Role-Prefixed Names (Claimant, Respondent, Plaintiff, Defendant, Petitioner, Appellant, Principal, Grantor, Attorney-in-Fact, Counsel)
257
- { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:Senior\s+)?Managing\s+Partner|Lead\s+Counsel|Co-Counsel|Special\s+Counsel|Of\s+Counsel|Counsel(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Attorney(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Registered\s+Representative|Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Principal|Grantor|Grantee|Trustee|Trustor|Fiduciary|Attorney-in-Fact|Designated\s+Attorney-in-Fact|Client\s*(?:\/\s*Principal)?|Escrow\s+(?:Trust\s+)?Officer)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu },
256
+ // Legal Party & Role-Prefixed Names (Claimant, Respondent, Plaintiff, Defendant, Petitioner, Appellant, Principal, Grantor, Settlor, Trustee, Beneficiary, Attorney-in-Fact, Counsel)
257
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:Senior\s+)?Managing\s+Partner|Lead\s+Counsel|Co-Counsel|Special\s+Counsel|Of\s+Counsel|Counsel(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Attorney(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Registered\s+Representative|Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Principal|Grantor[s]?|Grantee|Trustee[s]?|Co-Trustee[s]?|Successor\s+Trustee[s]?|Alternate\s+Trustee|Independent\s+Trustee|Settlor[s]?|Trustor[s]?|Beneficiar(?:y|ies)|Primary\s+Beneficiary|Contingent\s+Beneficiary|Remainder\s+Beneficiary|Trust\s+Protector|Protector|Fiduciar(?:y|ies)|Attorney-in-Fact|Designated\s+Attorney-in-Fact|Client\s*(?:\/\s*Principal)?|Escrow\s+(?:Trust\s+)?Officer)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu },
258
258
  { type: 'LEGAL', regex: /\bCASE[-_][A-Z0-9_-]{4,}\b/gi },
259
259
  { type: 'LEGAL', regex: /\bMATTER[-_][A-Z0-9_-]{4,}\b/gi },
260
260
  { type: 'LEGAL', regex: /\b[A-Z]{2,4}[- ]?\d{2}[- ]?\d{4,}\b/g },
@@ -361,8 +361,8 @@ let PROFILE_RULES = {
361
361
  { type: 'ID', regex: /\b(?:LEI|LEGAL[\s-]ENTITY[\s-]IDENTIFIER)[:\s#-]*[0-9A-Z]{20}\b/gi },
362
362
  { type: 'ID', regex: /\bBBG[0-9A-Z]{9}\b/g },
363
363
  { type: 'FINANCIAL', regex: /(?<=\b(?:Settlement(?:\s+Amount)?|Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?)[ \t:]+)(?:(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi },
364
- { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])\s*(?<!\b(?:Trade(?:\s+execution)?|Net|Gross|Base|Loan|Transfer)\s+)(?:Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total(?:\s+Due)?|Amount(?:\s+Due)?)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
365
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
364
+ { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])\s*(?<!\b(?:Trade(?:\s+execution)?|Net|Gross|Base|Loan|Transfer)\s+)(?:Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|(?:Capital\s+|Annual\s+)?Distribution(?:s)?|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total(?:\s+Due)?|Amount(?:\s+Due)?)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
365
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
366
366
  // Corporate Financial Performance, P&L Statements, Balance Sheets & Earnings
367
367
  { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Revenue|Total\s+Revenue|Sales\s+Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
368
368
  // Interbank Wire Transcripts & Payment Messaging
@@ -1190,9 +1190,9 @@ let PROFILE_RULES = {
1190
1190
  { type: 'FINANCIAL', regex: /\b(?:Account|Acct\.?)[:\s#]*\d{4}[-\s]?\d{4}[-\s]?\d{2,6}\b/gi },
1191
1191
  { type: 'FINANCIAL', regex: /\b(?:Policy|Contract)\s*(?:No\.?|Number|#)[:\s]+[A-Z0-9][A-Z0-9\-]{3,14}\b/gi },
1192
1192
  { type: 'ID', regex: /\bCRD\s*#?\s*\d{4,8}\b/gi },
1193
- { type: 'FINANCIAL', regex: /\b(?:Annual\s+(?:Distribution|Withdrawal)|RMD|Required\s+Minimum\s+Distribution)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1193
+ { type: 'FINANCIAL', regex: /(?<=\b(?:(?:Capital\s+|Annual\s+)?(?:Distribution|Withdrawal)s?|RMD|Required\s+Minimum\s+Distribution)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1194
1194
  { type: 'FINANCIAL', regex: /(?<=\b(?:Portfolio(?:\s+[Vv]alue)?|Market\s+Value|Net\s+Worth|AUM|Total\s+Assets|Cash\s+Balance|Account\s+Value|Capital\s+Gains?|Unrealized\s+(?:Gain|Loss)|Realized\s+(?:Gain|Loss)|Dividend\s+Income)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
1195
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1195
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1196
1196
  { type: 'FINANCIAL', regex: /\b(?:Roth\s+)?(?:IRA|401k|401\(k\)|403b|403\(b\)|SEP|SIMPLE)\s*(?:Account|Acct|Plan)?\s*(?:(?:No\.?|Number|#)[:\s#]*|[:#]\s*)([A-Z0-9-]{4,20})\b/gi },
1197
1197
  { type: 'ID', regex: /\bCUSIP[:\s#]*([0-9A-Z]{9})\b/gi },
1198
1198
  { type: 'ID', regex: /\bISIN[:\s#]*([A-Z]{2}[0-9A-Z]{9}[0-9])\b/gi },
@@ -1205,6 +1205,37 @@ let PROFILE_RULES = {
1205
1205
  { type: 'FINANCIAL', regex: /\b(?:Vanguard)(?:\s+(?:Account|Acct|Brokerage))*\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{8}[-\s]?\d|\d{8,9})\b/gi },
1206
1206
  { type: 'ID', regex: /\b(?:DTC|DTC\s+Participant|Clearing\s+Participant)\s*(?:Number|Num|No\.?|#|Code)?[:\s#]+(\d{4})\b/gi },
1207
1207
  // Family Office & Trust Governance
1208
+ // 1. Trust & Estate Role-Prefixed Names (Grantor, Settlor, Trustee, Beneficiary, Executor, Fiduciary, etc.)
1209
+ {
1210
+ type: 'NAME',
1211
+ isContextName: true,
1212
+ regex: /(?<=^|[^\p{L}\p{N}_])(?:Grantor[s]?|Trustor[s]?|Settlor[s]?|Trustee[s]?|Co-Trustee[s]?|Successor\s+Trustee[s]?|Alternate\s+Trustee|Independent\s+Trustee|Beneficiar(?:y|ies)|Primary\s+Beneficiary|Contingent\s+Beneficiary|Remainder\s+Beneficiary|Income\s+Beneficiary|Trust\s+Protector|Protector|Fiduciar(?:y|ies)|Custodian[s]?|Executor[s]?|Executrix|Personal\s+Representative|Power\s+of\s+Attorney|Attorney-in-Fact|Health\s+Care\s+(?:Agent|Proxy))\s*[:=#,\/\t-]*\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu
1213
+ },
1214
+ // 2. FBO (For Benefit Of) Client Account / Wire / Trust Beneficiary Names
1215
+ {
1216
+ type: 'NAME',
1217
+ isContextName: true,
1218
+ regex: /\b(?:FBO|F\/B\/O|f\/b\/o|For\s+(?:the\s+)?Benefit\s+Of)\s*[:=#]?\s*([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3}|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu
1219
+ },
1220
+ // 3. Declarative Trust Statement Openings ("wherein I, [NAME]...", "I, [NAME], of [CITY], as Settlor...")
1221
+ {
1222
+ type: 'NAME',
1223
+ isContextName: true,
1224
+ regex: /\b(?:wherein\s+I|I|We),\s*([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3}|[A-Z\p{Lu}]{2,}(?:[\s'.-]+[A-Z\p{Lu}]{2,}){1,3})(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?,?\s*(?:of\s+[^,]+,\s*[^,]+,?\s*)?(?:as\s+(?:Grantor|Settlor|Trustor|Trustee|Co-Trustee|Testator)|make\s+this|hereby\s+(?:create|establish|declare)|declare\s+that)\b/giu
1225
+ },
1226
+ // 4. Trust Names, Family Trusts, Living Trusts & Estates (Title Case & ALL-CAPS)
1227
+ {
1228
+ type: 'LEGAL',
1229
+ regex: /\b(?:The[ \t\xA0]+)?(?!\b(?:This|That|These|Those|Such|Said|Each|Every|Any|Some|Our|Your|Their|My|His|Her|A|An|Uniform|Delaware|California|Nevada|Florida|New\s+York)\b)([A-Z\p{Lu}][\p{L}'’–-]*(?:[ \t\xA0]+(?:and|&)[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’–-]*|[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’–-]*){0,4}[ \t\xA0]+(?:Family[ \t\xA0]+)?(?:Revocable|Irrevocable|Living|Dynasty|Asset[ \t\xA0]+Protection|Charitable[ \t\xA0]+(?:Remainder|Lead)|Special[ \t\xA0]+Needs|Generation-Skipping|QTIP|GRAT|GRUT|Testamentary)?[ \t\xA0]*Trust(?![ \t\xA0]+(?:Act|Code|Statute|Law|Indenture|Department|Officer|Company|Corp|Bank|Accounting))\b)/gu
1230
+ },
1231
+ {
1232
+ type: 'LEGAL',
1233
+ regex: /\b(?:THE[ \t\xA0]+)?(?!\b(?:THIS|THAT|THESE|THOSE|SUCH|SAID|EACH|EVERY|ANY|SOME|OUR|YOUR|THEIR|MY|HIS|HER|A|AN|UNIFORM)\b)([A-Z\p{Lu}0-9&'’.,-]{2,}(?:[ \t\xA0]+[A-Z\p{Lu}0-9&'’.,-]{2,}){0,4}[ \t\xA0]+(?:FAMILY[ \t\xA0]+)?(?:REVOCABLE|IRREVOCABLE|LIVING|DYNASTY|ASSET[ \t\xA0]+PROTECTION|CHARITABLE|TESTAMENTARY)?[ \t\xA0]*TRUST(?![ \t\xA0]+(?:ACT|CODE|STATUTE|LAW|INDENTURE|DEPARTMENT|OFFICER|COMPANY|CORP|BANK))\b)/g
1234
+ },
1235
+ {
1236
+ type: 'LEGAL',
1237
+ regex: /\b(?:Trust[ \t\xA0]+(?:Name|Title)|Title[ \t\xA0]+of[ \t\xA0]+Trust)[ \t\xA0]*[:#=]+[ \t\xA0]*([A-Za-z0-9&'’., \t\xA0-]+?[ \t\xA0]+(?:Family[ \t\xA0]+)?(?:Revocable|Irrevocable|Living|Dynasty|Asset[ \t\xA0]+Protection|Charitable|Special[ \t\xA0]+Needs|Testamentary)?[ \t\xA0]*Trust)(?![ \t\xA0]+(?:Act|Code|Statute|Law|Indenture))\b/gi
1238
+ },
1208
1239
  { type: 'ID', regex: /\b(?:Grantor|Trustor|Trustee|Beneficiary|Primary\s+Beneficiary|Contingent\s+Beneficiary)\s*(?:ID|Code|No\.?|Number|#)[:\s#-]+([A-Za-z0-9-]{3,20})\b/gi },
1209
1240
  { type: 'ID', regex: /\b(?:Trust\s+(?:EIN|TIN|Tax\s+ID)|Estate\s+EIN)[:\s#]*(\d{2}-\d{7})\b/gi }
1210
1241
  ],
@@ -1248,11 +1279,11 @@ let PROFILE_RULES = {
1248
1279
  regex: /\b(?:Incurred\s+Loss(?:es)?|Paid\s+Loss(?:es)?|Case\s+Reserve|Outstanding\s+Reserve|IBNR(?:\s+Reserve)?|Loss\s+Reserve|Self-Insured\s+Retention|SIR\s+(?:Amount|Limit)|Policy\s+Limit|Per\s+Occurrence\s+Limit|Aggregate\s+Limit|Excess\s+Limit|Underlying\s+Limit|Attachment\s+Point|Treaty\s+Limit|Cession\s+Amount)\s*[:=]\s*((?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))/gi
1249
1280
  },
1250
1281
  // Existing core insurance patterns
1251
- { type: 'FINANCIAL', regex: /\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|(?<!\b(?:Case|Outstanding|IBNR|Loss)\s+)Reserve|Indemnity)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1252
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1282
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|(?<!\b(?:Case|Outstanding|IBNR|Loss)\s+)Reserve|Indemnity)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1283
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1253
1284
  { type: 'ID', regex: /\b(?:(?:Assigned\s+)?Adjuster\s+(?:ID|No)|Claim\s+Rep(?:\.|resentative)?)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
1254
1285
  { type: 'ID', regex: /\bNAIC(?:\s+(?:Company\s+)?(?:Code|CoCode|No\.?|Number|#))?[:\s#]*(\d{5})\b/gi },
1255
- { type: 'FINANCIAL', regex: /\b(?:Deductible|Premium|Coverage\s+Amount)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1286
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Deductible|Premium|Coverage\s+Amount)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1256
1287
  { type: 'ID', regex: /\b[A-HJ-NPR-Z0-9]{17}\b/g },
1257
1288
  { type: 'ID', regex: /\b(?<!\bAdditional\s+)(?:Insured|Named\s+Insured)[:\s]+[A-Z][a-z]+(?:[ \t\xA0]+[A-Z][a-z]+)+/g },
1258
1289
  { type: 'ID', regex: /\b(?:Agent|Producer)\s*(?:Code|No|ID)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
@@ -1281,9 +1312,9 @@ let PROFILE_RULES = {
1281
1312
  { type: 'ID', regex: /\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{3,10}(?:[-_]\d{2,6})+\b|\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{4,10}\b/gi },
1282
1313
  { type: 'ID', regex: /\b(?:Cost\s+Center|CC)[-_\s]*(?:ID|Code|#)?[:\s#]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
1283
1314
  { type: 'ID', regex: /\b(?:Invoice|Inv|Purchase\s+Order|PO|Bill|Check|Voucher|Remittance)\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Za-z0-9_-]{4,25})\b/gi },
1284
- { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Invoice(?:\s+Total)?|Amount\s+Due|Total\s+Due|Payment(?:\s+Amount)?|Ledger\s+Balance|Credit|Debit|Net\s+Amount|Total\s+Paid|Billed|Remittance|Total\s+Revenue|Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|Sales\s+Revenue|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
1315
+ { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Invoice(?:\s+Total)?|Amount\s+Due|Total(?:\s+Due)?|Payment(?:\s+Amount)?|Ledger\s+Balance|Credit|Debit|Net\s+Amount|Total\s+Paid|Billed|Remittance|Total\s+Revenue|Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|(?:Capital\s+|Annual\s+)?Distribution(?:s)?|Withdrawal(?:s)?|Settlement(?:s)?|Sales\s+Revenue|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
1285
1316
  { type: 'FINANCIAL', regex: /(?<=\|\s*)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))(?=\s*\|)/gi },
1286
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi }
1317
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi }
1287
1318
  ],
1288
1319
  pharma: [
1289
1320
  // Contextual Clinical, Regulatory & Pharmacovigilance Personnel
@@ -1567,7 +1598,7 @@ let PROFILE_RULES = {
1567
1598
  { type: 'ID', regex: /\b(?:Ineligible\s+AR|Eligible\s+AR|Collateral\s+Account)(?:\s+(?:Account|Acct|ID|Ref|No\.?|Number|#))*\s*[:#-]\s*([A-Za-z0-9-]{4,20})\b/gi },
1568
1599
  { type: 'ID', regex: /\b(?:Merchant\s+Cash\s+Advance|MCA)[ \t\xA0]*(?:Agreement|Contract)?[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1569
1600
  { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])[ \t\xA0]*(?:Daily|Weekly)(?:[ \t\xA0]+(?:ACH|Remittance|Debit|Payment|Transfer|Split(?:[ \t\xA0]+Funding)?|Holdback))+[ \t\xA0]*[:=][ \t\xA0]*)((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+)/gi },
1570
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1601
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1571
1602
  { type: 'NAME', isContextName: true, isCorporateName: true, regex: /(?:MCA\s+Funder|Funder|ISO\s+Broker|Funding\s+Partner)[ \t\xA0]*[:#][ \t\xA0]*([A-Za-z0-9&.,\s'-]{2,40}?)(?=\r?\n|$|\s{3,}|\t|Rate|Factor|Advance|Amount|Terms)/gi }
1572
1603
  ]
1573
1604
  };
@@ -1847,7 +1878,7 @@ let NOT_NAME_WORDS = new Set([
1847
1878
  // Common Resume / Business Phrases
1848
1879
  'results-driven', 'data-driven', 'customer-centric', 'detail-oriented', 'cross-functional', 'self-motivated', 'time-management', 'problem-solving', 'fast-paced', 'year-over-year',
1849
1880
  // Legal & Trust terms
1850
- 'trust', 'trustee', 'co-trustee', 'settlor', 'grantor', 'beneficiary', 'agreement', 'will', 'estate', 'witness', 'declaration', 'signatory', 'testator', 'notary', 'commission', 'county', 'state', 'court', 'article', 'section', 'paragraph', 'schedule', 'exhibit', 'amendment', 'addendum', 'power', 'attorney', 'guardian', 'executor', 'administrator', 'survivor', 'predecessor', 'successor', 'whereof', 'hereby', 'thereby', 'herein', 'therein', 'witnesseth', 'whereas', 'therefore', 'now', 'dated', 'effective', 'matter', 'case', 'cases', 'docket', 'dockets', 'number', 'numbers', 'firm', 'firms', 'lawyer', 'lawyers', 'counsel', 'counsels', 'counselstack', 'tier', 'tiers', 'finding', 'findings', 'connector', 'connectors', 'platform', 'platforms',
1881
+ 'trust', 'trustee', 'trustees', 'co-trustee', 'co-trustees', 'settlor', 'settlors', 'grantor', 'grantors', 'trustor', 'trustors', 'beneficiary', 'beneficiaries', 'revocable', 'irrevocable', 'dynasty', 'testamentary', 'fbo', 'agreement', 'will', 'estate', 'witness', 'declaration', 'signatory', 'testator', 'notary', 'commission', 'county', 'state', 'court', 'article', 'section', 'paragraph', 'schedule', 'exhibit', 'amendment', 'addendum', 'power', 'attorney', 'guardian', 'executor', 'administrator', 'survivor', 'predecessor', 'successor', 'whereof', 'hereby', 'thereby', 'herein', 'therein', 'witnesseth', 'whereas', 'therefore', 'now', 'dated', 'effective', 'matter', 'case', 'cases', 'docket', 'dockets', 'number', 'numbers', 'firm', 'firms', 'lawyer', 'lawyers', 'counsel', 'counsels', 'counselstack', 'tier', 'tiers', 'finding', 'findings', 'connector', 'connectors', 'platform', 'platforms',
1851
1882
  // Medical & Clinical terms
1852
1883
  'clinical', 'note', 'notes', 'dx', 'rx', 'tx', 'hx', 'px', 'sx', 'type', 'diabetes', 'referred', 'referral', 'diagnosed', 'diagnosis', 'patient', 'insurance', 'bcbs', 'mrn', 'dob',
1853
1884
  // Tax & Payroll terms
@@ -1867,7 +1898,9 @@ let NOT_NAME_WORDS = new Set([
1867
1898
  'accord', 'contrat', 'contrato', 'acuerdo', 'avenant', 'convention', 'protocole', 'prestation', 'confidentialite', 'confidentialité',
1868
1899
  'f.3d', 'f.supp', 'u.s.c.', 'v.', 'plaintiff', 'defendant', 'v', 'u.s.', 'court', 'app.', 'reporter', 'cir.',
1869
1900
  'civ', 'crim', 'evid', 'bankr', 'proc',
1870
- 'marine', 'inland', 'ocean', 'comp', 'workers', 'actuarial', 'actuary', 'underwriting', 'syndicate', 'lloyd', 'lloyds', 'pcs']);
1901
+ 'marine', 'inland', 'ocean', 'comp', 'workers', 'actuarial', 'actuary', 'underwriting', 'syndicate', 'lloyd', 'lloyds', 'pcs',
1902
+ // Dutch role / job-title nouns (prevent sentence-initial role words from being absorbed into NAME tokens)
1903
+ 'medewerker', 'medewerkers', 'medewerkster', 'collega', 'collegas', 'werknemer', 'werknemers', 'klant', 'klanten', 'cliënt', 'client', 'cliënten', 'patiënt', 'patiënten', 'directeur', 'aanvrager', 'contactpersoon', 'huisarts', 'adviseur', 'consulent', 'beheerder', 'sollicitant', 'kandidaat', 'verzekerde', 'dossierhouder', 'behandelaar', 'zaakbehandelaar', 'burgerservicenummer', 'sofinummer']);
1871
1904
 
1872
1905
  // Nobiliary particles and conjunctions that should never trigger name disqualification
1873
1906
  const NOBILIARY_PARTICLES = new Set([
@@ -3034,6 +3067,25 @@ const PROFILE_JARGON = {
3034
3067
  restoredCount++;
3035
3068
  return lookup.get(upper);
3036
3069
  }
3070
+ // Normalized lookup: strip outer brackets/delimiters, normalize whitespace, collapse leading zeros
3071
+ const inner = match.replace(/^(\[|<|\{\{|__)\s*|\s*(\]|>|\}\}|__)$/g, '').trim();
3072
+ const normMatch = inner.match(/^([A-Za-z_А-Яа-яЁё0-9]+?)[-_\s]+0*(\d+)$/);
3073
+ if (normMatch) {
3074
+ const normLabel = normMatch[1].replace(/[\s_-]+/g, '_').toUpperCase();
3075
+ const normIdx = parseInt(normMatch[2], 10);
3076
+ const candidates = [
3077
+ normLabel + '_' + normIdx,
3078
+ '[' + normLabel + '_' + normIdx + ']',
3079
+ normLabel + ' ' + normIdx,
3080
+ normLabel + '-' + normIdx
3081
+ ];
3082
+ for (let c = 0; c < candidates.length; c++) {
3083
+ if (lookup.has(candidates[c])) {
3084
+ restoredCount++;
3085
+ return lookup.get(candidates[c]);
3086
+ }
3087
+ }
3088
+ }
3037
3089
  const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3038
3090
  if (possMatch) {
3039
3091
  const base = possMatch[1];
@@ -3079,12 +3131,32 @@ const PROFILE_JARGON = {
3079
3131
  } else if (lookup.has(match.toUpperCase())) {
3080
3132
  rawVal = lookup.get(match.toUpperCase());
3081
3133
  } else {
3082
- const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3083
- if (possMatch) {
3084
- const base = possMatch[1];
3085
- suffix = possMatch[2];
3086
- if (lookup.has(base)) rawVal = lookup.get(base);
3087
- else if (lookup.has(base.toUpperCase())) rawVal = lookup.get(base.toUpperCase());
3134
+ const inner = match.replace(/^(\[|<|\{\{|__)\s*|\s*(\]|>|\}\}|__)$/g, '').trim();
3135
+ const normMatch = inner.match(/^([A-Za-z_А-Яа-яЁё0-9]+?)[-_\s]+0*(\d+)$/);
3136
+ if (normMatch) {
3137
+ const normLabel = normMatch[1].replace(/[\s_-]+/g, '_').toUpperCase();
3138
+ const normIdx = parseInt(normMatch[2], 10);
3139
+ const candidates = [
3140
+ normLabel + '_' + normIdx,
3141
+ '[' + normLabel + '_' + normIdx + ']',
3142
+ normLabel + ' ' + normIdx,
3143
+ normLabel + '-' + normIdx
3144
+ ];
3145
+ for (let c = 0; c < candidates.length; c++) {
3146
+ if (lookup.has(candidates[c])) {
3147
+ rawVal = lookup.get(candidates[c]);
3148
+ break;
3149
+ }
3150
+ }
3151
+ }
3152
+ if (rawVal === null) {
3153
+ const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3154
+ if (possMatch) {
3155
+ const base = possMatch[1];
3156
+ suffix = possMatch[2];
3157
+ if (lookup.has(base)) rawVal = lookup.get(base);
3158
+ else if (lookup.has(base.toUpperCase())) rawVal = lookup.get(base.toUpperCase());
3159
+ }
3088
3160
  }
3089
3161
  }
3090
3162
  if (rawVal !== null) {
package/ps-pii-engine.js CHANGED
@@ -253,8 +253,8 @@ let REGEX_RULES = [
253
253
  let PROFILE_RULES = {
254
254
  general: [],
255
255
  legal: [
256
- // Legal Party & Role-Prefixed Names (Claimant, Respondent, Plaintiff, Defendant, Petitioner, Appellant, Principal, Grantor, Attorney-in-Fact, Counsel)
257
- { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:Senior\s+)?Managing\s+Partner|Lead\s+Counsel|Co-Counsel|Special\s+Counsel|Of\s+Counsel|Counsel(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Attorney(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Registered\s+Representative|Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Principal|Grantor|Grantee|Trustee|Trustor|Fiduciary|Attorney-in-Fact|Designated\s+Attorney-in-Fact|Client\s*(?:\/\s*Principal)?|Escrow\s+(?:Trust\s+)?Officer)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?)/giu },
256
+ // Legal Party & Role-Prefixed Names (Claimant, Respondent, Plaintiff, Defendant, Petitioner, Appellant, Principal, Grantor, Settlor, Trustee, Beneficiary, Attorney-in-Fact, Counsel)
257
+ { type: 'NAME', isContextName: true, regex: /(?<=^|[^\p{L}\p{N}_])(?:(?:Senior\s+)?Managing\s+Partner|Lead\s+Counsel|Co-Counsel|Special\s+Counsel|Of\s+Counsel|Counsel(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Attorney(?:\s+for\s+(?:the\s+)?(?:Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Debtor|Creditor|Party))?|Registered\s+Representative|Claimant|Respondent|Plaintiff|Defendant|Petitioner|Appellant|Appellee|Principal|Grantor[s]?|Grantee|Trustee[s]?|Co-Trustee[s]?|Successor\s+Trustee[s]?|Alternate\s+Trustee|Independent\s+Trustee|Settlor[s]?|Trustor[s]?|Beneficiar(?:y|ies)|Primary\s+Beneficiary|Contingent\s+Beneficiary|Remainder\s+Beneficiary|Trust\s+Protector|Protector|Fiduciar(?:y|ies)|Attorney-in-Fact|Designated\s+Attorney-in-Fact|Client\s*(?:\/\s*Principal)?|Escrow\s+(?:Trust\s+)?Officer)\s*[:#,]?\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu },
258
258
  { type: 'LEGAL', regex: /\bCASE[-_][A-Z0-9_-]{4,}\b/gi },
259
259
  { type: 'LEGAL', regex: /\bMATTER[-_][A-Z0-9_-]{4,}\b/gi },
260
260
  { type: 'LEGAL', regex: /\b[A-Z]{2,4}[- ]?\d{2}[- ]?\d{4,}\b/g },
@@ -361,8 +361,8 @@ let PROFILE_RULES = {
361
361
  { type: 'ID', regex: /\b(?:LEI|LEGAL[\s-]ENTITY[\s-]IDENTIFIER)[:\s#-]*[0-9A-Z]{20}\b/gi },
362
362
  { type: 'ID', regex: /\bBBG[0-9A-Z]{9}\b/g },
363
363
  { type: 'FINANCIAL', regex: /(?<=\b(?:Settlement(?:\s+Amount)?|Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?)[ \t:]+)(?:(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))/gi },
364
- { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])\s*(?<!\b(?:Trade(?:\s+execution)?|Net|Gross|Base|Loan|Transfer)\s+)(?:Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total(?:\s+Due)?|Amount(?:\s+Due)?)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
365
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
364
+ { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])\s*(?<!\b(?:Trade(?:\s+execution)?|Net|Gross|Base|Loan|Transfer)\s+)(?:Wire(?:\s+(?:Transfer|Amount))?|Direct\s+Wire|Balance|Deposit|Withdrawal|Settlement|Principal|Interest|Remittance|Payout|(?:Capital\s+|Annual\s+)?Distribution(?:s)?|Transaction(?:\s+Amount)?|Payment(?:\s+Amount)?|Total(?:\s+Due)?|Amount(?:\s+Due)?)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
365
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
366
366
  // Corporate Financial Performance, P&L Statements, Balance Sheets & Earnings
367
367
  { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Revenue|Total\s+Revenue|Sales\s+Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
368
368
  // Interbank Wire Transcripts & Payment Messaging
@@ -1190,9 +1190,9 @@ let PROFILE_RULES = {
1190
1190
  { type: 'FINANCIAL', regex: /\b(?:Account|Acct\.?)[:\s#]*\d{4}[-\s]?\d{4}[-\s]?\d{2,6}\b/gi },
1191
1191
  { type: 'FINANCIAL', regex: /\b(?:Policy|Contract)\s*(?:No\.?|Number|#)[:\s]+[A-Z0-9][A-Z0-9\-]{3,14}\b/gi },
1192
1192
  { type: 'ID', regex: /\bCRD\s*#?\s*\d{4,8}\b/gi },
1193
- { type: 'FINANCIAL', regex: /\b(?:Annual\s+(?:Distribution|Withdrawal)|RMD|Required\s+Minimum\s+Distribution)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1193
+ { type: 'FINANCIAL', regex: /(?<=\b(?:(?:Capital\s+|Annual\s+)?(?:Distribution|Withdrawal)s?|RMD|Required\s+Minimum\s+Distribution)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1194
1194
  { type: 'FINANCIAL', regex: /(?<=\b(?:Portfolio(?:\s+[Vv]alue)?|Market\s+Value|Net\s+Worth|AUM|Total\s+Assets|Cash\s+Balance|Account\s+Value|Capital\s+Gains?|Unrealized\s+(?:Gain|Loss)|Realized\s+(?:Gain|Loss)|Dividend\s+Income)[:\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]{3,}\b)/gi },
1195
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1195
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1196
1196
  { type: 'FINANCIAL', regex: /\b(?:Roth\s+)?(?:IRA|401k|401\(k\)|403b|403\(b\)|SEP|SIMPLE)\s*(?:Account|Acct|Plan)?\s*(?:(?:No\.?|Number|#)[:\s#]*|[:#]\s*)([A-Z0-9-]{4,20})\b/gi },
1197
1197
  { type: 'ID', regex: /\bCUSIP[:\s#]*([0-9A-Z]{9})\b/gi },
1198
1198
  { type: 'ID', regex: /\bISIN[:\s#]*([A-Z]{2}[0-9A-Z]{9}[0-9])\b/gi },
@@ -1205,6 +1205,37 @@ let PROFILE_RULES = {
1205
1205
  { type: 'FINANCIAL', regex: /\b(?:Vanguard)(?:\s+(?:Account|Acct|Brokerage))*\s*(?:Number|Num|No\.?|#)?[:\s#]+(\d{8}[-\s]?\d|\d{8,9})\b/gi },
1206
1206
  { type: 'ID', regex: /\b(?:DTC|DTC\s+Participant|Clearing\s+Participant)\s*(?:Number|Num|No\.?|#|Code)?[:\s#]+(\d{4})\b/gi },
1207
1207
  // Family Office & Trust Governance
1208
+ // 1. Trust & Estate Role-Prefixed Names (Grantor, Settlor, Trustee, Beneficiary, Executor, Fiduciary, etc.)
1209
+ {
1210
+ type: 'NAME',
1211
+ isContextName: true,
1212
+ regex: /(?<=^|[^\p{L}\p{N}_])(?:Grantor[s]?|Trustor[s]?|Settlor[s]?|Trustee[s]?|Co-Trustee[s]?|Successor\s+Trustee[s]?|Alternate\s+Trustee|Independent\s+Trustee|Beneficiar(?:y|ies)|Primary\s+Beneficiary|Contingent\s+Beneficiary|Remainder\s+Beneficiary|Income\s+Beneficiary|Trust\s+Protector|Protector|Fiduciar(?:y|ies)|Custodian[s]?|Executor[s]?|Executrix|Personal\s+Representative|Power\s+of\s+Attorney|Attorney-in-Fact|Health\s+Care\s+(?:Agent|Proxy))\s*[:=#,\/\t-]*\s*(?:(?:Dr|Mr|Mrs|Ms|Prof)\.?\s+)?((?:(?:d['’]|l['’]|(?:(?:van|von|de|di|da|do|dos|das|la|le|del|dels|du|der|den|ten|ter|af|av)\s+)+)\s*)?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*(?:,\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+)(?:\s+\p{Lu}\.?)?(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?|\s+(?:(?:van|von|de|di|da|do|dos|das|la|le|del|du|der|d['’]|l['’]|de\s+la|de\s+los|von\s+der)\s+)?(?:(?:\p{Lu}\.?\s+)?(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]*(?:-[\p{Lu}\p{Ll}'’–-]+)*))(?:\s+(?:y|i)\s+(?:(?:d['’]|l['’])?\p{Lu}[\p{L}'’–-]+))?|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu
1213
+ },
1214
+ // 2. FBO (For Benefit Of) Client Account / Wire / Trust Beneficiary Names
1215
+ {
1216
+ type: 'NAME',
1217
+ isContextName: true,
1218
+ regex: /\b(?:FBO|F\/B\/O|f\/b\/o|For\s+(?:the\s+)?Benefit\s+Of)\s*[:=#]?\s*([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3}|[A-Z\p{Lu}]{2,}(?:[\s'-]+[A-Z\p{Lu}]{2,}){1,3})/giu
1219
+ },
1220
+ // 3. Declarative Trust Statement Openings ("wherein I, [NAME]...", "I, [NAME], of [CITY], as Settlor...")
1221
+ {
1222
+ type: 'NAME',
1223
+ isContextName: true,
1224
+ regex: /\b(?:wherein\s+I|I|We),\s*([A-Z\p{Lu}][A-Za-z'’.-]*(?:[ \t\xA0]+[A-Z\p{Lu}][A-Za-z'’.-]*){1,3}|[A-Z\p{Lu}]{2,}(?:[\s'.-]+[A-Z\p{Lu}]{2,}){1,3})(?:,\s*(?:Jr\.?|Sr\.?|III|IV|II))?,?\s*(?:of\s+[^,]+,\s*[^,]+,?\s*)?(?:as\s+(?:Grantor|Settlor|Trustor|Trustee|Co-Trustee|Testator)|make\s+this|hereby\s+(?:create|establish|declare)|declare\s+that)\b/giu
1225
+ },
1226
+ // 4. Trust Names, Family Trusts, Living Trusts & Estates (Title Case & ALL-CAPS)
1227
+ {
1228
+ type: 'LEGAL',
1229
+ regex: /\b(?:The[ \t\xA0]+)?(?!\b(?:This|That|These|Those|Such|Said|Each|Every|Any|Some|Our|Your|Their|My|His|Her|A|An|Uniform|Delaware|California|Nevada|Florida|New\s+York)\b)([A-Z\p{Lu}][\p{L}'’–-]*(?:[ \t\xA0]+(?:and|&)[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’–-]*|[ \t\xA0]+[A-Z\p{Lu}][\p{L}'’–-]*){0,4}[ \t\xA0]+(?:Family[ \t\xA0]+)?(?:Revocable|Irrevocable|Living|Dynasty|Asset[ \t\xA0]+Protection|Charitable[ \t\xA0]+(?:Remainder|Lead)|Special[ \t\xA0]+Needs|Generation-Skipping|QTIP|GRAT|GRUT|Testamentary)?[ \t\xA0]*Trust(?![ \t\xA0]+(?:Act|Code|Statute|Law|Indenture|Department|Officer|Company|Corp|Bank|Accounting))\b)/gu
1230
+ },
1231
+ {
1232
+ type: 'LEGAL',
1233
+ regex: /\b(?:THE[ \t\xA0]+)?(?!\b(?:THIS|THAT|THESE|THOSE|SUCH|SAID|EACH|EVERY|ANY|SOME|OUR|YOUR|THEIR|MY|HIS|HER|A|AN|UNIFORM)\b)([A-Z\p{Lu}0-9&'’.,-]{2,}(?:[ \t\xA0]+[A-Z\p{Lu}0-9&'’.,-]{2,}){0,4}[ \t\xA0]+(?:FAMILY[ \t\xA0]+)?(?:REVOCABLE|IRREVOCABLE|LIVING|DYNASTY|ASSET[ \t\xA0]+PROTECTION|CHARITABLE|TESTAMENTARY)?[ \t\xA0]*TRUST(?![ \t\xA0]+(?:ACT|CODE|STATUTE|LAW|INDENTURE|DEPARTMENT|OFFICER|COMPANY|CORP|BANK))\b)/g
1234
+ },
1235
+ {
1236
+ type: 'LEGAL',
1237
+ regex: /\b(?:Trust[ \t\xA0]+(?:Name|Title)|Title[ \t\xA0]+of[ \t\xA0]+Trust)[ \t\xA0]*[:#=]+[ \t\xA0]*([A-Za-z0-9&'’., \t\xA0-]+?[ \t\xA0]+(?:Family[ \t\xA0]+)?(?:Revocable|Irrevocable|Living|Dynasty|Asset[ \t\xA0]+Protection|Charitable|Special[ \t\xA0]+Needs|Testamentary)?[ \t\xA0]*Trust)(?![ \t\xA0]+(?:Act|Code|Statute|Law|Indenture))\b/gi
1238
+ },
1208
1239
  { type: 'ID', regex: /\b(?:Grantor|Trustor|Trustee|Beneficiary|Primary\s+Beneficiary|Contingent\s+Beneficiary)\s*(?:ID|Code|No\.?|Number|#)[:\s#-]+([A-Za-z0-9-]{3,20})\b/gi },
1209
1240
  { type: 'ID', regex: /\b(?:Trust\s+(?:EIN|TIN|Tax\s+ID)|Estate\s+EIN)[:\s#]*(\d{2}-\d{7})\b/gi }
1210
1241
  ],
@@ -1248,11 +1279,11 @@ let PROFILE_RULES = {
1248
1279
  regex: /\b(?:Incurred\s+Loss(?:es)?|Paid\s+Loss(?:es)?|Case\s+Reserve|Outstanding\s+Reserve|IBNR(?:\s+Reserve)?|Loss\s+Reserve|Self-Insured\s+Retention|SIR\s+(?:Amount|Limit)|Policy\s+Limit|Per\s+Occurrence\s+Limit|Aggregate\s+Limit|Excess\s+Limit|Underlying\s+Limit|Attachment\s+Point|Treaty\s+Limit|Cession\s+Amount)\s*[:=]\s*((?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’]*\d[KMB]?\b|\b\d[0-9,.'’]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))/gi
1249
1280
  },
1250
1281
  // Existing core insurance patterns
1251
- { type: 'FINANCIAL', regex: /\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|(?<!\b(?:Case|Outstanding|IBNR|Loss)\s+)Reserve|Indemnity)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1252
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1282
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Loss|Claim\s+Amount|Claim\s+Settlement|Settlement|(?<!\b(?:Case|Outstanding|IBNR|Loss)\s+)Reserve|Indemnity)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1283
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1253
1284
  { type: 'ID', regex: /\b(?:(?:Assigned\s+)?Adjuster\s+(?:ID|No)|Claim\s+Rep(?:\.|resentative)?)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
1254
1285
  { type: 'ID', regex: /\bNAIC(?:\s+(?:Company\s+)?(?:Code|CoCode|No\.?|Number|#))?[:\s#]*(\d{5})\b/gi },
1255
- { type: 'FINANCIAL', regex: /\b(?:Deductible|Premium|Coverage\s+Amount)[:\s]+(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1286
+ { type: 'FINANCIAL', regex: /(?<=\b(?:Deductible|Premium|Coverage\s+Amount)[:\s]+)(?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[0-9,.'’\u2018\u2019]*\d[KMB]?\b/gi },
1256
1287
  { type: 'ID', regex: /\b[A-HJ-NPR-Z0-9]{17}\b/g },
1257
1288
  { type: 'ID', regex: /\b(?<!\bAdditional\s+)(?:Insured|Named\s+Insured)[:\s]+[A-Z][a-z]+(?:[ \t\xA0]+[A-Z][a-z]+)+/g },
1258
1289
  { type: 'ID', regex: /\b(?:Agent|Producer)\s*(?:Code|No|ID)[:\s#]*[-A-Z0-9]{4,15}\b/gi },
@@ -1281,9 +1312,9 @@ let PROFILE_RULES = {
1281
1312
  { type: 'ID', regex: /\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{3,10}(?:[-_]\d{2,6})+\b|\bGL[-_\s]*(?:Account|Acct|Code)?[:\s#]*\d{4,10}\b/gi },
1282
1313
  { type: 'ID', regex: /\b(?:Cost\s+Center|CC)[-_\s]*(?:ID|Code|#)?[:\s#]*[A-Z0-9_-]*\d[A-Z0-9_-]*\b/gi },
1283
1314
  { type: 'ID', regex: /\b(?:Invoice|Inv|Purchase\s+Order|PO|Bill|Check|Voucher|Remittance)\s*(?:Number|Num|No\.?|#)?[:\s#]+([A-Za-z0-9_-]{4,25})\b/gi },
1284
- { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Invoice(?:\s+Total)?|Amount\s+Due|Total\s+Due|Payment(?:\s+Amount)?|Ledger\s+Balance|Credit|Debit|Net\s+Amount|Total\s+Paid|Billed|Remittance|Total\s+Revenue|Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|Sales\s+Revenue|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
1315
+ { type: 'FINANCIAL', regex: /(?<=\b(?<!\b(?:EV|Debt|Net\s+Debt)\/)(?:Invoice(?:\s+Total)?|Amount\s+Due|Total(?:\s+Due)?|Payment(?:\s+Amount)?|Ledger\s+Balance|Credit|Debit|Net\s+Amount|Total\s+Paid|Billed|Remittance|Total\s+Revenue|Revenue|Cost\s+of\s+Goods(?:\s+Sold)?|COGS|Gross\s+Profit|Operating\s+Expenses?|OpEx|Operating\s+Income(?:\s*\([^)]*\))?|Operating\s+Loss|Net\s+Income(?:\s*[/()]*\s*Loss)?|Net\s+Loss|Foreign\s+Exchange(?:\s+Loss)?|FX\s+Loss|Retained\s+Earnings|Total\s+Equity|Shareholders?'?\s+Equity|Total\s+Assets|Total\s+Liabilities|Accounts\s+Payable|Accounts\s+Receivable|Cash|Cash\s+Flow|Free\s+Cash\s+Flow|Capital\s+Expenditures?|CapEx|Dividends?|(?:Capital\s+|Annual\s+)?Distribution(?:s)?|Withdrawal(?:s)?|Settlement(?:s)?|Sales\s+Revenue|EBITDA|EBIT|Balance|Loss|Profit)[:|\s]+)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹]))|[0-9,.'’]*\d\b)(?![ \t\xA0]*(?:%|[xX]\b|times\b|bps\b))/gi },
1285
1316
  { type: 'FINANCIAL', regex: /(?<=\|\s*)(?:(?:\((?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]+[KMB]?\)|(?:[$€£¥₪₽₹]\s*)\([0-9,.'’\u2018\u2019]+[KMB]?\))|(?:[-−](?:[$€£¥₪₽₹]\s*)?[0-9,.'’\u2018\u2019]*\d[KMB]?\b|(?:[$€£¥₪₽₹]\s*)[-−][0-9,.'’\u2018\u2019]*\d[KMB]?\b)|(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB)\b|[$€£¥₪₽₹])))(?=\s*\|)/gi },
1286
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi }
1317
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi }
1287
1318
  ],
1288
1319
  pharma: [
1289
1320
  // Contextual Clinical, Regulatory & Pharmacovigilance Personnel
@@ -1567,7 +1598,7 @@ let PROFILE_RULES = {
1567
1598
  { type: 'ID', regex: /\b(?:Ineligible\s+AR|Eligible\s+AR|Collateral\s+Account)(?:\s+(?:Account|Acct|ID|Ref|No\.?|Number|#))*\s*[:#-]\s*([A-Za-z0-9-]{4,20})\b/gi },
1568
1599
  { type: 'ID', regex: /\b(?:Merchant\s+Cash\s+Advance|MCA)[ \t\xA0]*(?:Agreement|Contract)?[ \t\xA0]*(?:ID|Ref|No\.?|Number|#)?[ \t\xA0]*[:#-][ \t\xA0]*(?!Agreement\b)([A-Za-z0-9-]{4,25})\b/gi },
1569
1600
  { type: 'FINANCIAL', regex: /(?<=(?:^|[\r\n\t.;])[ \t\xA0]*(?:Daily|Weekly)(?:[ \t\xA0]+(?:ACH|Remittance|Debit|Payment|Transfer|Split(?:[ \t\xA0]+Funding)?|Holdback))+[ \t\xA0]*[:=][ \t\xA0]*)((?:[$€£¥₪₽₹]|(?:USD|EUR|GBP|CHF|ILS|RUB)\s?)[\d,.'’]+)/gi },
1570
- { type: 'FINANCIAL', regex: /(?:(?:\b(?:EUR|GBP|CHF|ILS|RUB)\s*|[€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:EUR|GBP|CHF|ILS|RUB)\b|[€£¥₪₽₹]))/gi },
1601
+ { type: 'FINANCIAL', regex: /(?:(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\s*|[$€£¥₪₽₹]\s*)[0-9,.'’\u2018\u2019]*\d[KMB]?(?:\s*(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY|[$€£¥₪₽₹]))?\b|\b\d[0-9,.'’\u2018\u2019]*\d?[KMB]?\s*(?:\b(?:USD|EUR|GBP|CHF|ILS|RUB|CAD|AUD|JPY)\b|[$€£¥₪₽₹]))/gi },
1571
1602
  { type: 'NAME', isContextName: true, isCorporateName: true, regex: /(?:MCA\s+Funder|Funder|ISO\s+Broker|Funding\s+Partner)[ \t\xA0]*[:#][ \t\xA0]*([A-Za-z0-9&.,\s'-]{2,40}?)(?=\r?\n|$|\s{3,}|\t|Rate|Factor|Advance|Amount|Terms)/gi }
1572
1603
  ]
1573
1604
  };
@@ -1847,7 +1878,7 @@ let NOT_NAME_WORDS = new Set([
1847
1878
  // Common Resume / Business Phrases
1848
1879
  'results-driven', 'data-driven', 'customer-centric', 'detail-oriented', 'cross-functional', 'self-motivated', 'time-management', 'problem-solving', 'fast-paced', 'year-over-year',
1849
1880
  // Legal & Trust terms
1850
- 'trust', 'trustee', 'co-trustee', 'settlor', 'grantor', 'beneficiary', 'agreement', 'will', 'estate', 'witness', 'declaration', 'signatory', 'testator', 'notary', 'commission', 'county', 'state', 'court', 'article', 'section', 'paragraph', 'schedule', 'exhibit', 'amendment', 'addendum', 'power', 'attorney', 'guardian', 'executor', 'administrator', 'survivor', 'predecessor', 'successor', 'whereof', 'hereby', 'thereby', 'herein', 'therein', 'witnesseth', 'whereas', 'therefore', 'now', 'dated', 'effective', 'matter', 'case', 'cases', 'docket', 'dockets', 'number', 'numbers', 'firm', 'firms', 'lawyer', 'lawyers', 'counsel', 'counsels', 'counselstack', 'tier', 'tiers', 'finding', 'findings', 'connector', 'connectors', 'platform', 'platforms',
1881
+ 'trust', 'trustee', 'trustees', 'co-trustee', 'co-trustees', 'settlor', 'settlors', 'grantor', 'grantors', 'trustor', 'trustors', 'beneficiary', 'beneficiaries', 'revocable', 'irrevocable', 'dynasty', 'testamentary', 'fbo', 'agreement', 'will', 'estate', 'witness', 'declaration', 'signatory', 'testator', 'notary', 'commission', 'county', 'state', 'court', 'article', 'section', 'paragraph', 'schedule', 'exhibit', 'amendment', 'addendum', 'power', 'attorney', 'guardian', 'executor', 'administrator', 'survivor', 'predecessor', 'successor', 'whereof', 'hereby', 'thereby', 'herein', 'therein', 'witnesseth', 'whereas', 'therefore', 'now', 'dated', 'effective', 'matter', 'case', 'cases', 'docket', 'dockets', 'number', 'numbers', 'firm', 'firms', 'lawyer', 'lawyers', 'counsel', 'counsels', 'counselstack', 'tier', 'tiers', 'finding', 'findings', 'connector', 'connectors', 'platform', 'platforms',
1851
1882
  // Medical & Clinical terms
1852
1883
  'clinical', 'note', 'notes', 'dx', 'rx', 'tx', 'hx', 'px', 'sx', 'type', 'diabetes', 'referred', 'referral', 'diagnosed', 'diagnosis', 'patient', 'insurance', 'bcbs', 'mrn', 'dob',
1853
1884
  // Tax & Payroll terms
@@ -1867,7 +1898,9 @@ let NOT_NAME_WORDS = new Set([
1867
1898
  'accord', 'contrat', 'contrato', 'acuerdo', 'avenant', 'convention', 'protocole', 'prestation', 'confidentialite', 'confidentialité',
1868
1899
  'f.3d', 'f.supp', 'u.s.c.', 'v.', 'plaintiff', 'defendant', 'v', 'u.s.', 'court', 'app.', 'reporter', 'cir.',
1869
1900
  'civ', 'crim', 'evid', 'bankr', 'proc',
1870
- 'marine', 'inland', 'ocean', 'comp', 'workers', 'actuarial', 'actuary', 'underwriting', 'syndicate', 'lloyd', 'lloyds', 'pcs']);
1901
+ 'marine', 'inland', 'ocean', 'comp', 'workers', 'actuarial', 'actuary', 'underwriting', 'syndicate', 'lloyd', 'lloyds', 'pcs',
1902
+ // Dutch role / job-title nouns (prevent sentence-initial role words from being absorbed into NAME tokens)
1903
+ 'medewerker', 'medewerkers', 'medewerkster', 'collega', 'collegas', 'werknemer', 'werknemers', 'klant', 'klanten', 'cliënt', 'client', 'cliënten', 'patiënt', 'patiënten', 'directeur', 'aanvrager', 'contactpersoon', 'huisarts', 'adviseur', 'consulent', 'beheerder', 'sollicitant', 'kandidaat', 'verzekerde', 'dossierhouder', 'behandelaar', 'zaakbehandelaar', 'burgerservicenummer', 'sofinummer']);
1871
1904
 
1872
1905
  // Nobiliary particles and conjunctions that should never trigger name disqualification
1873
1906
  const NOBILIARY_PARTICLES = new Set([
@@ -3034,6 +3067,25 @@ const PROFILE_JARGON = {
3034
3067
  restoredCount++;
3035
3068
  return lookup.get(upper);
3036
3069
  }
3070
+ // Normalized lookup: strip outer brackets/delimiters, normalize whitespace, collapse leading zeros
3071
+ const inner = match.replace(/^(\[|<|\{\{|__)\s*|\s*(\]|>|\}\}|__)$/g, '').trim();
3072
+ const normMatch = inner.match(/^([A-Za-z_А-Яа-яЁё0-9]+?)[-_\s]+0*(\d+)$/);
3073
+ if (normMatch) {
3074
+ const normLabel = normMatch[1].replace(/[\s_-]+/g, '_').toUpperCase();
3075
+ const normIdx = parseInt(normMatch[2], 10);
3076
+ const candidates = [
3077
+ normLabel + '_' + normIdx,
3078
+ '[' + normLabel + '_' + normIdx + ']',
3079
+ normLabel + ' ' + normIdx,
3080
+ normLabel + '-' + normIdx
3081
+ ];
3082
+ for (let c = 0; c < candidates.length; c++) {
3083
+ if (lookup.has(candidates[c])) {
3084
+ restoredCount++;
3085
+ return lookup.get(candidates[c]);
3086
+ }
3087
+ }
3088
+ }
3037
3089
  const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3038
3090
  if (possMatch) {
3039
3091
  const base = possMatch[1];
@@ -3079,12 +3131,32 @@ const PROFILE_JARGON = {
3079
3131
  } else if (lookup.has(match.toUpperCase())) {
3080
3132
  rawVal = lookup.get(match.toUpperCase());
3081
3133
  } else {
3082
- const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3083
- if (possMatch) {
3084
- const base = possMatch[1];
3085
- suffix = possMatch[2];
3086
- if (lookup.has(base)) rawVal = lookup.get(base);
3087
- else if (lookup.has(base.toUpperCase())) rawVal = lookup.get(base.toUpperCase());
3134
+ const inner = match.replace(/^(\[|<|\{\{|__)\s*|\s*(\]|>|\}\}|__)$/g, '').trim();
3135
+ const normMatch = inner.match(/^([A-Za-z_А-Яа-яЁё0-9]+?)[-_\s]+0*(\d+)$/);
3136
+ if (normMatch) {
3137
+ const normLabel = normMatch[1].replace(/[\s_-]+/g, '_').toUpperCase();
3138
+ const normIdx = parseInt(normMatch[2], 10);
3139
+ const candidates = [
3140
+ normLabel + '_' + normIdx,
3141
+ '[' + normLabel + '_' + normIdx + ']',
3142
+ normLabel + ' ' + normIdx,
3143
+ normLabel + '-' + normIdx
3144
+ ];
3145
+ for (let c = 0; c < candidates.length; c++) {
3146
+ if (lookup.has(candidates[c])) {
3147
+ rawVal = lookup.get(candidates[c]);
3148
+ break;
3149
+ }
3150
+ }
3151
+ }
3152
+ if (rawVal === null) {
3153
+ const possMatch = match.match(/^([\s\S]+?)('s|’s|s|[а-яёА-ЯЁ]{1,3})$/);
3154
+ if (possMatch) {
3155
+ const base = possMatch[1];
3156
+ suffix = possMatch[2];
3157
+ if (lookup.has(base)) rawVal = lookup.get(base);
3158
+ else if (lookup.has(base.toUpperCase())) rawVal = lookup.get(base.toUpperCase());
3159
+ }
3088
3160
  }
3089
3161
  }
3090
3162
  if (rawVal !== null) {
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/moxno/privacyscrubber-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "2.3.7",
9
+ "version": "2.3.9",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@privacyscrubber/mcp-server",
14
- "version": "2.3.7",
14
+ "version": "2.3.9",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
package/bundle.mcpb DELETED
Binary file