[{"data":1,"prerenderedAt":1082},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:uQgYHB7e9X_tI6r4IX5X4wp6e5v9n6bCeefncdqPRLc":195,"content-page-surround:docs:uQgYHB7e9X_tI6r4IX5X4wp6e5v9n6bCeefncdqPRLc":1071,"i-lucide:file":1076,"i-lucide:clipboard":1080},[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":137,"updated":199,"navigation":200,"body":201,"type":1056,"id":134,"canonicalKey":135,"draft":6,"partial":6,"locale":8,"collection":1057,"navigationFile":6,"file":1058,"route":1064,"resolution":1068},"UR-08: every printable key is labelled one position too high","docs\u002Fupstream\u002Finput\u002Fkey-labels","The Controls panel names the next character in ASCII order. A control bound to K reads L. Input is correct; only the label is wrong.","2026-08-04",{"title":133},{"type":202,"children":203,"toc":1034},"root",[204,246,272,282,293,300,305,478,494,500,505,567,572,577,583,608,614,626,639,677,682,688,693,733,751,762,809,815,820,826,893,899,1002,1007,1013,1018,1023,1029],{"type":205,"tag":206,"props":207,"children":208},"element","p",{},[209,212,218,220,226,228,233,235,239,240,244],{"type":210,"value":211},"text","The Controls panel and the in-game menus name the wrong key for every binding\nthat uses a printable character. The label shows the ",{"type":205,"tag":213,"props":214,"children":215},"strong",{},[216],{"type":210,"value":217},"next character in ASCII\norder",{"type":210,"value":219},": a control bound to ",{"type":205,"tag":221,"props":222,"children":223},"code",{},[224],{"type":210,"value":225},"K",{"type":210,"value":227}," reads ",{"type":205,"tag":221,"props":229,"children":230},{},[231],{"type":210,"value":232},"L",{"type":210,"value":234},", a control bound to ",{"type":205,"tag":221,"props":236,"children":237},{},[238],{"type":210,"value":7},{"type":210,"value":227},{"type":205,"tag":221,"props":241,"children":242},{},[243],{"type":210,"value":56},{"type":210,"value":245},".",{"type":205,"tag":206,"props":247,"children":248},{},[249,251,256,258,263,265,270],{"type":210,"value":250},"Input itself is correct — the key that works is the right key and matches the\nWindows client, and the bindings on the account are fine. The defect is in the\ncode that renders a key id as text. Keys that have a name — ",{"type":205,"tag":221,"props":252,"children":253},{},[254],{"type":210,"value":255},"Up Arrow",{"type":210,"value":257},",\n",{"type":205,"tag":221,"props":259,"children":260},{},[261],{"type":210,"value":262},"Escape",{"type":210,"value":264},", ",{"type":205,"tag":221,"props":266,"children":267},{},[268],{"type":210,"value":269},"Tab",{"type":210,"value":271},", the function keys — are labelled correctly.",{"type":205,"tag":206,"props":273,"children":274},{},[275,280],{"type":205,"tag":213,"props":276,"children":277},{},[278],{"type":210,"value":279},"Fix:",{"type":210,"value":281}," low effort once the render function is found — with symbols that\nshould take minutes. Small blast radius: display text only, input handling\ndoesn't change.",{"type":205,"tag":206,"props":283,"children":284},{},[285,287,292],{"type":210,"value":286},"Build used for the measurements below: 38797,\n",{"type":205,"tag":221,"props":288,"children":289},{},[290],{"type":210,"value":291},"3229678d3fd7d2f0e309530086a614d97f02e7eeb3ca12650ababfd2eb360817",{"type":210,"value":245},{"type":205,"tag":294,"props":295,"children":297},"h2",{"id":296},"what-the-player-sees",[298],{"type":210,"value":299},"What the player sees",{"type":205,"tag":206,"props":301,"children":302},{},[303],{"type":210,"value":304},"Observed with default bindings, in Options → Control:",{"type":205,"tag":306,"props":307,"children":308},"table",{},[309,333],{"type":205,"tag":310,"props":311,"children":312},"thead",{},[313],{"type":205,"tag":314,"props":315,"children":316},"tr",{},[317,323,328],{"type":205,"tag":318,"props":319,"children":320},"th",{},[321],{"type":210,"value":322},"Action",{"type":205,"tag":318,"props":324,"children":325},{},[326],{"type":210,"value":327},"Key that works",{"type":205,"tag":318,"props":329,"children":330},{},[331],{"type":210,"value":332},"Label shown",{"type":205,"tag":334,"props":335,"children":336},"tbody",{},[337,359,379,398,418,438,457],{"type":205,"tag":314,"props":338,"children":339},{},[340,346,351],{"type":205,"tag":341,"props":342,"children":343},"td",{},[344],{"type":210,"value":345},"Panel: Open Hero",{"type":205,"tag":341,"props":347,"children":348},{},[349],{"type":210,"value":350},"H",{"type":205,"tag":341,"props":352,"children":353},{},[354],{"type":205,"tag":221,"props":355,"children":356},{},[357],{"type":210,"value":358},"I",{"type":205,"tag":314,"props":360,"children":361},{},[362,367,371],{"type":205,"tag":341,"props":363,"children":364},{},[365],{"type":210,"value":366},"Panel: Open Inventory",{"type":205,"tag":341,"props":368,"children":369},{},[370],{"type":210,"value":358},{"type":205,"tag":341,"props":372,"children":373},{},[374],{"type":205,"tag":221,"props":375,"children":376},{},[377],{"type":210,"value":378},"J",{"type":205,"tag":314,"props":380,"children":381},{},[382,387,391],{"type":205,"tag":341,"props":383,"children":384},{},[385],{"type":210,"value":386},"Panel: Open Skills and Attributes",{"type":205,"tag":341,"props":388,"children":389},{},[390],{"type":210,"value":225},{"type":205,"tag":341,"props":392,"children":393},{},[394],{"type":205,"tag":221,"props":395,"children":396},{},[397],{"type":210,"value":232},{"type":205,"tag":314,"props":399,"children":400},{},[401,406,410],{"type":205,"tag":341,"props":402,"children":403},{},[404],{"type":210,"value":405},"Panel: Open Quest Log",{"type":205,"tag":341,"props":407,"children":408},{},[409],{"type":210,"value":232},{"type":205,"tag":341,"props":411,"children":412},{},[413],{"type":205,"tag":221,"props":414,"children":415},{},[416],{"type":210,"value":417},"M",{"type":205,"tag":314,"props":419,"children":420},{},[421,426,430],{"type":205,"tag":341,"props":422,"children":423},{},[424],{"type":210,"value":425},"Panel: Open World Map",{"type":205,"tag":341,"props":427,"children":428},{},[429],{"type":210,"value":417},{"type":205,"tag":341,"props":431,"children":432},{},[433],{"type":205,"tag":221,"props":434,"children":435},{},[436],{"type":210,"value":437},"N",{"type":205,"tag":314,"props":439,"children":440},{},[441,446,450],{"type":205,"tag":341,"props":442,"children":443},{},[444],{"type":210,"value":445},"Action: Use Skill 1",{"type":205,"tag":341,"props":447,"children":448},{},[449],{"type":210,"value":7},{"type":205,"tag":341,"props":451,"children":452},{},[453],{"type":205,"tag":221,"props":454,"children":455},{},[456],{"type":210,"value":56},{"type":205,"tag":314,"props":458,"children":459},{},[460,465,470],{"type":205,"tag":341,"props":461,"children":462},{},[463],{"type":210,"value":464},"Movement: Move Forward",{"type":205,"tag":341,"props":466,"children":467},{},[468],{"type":210,"value":469},"W",{"type":205,"tag":341,"props":471,"children":472},{},[473],{"type":205,"tag":221,"props":474,"children":475},{},[476],{"type":210,"value":477},"X",{"type":205,"tag":206,"props":479,"children":480},{},[481,483,487,489,493],{"type":210,"value":482},"A player reads the menu, presses the key it names, and gets the adjacent\naction. \"Hero (I)\" opens the Inventory, because ",{"type":205,"tag":221,"props":484,"children":485},{},[486],{"type":210,"value":358},{"type":210,"value":488}," is the Inventory key, and\nthe Inventory label reads ",{"type":205,"tag":221,"props":490,"children":491},{},[492],{"type":210,"value":378},{"type":210,"value":245},{"type":205,"tag":294,"props":495,"children":497},{"id":496},"the-measurement-that-isolates-the-defect",[498],{"type":210,"value":499},"The measurement that isolates the defect",{"type":205,"tag":206,"props":501,"children":502},{},[503],{"type":210,"value":504},"One row of the Controls panel, with two keys bound to the same action:",{"type":205,"tag":306,"props":506,"children":507},{},[508,528],{"type":205,"tag":310,"props":509,"children":510},{},[511],{"type":205,"tag":314,"props":512,"children":513},{},[514,518,523],{"type":205,"tag":318,"props":515,"children":516},{},[517],{"type":210,"value":322},{"type":205,"tag":318,"props":519,"children":520},{},[521],{"type":210,"value":522},"Bound key",{"type":205,"tag":318,"props":524,"children":525},{},[526],{"type":210,"value":527},"Rendered",{"type":205,"tag":334,"props":529,"children":530},{},[531,549],{"type":205,"tag":314,"props":532,"children":533},{},[534,538,542],{"type":205,"tag":341,"props":535,"children":536},{},[537],{"type":210,"value":464},{"type":205,"tag":341,"props":539,"children":540},{},[541],{"type":210,"value":255},{"type":205,"tag":341,"props":543,"children":544},{},[545],{"type":205,"tag":221,"props":546,"children":547},{},[548],{"type":210,"value":255},{"type":205,"tag":314,"props":550,"children":551},{},[552,556,560],{"type":205,"tag":341,"props":553,"children":554},{},[555],{"type":210,"value":464},{"type":205,"tag":341,"props":557,"children":558},{},[559],{"type":210,"value":469},{"type":205,"tag":341,"props":561,"children":562},{},[563],{"type":205,"tag":221,"props":564,"children":565},{},[566],{"type":210,"value":477},{"type":205,"tag":206,"props":568,"children":569},{},[570],{"type":210,"value":571},"Same action, same binding record, same panel, same draw — and one of the two\nlabels is correct. That rules out the binding data, the stored configuration,\nthe keyboard layout, and any web-vs-Windows binding difference, because none\nof those can differ between two keys inside one record.",{"type":205,"tag":206,"props":573,"children":574},{},[575],{"type":210,"value":576},"The defect sits after the binding read, in the render step, and only for keys\nthat render as a character.",{"type":205,"tag":294,"props":578,"children":580},{"id":579},"scope",[581],{"type":210,"value":582},"Scope",{"type":205,"tag":584,"props":585,"children":586},"ul",{},[587,593,598,603],{"type":205,"tag":588,"props":589,"children":590},"li",{},[591],{"type":210,"value":592},"Letters and digits are both affected, by the same one position.",{"type":205,"tag":588,"props":594,"children":595},{},[596],{"type":210,"value":597},"Named keys are not affected. Those names come from the localized text, so a\nnumber cannot produce them.",{"type":205,"tag":588,"props":599,"children":600},{},[601],{"type":210,"value":602},"The defect is independent of the keyboard layout. We reproduced it on US\nQWERTY and on German QWERTZ, identically.",{"type":205,"tag":588,"props":604,"children":605},{},[606],{"type":210,"value":607},"The defect is independent of the host. Our host forwards key events\nunchanged, and it does not participate in the label draw.",{"type":205,"tag":294,"props":609,"children":611},{"id":610},"the-key-descriptor-table",[612],{"type":210,"value":613},"The key descriptor table",{"type":205,"tag":206,"props":615,"children":616},{},[617,619,624],{"type":210,"value":618},"The table sits at ",{"type":205,"tag":221,"props":620,"children":621},{},[622],{"type":210,"value":623},"0x1456c0",{"type":210,"value":625}," in the data segment. The records are 20 bytes:",{"type":205,"tag":627,"props":628,"children":632},"pre",{"language":629,"class":630,"tabindex":631},"c","shiki dark:dark-plus","0",[633],{"type":205,"tag":221,"props":634,"children":636},{"class":635},"language-c",[637],{"type":210,"value":638},"{ int32 id; char name[16] }\n\nid  0..43   Alt Control Shift CapsLock Escape NumLock ... ArrowUp F1..F12\nid 48..57   0..9   plus a parallel table of shifted names  ) ! @ # $ % ^ & * (\nid 65..90   A..Z   plus a parallel table of lowercase names  a..z",{"type":205,"tag":206,"props":640,"children":641},{},[642,644,649,651,656,657,662,663,668,670,675],{"type":210,"value":643},"The names are DOM ",{"type":205,"tag":221,"props":645,"children":646},{},[647],{"type":210,"value":648},"KeyboardEvent.key",{"type":210,"value":650}," values — ",{"type":205,"tag":221,"props":652,"children":653},{},[654],{"type":210,"value":655},"ArrowUp",{"type":210,"value":264},{"type":205,"tag":221,"props":658,"children":659},{},[660],{"type":210,"value":661},"PageDown",{"type":210,"value":257},{"type":205,"tag":221,"props":664,"children":665},{},[666],{"type":210,"value":667},"HangulMode",{"type":210,"value":669},", with ",{"type":205,"tag":221,"props":671,"children":672},{},[673],{"type":210,"value":674},"Unidentified",{"type":210,"value":676}," as the fallback. This is the table that\nturns a browser key event into an internal id.",{"type":205,"tag":206,"props":678,"children":679},{},[680],{"type":210,"value":681},"The contents and the order of this table are correct. The defect is not in\nthis data.",{"type":205,"tag":294,"props":683,"children":685},{"id":684},"what-we-could-not-determine",[686],{"type":210,"value":687},"What we could not determine",{"type":205,"tag":206,"props":689,"children":690},{},[691],{"type":210,"value":692},"We did not locate the function that renders the label. Two readings of the\ntable stay consistent with every observation above, and they need different\ncorrections, so we state both.",{"type":205,"tag":694,"props":695,"children":697},"info",{"title":696},"Reading 1 — the ids are ASCII+1 and the label casts the id",[698,700,705,707,712,714,719,720,725,726,731],{"type":210,"value":699},"Frame the records from ",{"type":205,"tag":221,"props":701,"children":702},{},[703],{"type":210,"value":704},"0x1456c4",{"type":210,"value":706},", with the name first and the id at ",{"type":205,"tag":221,"props":708,"children":709},{},[710],{"type":210,"value":711},"+16",{"type":210,"value":713},".\nThe printable ids are then one above ASCII: ",{"type":205,"tag":221,"props":715,"children":716},{},[717],{"type":210,"value":718},"A = 66",{"type":210,"value":264},{"type":205,"tag":221,"props":721,"children":722},{},[723],{"type":210,"value":724},"H = 73",{"type":210,"value":264},{"type":205,"tag":221,"props":727,"children":728},{},[729],{"type":210,"value":730},"0 = 49",{"type":210,"value":732},". A\ncast to a character gives the observed labels exactly.",{"type":205,"tag":694,"props":734,"children":736},{"title":735},"Reading 2 — the ids are ASCII and the render indexes one record too far",[737,738,742,744,749],{"type":210,"value":699},{"type":205,"tag":221,"props":739,"children":740},{},[741],{"type":210,"value":623},{"type":210,"value":743},", with the id first. The ids are then exactly\nASCII. A read of ",{"type":205,"tag":221,"props":745,"children":746},{},[747],{"type":210,"value":748},"name",{"type":210,"value":750}," from the following record gives the observed labels\nexactly.",{"type":205,"tag":206,"props":752,"children":753},{},[754,756,760],{"type":210,"value":755},"Both readings explain every case in this report, including why ",{"type":205,"tag":221,"props":757,"children":758},{},[759],{"type":210,"value":255},{"type":210,"value":761},"\nstays correct. With symbols and source this question is immediate; from a\nstripped module it isn't.",{"type":205,"tag":206,"props":763,"children":764},{},[765,767,772,774,779,781,785,786,791,792,796,797,802,803,807],{"type":210,"value":766},"We did establish that ",{"type":205,"tag":213,"props":768,"children":769},{},[770],{"type":210,"value":771},"function #9718",{"type":210,"value":773}," converts a key id to a character with\nno offset: ",{"type":205,"tag":221,"props":775,"children":776},{},[777],{"type":210,"value":778},"75",{"type":210,"value":780}," gives ",{"type":205,"tag":221,"props":782,"children":783},{},[784],{"type":210,"value":225},{"type":210,"value":264},{"type":205,"tag":221,"props":787,"children":788},{},[789],{"type":210,"value":790},"76",{"type":210,"value":780},{"type":205,"tag":221,"props":793,"children":794},{},[795],{"type":210,"value":232},{"type":210,"value":264},{"type":205,"tag":221,"props":798,"children":799},{},[800],{"type":210,"value":801},"48",{"type":210,"value":780},{"type":205,"tag":221,"props":804,"children":805},{},[806],{"type":210,"value":631},{"type":210,"value":808},". Many functions in\nthe module do that identical conversion as a generic one-character string\nhelper, so the conversion is not where the extra one enters.",{"type":205,"tag":294,"props":810,"children":812},{"id":811},"expected-behaviour",[813],{"type":210,"value":814},"Expected behaviour",{"type":205,"tag":206,"props":816,"children":817},{},[818],{"type":210,"value":819},"The Controls panel and the in-game menus name the key that actually triggers\nthe action — for printable keys, the way it already works for named keys.",{"type":205,"tag":294,"props":821,"children":823},{"id":822},"acceptance-criteria",[824],{"type":210,"value":825},"Acceptance criteria",{"type":205,"tag":584,"props":827,"children":828},{},[829,846,862,878,883,888],{"type":205,"tag":588,"props":830,"children":831},{},[832,834,838,840,844],{"type":210,"value":833},"\"Panel: Open Hero\" shows ",{"type":205,"tag":221,"props":835,"children":836},{},[837],{"type":210,"value":350},{"type":210,"value":839},", and ",{"type":205,"tag":221,"props":841,"children":842},{},[843],{"type":210,"value":350},{"type":210,"value":845}," opens the Hero panel.",{"type":205,"tag":588,"props":847,"children":848},{},[849,851,855,856,860],{"type":210,"value":850},"\"Action: Use Skill 1\" shows ",{"type":205,"tag":221,"props":852,"children":853},{},[854],{"type":210,"value":7},{"type":210,"value":839},{"type":205,"tag":221,"props":857,"children":858},{},[859],{"type":210,"value":7},{"type":210,"value":861}," uses skill 1.",{"type":205,"tag":588,"props":863,"children":864},{},[865,867,871,873,877],{"type":210,"value":866},"\"Movement: Move Forward\" shows ",{"type":205,"tag":221,"props":868,"children":869},{},[870],{"type":210,"value":255},{"type":210,"value":872}," and ",{"type":205,"tag":221,"props":874,"children":875},{},[876],{"type":210,"value":469},{"type":210,"value":245},{"type":205,"tag":588,"props":879,"children":880},{},[881],{"type":210,"value":882},"The result is the same on US QWERTY and on German QWERTZ.",{"type":205,"tag":588,"props":884,"children":885},{},[886],{"type":210,"value":887},"A rebind to any printable key shows that key.",{"type":205,"tag":588,"props":889,"children":890},{},[891],{"type":210,"value":892},"Named keys keep their current correct labels.",{"type":205,"tag":294,"props":894,"children":896},{"id":895},"how-to-reproduce",[897],{"type":210,"value":898},"How to reproduce",{"type":205,"tag":900,"props":901,"children":903},"steps",{"mode":902},"numbered",[904,911,916,922,943,949,960,966,976,982],{"type":205,"tag":905,"props":906,"children":908},"h3",{"id":907},"how-to-reproduce-open-the-panel",[909],{"type":210,"value":910},"Open the panel",{"type":205,"tag":206,"props":912,"children":913},{},[914],{"type":210,"value":915},"Log in and open Options → Control.",{"type":205,"tag":905,"props":917,"children":919},{"id":918},"how-to-reproduce-read-a-row",[920],{"type":210,"value":921},"Read a row",{"type":205,"tag":206,"props":923,"children":924},{},[925,927,931,933,937,938,942],{"type":210,"value":926},"Select ",{"type":205,"tag":213,"props":928,"children":929},{},[930],{"type":210,"value":464},{"type":210,"value":932},". It shows ",{"type":205,"tag":221,"props":934,"children":935},{},[936],{"type":210,"value":255},{"type":210,"value":872},{"type":205,"tag":221,"props":939,"children":940},{},[941],{"type":210,"value":477},{"type":210,"value":245},{"type":205,"tag":905,"props":944,"children":946},{"id":945},"how-to-reproduce-press-the-labelled-key",[947],{"type":210,"value":948},"Press the labelled key",{"type":205,"tag":206,"props":950,"children":951},{},[952,954,958],{"type":210,"value":953},"Press ",{"type":205,"tag":221,"props":955,"children":956},{},[957],{"type":210,"value":477},{"type":210,"value":959}," in the game. The character does not move.",{"type":205,"tag":905,"props":961,"children":963},{"id":962},"how-to-reproduce-press-the-real-key",[964],{"type":210,"value":965},"Press the real key",{"type":205,"tag":206,"props":967,"children":968},{},[969,970,974],{"type":210,"value":953},{"type":205,"tag":221,"props":971,"children":972},{},[973],{"type":210,"value":469},{"type":210,"value":975},". The character moves forward.",{"type":205,"tag":905,"props":977,"children":979},{"id":978},"how-to-reproduce-check-a-digit",[980],{"type":210,"value":981},"Check a digit",{"type":205,"tag":206,"props":983,"children":984},{},[985,986,990,991,995,997,1001],{"type":210,"value":926},{"type":205,"tag":213,"props":987,"children":988},{},[989],{"type":210,"value":445},{"type":210,"value":932},{"type":205,"tag":221,"props":992,"children":993},{},[994],{"type":210,"value":56},{"type":210,"value":996},". Skill 1 fires on ",{"type":205,"tag":221,"props":998,"children":999},{},[1000],{"type":210,"value":7},{"type":210,"value":245},{"type":205,"tag":206,"props":1003,"children":1004},{},[1005],{"type":210,"value":1006},"No configuration change is needed. The defect is present with default\nbindings.",{"type":205,"tag":294,"props":1008,"children":1010},{"id":1009},"method-and-its-limit",[1011],{"type":210,"value":1012},"Method, and its limit",{"type":205,"tag":206,"props":1014,"children":1015},{},[1016],{"type":210,"value":1017},"For the file-system reports we called the functions and measured the results.\nWe couldn't do that here: the label render depends on an initialised UI and\ntext subsystem, so there's no way to call it from a cold instance.",{"type":205,"tag":206,"props":1019,"children":1020},{},[1021],{"type":210,"value":1022},"What we observe directly: the rendered labels, the keys that work, and the\ncontents of the descriptor table. What we infer: which of the two readings is\nthe real one.",{"type":205,"tag":294,"props":1024,"children":1026},{"id":1025},"our-workaround-today",[1027],{"type":210,"value":1028},"Our workaround today",{"type":205,"tag":206,"props":1030,"children":1031},{},[1032],{"type":210,"value":1033},"None. A correction would need a second permanent transform, re-derived for\nevery client build — too high a price for a wrong letter on a label. We report\nthe defect and wait.",{"title":1035,"searchDepth":1036,"depth":1036,"links":1037},"",4,[1038,1040,1041,1042,1043,1044,1045,1046,1054,1055],{"id":296,"depth":1039,"text":299},2,{"id":496,"depth":1039,"text":499},{"id":579,"depth":1039,"text":582},{"id":610,"depth":1039,"text":613},{"id":684,"depth":1039,"text":687},{"id":811,"depth":1039,"text":814},{"id":822,"depth":1039,"text":825},{"id":895,"depth":1039,"text":898,"children":1047},[1048,1050,1051,1052,1053],{"id":907,"depth":1049,"text":910},3,{"id":918,"depth":1049,"text":921},{"id":945,"depth":1049,"text":948},{"id":962,"depth":1049,"text":965},{"id":978,"depth":1049,"text":981},{"id":1009,"depth":1039,"text":1012},{"id":1025,"depth":1039,"text":1028},"markdown","docs",{"source":1059,"path":1060,"stem":1061,"dir":1062,"extension":1063},"content","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F2.key-labels.md","en\u002F1.docs\u002F3.upstream\u002F4.input\u002F2.key-labels","input","md",{"requestedPath":138,"resolvedPath":138,"alternates":1065},[1066],{"locale":8,"path":138,"source":1067},"variant",{"requested":1069,"resolved":1070,"usedFallback":6},{"locale":8},{"locale":8},{"previous":1072,"next":1074},{"title":127,"id":128,"canonicalKey":129,"locale":8,"draft":6,"navigation":1073,"path":131},{"title":127},{"title":140,"id":141,"canonicalKey":142,"locale":8,"draft":6,"navigation":1075,"path":145},{"title":140},{"left":1077,"top":1077,"width":1078,"height":1078,"rotate":1077,"vFlip":6,"hFlip":6,"body":1079},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":1077,"top":1077,"width":1078,"height":1078,"rotate":1077,"vFlip":6,"hFlip":6,"body":1081},"\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>",1786362928477]