File size: 24,325 Bytes
149c2ac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3216053
149c2ac
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<!doctype html><html lang="en"><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<script defer data-auto-init src="https://cdn.jsdelivr.net/npm/@polar-sh/checkout@latest/dist/embed.global.js"></script>
<title>GNU Global C/C++ .vscode Config Pack</title>
<meta name="description" content="Paste a .vscode file. The 21 rules name the line and the fix. Left is the line that loads silently, right is the line that works.">
<style>
:root{color-scheme:light dark}
body{margin:0;font:16px/1.6 system-ui,-apple-system,"Segoe UI",sans-serif;
 background:#fbfbfa;color:#16161d}
@media(prefers-color-scheme:dark){body{background:#14141a;color:#e8e8ea}}
.wrap{max-width:880px;margin:0 auto;padding:28px 20px 64px}
h1{font-size:1.7rem;line-height:1.25;margin:.2em 0 .3em}
p.sub{margin:0 0 1.4em;opacity:.8}
textarea{width:100%;min-height:230px;font:13px/1.5 ui-monospace,Menlo,Consolas,monospace;
 padding:12px;border:1px solid #c9c9d1;border-radius:10px;background:transparent;color:inherit;
 box-sizing:border-box}
button{font:600 15px/1 inherit;padding:12px 22px;border:0;border-radius:10px;
 background:#1d4ed8;color:#fff;cursor:pointer;margin:12px 0}
button:hover{background:#1a43bd}
table{border-collapse:collapse;width:100%;margin-top:14px;font-size:14px}
th,td{border-bottom:1px solid #d8d8e0;padding:8px 6px;text-align:left;vertical-align:top}
th{font-weight:600;opacity:.75}
td.n{width:64px;font:13px ui-monospace,monospace;opacity:.7}
.ok{padding:14px;border-radius:10px;background:#e8f5ec;color:#14532d;margin-top:14px}
@media(prefers-color-scheme:dark){.ok{background:#15321f;color:#bbf7d0}}
.next{margin-top:30px;padding:18px;border:1px solid #d8d8e0;border-radius:12px}
.next h2{font-size:1.05rem;margin:0 0 .5em}
.next ul{margin:.3em 0 1em 1.1em;padding:0}
a.buy{display:inline-block;margin:14px 0 2px;padding:12px 20px;border-radius:10px;background:#1d4ed8;color:#fff;text-decoration:none;font-weight:600}
a.buy:hover{background:#1a43bd}
.rest{margin-top:10px;font-size:14px;opacity:.85}
</style>
<div class="wrap">
<h1>GNU Global C/C++ .vscode Config Pack</h1>
<p class="sub">Paste a .vscode file. The 21 rules name the line and the fix. Left is the line that loads silently, right is the line that works.</p>
<textarea id="src" placeholder="Paste settings.json, tasks.json, launch.json or c_cpp_properties.json here"></textarea>
<button id="go">Check this file</button>
<div id="out"></div>
<div class="next"><h2>The next file, and the 40 after it</h2><ul><li>Audit every config file in the repository at once</li><li>Write the findings to CSV, JSON or HTML</li><li>Add your team's own rules alongside the 21</li></ul><a class="buy" href="https://buy.polar.sh/polar_cl_Ge5u327gSZxIxtXPvdIVqBgdNtoieIuKZKWfV1LjjLp" data-polar-checkout data-polar-checkout-theme="light">Audit the whole repository &mdash; $29 one-off, 7-day full refund</a><div class="rest">Everything on this page stays free and unlimited: all 21 rules, on any file you paste, with no key.</div></div>
<script>
var RULES=[{"pattern": "\\$\\{workspaceRoot\\}", "flags": "i", "message": "${workspaceRoot} is the deprecated name. Newer VS Code releases resolve it inconsistently across tasks and launch configs, so the path can come out empty and the task runs in the wrong folder. Use ${workspaceFolder}.", "fix": "${workspaceFolder}"}, {"pattern": "\"/(home|Users)/[^\"]+\"", "flags": "", "message": "An absolute path from your own machine. Every teammate who clones this repository gets a path that does not exist, and the setting is ignored without an error. Use ${workspaceFolder} for repo paths or ${userHome} for personal ones."}, {"pattern": "[A-Za-z]:\\\\[^\\\\\"]", "flags": "", "message": "A single backslash in a Windows path is an invalid JSON escape. This file will not parse and every setting in it is dropped. Double the backslashes or use forward slashes, which VS Code accepts on Windows."}, {"pattern": ",\\s*[}\\]]", "flags": "", "message": "Trailing comma. tasks.json and settings.json tolerate it, but package.json, .eslintrc.json and any tool reading this with a strict JSON parser will fail on this line."}, {"pattern": "\"[^\"]*[Tt]oken\"\\s*:\\s*\"gh[pousr]_", "flags": "", "message": "A GitHub token is written into a file that lives in the repository. The moment this is pushed the token is public; GitHub revokes leaked tokens automatically and your gist and repo access stops. Move it to the VS Code secret storage or an environment variable."}, {"pattern": "\"[^\"]*([Ss]ecret|[Pp]assword|apiKey|api_key)\"\\s*:\\s*\"[^\"$][^\"]{7,}\"", "flags": "", "message": "A literal credential in a committed workspace file. Reference an environment variable such as ${env:MY_SECRET} instead of the value itself."}, {"pattern": "\"version\"\\s*:\\s*\"0\\.1\\.0\"", "flags": "", "message": "This is the legacy tasks.json schema. Task groups, presentation options and background matchers are all ignored under 0.1.0. The current schema is 2.0.0.", "fix": "\"version\": \"2.0.0\""}, {"pattern": "\"[A-Za-z_.]*[Pp]ath\"\\s*:\\s*\"~/", "flags": "", "message": "VS Code does not expand a leading tilde in JSON configuration. The path resolves literally to a folder named ~ , so the setting silently does nothing. Use ${userHome}/ instead."}, {"pattern": "\"console\"\\s*:\\s*\"internalConsole\"", "flags": "", "message": "The internal debug console cannot take keyboard input. Your program blocks forever on the first read from stdin and looks hung. Use integratedTerminal for anything that reads input.", "fix": "\"console\": \"integratedTerminal\""}, {"pattern": "\"intelliSenseMode\"\\s*:\\s*\"(msvc|gcc|clang)-(x64|x86|arm64|arm)\"", "flags": "", "message": "This is the pre-platform form of intelliSenseMode. The current values carry the platform first: windows-msvc-x64, linux-gcc-x64, macos-clang-arm64. The old value falls back to a guess and your defines and include search can differ from the real compiler."}, {"pattern": "\"cStandard\"\\s*:\\s*\"(c\\+\\+|gnu\\+\\+)", "flags": "", "message": "A C++ standard has been put in cStandard. C and C++ standards are separate keys: cStandard takes c11, c17, c23; cppStandard takes c++17, c++20, c++23. IntelliSense will parse your headers under the wrong language rules."}, {"pattern": "\"compileCommands\"\\s*:\\s*\"[^$\"]", "flags": "", "message": "compileCommands is given without ${workspaceFolder}. When the path cannot be resolved the C/C++ extension does not warn — it falls back to includePath guessing and you get red squiggles across files that compile fine. Write ${workspaceFolder}/build/compile_commands.json."}, {"pattern": "\"css\\.lint\\.unknownAtRules\"\\s*:\\s*\"(warning|error)\"", "flags": "", "message": "With this on, @tailwind and @apply are reported as unknown at-rules on every stylesheet you open, and the real CSS problems are buried in the noise. Set it to ignore.", "fix": "\"css.lint.unknownAtRules\": \"ignore\""}, {"pattern": "\"editor\\.defaultFormatter\"\\s*:\\s*\"[^\".]+\"", "flags": "", "message": "An extension id is always publisher.extension, with a dot. This value can never match an installed extension, so format-on-save does nothing at all and no message is shown. Example of the correct shape: esbenp.prettier-vscode."}, {"pattern": "\"(eslint\\.autoFixOnSave|prettier\\.eslintIntegration|prettier\\.tslintIntegration)\"", "flags": "", "message": "This setting was removed from the extension and is now read by nothing. Your files stop being fixed on save and the setting stays in the file looking correct. Use editor.codeActionsOnSave with source.fixAll.eslint instead."}, {"pattern": "\"source\\.fixAll(\\.[A-Za-z]+)?\"\\s*:\\s*(true|false)", "flags": "", "message": "The boolean form of a code action on save is deprecated. Use the string form — \"explicit\" to run only on an explicit save, \"always\" to include auto-saves, \"never\" to disable."}, {"pattern": "\"files\\.autoSave\"\\s*:\\s*\"afterDelay\"", "flags": "", "message": "afterDelay together with format-on-save reformats the file while you are still typing, which moves the cursor and can trigger a save-fix loop. onFocusChange gives the same safety without the interruption.", "fix": "\"files.autoSave\": \"onFocusChange\""}, {"pattern": "\"workbench\\.colorTheme\"\\s*:", "flags": "", "message": "A theme set in .vscode/settings.json is forced on everyone who opens this repository, overriding their own choice with no warning. Keep the theme in your User settings and put only workbench.colorCustomizations here."}, {"pattern": "\"key\"\\s*:\\s*\"cmd\\+", "flags": "i", "message": "cmd+ only binds on macOS. Teammates on Windows and Linux get no shortcut and nothing tells them why. Bind ctrl+ as well, or move the mac-only binding into your personal keybindings.json."}, {"pattern": "\"java\\.home\"\\s*:", "flags": "", "message": "java.home is deprecated. The language server now reads java.jdt.ls.java.home for its own runtime and java.configuration.runtimes for the project JDKs; this key alone leaves your MicroProfile project compiling against whatever JDK is first on PATH."}, {"pattern": "\"ASPNETCORE_ENVIRONMENT\"\\s*:\\s*\"Production\"", "flags": "", "message": "This debug configuration launches with the Production environment. The developer exception page is off, so an unhandled error shows a blank 500 instead of the stack trace, and appsettings.Production.json values are loaded on your machine. Use Development or Staging here."}];
function scan(t){var L=String(t).split(/\r?\n/),h=[],i,r,re;
 for(i=0;i<L.length;i++){for(var k=0;k<RULES.length;k++){r=RULES[k];
  try{re=new RegExp(r.pattern,r.flags||'')}catch(e){continue}
  if(re.test(L[i]))h.push({line:i+1,msg:r.message})}}
 return h}
document.getElementById('go').onclick=function(){
 var t=document.getElementById('src').value,o=document.getElementById('out');
 if(!t.trim()){o.innerHTML='';return}
 var h=scan(t);
 if(!h.length){o.innerHTML='<div class="ok">No configuration problems found in this file.</div>';return}
 var s='<table><tr><th>Line</th><th>Finding</th></tr>';
 for(var i=0;i<h.length;i++){s+='<tr><td class="n">'+h[i].line+'</td><td>'+
   String(h[i].msg).replace(/&/g,'&amp;').replace(/</g,'&lt;')+'</td></tr>'}
 o.innerHTML=s+'</table>'+'<p class="rest">'+h.length+' findings in this one file. A repository has more than one config file.</p>'+'<a class=\"buy\" href=\"https://buy.polar.sh/polar_cl_Ge5u327gSZxIxtXPvdIVqBgdNtoieIuKZKWfV1LjjLp\" data-polar-checkout data-polar-checkout-theme=\"light\">Audit the whole repository &mdash; $29 one-off, 7-day full refund</a>'};
</script>
</html>

<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 GNU Global C/C++ .vscode Config Pack 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:"gnu-global-cpp-vscode-config-pack",lang:"en",source:"rule_alert"})}).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></section>


<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://www.npmjs.com/package/@readystack/gnu-global-cpp-vscode-config-pack" rel="noopener" data-yj-install-door="npm" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'gnu-global-cpp-vscode-config-pack',src:'npm',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">npm</a><a href="https://www.npmjs.com/package/@readystack/gnu-global-cpp-vscode-config-pack" rel="noopener" data-yj-install-door="mcp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'gnu-global-cpp-vscode-config-pack',src:'mcp',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">MCP server (npx)</a><a href="https://hub.docker.com/r/getreadystack/gnu-global-cpp-vscode-config-pack" rel="noopener" data-yj-install-door="docker" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'gnu-global-cpp-vscode-config-pack',src:'docker',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">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">npx @readystack/gnu-global-cpp-vscode-config-pack &lt;file&gt;
npx @readystack/gnu-global-cpp-vscode-config-pack --mcp
docker run --rm -v &quot;$PWD:/w&quot; getreadystack/gnu-global-cpp-vscode-config-pack /w</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://buy.polar.sh/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" 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-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 complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">21 rules that read the values in a shared .vscode folder, plus 45 snippets. VS Code loads a wrong value without a word - this names the line and the fix.</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">A freelance senior software engineer in the US averages $101/hour in 2026 (contractrates.fyi; mid-level ~$73/hour). Finding one silently-ignored .vscode value by hand costs more than an hour of that.</p><a href="https://buy.polar.sh/polar_cl_Ge5u327gSZxIxtXPvdIVqBgdNtoieIuKZKWfV1LjjLp" 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 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">More from ReadyStack</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Ready-to-use files. One-time download, no subscription.</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/en/p/7-procreate-lettering-brush-recipes-that-kill-wobble-the-typ"><span class="yj-rel-t">7 Procreate Lettering Brush Recipes That Kill Wobble — The Type-These-Numbers </span><span class="yj-rel-p">$39</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/teacher-svg-bundle-cricut"><span class="yj-rel-t">Teacher &amp; School Staff SVG Bundle — 24 Classroom Sign, Tee &amp; Tumbler Cut Files</span><span class="yj-rel-p">$14.99</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/real-estate-template"><span class="yj-rel-t">Real Estate Template — 8 Filled-In Listing Pages for an Agent Site, Self-Conta</span><span class="yj-rel-p">$49</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/wedding-lut-pack"><span class="yj-rel-t">Wedding LUT and Lightroom Preset Pack – 22 Looks for Prep Rooms, Church Tungst</span><span class="yj-rel-p">$100</span></a><a class="yj-rel-c" href="https://getreadystack.com/en/p/refinance-your-car-or-keep-the-loan-17-formula-verdict-calcu"><span class="yj-rel-t">Refinance Your Car or Keep the Loan: 17-Formula Verdict Calculator</span><span class="yj-rel-p">$19</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/real-estate-icon-set"><span class="yj-rel-t">Real Estate Listing UI Kit — Property Status Badges, Amenity Chips &amp; Agent Car</span><span class="yj-rel-p">$168</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 {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[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>