[{"data":1,"prerenderedAt":1572},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:5KumEy0WyK4I6T52ey_cyuPyoC5UmLLrtuPGe-xLyOk":195,"content-page-surround:docs:5KumEy0WyK4I6T52ey_cyuPyoC5UmLLrtuPGe-xLyOk":1558,"i-lucide:file":1563,"i-lucide:clipboard":1567,"i-lucide:file-json":1569},[4,54,74],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Guides",false,"1","en","content:en:1.docs:1.guides:.navigation.yml","lucide:route","section",[13,19,26,33,40,47],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"icon":17,"path":18},"Install Guild Wars on Mac","content:en:1.docs:1.guides:1.install.md","1\u002F1","lucide:download","\u002Fdocs\u002Fguides\u002Finstall",{"title":20,"id":21,"canonicalKey":22,"locale":8,"draft":6,"navigation":23,"icon":24,"path":25},"Accounts & mobile linking","content:en:1.docs:1.guides:2.accounts.md","1\u002F2",{"title":20},"lucide:key-round","\u002Fdocs\u002Fguides\u002Faccounts",{"title":27,"id":28,"canonicalKey":29,"locale":8,"draft":6,"navigation":30,"icon":31,"path":32},"Play on Mac: options","content:en:1.docs:1.guides:3.play-guild-wars-on-mac.md","1\u002F3",{"title":27},"lucide:scale","\u002Fdocs\u002Fguides\u002Fplay-guild-wars-on-mac",{"title":34,"id":35,"canonicalKey":36,"locale":8,"draft":6,"navigation":37,"icon":38,"path":39},"Performance","content:en:1.docs:1.guides:4.performance.md","1\u002F4",{"title":34},"lucide:gauge","\u002Fdocs\u002Fguides\u002Fperformance",{"title":41,"id":42,"canonicalKey":43,"locale":8,"draft":6,"navigation":44,"icon":45,"path":46},"Templates","content:en:1.docs:1.guides:5.templates.md","1\u002F5",{"title":41},"lucide:bookmark","\u002Fdocs\u002Fguides\u002Ftemplates",{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Troubleshooting","content:en:1.docs:1.guides:6.troubleshooting.md","1\u002F6",{"title":48},"lucide:wrench","\u002Fdocs\u002Fguides\u002Ftroubleshooting",{"title":55,"page":6,"canonicalKey":56,"locale":8,"id":57,"draft":6,"icon":58,"sidebar":59,"children":60},"Project","2","content:en:1.docs:2.project:.navigation.yml","lucide:shield-check","group",[61,67],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":58,"path":66},"Safety & account risk","content:en:1.docs:2.project:1.safety.md","2\u002F1",{"title":62},"\u002Fdocs\u002Fproject\u002Fsafety",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"About & credits","content:en:1.docs:2.project:2.about.md","2\u002F2",{"title":68},"lucide:users","\u002Fdocs\u002Fproject\u002Fabout",{"title":75,"page":6,"canonicalKey":76,"locale":8,"id":77,"draft":6,"icon":78,"sidebar":11,"children":79},"For ArenaNet","3","content:en:1.docs:3.upstream:.navigation.yml","lucide:send",[80,87,94,120,146,158,177],{"title":81,"id":82,"canonicalKey":83,"locale":8,"draft":6,"navigation":84,"icon":85,"path":86},"Introduction","content:en:1.docs:3.upstream:1.introduction.md","3\u002F1",{"title":81},"lucide:book-open-check","\u002Fdocs\u002Fupstream\u002Fintroduction",{"title":88,"id":89,"canonicalKey":90,"locale":8,"draft":6,"navigation":91,"icon":92,"path":93},"Request summary","content:en:1.docs:3.upstream:2.request-summary.md","3\u002F2",{"title":88},"lucide:list-checks","\u002Fdocs\u002Fupstream\u002Frequest-summary",{"title":95,"page":6,"canonicalKey":96,"locale":8,"id":97,"draft":6,"icon":98,"sidebar":59,"children":99},"File system","3\u002F3","content:en:1.docs:3.upstream:3.filesystem:.navigation.yml","lucide:folder-x",[100,106,113],{"title":101,"id":102,"canonicalKey":103,"locale":8,"draft":6,"navigation":104,"icon":98,"path":105},"File routines (UR-01…04)","content:en:1.docs:3.upstream:3.filesystem:1.unimplemented-routines.md","3\u002F3\u002F1",{"title":101},"\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Funimplemented-routines",{"title":107,"id":108,"canonicalKey":109,"locale":8,"draft":6,"navigation":110,"icon":111,"path":112},"RemoveExtension (UR-05)","content:en:1.docs:3.upstream:3.filesystem:2.path-remove-extension.md","3\u002F3\u002F2",{"title":107},"lucide:scissors","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Fpath-remove-extension",{"title":114,"id":115,"canonicalKey":116,"locale":8,"draft":6,"navigation":117,"icon":118,"path":119},"File::Open mode (UR-06)","content:en:1.docs:3.upstream:3.filesystem:3.file-open-mode.md","3\u002F3\u002F3",{"title":114},"lucide:file-plus-2","\u002Fdocs\u002Fupstream\u002Ffilesystem\u002Ffile-open-mode",{"title":121,"page":6,"canonicalKey":122,"locale":8,"id":123,"draft":6,"icon":124,"sidebar":59,"children":125},"Input","3\u002F4","content:en:1.docs:3.upstream:4.input:.navigation.yml","lucide:mouse-pointer-click",[126,132,139],{"title":127,"id":128,"canonicalKey":129,"locale":8,"draft":6,"navigation":130,"icon":124,"path":131},"Double-click (UR-07)","content:en:1.docs:3.upstream:4.input:1.double-click-flag.md","3\u002F4\u002F1",{"title":127},"\u002Fdocs\u002Fupstream\u002Finput\u002Fdouble-click-flag",{"title":133,"id":134,"canonicalKey":135,"locale":8,"draft":6,"navigation":136,"icon":137,"path":138},"Key labels (UR-08)","content:en:1.docs:3.upstream:4.input:2.key-labels.md","3\u002F4\u002F2",{"title":133},"lucide:keyboard","\u002Fdocs\u002Fupstream\u002Finput\u002Fkey-labels",{"title":140,"id":141,"canonicalKey":142,"locale":8,"draft":6,"navigation":143,"icon":144,"path":145},"Cursor re-test (UR-09)","content:en:1.docs:3.upstream:4.input:3.cursor-re-evaluation.md","3\u002F4\u002F3",{"title":140},"lucide:pointer","\u002Fdocs\u002Fupstream\u002Finput\u002Fcursor-re-evaluation",{"title":147,"page":6,"canonicalKey":148,"locale":8,"id":149,"draft":6,"icon":150,"sidebar":59,"children":151},"Runtime","3\u002F5","content:en:1.docs:3.upstream:5.runtime:.navigation.yml","lucide:cpu",[152],{"title":153,"id":154,"canonicalKey":155,"locale":8,"draft":6,"navigation":156,"icon":150,"path":157},"Heap maximum (UR-10)","content:en:1.docs:3.upstream:5.runtime:1.heap-maximum.md","3\u002F5\u002F1",{"title":153},"\u002Fdocs\u002Fupstream\u002Fruntime\u002Fheap-maximum",{"title":159,"page":6,"canonicalKey":160,"locale":8,"id":161,"draft":6,"icon":162,"sidebar":59,"children":163},"Interface proposals","3\u002F6","content:en:1.docs:3.upstream:6.proposals:.navigation.yml","lucide:plug",[164,171],{"title":165,"id":166,"canonicalKey":167,"locale":8,"draft":6,"navigation":168,"icon":169,"path":170},"Build identity (UR-11)","content:en:1.docs:3.upstream:6.proposals:1.build-identification.md","3\u002F6\u002F1",{"title":165},"lucide:fingerprint","\u002Fdocs\u002Fupstream\u002Fproposals\u002Fbuild-identification",{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":175,"icon":162,"path":176},"Host interface (UR-12)","content:en:1.docs:3.upstream:6.proposals:2.platform-host-interface.md","3\u002F6\u002F2",{"title":172},"\u002Fdocs\u002Fupstream\u002Fproposals\u002Fplatform-host-interface",{"title":178,"page":6,"canonicalKey":179,"locale":8,"id":180,"draft":6,"icon":181,"sidebar":59,"children":182},"Reference","3\u002F7","content:en:1.docs:3.upstream:7.reference:.navigation.yml","lucide:microscope",[183,189],{"title":184,"id":185,"canonicalKey":186,"locale":8,"draft":6,"navigation":187,"icon":52,"path":188},"Our workarounds","content:en:1.docs:3.upstream:7.reference:1.our-workarounds.md","3\u002F7\u002F1",{"title":184},"\u002Fdocs\u002Fupstream\u002Freference\u002Four-workarounds",{"title":190,"id":191,"canonicalKey":192,"locale":8,"draft":6,"navigation":193,"icon":181,"path":194},"Verification method","content:en:1.docs:3.upstream:7.reference:2.verification-method.md","3\u002F7\u002F2",{"title":190},"\u002Fdocs\u002Fupstream\u002Freference\u002Fverification-method",{"title":196,"ref":197,"description":198,"icon":124,"updated":199,"navigation":200,"body":201,"type":1543,"id":128,"canonicalKey":129,"draft":6,"partial":6,"locale":8,"collection":1544,"navigationFile":6,"file":1545,"route":1551,"resolution":1555},"UR-07: double-click never fires because MouseEvent.detail is not marshalled","docs\u002Fupstream\u002Finput\u002Fdouble-click-flag","The client carries a double-click flag from the input record to FrMouse, but the Emscripten glue never writes it because it does not marshal MouseEvent.detail. One byte fixes double-click on the web client.","2026-08-04",{"title":127},{"type":202,"children":203,"toc":1525},"root",[204,234,245,257,264,518,563,574,607,692,716,725,844,849,916,922,951,975,981,1073,1083,1088,1094,1152,1158,1163,1200,1325,1351,1357,1396,1402,1407,1494,1500,1512,1520],{"type":205,"tag":206,"props":207,"children":208},"element","p",{},[209,212,218,220,225,227,232],{"type":210,"value":211},"text","The client can't double-click on the web platform, even though nearly all of\nthe machinery is in place: a per-press double-click flag travels from the\nEmscripten input record all the way to ",{"type":205,"tag":213,"props":214,"children":215},"code",{},[216],{"type":210,"value":217},"FrMouse",{"type":210,"value":219},", and every stage past that\nbyte works. The glue just never writes it — ",{"type":205,"tag":213,"props":221,"children":222},{},[223],{"type":210,"value":224},"fillMouseEventData",{"type":210,"value":226}," doesn't\nmarshal ",{"type":205,"tag":213,"props":228,"children":229},{},[230],{"type":210,"value":231},"MouseEvent.detail",{"type":210,"value":233},", and the mousedown callback zeroes the record\nwithout ever touching that offset.",{"type":205,"tag":206,"props":235,"children":236},{},[237,243],{"type":205,"tag":238,"props":239,"children":240},"strong",{},[241],{"type":210,"value":242},"Fix:",{"type":210,"value":244}," low effort, small blast radius — one marshalled field and one\nassignment. The flag slot is zero on every path today, so nothing can depend\non the current value, and the gamepad and touch paths have their own flag\nsources.",{"type":205,"tag":206,"props":246,"children":247},{},[248,250,255],{"type":210,"value":249},"Build used for the measurements below: 38735 (",{"type":205,"tag":213,"props":251,"children":252},{},[253],{"type":210,"value":254},"version.json",{"type":210,"value":256}," 1.1.7), size\n8,196,702 bytes.",{"type":205,"tag":258,"props":259,"children":261},"h2",{"id":260},"the-channel-end-to-end",[262],{"type":210,"value":263},"The channel, end to end",{"type":205,"tag":265,"props":266,"children":269},"pre",{"language":210,"class":267,"tabindex":268},"shiki shiki-themes light-plus dark-plus dark:dark-plus","0",[270],{"type":205,"tag":213,"props":271,"children":273},{"class":272},"language-text",[274,285,287,295,296,304,305,313,314,322,323,331,332,340,341,349,350,358,359,367,368,376,377,385,386,394,395,403,404,411,412,420,421,429,430,438,439,447,448,456,457,465,466,474,475,482,483,491,492,500,501,509,510],{"type":205,"tag":275,"props":276,"children":279},"span",{"class":277,"style":278},"line","display: inline",[280],{"type":205,"tag":275,"props":281,"children":282},{},[283],{"type":210,"value":284},"Chromium MouseEvent",{"type":210,"value":286},"\n",{"type":205,"tag":275,"props":288,"children":289},{"class":277,"style":278},[290],{"type":205,"tag":275,"props":291,"children":292},{},[293],{"type":210,"value":294},"  detail                                        \u003C- dropped here, never marshalled",{"type":210,"value":286},{"type":205,"tag":275,"props":297,"children":298},{"class":277,"style":278},[299],{"type":205,"tag":275,"props":300,"children":301},{},[302],{"type":210,"value":303},"  | fillMouseEventData (Gw.jspi.js)             writes 0,8,12,16,20,24-27,28,30,32,36,40,44",{"type":210,"value":286},{"type":205,"tag":275,"props":306,"children":307},{"class":277,"style":278},[308],{"type":205,"tag":275,"props":309,"children":310},{},[311],{"type":210,"value":312},"  | of a 64-byte struct; bytes 48-63 are never written by any path",{"type":210,"value":286},{"type":205,"tag":275,"props":315,"children":316},{"class":277,"style":278},[317],{"type":205,"tag":275,"props":318,"children":319},{},[320],{"type":210,"value":321},"#2448  table slot 903, the mousedown callback",{"type":210,"value":286},{"type":205,"tag":275,"props":324,"children":325},{"class":277,"style":278},[326],{"type":205,"tag":275,"props":327,"children":328},{},[329],{"type":210,"value":330},"         memset(rec, 0, 24)",{"type":210,"value":286},{"type":205,"tag":275,"props":333,"children":334},{"class":277,"style":278},[335],{"type":205,"tag":275,"props":336,"children":337},{},[338],{"type":210,"value":339},"         rec[0]  = 18                           kind: mouse button down",{"type":210,"value":286},{"type":205,"tag":275,"props":342,"children":343},{"class":277,"style":278},[344],{"type":205,"tag":275,"props":345,"children":346},{},[347],{"type":210,"value":348},"         rec[4]  = targetX * devicePixelRatio",{"type":210,"value":286},{"type":205,"tag":275,"props":351,"children":352},{"class":277,"style":278},[353],{"type":205,"tag":275,"props":354,"children":355},{},[356],{"type":210,"value":357},"         rec[8]  = targetY * devicePixelRatio",{"type":210,"value":286},{"type":205,"tag":275,"props":360,"children":361},{"class":277,"style":278},[362],{"type":205,"tag":275,"props":363,"children":364},{},[365],{"type":210,"value":366},"         rec[12] = event.button",{"type":210,"value":286},{"type":205,"tag":275,"props":369,"children":370},{"class":277,"style":278},[371],{"type":205,"tag":275,"props":372,"children":373},{},[374],{"type":210,"value":375},"         rec[16] = -- never written --          \u003C- the flag slot",{"type":210,"value":286},{"type":205,"tag":275,"props":378,"children":379},{"class":277,"style":278},[380],{"type":205,"tag":275,"props":381,"children":382},{},[383],{"type":210,"value":384},"         #791 enqueue                           Base\u002FOs\u002FEmscripten\u002FEmscriptenInput.cpp",{"type":210,"value":286},{"type":205,"tag":275,"props":387,"children":388},{"class":277,"style":278},[389],{"type":205,"tag":275,"props":390,"children":391},{},[392],{"type":210,"value":393},"  |",{"type":210,"value":286},{"type":205,"tag":275,"props":396,"children":397},{"class":277,"style":278},[398],{"type":205,"tag":275,"props":399,"children":400},{},[401],{"type":210,"value":402},"#794   dequeue, #828 per-frame pump, event loop #883 (Engine\u002FEvent\u002FEvtApi.cpp)",{"type":210,"value":286},{"type":205,"tag":275,"props":405,"children":406},{"class":277,"style":278},[407],{"type":205,"tag":275,"props":408,"children":409},{},[410],{"type":210,"value":393},{"type":210,"value":286},{"type":205,"tag":275,"props":413,"children":414},{"class":277,"style":278},[415],{"type":205,"tag":275,"props":416,"children":417},{},[418],{"type":210,"value":419},"#829   translate record to engine message, 36-way br_table on rec[0]",{"type":210,"value":286},{"type":205,"tag":275,"props":422,"children":423},{"class":277,"style":278},[424],{"type":205,"tag":275,"props":425,"children":426},{},[427],{"type":210,"value":428},"         kind 18 -> engine message 30, payload 24 bytes:",{"type":210,"value":286},{"type":205,"tag":275,"props":431,"children":432},{"class":277,"style":278},[433],{"type":205,"tag":275,"props":434,"children":435},{},[436],{"type":210,"value":437},"           msg[0]     = rec[12]                 button",{"type":210,"value":286},{"type":205,"tag":275,"props":440,"children":441},{"class":277,"style":278},[442],{"type":205,"tag":275,"props":443,"children":444},{},[445],{"type":210,"value":446},"           msg[4]     = rec[16]                 \u003C- the flag, structurally zero",{"type":210,"value":286},{"type":205,"tag":275,"props":449,"children":450},{"class":277,"style":278},[451],{"type":205,"tag":275,"props":452,"children":453},{},[454],{"type":210,"value":455},"           msg[8..15] = cursor x, y as f32",{"type":210,"value":286},{"type":205,"tag":275,"props":458,"children":459},{"class":277,"style":278},[460],{"type":205,"tag":275,"props":461,"children":462},{},[463],{"type":210,"value":464},"           msg[16]    = button state bitfield",{"type":210,"value":286},{"type":205,"tag":275,"props":467,"children":468},{"class":277,"style":278},[469],{"type":205,"tag":275,"props":470,"children":471},{},[472],{"type":210,"value":473},"           msg[20]    = modifier state",{"type":210,"value":286},{"type":205,"tag":275,"props":476,"children":477},{"class":277,"style":278},[478],{"type":205,"tag":275,"props":479,"children":480},{},[481],{"type":210,"value":393},{"type":210,"value":286},{"type":205,"tag":275,"props":484,"children":485},{"class":277,"style":278},[486],{"type":205,"tag":275,"props":487,"children":488},{},[489],{"type":210,"value":490},"#6293  table slot 1736, bound to engine message 30 by #6659 (Engine\u002FFrame\u002FFrApi.cpp)",{"type":210,"value":286},{"type":205,"tag":275,"props":493,"children":494},{"class":277,"style":278},[495],{"type":205,"tag":275,"props":496,"children":497},{},[498],{"type":210,"value":499},"         sets pointer mode 0 (mouse), then",{"type":210,"value":286},{"type":205,"tag":275,"props":502,"children":503},{"class":277,"style":278},[504],{"type":205,"tag":275,"props":505,"children":506},{},[507],{"type":210,"value":508},"         #6269(msg + 8, msg[0], msg[4] & 1)",{"type":210,"value":286},{"type":205,"tag":275,"props":511,"children":512},{"class":277,"style":278},[513],{"type":205,"tag":275,"props":514,"children":515},{},[516],{"type":210,"value":517},"                                    ^^^^^^^^^^  the double-click argument",{"type":205,"tag":206,"props":519,"children":520},{},[521,526,528,533,535,540,542,547,549,554,556,561],{"type":205,"tag":213,"props":522,"children":523},{},[524],{"type":210,"value":525},"#6269",{"type":210,"value":527}," is ",{"type":205,"tag":213,"props":529,"children":530},{},[531],{"type":210,"value":532},"Engine\u002FFrame\u002FFrMouse.cpp",{"type":210,"value":534},". It asserts ",{"type":205,"tag":213,"props":536,"children":537},{},[538],{"type":210,"value":539},"underMouse",{"type":210,"value":541}," at line 736. It\nis the one click-delivery routine. Its signature is\n",{"type":205,"tag":213,"props":543,"children":544},{},[545],{"type":210,"value":546},"(Vec2* pos, unsigned button, bool doubleClick)",{"type":210,"value":548},". At offset ",{"type":205,"tag":213,"props":550,"children":551},{},[552],{"type":210,"value":553},"+182",{"type":210,"value":555}," to ",{"type":205,"tag":213,"props":557,"children":558},{},[559],{"type":210,"value":560},"+201",{"type":210,"value":562},"\nthe third argument sets the flag:",{"type":205,"tag":265,"props":564,"children":567},{"language":565,"class":566,"tabindex":268},"wasm","shiki dark:dark-plus",[568],{"type":205,"tag":213,"props":569,"children":571},{"class":570},"language-wasm",[572],{"type":210,"value":573},"local.get 2          ;; doubleClick\ni32.eqz\nbr_if                ;; keep the word unchanged when the value is false\ni32.load  offset=12\ni32.const 1\ni32.or\ni32.store offset=12  ;; selectFlags |= FLAG_DBL_CLICK",{"type":205,"tag":206,"props":575,"children":576},{},[577,579,584,586,591,593,598,600,605],{"type":210,"value":578},"The flag values come from the two asserts in ",{"type":205,"tag":213,"props":580,"children":581},{},[582],{"type":210,"value":583},"#15917",{"type":210,"value":585},", which the compiler\nfolded into ",{"type":205,"tag":213,"props":587,"children":588},{},[589],{"type":210,"value":590},"(flags & 3) == 1",{"type":210,"value":592},", and from the ",{"type":205,"tag":213,"props":594,"children":595},{},[596],{"type":210,"value":597},"br_table",{"type":210,"value":599}," at ",{"type":205,"tag":213,"props":601,"children":602},{},[603],{"type":210,"value":604},"#6269+93",{"type":210,"value":606},":",{"type":205,"tag":608,"props":609,"children":610},"table",{},[611,630],{"type":205,"tag":612,"props":613,"children":614},"thead",{},[615],{"type":205,"tag":616,"props":617,"children":618},"tr",{},[619,625],{"type":205,"tag":620,"props":621,"children":622},"th",{},[623],{"type":210,"value":624},"Flag",{"type":205,"tag":620,"props":626,"children":627},{},[628],{"type":210,"value":629},"Value",{"type":205,"tag":631,"props":632,"children":633},"tbody",{},[634,654,673],{"type":205,"tag":616,"props":635,"children":636},{},[637,646],{"type":205,"tag":638,"props":639,"children":640},"td",{},[641],{"type":205,"tag":213,"props":642,"children":643},{},[644],{"type":210,"value":645},"FLAG_DBL_CLICK",{"type":205,"tag":638,"props":647,"children":648},{},[649],{"type":205,"tag":213,"props":650,"children":651},{},[652],{"type":210,"value":653},"0x1",{"type":205,"tag":616,"props":655,"children":656},{},[657,665],{"type":205,"tag":638,"props":658,"children":659},{},[660],{"type":205,"tag":213,"props":661,"children":662},{},[663],{"type":210,"value":664},"FLAG_DUE_TO_CLICK",{"type":205,"tag":638,"props":666,"children":667},{},[668],{"type":205,"tag":213,"props":669,"children":670},{},[671],{"type":210,"value":672},"0x2",{"type":205,"tag":616,"props":674,"children":675},{},[676,684],{"type":205,"tag":638,"props":677,"children":678},{},[679],{"type":205,"tag":213,"props":680,"children":681},{},[682],{"type":210,"value":683},"FLAG_NO_INTERACT",{"type":205,"tag":638,"props":685,"children":686},{},[687],{"type":205,"tag":213,"props":688,"children":689},{},[690],{"type":210,"value":691},"0x4",{"type":205,"tag":206,"props":693,"children":694},{},[695,700,702,707,709,714],{"type":205,"tag":213,"props":696,"children":697},{},[698],{"type":210,"value":699},"#6270",{"type":210,"value":701}," (",{"type":205,"tag":213,"props":703,"children":704},{},[705],{"type":210,"value":706},"FrMouse.cpp:192",{"type":210,"value":708},") then moves the bit into its own field —\n",{"type":205,"tag":213,"props":710,"children":711},{},[712],{"type":210,"value":713},"msg[40] = evt[4] & 1",{"type":210,"value":715}," — before it posts to the widget under the cursor.",{"type":205,"tag":206,"props":717,"children":718},{},[719,723],{"type":205,"tag":213,"props":720,"children":721},{},[722],{"type":210,"value":525},{"type":210,"value":724}," has exactly three callers, each supplying the argument from its own\nsource:",{"type":205,"tag":608,"props":726,"children":727},{},[728,749],{"type":205,"tag":612,"props":729,"children":730},{},[731],{"type":205,"tag":616,"props":732,"children":733},{},[734,739,744],{"type":205,"tag":620,"props":735,"children":736},{},[737],{"type":210,"value":738},"Caller",{"type":205,"tag":620,"props":740,"children":741},{},[742],{"type":210,"value":743},"Pointer mode",{"type":205,"tag":620,"props":745,"children":746},{},[747],{"type":210,"value":748},"Source of the double-click bit",{"type":205,"tag":631,"props":750,"children":751},{},[752,783,816],{"type":205,"tag":616,"props":753,"children":754},{},[755,763,768],{"type":205,"tag":638,"props":756,"children":757},{},[758],{"type":205,"tag":213,"props":759,"children":760},{},[761],{"type":210,"value":762},"#6293",{"type":205,"tag":638,"props":764,"children":765},{},[766],{"type":210,"value":767},"0, mouse",{"type":205,"tag":638,"props":769,"children":770},{},[771,776,778],{"type":205,"tag":213,"props":772,"children":773},{},[774],{"type":210,"value":775},"msg[4] & 1",{"type":210,"value":777}," — ",{"type":205,"tag":238,"props":779,"children":780},{},[781],{"type":210,"value":782},"always 0 on the web client",{"type":205,"tag":616,"props":784,"children":785},{},[786,794,799],{"type":205,"tag":638,"props":787,"children":788},{},[789],{"type":205,"tag":213,"props":790,"children":791},{},[792],{"type":210,"value":793},"#6304",{"type":205,"tag":638,"props":795,"children":796},{},[797],{"type":210,"value":798},"1, gamepad",{"type":205,"tag":638,"props":800,"children":801},{},[802,807,809,814],{"type":205,"tag":213,"props":803,"children":804},{},[805],{"type":210,"value":806},"FrGamepad.cpp",{"type":210,"value":808}," ",{"type":205,"tag":213,"props":810,"children":811},{},[812],{"type":210,"value":813},"#6372",{"type":210,"value":815},", a 400 ms window",{"type":205,"tag":616,"props":817,"children":818},{},[819,827,832],{"type":205,"tag":638,"props":820,"children":821},{},[822],{"type":205,"tag":213,"props":823,"children":824},{},[825],{"type":210,"value":826},"#6309",{"type":205,"tag":638,"props":828,"children":829},{},[830],{"type":210,"value":831},"2, touch",{"type":205,"tag":638,"props":833,"children":834},{},[835,837,842],{"type":210,"value":836},"the ",{"type":205,"tag":213,"props":838,"children":839},{},[840],{"type":210,"value":841},"FrTouch",{"type":210,"value":843}," double-tap detector",{"type":205,"tag":206,"props":845,"children":846},{},[847],{"type":210,"value":848},"The gamepad path and the touch path work. The mouse path is missing one byte.",{"type":205,"tag":850,"props":851,"children":853},"info",{"title":852},"The press timestamps in #6293 are not a double-click detector",[854,858,860,865,867,872,874,879,881,886,888,893,895,900,902,907,909,914],{"type":205,"tag":213,"props":855,"children":856},{},[857],{"type":210,"value":762},{"type":210,"value":859}," does keep press timestamps — offsets ",{"type":205,"tag":213,"props":861,"children":862},{},[863],{"type":210,"value":864},"+44",{"type":210,"value":866}," and ",{"type":205,"tag":213,"props":868,"children":869},{},[870],{"type":210,"value":871},"+51",{"type":210,"value":873}," save the previous\npress time, ",{"type":205,"tag":213,"props":875,"children":876},{},[877],{"type":210,"value":878},"+213",{"type":210,"value":880}," stamps the current one, and ",{"type":205,"tag":213,"props":882,"children":883},{},[884],{"type":210,"value":885},"#6290",{"type":210,"value":887}," returns the difference.\nBut the only consumers are three ",{"type":205,"tag":213,"props":889,"children":890},{},[891],{"type":210,"value":892},"FrGamepad",{"type":210,"value":894}," functions comparing against\n",{"type":205,"tag":213,"props":896,"children":897},{},[898],{"type":210,"value":899},"i32.const 2001",{"type":210,"value":901},", which is an idle check (\"did the player use the mouse\nrecently\"). Nothing in ",{"type":205,"tag":213,"props":903,"children":904},{},[905],{"type":210,"value":906},"FrMouse.cpp",{"type":210,"value":908}," does time arithmetic; every ",{"type":205,"tag":213,"props":910,"children":911},{},[912],{"type":210,"value":913},"i32.sub",{"type":210,"value":915}," in\nthat file is stack-frame setup or list-pointer math. We chased this lead so\nyou don't have to.",{"type":205,"tag":258,"props":917,"children":919},{"id":918},"expected-behaviour",[920],{"type":210,"value":921},"Expected behaviour",{"type":205,"tag":206,"props":923,"children":924},{},[925,929,931,936,938,942,944,949],{"type":205,"tag":213,"props":926,"children":927},{},[928],{"type":210,"value":224},{"type":210,"value":930}," in ",{"type":205,"tag":213,"props":932,"children":933},{},[934],{"type":210,"value":935},"Gw.jspi.js",{"type":210,"value":937}," marshals ",{"type":205,"tag":213,"props":939,"children":940},{},[941],{"type":210,"value":231},{"type":210,"value":943},", and the\nmousedown callback sets the double-click bit at record offset 16 when the\nclick count is even — the same condition Windows uses to raise\n",{"type":205,"tag":213,"props":945,"children":946},{},[947],{"type":210,"value":948},"WM_LBUTTONDBLCLK",{"type":210,"value":950},".",{"type":205,"tag":206,"props":952,"children":953},{},[954,956,960,962,967,969,973],{"type":210,"value":955},"Nothing after that byte needs to change: ",{"type":205,"tag":213,"props":957,"children":958},{},[959],{"type":210,"value":906},{"type":210,"value":961},", ",{"type":205,"tag":213,"props":963,"children":964},{},[965],{"type":210,"value":966},"#829",{"type":210,"value":968},", and ",{"type":205,"tag":213,"props":970,"children":971},{},[972],{"type":210,"value":762},{"type":210,"value":974},"\nalready do the right thing.",{"type":205,"tag":258,"props":976,"children":978},{"id":977},"proposed-change",[979],{"type":210,"value":980},"Proposed change",{"type":205,"tag":265,"props":982,"children":984},{"language":983,"class":267,"tabindex":268},"js",[985],{"type":205,"tag":213,"props":986,"children":988},{"class":987},"language-js",[989,998,999,1007,1008],{"type":205,"tag":275,"props":990,"children":991},{"class":277,"style":278},[992],{"type":205,"tag":275,"props":993,"children":995},{"style":994},"color:#008000;--shiki-dark:#6A9955",[996],{"type":210,"value":997},"\u002F\u002F Gw.jspi.js, fillMouseEventData",{"type":210,"value":286},{"type":205,"tag":275,"props":1000,"children":1001},{"class":277,"style":278},[1002],{"type":205,"tag":275,"props":1003,"children":1004},{"style":994},[1005],{"type":210,"value":1006},"\u002F\u002F Add one field to the marshalled struct.",{"type":210,"value":286},{"type":205,"tag":275,"props":1009,"children":1010},{"class":277,"style":278},[1011,1017,1023,1029,1034,1040,1045,1049,1054,1059,1063,1068],{"type":205,"tag":275,"props":1012,"children":1014},{"style":1013},"color:#0070C1;--shiki-dark:#4FC1FF",[1015],{"type":210,"value":1016},"HEAP32",{"type":205,"tag":275,"props":1018,"children":1020},{"style":1019},"color:#000000;--shiki-dark:#D4D4D4",[1021],{"type":210,"value":1022},"[(",{"type":205,"tag":275,"props":1024,"children":1026},{"style":1025},"color:#001080;--shiki-dark:#9CDCFE",[1027],{"type":210,"value":1028},"ptr",{"type":205,"tag":275,"props":1030,"children":1031},{"style":1019},[1032],{"type":210,"value":1033}," + ",{"type":205,"tag":275,"props":1035,"children":1037},{"style":1036},"color:#098658;--shiki-dark:#B5CEA8",[1038],{"type":210,"value":1039},"48",{"type":205,"tag":275,"props":1041,"children":1042},{"style":1019},[1043],{"type":210,"value":1044},") >> ",{"type":205,"tag":275,"props":1046,"children":1047},{"style":1036},[1048],{"type":210,"value":56},{"type":205,"tag":275,"props":1050,"children":1051},{"style":1019},[1052],{"type":210,"value":1053},"] = ",{"type":205,"tag":275,"props":1055,"children":1056},{"style":1025},[1057],{"type":210,"value":1058},"e",{"type":205,"tag":275,"props":1060,"children":1061},{"style":1019},[1062],{"type":210,"value":950},{"type":205,"tag":275,"props":1064,"children":1065},{"style":1025},[1066],{"type":210,"value":1067},"detail",{"type":205,"tag":275,"props":1069,"children":1070},{"style":1019},[1071],{"type":210,"value":1072},";",{"type":205,"tag":265,"props":1074,"children":1076},{"language":1075,"class":566,"tabindex":268},"c",[1077],{"type":205,"tag":213,"props":1078,"children":1080},{"class":1079},"language-c",[1081],{"type":210,"value":1082},"\u002F\u002F Base\u002FOs\u002FEmscripten\u002FEmscriptenInput.cpp, the mousedown callback (#2448)\n\u002F\u002F After the existing writes:\nrec[16] = (mouseEvent->detail % 2 == 0) ? 1 : 0;",{"type":205,"tag":206,"props":1084,"children":1085},{},[1086],{"type":210,"value":1087},"The field offsets above are ours, from the module. Use your own names.",{"type":205,"tag":258,"props":1089,"children":1091},{"id":1090},"acceptance-criteria",[1092],{"type":210,"value":1093},"Acceptance criteria",{"type":205,"tag":1095,"props":1096,"children":1097},"ul",{},[1098,1104,1109,1126,1131,1136,1141],{"type":205,"tag":1099,"props":1100,"children":1101},"li",{},[1102],{"type":210,"value":1103},"A deliberate double-click on an inventory item uses the item.",{"type":205,"tag":1099,"props":1105,"children":1106},{},[1107],{"type":210,"value":1108},"A deliberate double-click on a party member opens the correct panel.",{"type":205,"tag":1099,"props":1110,"children":1111},{},[1112,1114,1119,1121,1125],{"type":210,"value":1113},"The client delivers exactly ",{"type":205,"tag":238,"props":1115,"children":1116},{},[1117],{"type":210,"value":1118},"two",{"type":210,"value":1120}," clicks for one double-click. The second\nclick carries ",{"type":205,"tag":213,"props":1122,"children":1123},{},[1124],{"type":210,"value":645},{"type":210,"value":950},{"type":205,"tag":1099,"props":1127,"children":1128},{},[1129],{"type":210,"value":1130},"Two slow single clicks on the same position deliver two clicks, and neither\ncarries the flag.",{"type":205,"tag":1099,"props":1132,"children":1133},{},[1134],{"type":210,"value":1135},"The behaviour follows the double-click preference of the operating system,\nas it does on Windows.",{"type":205,"tag":1099,"props":1137,"children":1138},{},[1139],{"type":210,"value":1140},"A single click delivers one click with no flag.",{"type":205,"tag":1099,"props":1142,"children":1143},{},[1144,1146,1150],{"type":210,"value":1145},"The pointer mode stays ",{"type":205,"tag":213,"props":1147,"children":1148},{},[1149],{"type":210,"value":268},{"type":210,"value":1151}," for all mouse input.",{"type":205,"tag":258,"props":1153,"children":1155},{"id":1154},"why-we-removed-our-own-tap-based-workaround",[1156],{"type":210,"value":1157},"Why we removed our own tap-based workaround",{"type":205,"tag":206,"props":1159,"children":1160},{},[1161],{"type":210,"value":1162},"Before build 2026.8, our host synthesised a pair of touch taps to fake a\ndouble-click. We measured what that costs and deleted it.",{"type":205,"tag":206,"props":1164,"children":1165},{},[1166,1168,1173,1175,1179,1181,1185,1187,1191,1193,1198],{"type":210,"value":1167},"A tap is not a hint. ",{"type":205,"tag":213,"props":1169,"children":1170},{},[1171],{"type":210,"value":1172},"#6614",{"type":210,"value":1174}," calls ",{"type":205,"tag":213,"props":1176,"children":1177},{},[1178],{"type":210,"value":826},{"type":210,"value":1180}," once per tap, and ",{"type":205,"tag":213,"props":1182,"children":1183},{},[1184],{"type":210,"value":826},{"type":210,"value":1186}," ends in\n",{"type":205,"tag":213,"props":1188,"children":1189},{},[1190],{"type":210,"value":525},{"type":210,"value":1192}," — the one click-delivery routine. So one synthesised double-click\ndelivers ",{"type":205,"tag":238,"props":1194,"children":1195},{},[1196],{"type":210,"value":1197},"four",{"type":210,"value":1199}," clicks where the Windows client delivers two:",{"type":205,"tag":608,"props":1201,"children":1202},{},[1203,1226],{"type":205,"tag":612,"props":1204,"children":1205},{},[1206],{"type":205,"tag":616,"props":1207,"children":1208},{},[1209,1214,1219],{"type":205,"tag":620,"props":1210,"children":1211},{},[1212],{"type":210,"value":1213},"Source",{"type":205,"tag":620,"props":1215,"children":1216},{},[1217],{"type":210,"value":1218},"Delivered by",{"type":205,"tag":620,"props":1220,"children":1221},{},[1222],{"type":205,"tag":213,"props":1223,"children":1224},{},[1225],{"type":210,"value":645},{"type":205,"tag":631,"props":1227,"children":1228},{},[1229,1253,1277,1301],{"type":205,"tag":616,"props":1230,"children":1231},{},[1232,1237,1249],{"type":205,"tag":638,"props":1233,"children":1234},{},[1235],{"type":210,"value":1236},"The first press of the player",{"type":205,"tag":638,"props":1238,"children":1239},{},[1240,1244,1245],{"type":205,"tag":213,"props":1241,"children":1242},{},[1243],{"type":210,"value":762},{"type":210,"value":555},{"type":205,"tag":213,"props":1246,"children":1247},{},[1248],{"type":210,"value":525},{"type":205,"tag":638,"props":1250,"children":1251},{},[1252],{"type":210,"value":268},{"type":205,"tag":616,"props":1254,"children":1255},{},[1256,1261,1273],{"type":205,"tag":638,"props":1257,"children":1258},{},[1259],{"type":210,"value":1260},"The second press of the player",{"type":205,"tag":638,"props":1262,"children":1263},{},[1264,1268,1269],{"type":205,"tag":213,"props":1265,"children":1266},{},[1267],{"type":210,"value":762},{"type":210,"value":555},{"type":205,"tag":213,"props":1270,"children":1271},{},[1272],{"type":210,"value":525},{"type":205,"tag":638,"props":1274,"children":1275},{},[1276],{"type":210,"value":268},{"type":205,"tag":616,"props":1278,"children":1279},{},[1280,1285,1297],{"type":205,"tag":638,"props":1281,"children":1282},{},[1283],{"type":210,"value":1284},"Synthetic tap 1",{"type":205,"tag":638,"props":1286,"children":1287},{},[1288,1292,1293],{"type":205,"tag":213,"props":1289,"children":1290},{},[1291],{"type":210,"value":826},{"type":210,"value":555},{"type":205,"tag":213,"props":1294,"children":1295},{},[1296],{"type":210,"value":525},{"type":205,"tag":638,"props":1298,"children":1299},{},[1300],{"type":210,"value":268},{"type":205,"tag":616,"props":1302,"children":1303},{},[1304,1309,1321],{"type":205,"tag":638,"props":1305,"children":1306},{},[1307],{"type":210,"value":1308},"Synthetic tap 2",{"type":205,"tag":638,"props":1310,"children":1311},{},[1312,1316,1317],{"type":205,"tag":213,"props":1313,"children":1314},{},[1315],{"type":210,"value":826},{"type":210,"value":555},{"type":205,"tag":213,"props":1318,"children":1319},{},[1320],{"type":210,"value":525},{"type":205,"tag":638,"props":1322,"children":1323},{},[1324],{"type":210,"value":7},{"type":205,"tag":206,"props":1326,"children":1327},{},[1328,1330,1334,1336,1341,1343,1349],{"type":210,"value":1329},"On top of the extra clicks, ",{"type":205,"tag":213,"props":1331,"children":1332},{},[1333],{"type":210,"value":826},{"type":210,"value":1335}," warps the cursor to the tap position,\nforce-releases captured buttons, switches the pointer mode to touch until the\nnext real press, and enters the drag machinery through ",{"type":205,"tag":213,"props":1337,"children":1338},{},[1339],{"type":210,"value":1340},"#6273",{"type":210,"value":1342}," — the cause of\n",{"type":205,"tag":1344,"props":1345,"children":1346},"em",{},[1347],{"type":210,"value":1348},"\"a double-click in my inventory moves the item to a random slot\"",{"type":210,"value":1350},". Any widget\nthat acts on a plain click gets two extra activations per deliberate\ndouble-click, and no holdback timer can change that. Only the client-side flag\nremoves the extra clicks.",{"type":205,"tag":258,"props":1352,"children":1354},{"id":1353},"supporting-negatives",[1355],{"type":210,"value":1356},"Supporting negatives",{"type":205,"tag":206,"props":1358,"children":1359},{},[1360,1362,1367,1369,1374,1376,1381,1382,1387,1389,1394],{"type":210,"value":1361},"The seventeen ",{"type":205,"tag":213,"props":1363,"children":1364},{},[1365],{"type":210,"value":1366},"emscripten_set_*_callback",{"type":210,"value":1368}," imports include no\n",{"type":205,"tag":213,"props":1370,"children":1371},{},[1372],{"type":210,"value":1373},"emscripten_set_dblclick_callback",{"type":210,"value":1375},", and the strings ",{"type":205,"tag":213,"props":1377,"children":1378},{},[1379],{"type":210,"value":1380},"dblclick",{"type":210,"value":961},{"type":205,"tag":213,"props":1383,"children":1384},{},[1385],{"type":210,"value":1386},"clickCount",{"type":210,"value":1388},",\nand ",{"type":205,"tag":213,"props":1390,"children":1391},{},[1392],{"type":210,"value":1393},"DblClick",{"type":210,"value":1395}," occur nowhere in the binary.",{"type":205,"tag":258,"props":1397,"children":1399},{"id":1398},"how-to-reproduce",[1400],{"type":210,"value":1401},"How to reproduce",{"type":205,"tag":206,"props":1403,"children":1404},{},[1405],{"type":210,"value":1406},"No host change is needed.",{"type":205,"tag":1408,"props":1409,"children":1411},"steps",{"mode":1410},"numbered",[1412,1419,1442,1448,1467,1473],{"type":205,"tag":1413,"props":1414,"children":1416},"h3",{"id":1415},"how-to-reproduce-read-the-glue",[1417],{"type":210,"value":1418},"Read the glue",{"type":205,"tag":206,"props":1420,"children":1421},{},[1422,1424,1428,1429,1433,1435,1440],{"type":210,"value":1423},"Instrument ",{"type":205,"tag":213,"props":1425,"children":1426},{},[1427],{"type":210,"value":224},{"type":210,"value":930},{"type":205,"tag":213,"props":1430,"children":1431},{},[1432],{"type":210,"value":935},{"type":210,"value":1434},". The file reads ",{"type":205,"tag":213,"props":1436,"children":1437},{},[1438],{"type":210,"value":1439},"e.detail",{"type":210,"value":1441},"\nnowhere.",{"type":205,"tag":1413,"props":1443,"children":1445},{"id":1444},"how-to-reproduce-decode-the-callback",[1446],{"type":210,"value":1447},"Decode the callback",{"type":205,"tag":206,"props":1449,"children":1450},{},[1451,1453,1458,1460,1465],{"type":210,"value":1452},"Decode ",{"type":205,"tag":213,"props":1454,"children":1455},{},[1456],{"type":210,"value":1457},"#2448",{"type":210,"value":1459},". ",{"type":205,"tag":213,"props":1461,"children":1462},{},[1463],{"type":210,"value":1464},"#267",{"type":210,"value":1466}," zeroes the 24-byte record. The callback writes four\nfields. Offset 16 is not one of them.",{"type":205,"tag":1413,"props":1468,"children":1470},{"id":1469},"how-to-reproduce-decode-the-consumer",[1471],{"type":210,"value":1472},"Decode the consumer",{"type":205,"tag":206,"props":1474,"children":1475},{},[1476,1477,1481,1483,1487,1489,1493],{"type":210,"value":1452},{"type":205,"tag":213,"props":1478,"children":1479},{},[1480],{"type":210,"value":762},{"type":210,"value":1482},". It reads ",{"type":205,"tag":213,"props":1484,"children":1485},{},[1486],{"type":210,"value":775},{"type":210,"value":1488}," and passes the value to ",{"type":205,"tag":213,"props":1490,"children":1491},{},[1492],{"type":210,"value":525},{"type":210,"value":950},{"type":205,"tag":258,"props":1495,"children":1497},{"id":1496},"our-workaround-today",[1498],{"type":210,"value":1499},"Our workaround today",{"type":205,"tag":206,"props":1501,"children":1502},{},[1503,1505,1510],{"type":210,"value":1504},"The host appends one exported mutable ",{"type":205,"tag":213,"props":1506,"children":1507},{},[1508],{"type":210,"value":1509},"i32",{"type":210,"value":1511}," global to the module, then splices\nthree instructions into the mousedown callback:",{"type":205,"tag":265,"props":1513,"children":1514},{"language":565,"class":566,"tabindex":268},[1515],{"type":205,"tag":213,"props":1516,"children":1517},{"class":570},[1518],{"type":210,"value":1519},"local.get 3          ;; the frame pointer that holds the record\nglobal.get $flag     ;; what the host wrote before this press\ni32.store offset=24  ;; record+16, the word that #829 copies into msg[4]",{"type":205,"tag":206,"props":1521,"children":1522},{},[1523],{"type":210,"value":1524},"The host writes the Chromium click count into the global on every trusted\npress, so the client receives what Windows receives, under the player's\ndouble-click preference. The transform adds no function and moves no index or\ntable entry — but it still has to be certified for every new build. One\nmarshalled field in the glue retires it.",{"title":1526,"searchDepth":1527,"depth":1527,"links":1528},"",4,[1529,1531,1532,1533,1534,1535,1536,1542],{"id":260,"depth":1530,"text":263},2,{"id":918,"depth":1530,"text":921},{"id":977,"depth":1530,"text":980},{"id":1090,"depth":1530,"text":1093},{"id":1154,"depth":1530,"text":1157},{"id":1353,"depth":1530,"text":1356},{"id":1398,"depth":1530,"text":1401,"children":1537},[1538,1540,1541],{"id":1415,"depth":1539,"text":1418},3,{"id":1444,"depth":1539,"text":1447},{"id":1469,"depth":1539,"text":1472},{"id":1496,"depth":1530,"text":1499},"markdown","docs",{"source":1546,"path":1547,"stem":1548,"dir":1549,"extension":1550},"content","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F1.double-click-flag.md","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F1.double-click-flag","input","md",{"requestedPath":131,"resolvedPath":131,"alternates":1552},[1553],{"locale":8,"path":131,"source":1554},"variant",{"requested":1556,"resolved":1557,"usedFallback":6},{"locale":8},{"locale":8},{"previous":1559,"next":1561},{"title":114,"id":115,"canonicalKey":116,"locale":8,"draft":6,"navigation":1560,"path":119},{"title":114},{"title":133,"id":134,"canonicalKey":135,"locale":8,"draft":6,"navigation":1562,"path":138},{"title":133},{"left":1564,"top":1564,"width":1565,"height":1565,"rotate":1564,"vFlip":6,"hFlip":6,"body":1566},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5\"\u002F>\u003C\u002Fg>",{"left":1564,"top":1564,"width":1565,"height":1565,"rotate":1564,"vFlip":6,"hFlip":6,"body":1568},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",{"left":1564,"top":1564,"width":1565,"height":1565,"rotate":1564,"vFlip":6,"hFlip":6,"body":1570,"hidden":1571},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"\u002F>\u003Cpath d=\"M14 2v4a2 2 0 0 0 2 2h4m-10 4a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1a1 1 0 0 1 1 1v1a1 1 0 0 0 1 1m4 0a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1a1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\"\u002F>\u003C\u002Fg>",true,1786362928198]