[{"data":1,"prerenderedAt":719},["ShallowReactive",2],{"learn-doc-\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002Fstrategies":3,"learn-doc-topic-\u002Flearn\u002Fen\u002Fcourses\u002Fcaching":239,"lessons-\u002Flearn\u002Fen\u002Fcourses\u002Fcaching":273,"sidebar-course-\u002Flearn\u002Fen\u002Fcourses\u002Fcaching":662,"i-lucide:chevron-down":674,"i-lucide:search":678,"i-lucide:sun":680,"i-lucide:moon":682,"i-lucide:menu":684,"i-lucide:panel-left":686,"i-lucide:chevron-right":688,"i-lucide:arrow-right":690,"i-lucide:corner-down-right":692,"i-lucide:mail":694,"i-simple-icons:x":696,"i-simple-icons:linkedin":698,"i-simple-icons:dribbble":700,"i-simple-icons:github":702,"i-lucide:eye":704,"sidebar-quiz-\u002Flearn\u002Fen\u002Fcourses\u002Fcaching":706,"i-lucide:layers":707,"i-lucide:lock":709,"i-lucide:printer":711,"i-lucide:graduation-cap":713,"i-lucide:book-marked":715,"i-lucide:notebook-pen":717},{"id":4,"title":5,"access":6,"body":7,"description":230,"extension":231,"lang":232,"meta":233,"navigation":234,"order":40,"partial":234,"path":235,"seo":236,"stem":237,"__hash__":238},"lessons\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002F01.strategies.md","The four strategies","free",{"type":8,"value":9,"toc":224},"minimark",[10,14,18,23,26,181,184,188,191,194,198,201,204,208,211,214,220],[11,12,5],"h1",{"id":13},"the-four-strategies",[15,16,17],"p",{},"Every caching pattern answers two questions: who populates the cache, and when is\nthe source of truth updated relative to it.",[19,20,22],"h2",{"id":21},"cache-aside","Cache-aside",[15,24,25],{},"The application checks the cache, and on a miss reads the database and populates\nthe cache itself. The cache has no knowledge of the database.",[27,28,33],"pre",{"className":29,"code":30,"language":31,"meta":32,"style":32},"language-python shiki shiki-themes github-dark-dimmed github-dark-dimmed","def get_user(user_id):\n    cached = cache.get(f\"user:{user_id}\")\n    if cached is not None:\n        return cached\n    user = db.query(\"SELECT * FROM users WHERE id = %s\", user_id)\n    cache.set(f\"user:{user_id}\", user, ttl=300)\n    return user\n","python","",[34,35,36,53,87,109,118,140,172],"code",{"__ignoreMap":32},[37,38,41,45,49],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sEYkB","def",[37,46,48],{"class":47},"s-wk_"," get_user",[37,50,52],{"class":51},"sM9_K","(user_id):\n",[37,54,56,59,62,65,68,72,75,78,81,84],{"class":39,"line":55},2,[37,57,58],{"class":51},"    cached ",[37,60,61],{"class":43},"=",[37,63,64],{"class":51}," cache.get(",[37,66,67],{"class":43},"f",[37,69,71],{"class":70},"szYpP","\"user:",[37,73,74],{"class":43},"{",[37,76,77],{"class":51},"user_id",[37,79,80],{"class":43},"}",[37,82,83],{"class":70},"\"",[37,85,86],{"class":51},")\n",[37,88,90,93,96,99,102,106],{"class":39,"line":89},3,[37,91,92],{"class":43},"    if",[37,94,95],{"class":51}," cached ",[37,97,98],{"class":43},"is",[37,100,101],{"class":43}," not",[37,103,105],{"class":104},"sQdni"," None",[37,107,108],{"class":51},":\n",[37,110,112,115],{"class":39,"line":111},4,[37,113,114],{"class":43},"        return",[37,116,117],{"class":51}," cached\n",[37,119,121,124,126,129,132,135,137],{"class":39,"line":120},5,[37,122,123],{"class":51},"    user ",[37,125,61],{"class":43},[37,127,128],{"class":51}," db.query(",[37,130,131],{"class":70},"\"SELECT * FROM users WHERE id = ",[37,133,134],{"class":43},"%s",[37,136,83],{"class":70},[37,138,139],{"class":51},", user_id)\n",[37,141,143,146,148,150,152,154,156,158,161,165,167,170],{"class":39,"line":142},6,[37,144,145],{"class":51},"    cache.set(",[37,147,67],{"class":43},[37,149,71],{"class":70},[37,151,74],{"class":43},[37,153,77],{"class":51},[37,155,80],{"class":43},[37,157,83],{"class":70},[37,159,160],{"class":51},", user, ",[37,162,164],{"class":163},"siJwO","ttl",[37,166,61],{"class":43},[37,168,169],{"class":104},"300",[37,171,86],{"class":51},[37,173,175,178],{"class":39,"line":174},7,[37,176,177],{"class":43},"    return",[37,179,180],{"class":51}," user\n",[15,182,183],{},"This is the default for a reason: if the cache is down, every request simply\nbecomes a database read. Degraded, not broken.",[19,185,187],{"id":186},"read-through","Read-through",[15,189,190],{},"The cache sits inline. The application only talks to the cache, which fetches from\nthe database on a miss. Logic moves out of the application and into the cache layer.",[15,192,193],{},"Cleaner call sites, but the cache is now on the critical path — if it is unavailable,\nreads fail entirely rather than falling back.",[19,195,197],{"id":196},"write-through","Write-through",[15,199,200],{},"Writes go to the cache, which synchronously writes to the database before\nacknowledging. The cache is never stale.",[15,202,203],{},"The cost is write latency: every write pays for both hops. Worth it when reads\nvastly outnumber writes and stale reads are unacceptable.",[19,205,207],{"id":206},"write-behind","Write-behind",[15,209,210],{},"Writes land in the cache and are flushed to the database asynchronously.",[15,212,213],{},"Fastest writes available, and the only strategy that can lose acknowledged data. A\ncrash between acknowledgement and flush loses whatever was buffered.",[215,216,217],"warning",{},[15,218,219],{},"Write-behind is appropriate for metrics, view counts and analytics events. It is not\nappropriate for anything a user would notice going missing — orders, payments,\nmessages. The performance gain is real, and so is the data loss.",[221,222,223],"style",{},"html pre.shiki code .sEYkB, html code.shiki .sEYkB{--shiki-default:#F47067;--shiki-dark:#F47067}html pre.shiki code .s-wk_, html code.shiki .s-wk_{--shiki-default:#DCBDFB;--shiki-dark:#DCBDFB}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html pre.shiki code .siJwO, html code.shiki .siJwO{--shiki-default:#F69D50;--shiki-dark:#F69D50}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);}",{"title":32,"searchDepth":89,"depth":89,"links":225},[226,227,228,229],{"id":21,"depth":55,"text":22},{"id":186,"depth":55,"text":187},{"id":196,"depth":55,"text":197},{"id":206,"depth":55,"text":207},"Cache-aside, read-through, write-through and write-behind compared.","md","en",{},true,"\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002Fstrategies",{"title":5,"description":230},"learn\u002Fen\u002Fcourses\u002Fcaching\u002F01.strategies","sh2NUIv6r7JjhJWD_OzLrfaRSj7urg2L7nJtqWFgm04",{"id":240,"title":241,"access":242,"body":243,"description":247,"draft":248,"estimatedMinutes":249,"extension":231,"featured":248,"icon":250,"lang":232,"level":251,"meta":252,"navigation":234,"order":40,"path":253,"prerequisites":254,"resources":255,"seo":261,"sku":259,"stem":262,"subjects":263,"summary":265,"tags":266,"updated":271,"__hash__":272},"courses\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002Findex.md","Caching strategies","premium",{"type":8,"value":244,"toc":245},[],{"title":32,"searchDepth":89,"depth":89,"links":246},[],"Read-through, write-behind, invalidation and the failure modes each one buys.",false,40,"lucide:layers","advanced",{},"\u002Flearn\u002Fen\u002Fcourses\u002Fcaching",[],[256],{"label":257,"file":258,"access":242,"sku":259,"size":260},"Caching decision matrix","caching-decision-matrix.pdf","topic-caching-strategies","310 KB",{"title":241,"description":247},"learn\u002Fen\u002Fcourses\u002Fcaching\u002Findex",[264],"system-design","A cache is a bet that reading stale data is cheaper than reading correct data.\nThe strategies differ in who writes to the cache, when, and what happens when\nthe cache and the source disagree. Cache-aside is the default because it fails\nsafely. Write-behind is the fastest and loses data on a crash. Almost every\nproduction incident involving a cache comes down to invalidation, stampedes, or\na cache that was quietly doing nothing at all.\n",[267,268,269,270],"caching","performance","consistency","redis","2026-08-06","mqYWifp5mzccLyzSY681N-Yn1wymognvHpRRfhOtFBI",[274,421],{"id":4,"title":5,"access":6,"body":275,"description":230,"extension":231,"lang":232,"meta":419,"navigation":234,"order":40,"partial":234,"path":235,"seo":420,"stem":237,"__hash__":238},{"type":8,"value":276,"toc":413},[277,279,281,283,285,387,389,391,393,395,397,399,401,403,405,407,411],[11,278,5],{"id":13},[15,280,17],{},[19,282,22],{"id":21},[15,284,25],{},[27,286,287],{"className":29,"code":30,"language":31,"meta":32,"style":32},[34,288,289,297,319,333,339,355,381],{"__ignoreMap":32},[37,290,291,293,295],{"class":39,"line":40},[37,292,44],{"class":43},[37,294,48],{"class":47},[37,296,52],{"class":51},[37,298,299,301,303,305,307,309,311,313,315,317],{"class":39,"line":55},[37,300,58],{"class":51},[37,302,61],{"class":43},[37,304,64],{"class":51},[37,306,67],{"class":43},[37,308,71],{"class":70},[37,310,74],{"class":43},[37,312,77],{"class":51},[37,314,80],{"class":43},[37,316,83],{"class":70},[37,318,86],{"class":51},[37,320,321,323,325,327,329,331],{"class":39,"line":89},[37,322,92],{"class":43},[37,324,95],{"class":51},[37,326,98],{"class":43},[37,328,101],{"class":43},[37,330,105],{"class":104},[37,332,108],{"class":51},[37,334,335,337],{"class":39,"line":111},[37,336,114],{"class":43},[37,338,117],{"class":51},[37,340,341,343,345,347,349,351,353],{"class":39,"line":120},[37,342,123],{"class":51},[37,344,61],{"class":43},[37,346,128],{"class":51},[37,348,131],{"class":70},[37,350,134],{"class":43},[37,352,83],{"class":70},[37,354,139],{"class":51},[37,356,357,359,361,363,365,367,369,371,373,375,377,379],{"class":39,"line":142},[37,358,145],{"class":51},[37,360,67],{"class":43},[37,362,71],{"class":70},[37,364,74],{"class":43},[37,366,77],{"class":51},[37,368,80],{"class":43},[37,370,83],{"class":70},[37,372,160],{"class":51},[37,374,164],{"class":163},[37,376,61],{"class":43},[37,378,169],{"class":104},[37,380,86],{"class":51},[37,382,383,385],{"class":39,"line":174},[37,384,177],{"class":43},[37,386,180],{"class":51},[15,388,183],{},[19,390,187],{"id":186},[15,392,190],{},[15,394,193],{},[19,396,197],{"id":196},[15,398,200],{},[15,400,203],{},[19,402,207],{"id":206},[15,404,210],{},[15,406,213],{},[215,408,409],{},[15,410,219],{},[221,412,223],{},{"title":32,"searchDepth":89,"depth":89,"links":414},[415,416,417,418],{"id":21,"depth":55,"text":22},{"id":186,"depth":55,"text":187},{"id":196,"depth":55,"text":197},{"id":206,"depth":55,"text":207},{},{"title":5,"description":230},{"id":422,"title":423,"access":242,"body":424,"description":656,"extension":231,"lang":232,"meta":657,"navigation":234,"order":55,"partial":248,"path":658,"seo":659,"stem":660,"__hash__":661},"lessons\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002F02.invalidation.md","Invalidation and stampedes",{"type":8,"value":425,"toc":650},[426,429,432,436,439,443,446,449,452,459,465,534,540,546,550,553,592,595,598,602,605,644,647],[11,427,423],{"id":428},"invalidation-and-stampedes",[15,430,431],{},"Caching is easy. Knowing when the cached value stopped being true is the hard part.",[19,433,435],{"id":434},"ttl-is-a-guess-about-staleness","TTL is a guess about staleness",[15,437,438],{},"A TTL says \"I accept being wrong for up to this long\". Choosing one means deciding\nhow much staleness the product tolerates — a question for the product, not the\ninfrastructure.",[19,440,442],{"id":441},"the-thundering-herd","The thundering herd",[15,444,445],{},"A popular key expires. A thousand concurrent requests miss simultaneously. All\nthousand hit the database with the same query.",[15,447,448],{},"The database, sized for the cached load, falls over. Recovery repopulates the cache,\nthe key expires again, and the pattern repeats on a cycle matching the TTL.",[15,450,451],{},"Three defences:",[15,453,454,458],{},[455,456,457],"strong",{},"Locking."," The first miss takes a lock and recomputes; everyone else waits or\nserves stale. Correct, but adds a coordination point.",[15,460,461,464],{},[455,462,463],{},"Probabilistic early expiry."," Recompute before expiry with a probability that\nrises as the TTL approaches, so refreshes spread out instead of synchronising.",[27,466,468],{"className":29,"code":467,"language":31,"meta":32,"style":32},"def should_refresh(computed_at, ttl, beta=1.0):\n    age = now() - computed_at\n    return age + beta * delta * math.log(random.random()) >= ttl\n",[34,469,470,488,504],{"__ignoreMap":32},[37,471,472,474,477,480,482,485],{"class":39,"line":40},[37,473,44],{"class":43},[37,475,476],{"class":47}," should_refresh",[37,478,479],{"class":51},"(computed_at, ttl, beta",[37,481,61],{"class":43},[37,483,484],{"class":104},"1.0",[37,486,487],{"class":51},"):\n",[37,489,490,493,495,498,501],{"class":39,"line":55},[37,491,492],{"class":51},"    age ",[37,494,61],{"class":43},[37,496,497],{"class":51}," now() ",[37,499,500],{"class":43},"-",[37,502,503],{"class":51}," computed_at\n",[37,505,506,508,511,514,517,520,523,525,528,531],{"class":39,"line":89},[37,507,177],{"class":43},[37,509,510],{"class":51}," age ",[37,512,513],{"class":43},"+",[37,515,516],{"class":51}," beta ",[37,518,519],{"class":43},"*",[37,521,522],{"class":51}," delta ",[37,524,519],{"class":43},[37,526,527],{"class":51}," math.log(random.random()) ",[37,529,530],{"class":43},">=",[37,532,533],{"class":51}," ttl\n",[15,535,536,539],{},[455,537,538],{},"Jitter."," Add randomness to every TTL so keys written together do not expire\ntogether. The cheapest fix and often sufficient.",[541,542,543],"danger",{},[15,544,545],{},"Populating a cache during a deploy or a warm-up script writes thousands of keys\nwithin the same second. With a fixed TTL they all expire within the same second too,\nproducing a synchronised stampede hours later that looks completely unrelated to\nthe deploy that caused it. Always jitter.",[19,547,549],{"id":548},"explicit-invalidation","Explicit invalidation",[15,551,552],{},"Delete the key on write:",[27,554,556],{"className":29,"code":555,"language":31,"meta":32,"style":32},"def update_user(user_id, data):\n    db.update(user_id, data)\n    cache.delete(f\"user:{user_id}\")\n",[34,557,558,568,573],{"__ignoreMap":32},[37,559,560,562,565],{"class":39,"line":40},[37,561,44],{"class":43},[37,563,564],{"class":47}," update_user",[37,566,567],{"class":51},"(user_id, data):\n",[37,569,570],{"class":39,"line":55},[37,571,572],{"class":51},"    db.update(user_id, data)\n",[37,574,575,578,580,582,584,586,588,590],{"class":39,"line":89},[37,576,577],{"class":51},"    cache.delete(",[37,579,67],{"class":43},[37,581,71],{"class":70},[37,583,74],{"class":43},[37,585,77],{"class":51},[37,587,80],{"class":43},[37,589,83],{"class":70},[37,591,86],{"class":51},[15,593,594],{},"Delete rather than overwrite. Overwriting introduces a race where two concurrent\nwriters leave the cache holding the older value.",[15,596,597],{},"The ordering matters too — database first, then cache. Reversed, a concurrent read\nbetween the two steps repopulates the cache with the old row and the stale value\nsurvives its TTL.",[19,599,601],{"id":600},"cached-nothing","Cached nothing",[15,603,604],{},"The failure mode nobody instruments: a cache that works perfectly and is never hit,\nbecause keys are built from something that varies per request.",[27,606,608],{"className":29,"code":607,"language":31,"meta":32,"style":32},"cache.set(f\"user:{user_id}:{request_id}\", user)  # unique every time\n",[34,609,610],{"__ignoreMap":32},[37,611,612,615,617,619,621,623,625,628,630,633,635,637,640],{"class":39,"line":40},[37,613,614],{"class":51},"cache.set(",[37,616,67],{"class":43},[37,618,71],{"class":70},[37,620,74],{"class":43},[37,622,77],{"class":51},[37,624,80],{"class":43},[37,626,627],{"class":70},":",[37,629,74],{"class":43},[37,631,632],{"class":51},"request_id",[37,634,80],{"class":43},[37,636,83],{"class":70},[37,638,639],{"class":51},", user)  ",[37,641,643],{"class":642},"s0RzX","# unique every time\n",[15,645,646],{},"Hit rate is zero. Latency is unchanged. Nothing errors. Monitor hit rate as a first\nclass metric, and alert when it drops — a cache silently doing nothing is a cost with\nno benefit.",[221,648,649],{},"html pre.shiki code .sEYkB, html code.shiki .sEYkB{--shiki-default:#F47067;--shiki-dark:#F47067}html pre.shiki code .s-wk_, html code.shiki .s-wk_{--shiki-default:#DCBDFB;--shiki-dark:#DCBDFB}html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}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 pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .s0RzX, html code.shiki .s0RzX{--shiki-default:#768390;--shiki-dark:#768390}",{"title":32,"searchDepth":89,"depth":89,"links":651},[652,653,654,655],{"id":434,"depth":55,"text":435},{"id":441,"depth":55,"text":442},{"id":548,"depth":55,"text":549},{"id":600,"depth":55,"text":601},"TTLs, explicit invalidation, and what happens when a hot key expires.",{},"\u002Flearn\u002Fen\u002Fcourses\u002Fcaching\u002Finvalidation",{"title":423,"description":656},"learn\u002Fen\u002Fcourses\u002Fcaching\u002F02.invalidation","fahMLdo2hiDD5K_BQHGZCeYMOkIquLGdRIDAy0WkguI",{"id":240,"title":241,"access":242,"body":663,"description":247,"draft":248,"estimatedMinutes":249,"extension":231,"featured":248,"icon":250,"lang":232,"level":251,"meta":667,"navigation":234,"order":40,"path":253,"prerequisites":668,"resources":669,"seo":671,"sku":259,"stem":262,"subjects":672,"summary":265,"tags":673,"updated":271,"__hash__":272},{"type":8,"value":664,"toc":665},[],{"title":32,"searchDepth":89,"depth":89,"links":666},[],{},[],[670],{"label":257,"file":258,"access":242,"sku":259,"size":260},{"title":241,"description":247},[264],[267,268,269,270],{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":677},0,24,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":679},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":681},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":683},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":685},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":687},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M9 3v18\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":689},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m9 18l6-6l-6-6\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":691},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":693},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m15 10l5 5l-5 5\"\u002F>\u003Cpath d=\"M4 4v7a4 4 0 0 0 4 4h12\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":695},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":697},"\u003Cpath fill=\"currentColor\" d=\"M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":699,"hidden":234},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":701},"\u003Cpath fill=\"currentColor\" d=\"M12 24C5.385 24 0 18.615 0 12S5.385 0 12 0s12 5.385 12 12s-5.385 12-12 12m10.12-10.358c-.35-.11-3.17-.953-6.384-.438c1.34 3.684 1.887 6.684 1.992 7.308a10.28 10.28 0 0 0 4.395-6.87zm-6.115 7.808c-.153-.9-.75-4.032-2.19-7.77l-.066.02c-5.79 2.015-7.86 6.025-8.04 6.4a10.16 10.16 0 0 0 6.29 2.166c1.42 0 2.77-.29 4-.814zm-11.62-2.58c.232-.4 3.045-5.055 8.332-6.765q.202-.067.405-.12q-.392-.879-.832-1.74C7.17 11.775 2.206 11.71 1.756 11.7l-.004.312c0 2.633.998 5.037 2.634 6.855zm-2.42-8.955c.46.008 4.683.026 9.477-1.248a66 66 0 0 0-3.8-5.928a10.28 10.28 0 0 0-5.676 7.17zM9.6 2.052c.282.38 2.145 2.914 3.822 6c3.645-1.365 5.19-3.44 5.373-3.702A10.2 10.2 0 0 0 12 1.764c-.825 0-1.63.1-2.4.285zm10.335 3.483c-.218.29-1.935 2.493-5.724 4.04c.24.49.47.985.68 1.486c.08.18.15.36.22.53c3.41-.43 6.8.26 7.14.33c-.02-2.42-.88-4.64-2.31-6.38z\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":703},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":705},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\"\u002F>\u003Ccircle cx=\"12\" cy=\"12\" r=\"3\"\u002F>\u003C\u002Fg>",null,{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":708},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"\u002F>\u003Cpath d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\"\u002F>\u003Cpath d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":710},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M7 11V7a5 5 0 0 1 10 0v4\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":712},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2M6 9V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v6\"\u002F>\u003Crect width=\"12\" height=\"8\" x=\"6\" y=\"14\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":714},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0zM22 10v6\"\u002F>\u003Cpath d=\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":716},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M10 2v8l3-3l3 3V2\"\u002F>\u003Cpath d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20\"\u002F>\u003C\u002Fg>",{"left":675,"top":675,"width":676,"height":676,"rotate":675,"vFlip":248,"hFlip":248,"body":718},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M13.4 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7.4M2 6h4m-4 4h4m-4 4h4m-4 4h4\"\u002F>\u003Cpath d=\"M21.378 5.626a1 1 0 1 0-3.004-3.004l-5.01 5.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z\"\u002F>\u003C\u002Fg>",1787597895428]