Download index.html from getreadystack/cra-reporting-clock-lint: direct link, hf CLI and curl.
- Browser
- Download file 48.2 kB
-
https://huggingface.co/spaces/getreadystack/cra-reporting-clock-lint/resolve/main/index.html
- Command line
-
hf download hf://spaces/getreadystack/cra-reporting-clock-lint/index.html
-
curl -L -o index.html https://huggingface.co/spaces/getreadystack/cra-reporting-clock-lint/resolve/main/index.html
48.2 kB
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| <title>Cyber Resilience Act Reporting deadlines — check security reporting</title> | |
| <meta name="description" content="This browser tool checks SECURITY.md against the Cyber Resilience Act reporting clocks, support period, coordinated vulnerability disclosure policy, and SBOM listed in the description."> | |
| <style> | |
| :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512} | |
| .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px} | |
| textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box} | |
| .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer} | |
| input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px} | |
| table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65} | |
| .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600} | |
| .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa} | |
| </style> | |
| <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script> | |
| <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/cra-reporting-clock-lint"><style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:anywhere}#out pre,#out code{white-space:pre-wrap;overflow-wrap:anywhere}@media (max-width:640px){table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <h1>Cyber Resilience Act Reporting deadlines — check security reporting</h1> | |
| <p class="lede">Checks SECURITY.md against the EU Cyber Resilience Act clocks that went live 11 Sep 2026: 24h early warning, 72h notification, 14-day final report, 5-year support period, CVD policy, SBOM. Runs entirely in your browser — nothing is uploaded.</p> | |
| <textarea id="src" spellcheck="false"># Security Policy | |
| ## Supported Versions | |
| We support the two most recent minor releases. Support period: 2 years from the | |
| release date. End of support for the legacy branch: 2025-12-31. | |
| ## Reporting a Vulnerability | |
| Please do not open a public issue. Use the private advisory form on our | |
| repository instead. We will acknowledge receipt and aim to respond within 90 | |
| days of the initial report. | |
| Patches are provided on a best-effort basis and shipped at our sole discretion. | |
| We may also coordinate a longer embargo of up to 180 days where a fix is | |
| complicated. | |
| ## EU Cyber Resilience Act | |
| The Cyber Resilience Act only applies from 11 December 2027, so there is nothing | |
| for reporters to do differently today.</textarea> | |
| <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div> | |
| <div id="out" aria-live="polite"></div> | |
| <div id="paid"><strong>Free here:</strong> Lints the SECURITY.md you have open and names every CRA Article 13/14 and Annex I/II clause it is missing, with the statutory deadline and the article number for each one.. <strong>In the editor:</strong> Scans every SECURITY.md in the whole workspace at once and writes the corrected, CRA-clause-referenced policy text out to disk as a dated audit file you keep. — that part asks for a licence key.</div> | |
| <p class="note">Same engine as the VS Code extension, byte for byte.</p> | |
| </div> | |
| <script>var CRA_RULES = [ | |
| {"id":"cra-art14-24h-early-warning","sev":"error","kind":"require","all":["\\b24[ -]?(h|hr|hrs|hour|hours)\\b","(ENISA|CSIRT)"], | |
| "msg":"No 24-hour early-warning path. Art. 14(2)(a) EU 2024/2847: an actively exploited vulnerability must reach the coordinator CSIRT and ENISA within 24 hours of becoming aware. This clock is live since 11 Sep 2026."}, | |
| {"id":"cra-art14-72h-notification","sev":"error","kind":"require","all":["\\b72[ -]?(h|hr|hrs|hour|hours)\\b"], | |
| "msg":"No 72-hour notification step. Art. 14(2)(b): the vulnerability notification with corrective measures follows the early warning within 72 hours."}, | |
| {"id":"cra-art14-final-report-14d","sev":"error","kind":"require","all":["final report","\\b14[ -]?(calendar[ -])?days?\\b"], | |
| "msg":"No 14-day final report. Art. 14(2)(c): a final report is due within 14 days of a corrective measure being available for the exploited vulnerability."}, | |
| {"id":"cra-art14-severe-incident-1-month","sev":"warn","kind":"require","all":["severe incident","(1 month|one month)"], | |
| "msg":"Severe incidents are on a separate clock. Art. 14(4)(c): 24-hour early warning, 72-hour incident notification, final report within 1 month. Name it separately from the vulnerability track."}, | |
| {"id":"cra-art13-support-period","sev":"error","kind":"require","any":["support period","end of support","end-of-support","support ends"], | |
| "msg":"No support period stated. Art. 13(8): the support period must be at least 5 years unless the product's expected lifetime is shorter, and Annex II(7) says users must be told its end date."}, | |
| {"id":"cra-annex1-cvd-policy","sev":"error","kind":"require","any":["coordinated vulnerability disclosure","\\bCVD policy\\b"], | |
| "msg":"No coordinated vulnerability disclosure policy named. Annex I Part II(5) requires the manufacturer to put one in place and enforce it — a reporting email alone is not the policy."}, | |
| {"id":"cra-annex1-sbom","sev":"error","kind":"require","any":["\\bSBOM\\b","software bill of materials"], | |
| "msg":"No SBOM. Annex I Part II(1): vulnerabilities and components must be identified and documented, including a software bill of materials covering at the very least the top-level dependencies."}, | |
| {"id":"cra-sbom-machine-readable-format","sev":"warn","kind":"require","when":"(\\bSBOM\\b|software bill of materials)","any":["CycloneDX","SPDX"], | |
| "msg":"SBOM is mentioned but no machine-readable format is named. Annex I Part II(1) requires a commonly used machine-readable format — name CycloneDX or SPDX and where the file lives."}, | |
| {"id":"cra-annex2-contact-point","sev":"error","kind":"require","any":["[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}","security\\.txt","/security/advisories","/security/policy"], | |
| "msg":"No single contact point for vulnerability reports. Annex II(2) requires a contact point where information about vulnerabilities can be reported and received — an address, a security.txt, or an advisories URL."}, | |
| {"id":"cra-art16-single-reporting-platform","sev":"warn","kind":"require","any":["single reporting platform","Article 16","Art\\.? ?16"], | |
| "msg":"The reporting destination is unnamed. Art. 16 routes Art. 14 notifications through the single reporting platform ENISA operates — say that is where your 24h and 72h notifications go."}, | |
| {"id":"cra-art24-role-declaration","sev":"warn","kind":"require","any":["open[- ]source software steward","\\bmanufacturer\\b","Article 24","Art\\.? ?24"], | |
| "msg":"Your CRA role is undeclared. Art. 24 gives open-source software stewards a lighter regime than manufacturers, and the two owe different duties — state which one you are before someone assumes the heavier one."}, | |
| {"id":"cra-art28-eu-declaration-of-conformity","sev":"warn","kind":"require","any":["EU declaration of conformity","\\bCE mark"], | |
| "msg":"No EU declaration of conformity or CE marking referenced. Art. 28 and Art. 30 make the declaration and the CE marking the visible proof of conformity for a product with digital elements placed on the EU market."}, | |
| {"id":"cra-slow-response-window-conflict","sev":"error","kind":"forbid","bad":"\\b(30|45|60|90|120|180)[ -]?(calendar[ -]|business[ -]|working[ -])?days?\\b", | |
| "msg":"This response window is longer than the CRA clock. Once Art. 14 applies, an actively exploited vulnerability is reportable in 24 hours and notified in 72 — a 30-to-180 day disclosure window cannot be your stated obligation."}, | |
| {"id":"cra-wrong-applicability-date","sev":"error","kind":"forbid","bad":"(applies|applicable|in force|takes effect|comes into force|enters into force|starts|begins|only)[^.\\n]{0,70}(11 December 2027|December 2027|2027-12-11|not until 2027|December 2024|2024-12-10)", | |
| "msg":"Wrong CRA start date. 11 Dec 2027 is full application and Dec 2024 is entry into force; the Art. 14 reporting obligations have applied since 11 Sep 2026 and Chapter IV since 11 Jun 2026."}, | |
| {"id":"cra-disclaimer-contradicts-duty","sev":"warn","kind":"forbid","bad":"\\b(best[- ]effort|no guarantee of a (fix|response)|as[- ]is basis|we (may|might) not respond|at our sole discretion)\\b", | |
| "msg":"This disclaimer contradicts a CRA duty. Annex I Part II(2) requires vulnerabilities to be addressed and remediated without delay throughout the support period — discretionary language does not survive it."}, | |
| {"id":"cra-support-period-too-short","sev":"error","kind":"support_length", | |
| "msg":"Stated support period is under the Art. 13(8) floor of 5 years. Shorter is only defensible when the product's expected lifetime is genuinely shorter, and that has to be said in the same breath."}, | |
| {"id":"cra-support-end-date-past","sev":"error","kind":"support_end_date", | |
| "msg":"The support end date you publish is already in the past. Annex II(7) makes this date the thing users rely on; a lapsed date reads as an unsupported product still on the market."} | |
| ] | |
| ;</script> | |
| <script>/* CRA Reporting Clock Lint — engine. | |
| Same brain in Node (extension) and in the browser (free web page). */ | |
| (function () { | |
| var RULES = (typeof module !== 'undefined') | |
| ? require('./rules.json') | |
| : window.CRA_RULES; | |
| var MONTHS = {january:1,february:2,march:3,april:4,may:5,june:6,july:7,august:8, | |
| september:9,october:10,november:11,december:12}; | |
| function lineOf(text, index) { | |
| return text.slice(0, index).split('\n').length; | |
| } | |
| function firstHeadingLine(text) { | |
| var lines = text.split('\n'); | |
| for (var i = 0; i < lines.length; i++) { | |
| if (/^#/.test(lines[i])) return i + 1; | |
| } | |
| return 1; | |
| } | |
| function stripCode(text) { | |
| return text.replace(/```[\s\S]*?```/g, function (b) { | |
| return b.replace(/[^\n]/g, ' '); | |
| }); | |
| } | |
| /* Markdown wraps sentences across lines; match on a whitespace-flattened copy | |
| but keep a map back to the original offsets so line numbers stay true. */ | |
| function flatten(text) { | |
| var out = '', map = [], prev = false, i, c; | |
| for (i = 0; i < text.length; i++) { | |
| c = text.charAt(i); | |
| if (/\s/.test(c)) { | |
| if (prev) continue; | |
| out += ' '; map.push(i); prev = true; | |
| } else { | |
| out += c; map.push(i); prev = false; | |
| } | |
| } | |
| return { s: out, map: map }; | |
| } | |
| function toDays(n, unit) { | |
| if (/month/i.test(unit)) return n * 30.4375; | |
| if (/week/i.test(unit)) return n * 7; | |
| return n * 365.25; | |
| } | |
| /* "supported for 2 years", "24 months of support", "support period: 3 years" */ | |
| function supportLength(text) { | |
| var out = []; | |
| var pats = [ | |
| /support(?:ed|s)?[^.\n]{0,60}?(\d{1,3})\s*(years?|months?|weeks?)/gi, | |
| /(\d{1,3})\s*(years?|months?|weeks?)[^.\n]{0,40}?\bsupport\b/gi | |
| ]; | |
| for (var p = 0; p < pats.length; p++) { | |
| var re = pats[p], m; | |
| while ((m = re.exec(text)) !== null) { | |
| out.push({ years: toDays(parseInt(m[1], 10), m[2]) / 365.25, at: m.index, raw: m[0].trim() }); | |
| } | |
| } | |
| return out; | |
| } | |
| /* an explicit end-of-support date, ISO or "31 December 2027" or "December 2027" */ | |
| function supportEndDates(text) { | |
| var out = []; | |
| var win = /(support (?:period )?(?:ends?|until|through)|end[- ]of[- ]support|end of the support period|supported until)([^\n]{0,48})/gi; | |
| var m; | |
| while ((m = win.exec(text)) !== null) { | |
| var tail = m[2], d = null; | |
| var iso = /(\d{4})-(\d{2})-(\d{2})/.exec(tail); | |
| var dmy = /(\d{1,2})\s+([A-Za-z]+)\s+(\d{4})/.exec(tail); | |
| var my = /([A-Za-z]+)\s+(\d{4})/.exec(tail); | |
| if (iso) d = new Date(Date.UTC(+iso[1], +iso[2] - 1, +iso[3])); | |
| else if (dmy && MONTHS[dmy[2].toLowerCase()]) d = new Date(Date.UTC(+dmy[3], MONTHS[dmy[2].toLowerCase()] - 1, +dmy[1])); | |
| else if (my && MONTHS[my[1].toLowerCase()]) d = new Date(Date.UTC(+my[2], MONTHS[my[1].toLowerCase()] - 1, 28)); | |
| if (d && !isNaN(d.getTime())) out.push({ date: d, at: m.index, raw: m[0].replace(/\s*#+.*$/, '').trim() }); | |
| } | |
| return out; | |
| } | |
| function check(text, opts) { | |
| text = String(text == null ? '' : text); | |
| opts = opts || {}; | |
| var today = new Date((opts.today || '2026-09-11') + 'T00:00:00Z'); | |
| if (isNaN(today.getTime())) today = new Date(Date.UTC(2026, 8, 11)); | |
| var flat = flatten(stripCode(text)); | |
| var body = flat.s; | |
| function origLine(at) { return lineOf(text, flat.map[at] == null ? 0 : flat.map[at]); } | |
| var head = firstHeadingLine(text); | |
| var findings = []; | |
| function add(rule, line, extra) { | |
| findings.push({ | |
| check: rule.id, | |
| sev: rule.sev, | |
| msg: extra ? rule.msg + ' ' + extra : rule.msg, | |
| line: line | |
| }); | |
| } | |
| for (var i = 0; i < RULES.length; i++) { | |
| var r = RULES[i], j, hit; | |
| if (r.when && !new RegExp(r.when, 'i').test(body)) continue; | |
| if (r.kind === 'require') { | |
| if (r.all) { | |
| var missAll = false; | |
| for (j = 0; j < r.all.length; j++) { | |
| if (!new RegExp(r.all[j], 'i').test(body)) { missAll = true; break; } | |
| } | |
| if (missAll) add(r, head); | |
| } else if (r.any) { | |
| hit = false; | |
| for (j = 0; j < r.any.length; j++) { | |
| if (new RegExp(r.any[j], 'i').test(body)) { hit = true; break; } | |
| } | |
| if (!hit) add(r, head); | |
| } | |
| } else if (r.kind === 'forbid') { | |
| var re = new RegExp(r.bad, 'gi'), m; | |
| while ((m = re.exec(body)) !== null) { | |
| add(r, origLine(m.index), 'Found: "' + m[0].trim() + '".'); | |
| if (m.index === re.lastIndex) re.lastIndex++; | |
| } | |
| } else if (r.kind === 'support_length') { | |
| var lens = supportLength(body); | |
| for (j = 0; j < lens.length; j++) { | |
| if (lens[j].years < 5) { | |
| add(r, origLine(lens[j].at), | |
| 'Found: "' + lens[j].raw + '" = ' + (Math.round(lens[j].years * 10) / 10) + ' years.'); | |
| } | |
| } | |
| } else if (r.kind === 'support_end_date') { | |
| var ends = supportEndDates(body); | |
| for (j = 0; j < ends.length; j++) { | |
| if (ends[j].date.getTime() < today.getTime()) { | |
| add(r, origLine(ends[j].at), | |
| 'Found: "' + ends[j].raw + '" — already past on ' + (opts.today || '2026-09-11') + '.'); | |
| } | |
| } | |
| } | |
| } | |
| findings.sort(function (a, b) { return a.line - b.line; }); | |
| return { findings: findings }; | |
| } | |
| var OUT = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length }; | |
| if (typeof module !== 'undefined') { module.exports = OUT; } | |
| if (typeof window !== 'undefined') { window.CRAENGINE = OUT; } | |
| })(); | |
| </script> | |
| <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다. | |
| ; | |
| function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); } | |
| function summaryLine(res) { | |
| const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length; | |
| return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.'; | |
| } | |
| function toText(res, label) { | |
| const f = (res && res.findings) || []; | |
| const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)]; | |
| f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); }); | |
| return lines.join('\n'); | |
| } | |
| function toHtml(res) { | |
| const f = (res && res.findings) || []; | |
| if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>'; | |
| const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join(''); | |
| return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>'; | |
| } | |
| var CRAREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml }; | |
| if (typeof module !== 'undefined' && module.exports) module.exports = CRAREPORT; | |
| else window.CRAREPORT = CRAREPORT; | |
| </script> | |
| <script> | |
| (function(){ | |
| var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today'); | |
| today.value=new Date().toISOString().slice(0,10); | |
| function run(){ try { var res=window.CRAENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.CRAREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } } | |
| go.onclick=run; if (src.value.trim()) run(); | |
| })(); | |
| </script> | |
| <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.cra-reporting-clock-lint" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'cra-reporting-clock-lint',src:'mp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.cra-reporting-clock-lint</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section> | |
| <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind CRA Reporting Clock Lint (EU 2024/2847) every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"cra-reporting-clock-lint",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section> | |
| <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Scans every SECURITY.md across the whole workspace in one pass and writes the corrected, clause-referenced policy text out to a dated audit file you keep.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">The human alternative is EU product-compliance counsel reading the same file by the billable hour; Art. 64(2) caps an Article 13 or 14 infringement at EUR 15,000,000 or 2.5% of total worldwide annual turnover, whichever is higher.</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_GgC3uLMfpdK3CNNCQPU9Fzqj26FymQcDCi9d74XQFG5" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section> | |
| <section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does CRA Reporting Clock Lint actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads the SECURITY.md you have open and checks it against 17 rules drawn from Regulation (EU) 2024/2847. Each finding names the article or annex point and the deadline: 24 hours for the early warning, 72 hours for the notification, 14 days for the final report, five years for the support period. It reports; it does not file anything.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is this for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Maintainers and product engineers who place software with digital elements on the EU market and own the repository's SECURITY.md. That includes commercial open-source vendors, SaaS teams shipping installable agents, and firmware teams. It is aimed at the person who has to answer a customer's CRA questionnaire, not at a compliance department.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just use a free Markdown linter or a chat assistant?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A Markdown linter checks heading levels and link syntax. It has no article numbers, and it cannot tell that a published support end date of 2025-12-31 has already passed. This extension compares your file against dated obligations and against today's date, offline, with the clause number attached to every finding.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what needs a licence key?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free covers one file completely: open a SECURITY.md, run the lint, read every missing or contradicted clause with its article number. The full version adds a different axis, not a bigger drip: a workspace-wide pass over every SECURITY.md, and a written, dated audit file containing the corrected clause-referenced text.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What would this cost done by a person?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">The ordinary route is having EU product-compliance counsel read the policy by the billable hour, then repeating that each time the file changes. The statutory ceiling on the other side is Art. 64(2): EUR 15,000,000 or 2.5% of total worldwide annual turnover for an Article 13 or 14 infringement, whichever is higher.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does CRA Reporting Clock Lint actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads the SECURITY.md you have open and checks it against 17 rules drawn from Regulation (EU) 2024/2847. Each finding names the article or annex point and the deadline: 24 hours for the early warning, 72 hours for the notification, 14 days for the final report, five years for the support period. It reports; it does not file anything."}}, {"@type": "Question", "name": "Who is this for?", "acceptedAnswer": {"@type": "Answer", "text": "Maintainers and product engineers who place software with digital elements on the EU market and own the repository's SECURITY.md. That includes commercial open-source vendors, SaaS teams shipping installable agents, and firmware teams. It is aimed at the person who has to answer a customer's CRA questionnaire, not at a compliance department."}}, {"@type": "Question", "name": "Why not just use a free Markdown linter or a chat assistant?", "acceptedAnswer": {"@type": "Answer", "text": "A Markdown linter checks heading levels and link syntax. It has no article numbers, and it cannot tell that a published support end date of 2025-12-31 has already passed. This extension compares your file against dated obligations and against today's date, offline, with the clause number attached to every finding."}}, {"@type": "Question", "name": "What is free and what needs a licence key?", "acceptedAnswer": {"@type": "Answer", "text": "Free covers one file completely: open a SECURITY.md, run the lint, read every missing or contradicted clause with its article number. The full version adds a different axis, not a bigger drip: a workspace-wide pass over every SECURITY.md, and a written, dated audit file containing the corrected clause-referenced text."}}, {"@type": "Question", "name": "What would this cost done by a person?", "acceptedAnswer": {"@type": "Answer", "text": "The ordinary route is having EU product-compliance counsel read the policy by the billable hour, then repeating that each time the file changes. The statutory ceiling on the other side is Art. 64(2): EUR 15,000,000 or 2.5% of total worldwide annual turnover for an Article 13 or 14 infringement, whichever is higher."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:0,slug:"cra-reporting-clock-lint",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><!--yj-embed-s178--><details id="embed" data-yj="yj-embed" style="max-width:46rem;margin:1.6rem auto;padding:.85rem 1.1rem;border:1px solid #8884;border-radius:10px"><summary style="cursor:pointer;font-weight:600">Embed this tool on your site (free)</summary><p style="margin:.6rem 0;opacity:.85">Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.</p><textarea readonly rows="6" style="width:100%;font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;border:1px solid #8886;border-radius:7px;padding:.5rem"><iframe src="https://getreadystack.com/embed/cra-reporting-clock-lint/" title="Cyber Resilience Act Reporting deadlines — check security reporting" loading="lazy" data-rs-embed="en-cra-reporting-clock-lint" style="width:100%;max-width:760px;height:640px;border:1px solid #e3e3e3;border-radius:10px"></iframe> | |
| <p style="font-size:13px;margin:6px 0 0"><a href="https://getreadystack.com/tools/cra-reporting-clock-lint">Cyber Resilience Act Reporting deadlines — check security reporting</a> by <a href="https://getreadystack.com/">ReadyStack</a></p> | |
| <script>window.addEventListener("message",function(e){if(e.origin!=="https://getreadystack.com"||!e.data||e.data.type!=="readystack-embed")return;var f=document.querySelectorAll("iframe[data-rs-embed]");for(var i=0;i<f.length;i++){if(f[i].contentWindow===e.source)f[i].style.height=Math.min(e.data.h+6,8000)+"px";}});</script></textarea><p style="margin:.5rem 0 0"><button type="button" data-yj="yj-embed-copy" style="font:inherit;padding:8px 14px;border:1px solid #8884;border-radius:9px;background:transparent;cursor:pointer">Copy code</button> <a href="/embed/">All embeddable tools</a></p><p style="margin:.7rem 0 0;font-size:.92em;opacity:.9">For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. <a href="/embed/pro/?ref=embed_box">See Pro →</a></p></details><script data-yj="yj-embed">(function(){var b=document.querySelector("[data-yj=yj-embed-copy]");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var a=b.closest("details").querySelector("textarea");var v=a.value;function d(){b.textContent="Copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(v).then(d,function(){a.select();});}else{a.select();}});})();</script><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/cra-readiness-audit"><span class="yj-rel-t">CRA Readiness Audit for EU Cyber Resilience Act</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/cra-24-72-14-reporting-lint"><span class="yj-rel-t">CRA 24/72/14 Reporting Lint (Article 14)</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/autohotkey-toml-devicetree-snippets"><span class="yj-rel-t">AutoHotkey v2, TOML and DeviceTree checks for VS Code</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/csaf-advisory-check-cra-2026"><span class="yj-rel-t">CSAF Advisory Check for CRA 2026</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/en301549-lint"><span class="yj-rel-t">EN 301 549 Lint — European Accessibility Act rules, with the clause number, in</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/ai-act-article-50-audit"><span class="yj-rel-t">EU AI Act Article 50 Transparency Audit for Your Codebase</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div> | |
| <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script> | |
| <script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script> | |
| <script data-yj="yj-prefill-s181 v1">(function(){try{var q=new URLSearchParams(location.search);if(!q.toString())return;var P={"R": {"employee": ["employee|w-?2\\b|arbeitnehmer|angestellt|会社員|従業員|給与所得|trabajador|asalariad|empregad|clt\\b|salari", "Employee"], "self": ["self-?employ|freelanc|sole (trader|prop)|selbst(ä|ae)ndig|freiberuf|個人事業|フリーランス|aut(ó|o)nom|\\bmei\\b", "Freelancer / self-employed"], "landlord": ["landlord|rental|vermiet|大家|不動産|arrendador|alquiler|locador|aluguel", "Landlord"], "investor": ["invest|trader|anleger|投資|inversor|investidor", "Investor / trader"], "employer": ["employer|arbeitgeber|雇用主|事業主|empleador|empregador", "Employer"], "seller": ["seller|online shop|h(ä|ae)ndler|販売|vendedor|e-?commerce", "Online seller"]}, "C": {"US": "^(us|usa)$|united states|estados unidos|vereinigte staaten|アメリカ|米国", "UK": "^(uk|gb)$|united kingdom|great britain|reino unido|vereinigtes k|イギリス|英国", "DE": "^de$|germany|deutschland|alemania|alemanha|ドイツ", "JP": "^jp$|japan|jap(ó|ã|o)n?|日本", "ES": "^es$|spain|españa|espana|espanha|spanien|スペイン", "BR": "^br$|brazil|brasil|ブラジル"}, "B": "your 2027 dates", "L": "en"};function ours(el){return !!(el&&el.closest&&el.closest("[data-yj],[data-yj-cta],[data-yj-cal],.yj-email-gate,.yj-find,.yj-related,#yj-ask,#yjgo,#yjr,header,footer,nav"));}function fields(){var r=document.querySelector("main")||document.body;return [].filter.call(r.querySelectorAll("input,select,textarea"),function(el){var t=(el.type||"").toLowerCase();return !ours(el)&&!el.disabled&&["email","hidden","search","password","file","submit","button","reset","image"].indexOf(t)<0;});}function key(el){return el.getAttribute("data-k")||el.id||el.name||"";}function fire(el){["input","change"].forEach(function(n){try{el.dispatchEvent(new Event(n,{bubbles:true}))}catch(e){}});}function setv(el,v){v=String(v).slice(0,80);var t=(el.type||"").toLowerCase(),tg=el.tagName;if(tg=="SELECT"){var o=[].filter.call(el.options,function(o){return o.value==v||o.text.trim()==v})[0];if(!o)return false;el.value=o.value;}else if(t=="checkbox"||t=="radio"){if(!/^(1|0|true|false|on|off|yes|no)$/i.test(v))return false;el.checked=/^(1|true|on|yes)$/i.test(v);}else if(t=="number"||t=="range"){var n=parseFloat(v.replace(/\s/g,"").replace(",","."));if(!isFinite(n))return false;el.value=String(n);}else if(t=="date"){if(!/^\d{4}-\d{2}-\d{2}$/.test(v))return false;el.value=v;}else{if(/[<>]/.test(v))return false;el.value=v;}fire(el);return true;}function pick(el,rx){if(el.tagName!="SELECT")return false;var re=new RegExp(rx,"i");var o=[].filter.call(el.options,function(o){return re.test(o.value)||re.test(o.text)})[0];if(!o||el.value==o.value)return false;el.value=o.value;fire(el);return true;}function run(){var F=fields(),done={},n=0;q.forEach(function(v,k){if(n>=20||/^(ref|role|cc|utm_.*|fbclid|gclid)$/.test(k)||!/^[A-Za-z0-9_-]{1,40}$/.test(k))return;F.forEach(function(el){if(key(el)===k&&!done[k]&&setv(el,v)){done[k]=1;n++;}});});var cc=(q.get("cc")||"").toUpperCase().replace(/[^A-Z]/g,"");if(P.C[cc])F.forEach(function(el){var k=key(el);if(!done[k]&&/country|land|pa(i|í)s|pays|国/i.test(k+" "+(el.id||""))&&pick(el,P.C[cc])){done[k]=1;n++;}});var ro=(q.get("role")||"").replace(/[^a-z]/g,""),R=P.R[ro];if(R)F.forEach(function(el){var k=key(el);if(!done[k]&&el.tagName=="SELECT"&&[].some.call(el.options,function(o){return [].some.call(Object.keys(P.R),function(x){return new RegExp(P.R[x][0],"i").test(o.text)})})&&pick(el,R[0])){done[k]=1;n++;}});if(q.get("ref")=="calendar"){var h=document.querySelector("main h1")||document.querySelector("h1");var d=document.createElement("div");d.setAttribute("data-yj","yj-prefill-back");d.style.cssText="margin:.4rem 0 .8rem;font:15px/1.5 system-ui,sans-serif;opacity:.9";var a=document.createElement("a");a.href="/"+P.L+"/calendar/?ref=tool"+(R?"&role="+ro:"")+(P.C[cc]?"&cc="+cc:"");a.textContent=(R?R[1]+" \u00b7 ":"")+P.B+" \u2192";d.appendChild(a);if(h&&h.parentNode)h.parentNode.insertBefore(d,h.nextSibling);}document.documentElement.setAttribute("data-yj-prefilled",String(n));}if(document.readyState=="loading")document.addEventListener("DOMContentLoaded",run);else run();}catch(e){}})();</script> | |
| </body> | |
| </html> | |