[{"data":1,"prerenderedAt":879},["ShallowReactive",2],{"print-topic-\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop":3,"lessons-\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop":44,"i-lucide:printer":875},{"id":4,"title":5,"access":6,"body":7,"description":14,"draft":15,"estimatedMinutes":16,"extension":17,"featured":18,"icon":19,"lang":20,"level":21,"meta":22,"navigation":18,"order":23,"path":24,"prerequisites":25,"resources":26,"seo":31,"sku":32,"stem":33,"subjects":34,"summary":36,"tags":37,"updated":42,"__hash__":43},"courses\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop\u002Findex.md","The event loop","free",{"type":8,"value":9,"toc":10},"minimark",[],{"title":11,"searchDepth":12,"depth":12,"links":13},"",3,[],"Call stack, task queues and microtasks — why your code ran in that order.",false,30,"md",true,"lucide:workflow","en","intermediate",{},1,"\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop",[],[27],{"label":28,"file":29,"access":6,"size":30},"Event loop reference card","js-event-loop-card.pdf","95 KB",{"title":5,"description":14},null,"learn\u002Fen\u002Fcourses\u002Fevent-loop\u002Findex",[35],"javascript","JavaScript runs on one thread with one call stack. Anything asynchronous is\nhanded to the host environment, which puts a callback in a queue when it is\nready. The event loop moves work from those queues onto the stack, but only\nwhen the stack is empty. Microtasks — promise continuations — drain completely\nbetween each task, which is why an await resolves before a setTimeout of zero.\nAlmost every ordering surprise in JavaScript follows from those rules.\n",[38,39,40,41],"async","promises","runtime","concurrency","2026-08-05","BOC7v_GWQoKJp-mEK6X_H0pY-0KcxkhIWnXKWsm8c9k",[45,444],{"id":46,"title":47,"access":6,"body":48,"description":438,"extension":17,"lang":20,"meta":439,"navigation":18,"order":23,"partial":15,"path":440,"seo":441,"stem":442,"__hash__":443},"lessons\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop\u002F01.call-stack.md","The call stack",{"type":8,"value":49,"toc":433},[50,54,58,161,168,173,176,179,238,244,248,256,267,335,340,344,347,416,429],[51,52,47],"h1",{"id":53},"the-call-stack",[55,56,57],"p",{},"JavaScript has a single call stack. One thing executes at a time, and a function\nruns to completion before anything else gets a turn.",[59,60,64],"pre",{"className":61,"code":62,"language":63,"meta":11,"style":11},"language-js shiki shiki-themes github-dark-dimmed github-dark-dimmed","function third() {\n  return 'done'\n}\nfunction second() {\n  return third()\n}\nfunction first() {\n  return second()\n}\n\nfirst()\n","js",[65,66,67,83,93,98,108,118,123,133,142,147,153],"code",{"__ignoreMap":11},[68,69,71,75,79],"span",{"class":70,"line":23},"line",[68,72,74],{"class":73},"sEYkB","function",[68,76,78],{"class":77},"s-wk_"," third",[68,80,82],{"class":81},"sM9_K","() {\n",[68,84,86,89],{"class":70,"line":85},2,[68,87,88],{"class":73},"  return",[68,90,92],{"class":91},"szYpP"," 'done'\n",[68,94,95],{"class":70,"line":12},[68,96,97],{"class":81},"}\n",[68,99,101,103,106],{"class":70,"line":100},4,[68,102,74],{"class":73},[68,104,105],{"class":77}," second",[68,107,82],{"class":81},[68,109,111,113,115],{"class":70,"line":110},5,[68,112,88],{"class":73},[68,114,78],{"class":77},[68,116,117],{"class":81},"()\n",[68,119,121],{"class":70,"line":120},6,[68,122,97],{"class":81},[68,124,126,128,131],{"class":70,"line":125},7,[68,127,74],{"class":73},[68,129,130],{"class":77}," first",[68,132,82],{"class":81},[68,134,136,138,140],{"class":70,"line":135},8,[68,137,88],{"class":73},[68,139,105],{"class":77},[68,141,117],{"class":81},[68,143,145],{"class":70,"line":144},9,[68,146,97],{"class":81},[68,148,150],{"class":70,"line":149},10,[68,151,152],{"emptyLinePlaceholder":18},"\n",[68,154,156,159],{"class":70,"line":155},11,[68,157,158],{"class":77},"first",[68,160,117],{"class":81},[55,162,163,164,167],{},"The stack grows to ",[65,165,166],{},"first → second → third",", then unwinds. Nothing interleaves.",[169,170,172],"h2",{"id":171},"run-to-completion-is-a-guarantee","Run-to-completion is a guarantee",[55,174,175],{},"Once a function starts, no other JavaScript can run until it returns. This is why\nyou never need locks around a shared variable: no other code can observe an\nintermediate state.",[55,177,178],{},"It is also why one slow function freezes everything:",[59,180,182],{"className":61,"code":181,"language":63,"meta":11,"style":11},"const start = Date.now()\nwhile (Date.now() - start \u003C 5000) {}\n\u002F\u002F Nothing else runs for five seconds — no clicks, no timers, no rendering.\n",[65,183,184,204,232],{"__ignoreMap":11},[68,185,186,189,193,196,199,202],{"class":70,"line":23},[68,187,188],{"class":73},"const",[68,190,192],{"class":191},"sQdni"," start",[68,194,195],{"class":73}," =",[68,197,198],{"class":81}," Date.",[68,200,201],{"class":77},"now",[68,203,117],{"class":81},[68,205,206,209,212,214,217,220,223,226,229],{"class":70,"line":85},[68,207,208],{"class":73},"while",[68,210,211],{"class":81}," (Date.",[68,213,201],{"class":77},[68,215,216],{"class":81},"() ",[68,218,219],{"class":73},"-",[68,221,222],{"class":81}," start ",[68,224,225],{"class":73},"\u003C",[68,227,228],{"class":191}," 5000",[68,230,231],{"class":81},") {}\n",[68,233,234],{"class":70,"line":12},[68,235,237],{"class":236},"s0RzX","\u002F\u002F Nothing else runs for five seconds — no clicks, no timers, no rendering.\n",[239,240,241],"warning",{},[55,242,243],{},"\"Blocking the event loop\" is not a metaphor. On the main thread of a browser, a\nlong synchronous loop blocks rendering, input handling and every pending callback.\nThe tab is frozen for the duration, and the browser may offer to kill it.",[169,245,247],{"id":246},"where-async-work-actually-happens","Where async work actually happens",[55,249,250,251,255],{},"The runtime is single-threaded. The ",[252,253,254],"em",{},"environment"," around it is not.",[55,257,258,259,262,263,266],{},"When you call ",[65,260,261],{},"setTimeout",", the timer is not JavaScript — it is the host. When you\ncall ",[65,264,265],{},"fetch",", the network request is handled by the browser's networking stack on\nanother thread. Your callback is simply registered.",[59,268,270],{"className":61,"code":269,"language":63,"meta":11,"style":11},"console.log('1')\nsetTimeout(() => console.log('3'), 0)\nconsole.log('2')\n\u002F\u002F 1, 2, 3\n",[65,271,272,289,317,330],{"__ignoreMap":11},[68,273,274,277,280,283,286],{"class":70,"line":23},[68,275,276],{"class":81},"console.",[68,278,279],{"class":77},"log",[68,281,282],{"class":81},"(",[68,284,285],{"class":91},"'1'",[68,287,288],{"class":81},")\n",[68,290,291,293,296,299,302,304,306,309,312,315],{"class":70,"line":85},[68,292,261],{"class":77},[68,294,295],{"class":81},"(() ",[68,297,298],{"class":73},"=>",[68,300,301],{"class":81}," console.",[68,303,279],{"class":77},[68,305,282],{"class":81},[68,307,308],{"class":91},"'3'",[68,310,311],{"class":81},"), ",[68,313,314],{"class":191},"0",[68,316,288],{"class":81},[68,318,319,321,323,325,328],{"class":70,"line":12},[68,320,276],{"class":81},[68,322,279],{"class":77},[68,324,282],{"class":81},[68,326,327],{"class":91},"'2'",[68,329,288],{"class":81},[68,331,332],{"class":70,"line":100},[68,333,334],{"class":236},"\u002F\u002F 1, 2, 3\n",[55,336,337,339],{},[65,338,261],{}," returns immediately. The callback is queued for later even with a zero\ndelay, because \"later\" means \"once the stack is empty\" — not \"in zero milliseconds\".",[169,341,343],{"id":342},"the-stack-in-a-stack-trace","The stack in a stack trace",[55,345,346],{},"An error captures the stack at the moment it is thrown. In async code, the stack\nyou get is the one at callback time, not at scheduling time:",[59,348,350],{"className":61,"code":349,"language":63,"meta":11,"style":11},"function schedule() {\n  setTimeout(() => {\n    throw new Error('boom')\n  }, 0)\n}\nschedule()\n\u002F\u002F The trace shows the timer callback. `schedule` is long gone.\n",[65,351,352,361,373,391,400,404,411],{"__ignoreMap":11},[68,353,354,356,359],{"class":70,"line":23},[68,355,74],{"class":73},[68,357,358],{"class":77}," schedule",[68,360,82],{"class":81},[68,362,363,366,368,370],{"class":70,"line":85},[68,364,365],{"class":77},"  setTimeout",[68,367,295],{"class":81},[68,369,298],{"class":73},[68,371,372],{"class":81}," {\n",[68,374,375,378,381,384,386,389],{"class":70,"line":12},[68,376,377],{"class":73},"    throw",[68,379,380],{"class":73}," new",[68,382,383],{"class":77}," Error",[68,385,282],{"class":81},[68,387,388],{"class":91},"'boom'",[68,390,288],{"class":81},[68,392,393,396,398],{"class":70,"line":100},[68,394,395],{"class":81},"  }, ",[68,397,314],{"class":191},[68,399,288],{"class":81},[68,401,402],{"class":70,"line":110},[68,403,97],{"class":81},[68,405,406,409],{"class":70,"line":120},[68,407,408],{"class":77},"schedule",[68,410,117],{"class":81},[68,412,413],{"class":70,"line":125},[68,414,415],{"class":236},"\u002F\u002F The trace shows the timer callback. `schedule` is long gone.\n",[55,417,418,419,422,423,425,426,428],{},"Modern engines reconstruct async stack traces across ",[65,420,421],{},"await"," boundaries, which is\none practical reason to prefer ",[65,424,38],{},"\u002F",[65,427,421],{}," over raw callbacks.",[430,431,432],"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 .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 .sQdni, html code.shiki .sQdni{--shiki-default:#6CB6FF;--shiki-dark:#6CB6FF}html pre.shiki code .s0RzX, html code.shiki .s0RzX{--shiki-default:#768390;--shiki-dark:#768390}",{"title":11,"searchDepth":12,"depth":12,"links":434},[435,436,437],{"id":171,"depth":85,"text":172},{"id":246,"depth":85,"text":247},{"id":342,"depth":85,"text":343},"One thread, one stack, and what \"blocking\" actually blocks.",{},"\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop\u002Fcall-stack",{"title":47,"description":438},"learn\u002Fen\u002Fcourses\u002Fevent-loop\u002F01.call-stack","BiJN8dMZjgvIkocYL4WlAg539TRcbZZHnuwy9Hi7GFg",{"id":445,"title":446,"access":6,"body":447,"description":869,"extension":17,"lang":20,"meta":870,"navigation":18,"order":85,"partial":15,"path":871,"seo":872,"stem":873,"__hash__":874},"lessons\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop\u002F02.task-queues.md","Tasks and microtasks",{"type":8,"value":448,"toc":863},[449,452,455,512,516,524,648,651,659,662,666,671,759,772,776,779,831,844,848,851,860],[51,450,446],{"id":451},"tasks-and-microtasks",[55,453,454],{},"There is not one queue. There are two, and they are drained differently.",[456,457,458,474],"table",{},[459,460,461],"thead",{},[462,463,464,468,471],"tr",{},[465,466,467],"th",{},"Queue",[465,469,470],{},"Sources",[465,472,473],{},"Drained",[475,476,477,495],"tbody",{},[462,478,479,483,492],{},[480,481,482],"td",{},"Task (macrotask)",[480,484,485,487,488,491],{},[65,486,261],{},", ",[65,489,490],{},"setInterval",", I\u002FO, events",[480,493,494],{},"One per loop iteration",[462,496,497,500,509],{},[480,498,499],{},"Microtask",[480,501,502,503,487,506],{},"Promise callbacks, ",[65,504,505],{},"queueMicrotask",[65,507,508],{},"MutationObserver",[480,510,511],{},"Completely, after every task",[169,513,515],{"id":514},"the-rule","The rule",[55,517,518,519,523],{},"After the stack empties, the event loop drains ",[520,521,522],"strong",{},"the entire microtask queue"," before\ntaking the next task. Microtasks added while draining are also processed in the same\npass.",[59,525,527],{"className":61,"code":526,"language":63,"meta":11,"style":11},"console.log('script start')\n\nsetTimeout(() => console.log('timeout'), 0)\n\nPromise.resolve()\n  .then(() => console.log('promise 1'))\n  .then(() => console.log('promise 2'))\n\nconsole.log('script end')\n",[65,528,529,542,546,569,573,586,610,631,635],{"__ignoreMap":11},[68,530,531,533,535,537,540],{"class":70,"line":23},[68,532,276],{"class":81},[68,534,279],{"class":77},[68,536,282],{"class":81},[68,538,539],{"class":91},"'script start'",[68,541,288],{"class":81},[68,543,544],{"class":70,"line":85},[68,545,152],{"emptyLinePlaceholder":18},[68,547,548,550,552,554,556,558,560,563,565,567],{"class":70,"line":12},[68,549,261],{"class":77},[68,551,295],{"class":81},[68,553,298],{"class":73},[68,555,301],{"class":81},[68,557,279],{"class":77},[68,559,282],{"class":81},[68,561,562],{"class":91},"'timeout'",[68,564,311],{"class":81},[68,566,314],{"class":191},[68,568,288],{"class":81},[68,570,571],{"class":70,"line":100},[68,572,152],{"emptyLinePlaceholder":18},[68,574,575,578,581,584],{"class":70,"line":110},[68,576,577],{"class":191},"Promise",[68,579,580],{"class":81},".",[68,582,583],{"class":77},"resolve",[68,585,117],{"class":81},[68,587,588,591,594,596,598,600,602,604,607],{"class":70,"line":120},[68,589,590],{"class":81},"  .",[68,592,593],{"class":77},"then",[68,595,295],{"class":81},[68,597,298],{"class":73},[68,599,301],{"class":81},[68,601,279],{"class":77},[68,603,282],{"class":81},[68,605,606],{"class":91},"'promise 1'",[68,608,609],{"class":81},"))\n",[68,611,612,614,616,618,620,622,624,626,629],{"class":70,"line":125},[68,613,590],{"class":81},[68,615,593],{"class":77},[68,617,295],{"class":81},[68,619,298],{"class":73},[68,621,301],{"class":81},[68,623,279],{"class":77},[68,625,282],{"class":81},[68,627,628],{"class":91},"'promise 2'",[68,630,609],{"class":81},[68,632,633],{"class":70,"line":135},[68,634,152],{"emptyLinePlaceholder":18},[68,636,637,639,641,643,646],{"class":70,"line":144},[68,638,276],{"class":81},[68,640,279],{"class":77},[68,642,282],{"class":81},[68,644,645],{"class":91},"'script end'",[68,647,288],{"class":81},[55,649,650],{},"Output:",[59,652,657],{"className":653,"code":655,"language":656,"meta":11},[654],"language-text","script start\nscript end\npromise 1\npromise 2\ntimeout\n","text",[65,658,655],{"__ignoreMap":11},[55,660,661],{},"Both promise callbacks run before the timeout, even though the timeout was scheduled\nfirst. They are microtasks; the timeout is a task.",[169,663,665],{"id":664},"await-is-a-microtask-boundary","await is a microtask boundary",[55,667,668,670],{},[65,669,421],{}," suspends the function and schedules the remainder as a promise continuation:",[59,672,674],{"className":61,"code":673,"language":63,"meta":11,"style":11},"async function run() {\n  console.log('a')\n  await null \u002F\u002F still a microtask, even awaiting a non-promise\n  console.log('c')\n}\n\nrun()\nconsole.log('b')\n\u002F\u002F a, b, c\n",[65,675,676,688,702,713,726,730,734,741,754],{"__ignoreMap":11},[68,677,678,680,683,686],{"class":70,"line":23},[68,679,38],{"class":73},[68,681,682],{"class":73}," function",[68,684,685],{"class":77}," run",[68,687,82],{"class":81},[68,689,690,693,695,697,700],{"class":70,"line":85},[68,691,692],{"class":81},"  console.",[68,694,279],{"class":77},[68,696,282],{"class":81},[68,698,699],{"class":91},"'a'",[68,701,288],{"class":81},[68,703,704,707,710],{"class":70,"line":12},[68,705,706],{"class":73},"  await",[68,708,709],{"class":191}," null",[68,711,712],{"class":236}," \u002F\u002F still a microtask, even awaiting a non-promise\n",[68,714,715,717,719,721,724],{"class":70,"line":100},[68,716,692],{"class":81},[68,718,279],{"class":77},[68,720,282],{"class":81},[68,722,723],{"class":91},"'c'",[68,725,288],{"class":81},[68,727,728],{"class":70,"line":110},[68,729,97],{"class":81},[68,731,732],{"class":70,"line":120},[68,733,152],{"emptyLinePlaceholder":18},[68,735,736,739],{"class":70,"line":125},[68,737,738],{"class":77},"run",[68,740,117],{"class":81},[68,742,743,745,747,749,752],{"class":70,"line":135},[68,744,276],{"class":81},[68,746,279],{"class":77},[68,748,282],{"class":81},[68,750,751],{"class":91},"'b'",[68,753,288],{"class":81},[68,755,756],{"class":70,"line":144},[68,757,758],{"class":236},"\u002F\u002F a, b, c\n",[55,760,761,764,765,767,768,771],{},[65,762,763],{},"await null"," does not skip the queue. Everything after the ",[65,766,421],{}," becomes a\nmicrotask, so the synchronous ",[65,769,770],{},"console.log('b')"," runs first.",[169,773,775],{"id":774},"starving-the-loop","Starving the loop",[55,777,778],{},"Because microtasks drain completely, a microtask that schedules another microtask\nforever prevents any task from ever running:",[59,780,782],{"className":61,"code":781,"language":63,"meta":11,"style":11},"function spin() {\n  Promise.resolve().then(spin)\n}\nspin()\n\u002F\u002F Timers never fire. Rendering never happens. The page is frozen —\n\u002F\u002F but the CPU profile looks like idle promise work, not a busy loop.\n",[65,783,784,793,810,814,821,826],{"__ignoreMap":11},[68,785,786,788,791],{"class":70,"line":23},[68,787,74],{"class":73},[68,789,790],{"class":77}," spin",[68,792,82],{"class":81},[68,794,795,798,800,802,805,807],{"class":70,"line":85},[68,796,797],{"class":191},"  Promise",[68,799,580],{"class":81},[68,801,583],{"class":77},[68,803,804],{"class":81},"().",[68,806,593],{"class":77},[68,808,809],{"class":81},"(spin)\n",[68,811,812],{"class":70,"line":12},[68,813,97],{"class":81},[68,815,816,819],{"class":70,"line":100},[68,817,818],{"class":77},"spin",[68,820,117],{"class":81},[68,822,823],{"class":70,"line":110},[68,824,825],{"class":236},"\u002F\u002F Timers never fire. Rendering never happens. The page is frozen —\n",[68,827,828],{"class":70,"line":120},[68,829,830],{"class":236},"\u002F\u002F but the CPU profile looks like idle promise work, not a busy loop.\n",[832,833,834],"danger",{},[55,835,836,837,840,841,843],{},"This is worse than a ",[65,838,839],{},"while (true)"," loop, because it is harder to spot. The stack is\nshallow, each individual microtask is fast, and nothing looks obviously wrong. Use\n",[65,842,261],{}," rather than promise recursion for anything that repeats indefinitely.",[169,845,847],{"id":846},"rendering","Rendering",[55,849,850],{},"In a browser, rendering is neither a task nor a microtask — it happens between\ntasks, at most once per frame. Since microtasks drain before rendering, a long\nmicrotask chain delays paint just as effectively as blocking code.",[852,853,854],"tip",{},[55,855,856,859],{},[65,857,858],{},"requestAnimationFrame"," callbacks run just before paint, after microtasks. That is\nthe correct place for visual updates, and the wrong place for anything expensive.",[430,861,862],{},"html pre.shiki code .sM9_K, html code.shiki .sM9_K{--shiki-default:#ADBAC7;--shiki-dark:#ADBAC7}html pre.shiki code .s-wk_, html code.shiki .s-wk_{--shiki-default:#DCBDFB;--shiki-dark:#DCBDFB}html pre.shiki code .szYpP, html code.shiki .szYpP{--shiki-default:#96D0FF;--shiki-dark:#96D0FF}html pre.shiki code .sEYkB, html code.shiki .sEYkB{--shiki-default:#F47067;--shiki-dark:#F47067}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 .s0RzX, html code.shiki .s0RzX{--shiki-default:#768390;--shiki-dark:#768390}",{"title":11,"searchDepth":12,"depth":12,"links":864},[865,866,867,868],{"id":514,"depth":85,"text":515},{"id":664,"depth":85,"text":665},{"id":774,"depth":85,"text":775},{"id":846,"depth":85,"text":847},"Two queues, different draining rules, and the ordering that follows.",{},"\u002Flearn\u002Fen\u002Fcourses\u002Fevent-loop\u002Ftask-queues",{"title":446,"description":869},"learn\u002Fen\u002Fcourses\u002Fevent-loop\u002F02.task-queues","Jzwld-KwT30H_KYGrTndaDQB3plJFyiXJ-0rWZCopTQ",{"left":876,"top":876,"width":877,"height":877,"rotate":876,"vFlip":15,"hFlip":15,"body":878},0,24,"\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>",1787597904819]