[{"data":1,"prerenderedAt":1043},["ShallowReactive",2],{"blog-layout-\u002Fblog\u002Fhomelab-flux-gitops-six-months":3,"blog-\u002Fblog\u002Fhomelab-flux-gitops-six-months":641},{"id":4,"title":5,"body":6,"date":631,"description":632,"extension":633,"image":634,"meta":635,"navigation":636,"path":637,"seo":638,"stem":639,"__hash__":640},"blog\u002Fblog\u002Fhomelab-flux-gitops-six-months.md","Homelab GitOps, Six Months In: Progress is progress",{"type":7,"value":8,"toc":621},"minimark",[9,13,25,33,36,41,52,55,121,124,128,147,306,309,312,316,323,338,344,351,361,364,413,416,420,423,426,440,510,517,521,524,527,531,534,545,549,552,576,583,587,590,593,599,602,617],[10,11,12],"p",{},"Three months in, I wrote about getting a homelab cluster running — Talos Linux, Flux GitOps, SOPS secrets, a homepage dashboard that mostly worked. The honest pitch was \"things that broke, and how I'll do it again.\"",[10,14,15,16,20,21,24],{},"Six months in, the cluster is boring. That's the whole point of GitOps, supposedly, but I didn't expect to feel it. Nothing crashes in the night. Nothing needs a weekend. The interesting stories are no longer ",[17,18,19],"em",{},"things that broke"," — they're ",[17,22,23],{},"times the cluster lied to me",". Blamed the wrong component. Hid a root cause behind a plausible-looking symptom. Made me confident and wrong.",[10,26,27,28,32],{},"The best thing I built this quarter isn't a service. It's a ",[29,30,31],"code",{},"docs\u002Fsolutions\u002F"," directory that caught me being wrong, months after I wrote the wrong thing down. That's the compounding-documentation thesis from last time, but the honest version: documentation doesn't make you smart. It makes your future self slightly less dumb, on a delay.",[10,34,35],{},"Here's what changed, what stalled, and what my own notes caught me lying about.",[37,38,40],"h2",{"id":39},"the-skill-stack-grew-layers","The Skill Stack Grew Layers",[10,42,43,44,47,48,51],{},"Three months ago I had one custom skill — ",[29,45,46],{},"homelab-flux"," — and the ",[29,49,50],{},"ce:compound"," habit of writing solutions down. That was the whole agent surface. Cute, but it depended on my laptop and my memory of which doc lived where.",[10,53,54],{},"Since then the skill layer grew actual structure, and I think this is the most under-told part of running a mature homelab:",[56,57,58,81,90],"ul",{},[59,60,61,65,66,69,70,69,73,76,77,80],"li",{},[62,63,64],"strong",{},"Three official FluxCD agent skills"," — ",[29,67,68],{},"gitops-cluster-debug",", ",[29,71,72],{},"gitops-knowledge",[29,74,75],{},"gitops-repo-audit",". Added in May, vendored and hash-locked in ",[29,78,79],{},"skills-lock.json",". They travel with the repo, not the machine. If my laptop dies, the next agent that opens the repo gets the same debugging runbook I do.",[59,82,83,85,86,89],{},[29,84,46],{}," ",[62,87,88],{},"promoted in-repo."," It used to live at the user level — my machine, my problem. Now it lives inside the infra repo, so the runbook travels with the cluster state it describes. If the cluster and the runbook ever disagree, at least they're disagreeing in the same git history.",[59,91,92,85,95,85,98,101,102,69,105,69,108,69,111,69,114,69,117,120],{},[62,93,94],{},"A custom",[29,96,97],{},"crowdsec",[62,99,100],{},"skill"," — earned its own skill with a full reference tree (",[29,103,104],{},"appsec\u002F",[29,106,107],{},"configure\u002F",[29,109,110],{},"debug\u002F",[29,112,113],{},"install\u002F",[29,115,116],{},"migrate\u002F",[29,118,119],{},"operate\u002F",") because CrowdSec's scope outgrew a single solution doc and I refused to remember it all. More on that in the security section.",[10,122,123],{},"Skills are now infrastructure. An agent debugging my cluster reads the same runbook I would, applies the same \"check storage class first, then node scheduling, then Flux health\" sequence I would. This is either reassuring or a sign I've automated away my own hobby. Possibly both.",[37,125,127],{"id":126},"flux-bootstrap-flux-operator-the-migration-that-quieted-things","Flux Bootstrap → Flux Operator (the migration that quieted things)",[10,129,130,131,134,135,138,139,142,143,146],{},"In May I cut over from the Flux CLI's bootstrap flow to the Flux Operator. The old setup had ",[29,132,133],{},"gotk-sync.yaml"," — a CLI-generated ",[29,136,137],{},"GitRepository"," + ",[29,140,141],{},"Kustomization"," — holding the sync. The new setup has a ",[29,144,145],{},"flux-instance"," HelmRelease owning it:",[148,149,154],"pre",{"className":150,"code":151,"language":152,"meta":153,"style":153},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark monokai","apiVersion: helm.toolkit.fluxcd.io\u002Fv2\nkind: HelmRelease\nmetadata:\n  name: flux-instance\n  namespace: flux-system\nspec:\n  # ... chart config ...\n  values:\n    instance:\n      sync:\n        kind: GitRepository\n        url: https:\u002F\u002Fgithub.com\u002Fyour-username\u002Fhomelab-infra\n        ref:\n          branch: main\n        path: .\u002Fclusters\u002Fhomelab\n","yaml","",[29,155,156,173,184,193,204,215,223,230,238,246,254,265,276,284,295],{"__ignoreMap":153},[157,158,161,165,169],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"sHsBP","apiVersion",[157,166,168],{"class":167},"swvn1",":",[157,170,172],{"class":171},"sLACW"," helm.toolkit.fluxcd.io\u002Fv2\n",[157,174,176,179,181],{"class":159,"line":175},2,[157,177,178],{"class":163},"kind",[157,180,168],{"class":167},[157,182,183],{"class":171}," HelmRelease\n",[157,185,187,190],{"class":159,"line":186},3,[157,188,189],{"class":163},"metadata",[157,191,192],{"class":167},":\n",[157,194,196,199,201],{"class":159,"line":195},4,[157,197,198],{"class":163},"  name",[157,200,168],{"class":167},[157,202,203],{"class":171}," flux-instance\n",[157,205,207,210,212],{"class":159,"line":206},5,[157,208,209],{"class":163},"  namespace",[157,211,168],{"class":167},[157,213,214],{"class":171}," flux-system\n",[157,216,218,221],{"class":159,"line":217},6,[157,219,220],{"class":163},"spec",[157,222,192],{"class":167},[157,224,226],{"class":159,"line":225},7,[157,227,229],{"class":228},"ss7Ak","  # ... chart config ...\n",[157,231,233,236],{"class":159,"line":232},8,[157,234,235],{"class":163},"  values",[157,237,192],{"class":167},[157,239,241,244],{"class":159,"line":240},9,[157,242,243],{"class":163},"    instance",[157,245,192],{"class":167},[157,247,249,252],{"class":159,"line":248},10,[157,250,251],{"class":163},"      sync",[157,253,192],{"class":167},[157,255,257,260,262],{"class":159,"line":256},11,[157,258,259],{"class":163},"        kind",[157,261,168],{"class":167},[157,263,264],{"class":171}," GitRepository\n",[157,266,268,271,273],{"class":159,"line":267},12,[157,269,270],{"class":163},"        url",[157,272,168],{"class":167},[157,274,275],{"class":171}," https:\u002F\u002Fgithub.com\u002Fyour-username\u002Fhomelab-infra\n",[157,277,279,282],{"class":159,"line":278},13,[157,280,281],{"class":163},"        ref",[157,283,192],{"class":167},[157,285,287,290,292],{"class":159,"line":286},14,[157,288,289],{"class":163},"          branch",[157,291,168],{"class":167},[157,293,294],{"class":171}," main\n",[157,296,298,301,303],{"class":159,"line":297},15,[157,299,300],{"class":163},"        path",[157,302,168],{"class":167},[157,304,305],{"class":171}," .\u002Fclusters\u002Fhomelab\n",[10,307,308],{},"The bootstrap manifests left Git entirely. Flux now manages Flux, declaratively, in version control.",[10,310,311],{},"It's turtles all the way down, but the turtles are in a git repo, which is the only place I trust turtles. The payoff was that the Flux Web UI I described last time — the one that read slightly ahead of the bootstrap step — finally had a coherent origin story. It's operator-managed, not bootstrapped. The two sections in the old post that contradicted each other quietly resolved themselves.",[37,313,315],{"id":314},"where-my-own-notes-caught-me","Where My Own Notes Caught Me",[10,317,318,319,322],{},"Immich started crashing during thumbnail generation for iPhone video — H.264 and HEVC MOV files from Live Photos. The error was ",[29,320,321],{},"ffmpeg was killed with signal SIGSEGV",". Classic segfault. Classic hunt.",[10,324,325,326,329,330,333,334,337],{},"I blamed ",[29,327,328],{},"fluent-ffmpeg",". Plausible! The fault surfaced in the Node.js process — the fluent-ffmpeg wrapper — and direct ",[29,331,332],{},"ffmpeg"," commands worked fine when I ran them by hand. The timing even lined up: the crash happened during the cleanup phase, after frames were successfully processed. That ",[17,335,336],{},"smells"," like a wrapper lifecycle bug. I wrote it up, documented the diagnosis, moved on.",[10,339,340,341,343],{},"I was wrong. The ",[29,342,31],{}," directory caught it months later during a refresh pass.",[10,345,346,347,350],{},"The actual cause: the Mac Mini is an older Ivy Bridge box — 3rd-gen Intel, HD Graphics 4000 — with no VAAPI, CUDA, or Vulkan support. ffmpeg tries to initialize hardware acceleration during processing. On a CPU that has no accel surface, that initialization fails. And because ffmpeg is a gentleman about it, the fault doesn't surface until ",[17,348,349],{},"after"," it's done the useful work — during cleanup, out of spite.",[10,352,353,354,356,357,360],{},"The reason I was misled: the direct ",[29,355,332],{}," commands I tested ",[17,358,359],{},"implicitly disabled"," hardware acceleration, so they worked. The Immich pipeline enabled it, so it crashed. Same binary, different default, opposite conclusion. My test was rigged to confirm my hypothesis.",[10,362,363],{},"The fix is one environment variable:",[148,365,367],{"className":150,"code":366,"language":152,"meta":153,"style":153},"env:\n  FFMPEG_HWACCEL: \"false\"   # software-only on Ivy Bridge; the honest mode\n  FFMPEG_WORKERS: \"1\"        # secondary mitigation\n",[29,368,369,376,396],{"__ignoreMap":153},[157,370,371,374],{"class":159,"line":160},[157,372,373],{"class":163},"env",[157,375,192],{"class":167},[157,377,378,381,383,387,390,393],{"class":159,"line":175},[157,379,380],{"class":163},"  FFMPEG_HWACCEL",[157,382,168],{"class":167},[157,384,386],{"class":385},"siCPE"," \"",[157,388,389],{"class":171},"false",[157,391,392],{"class":385},"\"",[157,394,395],{"class":228},"   # software-only on Ivy Bridge; the honest mode\n",[157,397,398,401,403,405,408,410],{"class":159,"line":186},[157,399,400],{"class":163},"  FFMPEG_WORKERS",[157,402,168],{"class":167},[157,404,386],{"class":385},[157,406,407],{"class":171},"1",[157,409,392],{"class":385},[157,411,412],{"class":228},"        # secondary mitigation\n",[10,414,415],{},"The lesson isn't \"check your CPU's acceleration support before enabling transcoding\" — though, yes, obviously, that. Haswell (4th gen) and newer are fine; Ivy Bridge and earlier need software-only. The lesson is that my own solution doc carried the wrong diagnosis for months, and the compounding-docs discipline caught it on a re-read, not at the time of writing. I'd rather have documentation that admits it was wrong than documentation that was never wrong because I never wrote it down.",[37,417,419],{"id":418},"improving-security-posture","Improving Security Posture",[10,421,422],{},"Three months ago, CrowdSec was an edge bouncer: blocked bad IPs, sat in front of Traefik, ran its LAPI. Fine. Since then it started ingesting Talos node logs too — cluster-wide acquisition, not just edge traffic — and the scope quietly outgrew a single solution doc. That's why it got its own skill with a reference tree. When the security surface grows, the skill surface follows.",[10,424,425],{},"The other thing that happened: I found plaintext credentials in the docs.",[10,427,428,429,432,433,168],{},"Not in the cluster — the cluster uses SOPS\u002FAge, secrets are encrypted, that was always fine. But the ",[17,430,431],{},"documentation"," of how I'd set things up, written back when I was figuring it out, had real tokens in the examples. In the repo. In git history. Which meant I got to spend an afternoon with ",[434,435,439],"a",{"href":436,"rel":437},"https:\u002F\u002Frtyley.github.io\u002Fbfg-repo-cleaner\u002F",[438],"nofollow","BFG Repo-Cleaner",[148,441,445],{"className":442,"code":443,"language":444,"meta":153,"style":153},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","# the day I made my past disappear, for legal reasons\nbfg --replace-text passwords.txt homelab-infra.git\ngit reflog expire --expire=now --all && git gc --prune=now --aggressive\ngit push --force\n","bash",[29,446,447,452,468,500],{"__ignoreMap":153},[157,448,449],{"class":159,"line":160},[157,450,451],{"class":228},"# the day I made my past disappear, for legal reasons\n",[157,453,454,458,462,465],{"class":159,"line":175},[157,455,457],{"class":456},"sR7ES","bfg",[157,459,461],{"class":460},"sFhLe"," --replace-text",[157,463,464],{"class":171}," passwords.txt",[157,466,467],{"class":171}," homelab-infra.git\n",[157,469,470,473,476,479,482,485,488,491,494,497],{"class":159,"line":186},[157,471,472],{"class":456},"git",[157,474,475],{"class":171}," reflog",[157,477,478],{"class":171}," expire",[157,480,481],{"class":460}," --expire=now",[157,483,484],{"class":460}," --all",[157,486,487],{"class":167}," &&",[157,489,490],{"class":456}," git",[157,492,493],{"class":171}," gc",[157,495,496],{"class":460}," --prune=now",[157,498,499],{"class":460}," --aggressive\n",[157,501,502,504,507],{"class":159,"line":195},[157,503,472],{"class":456},[157,505,506],{"class":171}," push",[157,508,509],{"class":460}," --force\n",[10,511,512,513,516],{},"Documentation hygiene as lived practice, not theory: the lesson is that you write the creds down ",[17,514,515],{},"once"," while debugging, and then they live in your history forever until you surgically remove them. Better to redact at write time. I now redact at write time.",[37,518,520],{"id":519},"running-my-own-apps","Running My Own Apps",[10,522,523],{},"Three months ago the cluster hosted other people's Helm charts — Immich, Plex, Grafana, CrowdSec, Traefik. That's still most of it. But this quarter I started shipping my own images through the same reconciliation loop: a small AI playlist generator for Plex, and a job-search tracker. Both behind Traefik. Both reconciled by Flux like everything else.",[10,525,526],{},"The shift is small but real. Hosting off-the-shelf software teaches you operations. Shipping your own images into the same loop teaches you the whole pipeline — build, tag, push, reconcile, break, fix, reconcile again. The cluster doesn't care that the image is mine. It just applies the manifest. Which is, I think, the highest compliment I can pay GitOps: my own software is treated with exactly the same indifference as everyone else's.",[37,528,530],{"id":529},"major-upgrades-under-gitops-immich-v2-v3","Major Upgrades Under GitOps: Immich v2 → v3",[10,532,533],{},"The Immich v2 → v3 upgrade would've been a sweaty afternoon on a manual cluster. Under Flux it was a commit. Something broke; I reverted the commit; it un-broke. I re-tried with a config tweak; it stuck.",[10,535,536,537,540,541,544],{},"One thread tied back to the ffmpeg saga: Immich's ",[29,538,539],{},"FFMPEG_*"," environment variables aren't officially supported, so the ",[29,542,543],{},"FFMPEG_HWACCEL=false"," fix from above is a \"works, but don't call us\" kind of deal. It survived the v3 upgrade, which I was not confident about and am now.",[37,546,548],{"id":547},"what-stalled-the-honest-beat","What Stalled (the Honest Beat)",[10,550,551],{},"The original post had a \"What's Next\" list. Let me be honest about it:",[56,553,554,564,570],{},[59,555,556,559,560,563],{},[62,557,558],{},"Gitea Actions CI with in-cluster runners"," — actually shipped. Quietly. An ",[29,561,562],{},"act_runner"," deployment with DinD, living in the cluster it tests. It builds and pushes the images for the self-hosted apps (the playlist generator, the job-search tracker) through the same reconciliation loop as everything else. The blog itself publishes separately via GitHub Actions.",[59,565,566,569],{},[62,567,568],{},"Second node for HA"," — not shipped. The Mac Mini hasn't died, so the urgency is theoretical.",[59,571,572,575],{},[62,573,574],{},"Better Alertmanager rules"," — I'll get to it. Probably. Eventually.",[10,577,578,579,582],{},"The mature homelab is mostly about what you choose ",[17,580,581],{},"not"," to do. I chose not to do quite a lot this quarter, and the cluster kept running anyway, which is either a win or an indictment of my ambitions.",[37,584,586],{"id":585},"what-the-next-six-months-look-like","What the Next Six Months Look Like",[10,588,589],{},"The deferred items above are still the list, reframed as decisions rather than TODOs. Second-node HA is the next one I'll actually pick up — the Mac Mini hasn't earned its keep by failing yet, but the redundancy is the last piece between \"homelab\" and \"homelab I'd show people without caveat.\"",[10,591,592],{},"But the highest-leverage thing I can invest in is the skill layer. Not because skills are glamorous — they're the opposite of glamorous — but because I'm running out of things I personally want to debug twice. Every problem I've solved twice now has a doc. Every doc that got a diagnosis wrong now has a correction. The skill stack means the next agent — or the next me, after a machine swap, or a long pause, or a few beers — starts from the corrected version, not from zero.",[10,594,595,596,598],{},"Three months in, I thought the cluster was the project. Six months in, the cluster is fine. The ",[29,597,31],{}," directory is the project. The cluster just pays rent.",[600,601],"hr",{},[10,603,604],{},[17,605,606,607,611,612,616],{},"Starts here: ",[434,608,610],{"href":609},"\u002Fblog\u002Fhomelab-flux-gitops-journey","Building a Homelab with Flux GitOps: Some lessons, three months in",". For the AI-assisted side, see ",[434,613,615],{"href":614},"\u002Fblog\u002Fknowledge-graph-obsidian-mcp","Building a Knowledge Graph with Obsidian and MCP",".",[618,619,620],"style",{},"html pre.shiki code .sHsBP, html code.shiki .sHsBP{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D;--shiki-sepia:#F92672}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sFhLe, html code.shiki .sFhLe{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":153,"searchDepth":175,"depth":175,"links":622},[623,624,625,626,627,628,629,630],{"id":39,"depth":175,"text":40},{"id":126,"depth":175,"text":127},{"id":314,"depth":175,"text":315},{"id":418,"depth":175,"text":419},{"id":519,"depth":175,"text":520},{"id":529,"depth":175,"text":530},{"id":547,"depth":175,"text":548},{"id":585,"depth":175,"text":586},"2026-07-27","Six months into the Flux\u002FTalos homelab. Self-hosted apps are now just a prompt away.","md",null,{},true,"\u002Fblog\u002Fhomelab-flux-gitops-six-months",{"title":5,"description":632},"blog\u002Fhomelab-flux-gitops-six-months","EM2ka1Vv2_II1gNMkM4r8BFrzWRSEcqeiiSW-oHJUUw",{"id":4,"title":5,"body":642,"date":631,"description":632,"extension":633,"image":634,"meta":1041,"navigation":636,"path":637,"seo":1042,"stem":639,"__hash__":640},{"type":7,"value":643,"toc":1031},[644,646,652,656,658,660,666,668,708,710,712,722,830,832,834,836,840,848,852,856,862,864,902,904,906,908,910,917,965,969,971,973,975,977,979,985,987,989,1005,1009,1011,1013,1015,1019,1021,1029],[10,645,12],{},[10,647,15,648,20,650,24],{},[17,649,19],{},[17,651,23],{},[10,653,27,654,32],{},[29,655,31],{},[10,657,35],{},[37,659,40],{"id":39},[10,661,43,662,47,664,51],{},[29,663,46],{},[29,665,50],{},[10,667,54],{},[56,669,670,682,688],{},[59,671,672,65,674,69,676,69,678,76,680,80],{},[62,673,64],{},[29,675,68],{},[29,677,72],{},[29,679,75],{},[29,681,79],{},[59,683,684,85,686,89],{},[29,685,46],{},[62,687,88],{},[59,689,690,85,692,85,694,101,696,69,698,69,700,69,702,69,704,69,706,120],{},[62,691,94],{},[29,693,97],{},[62,695,100],{},[29,697,104],{},[29,699,107],{},[29,701,110],{},[29,703,113],{},[29,705,116],{},[29,707,119],{},[10,709,123],{},[37,711,127],{"id":126},[10,713,130,714,134,716,138,718,142,720,146],{},[29,715,133],{},[29,717,137],{},[29,719,141],{},[29,721,145],{},[148,723,724],{"className":150,"code":151,"language":152,"meta":153,"style":153},[29,725,726,734,742,748,756,764,770,774,780,786,792,800,808,814,822],{"__ignoreMap":153},[157,727,728,730,732],{"class":159,"line":160},[157,729,164],{"class":163},[157,731,168],{"class":167},[157,733,172],{"class":171},[157,735,736,738,740],{"class":159,"line":175},[157,737,178],{"class":163},[157,739,168],{"class":167},[157,741,183],{"class":171},[157,743,744,746],{"class":159,"line":186},[157,745,189],{"class":163},[157,747,192],{"class":167},[157,749,750,752,754],{"class":159,"line":195},[157,751,198],{"class":163},[157,753,168],{"class":167},[157,755,203],{"class":171},[157,757,758,760,762],{"class":159,"line":206},[157,759,209],{"class":163},[157,761,168],{"class":167},[157,763,214],{"class":171},[157,765,766,768],{"class":159,"line":217},[157,767,220],{"class":163},[157,769,192],{"class":167},[157,771,772],{"class":159,"line":225},[157,773,229],{"class":228},[157,775,776,778],{"class":159,"line":232},[157,777,235],{"class":163},[157,779,192],{"class":167},[157,781,782,784],{"class":159,"line":240},[157,783,243],{"class":163},[157,785,192],{"class":167},[157,787,788,790],{"class":159,"line":248},[157,789,251],{"class":163},[157,791,192],{"class":167},[157,793,794,796,798],{"class":159,"line":256},[157,795,259],{"class":163},[157,797,168],{"class":167},[157,799,264],{"class":171},[157,801,802,804,806],{"class":159,"line":267},[157,803,270],{"class":163},[157,805,168],{"class":167},[157,807,275],{"class":171},[157,809,810,812],{"class":159,"line":278},[157,811,281],{"class":163},[157,813,192],{"class":167},[157,815,816,818,820],{"class":159,"line":286},[157,817,289],{"class":163},[157,819,168],{"class":167},[157,821,294],{"class":171},[157,823,824,826,828],{"class":159,"line":297},[157,825,300],{"class":163},[157,827,168],{"class":167},[157,829,305],{"class":171},[10,831,308],{},[10,833,311],{},[37,835,315],{"id":314},[10,837,318,838,322],{},[29,839,321],{},[10,841,325,842,329,844,333,846,337],{},[29,843,328],{},[29,845,332],{},[17,847,336],{},[10,849,340,850,343],{},[29,851,31],{},[10,853,346,854,350],{},[17,855,349],{},[10,857,353,858,356,860,360],{},[29,859,332],{},[17,861,359],{},[10,863,363],{},[148,865,866],{"className":150,"code":366,"language":152,"meta":153,"style":153},[29,867,868,874,888],{"__ignoreMap":153},[157,869,870,872],{"class":159,"line":160},[157,871,373],{"class":163},[157,873,192],{"class":167},[157,875,876,878,880,882,884,886],{"class":159,"line":175},[157,877,380],{"class":163},[157,879,168],{"class":167},[157,881,386],{"class":385},[157,883,389],{"class":171},[157,885,392],{"class":385},[157,887,395],{"class":228},[157,889,890,892,894,896,898,900],{"class":159,"line":186},[157,891,400],{"class":163},[157,893,168],{"class":167},[157,895,386],{"class":385},[157,897,407],{"class":171},[157,899,392],{"class":385},[157,901,412],{"class":228},[10,903,415],{},[37,905,419],{"id":418},[10,907,422],{},[10,909,425],{},[10,911,428,912,432,914,168],{},[17,913,431],{},[434,915,439],{"href":436,"rel":916},[438],[148,918,919],{"className":442,"code":443,"language":444,"meta":153,"style":153},[29,920,921,925,935,957],{"__ignoreMap":153},[157,922,923],{"class":159,"line":160},[157,924,451],{"class":228},[157,926,927,929,931,933],{"class":159,"line":175},[157,928,457],{"class":456},[157,930,461],{"class":460},[157,932,464],{"class":171},[157,934,467],{"class":171},[157,936,937,939,941,943,945,947,949,951,953,955],{"class":159,"line":186},[157,938,472],{"class":456},[157,940,475],{"class":171},[157,942,478],{"class":171},[157,944,481],{"class":460},[157,946,484],{"class":460},[157,948,487],{"class":167},[157,950,490],{"class":456},[157,952,493],{"class":171},[157,954,496],{"class":460},[157,956,499],{"class":460},[157,958,959,961,963],{"class":159,"line":195},[157,960,472],{"class":456},[157,962,506],{"class":171},[157,964,509],{"class":460},[10,966,512,967,516],{},[17,968,515],{},[37,970,520],{"id":519},[10,972,523],{},[10,974,526],{},[37,976,530],{"id":529},[10,978,533],{},[10,980,536,981,540,983,544],{},[29,982,539],{},[29,984,543],{},[37,986,548],{"id":547},[10,988,551],{},[56,990,991,997,1001],{},[59,992,993,559,995,563],{},[62,994,558],{},[29,996,562],{},[59,998,999,569],{},[62,1000,568],{},[59,1002,1003,575],{},[62,1004,574],{},[10,1006,578,1007,582],{},[17,1008,581],{},[37,1010,586],{"id":585},[10,1012,589],{},[10,1014,592],{},[10,1016,595,1017,598],{},[29,1018,31],{},[600,1020],{},[10,1022,1023],{},[17,1024,606,1025,611,1027,616],{},[434,1026,610],{"href":609},[434,1028,615],{"href":614},[618,1030,620],{},{"title":153,"searchDepth":175,"depth":175,"links":1032},[1033,1034,1035,1036,1037,1038,1039,1040],{"id":39,"depth":175,"text":40},{"id":126,"depth":175,"text":127},{"id":314,"depth":175,"text":315},{"id":418,"depth":175,"text":419},{"id":519,"depth":175,"text":520},{"id":529,"depth":175,"text":530},{"id":547,"depth":175,"text":548},{"id":585,"depth":175,"text":586},{},{"title":5,"description":632},1785179421736]