1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2<html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 5 <title>File Index</title> 6 <link href="doxygen.css" rel="stylesheet" type="text/css"> 7 </head> 8 <body> 9<!-- Generated by Doxygen 1.7.4 --> 10 <div id="navrow1" class="tabs"> 11 <ul class="tablist"> 12 <li><a href="index.html"><span>Main Page</span></a></li> 13 <li><a href="annotated.html"><span>Data Structures</span></a></li> 14 <li class="current"><a href="files.html"><span>Files</span></a></li> 15 </ul> 16 </div> 17 <div id="navrow2" class="tabs2"> 18 <ul class="tablist"> 19 <li><a href="files.html"><span>File List</span></a></li> 20 <li><a href="globals.html"><span>Globals</span></a></li> 21 </ul> 22 </div> 23</div> 24<div id="side-nav" class="ui-resizable side-nav-resizable"> 25 <div id="nav-tree"> 26 <div id="nav-tree-contents"> 27 </div> 28 </div> 29 <div id="splitbar" style="-moz-user-select:none;" 30 class="ui-resizable-handle"> 31 </div> 32</div> 33<script type="text/javascript"> 34 initNavTree('lnx-keyboard_8h.html',''); 35</script> 36<div id="doc-content"> 37<div class="header"> 38 <div class="summary"> 39<a href="#func-members">Functions</a> </div> 40 <div class="headertitle"> 41<div class="title">lnx-keyboard.h File Reference</div> </div> 42</div> 43<div class="contents"> 44 45<p><a href="lnx-keyboard_8h_source.html">Go to the source code of this file.</a></p> 46<table class="memberdecls"> 47<tr><td colspan="2"><h2><a name="func-members"></a> 48Functions</h2></td></tr> 49<tr><td class="memItemLeft" align="right" valign="top">pointer </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#aaeba8e3220761201a64b5da3e2f85e52">kbdLinuxCreatePrivate</a> (DeviceIntPtr pKeyboard)</td></tr> 50<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a71f565aa8f6824d52f817dc4a5e504f7">kbdLinuxDestroyPrivate</a> (pointer private)</td></tr> 51<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a24c8cbb95ad1f21d590f57cdb22c25f4">kbdLinuxInit</a> (DevicePtr pDev)</td></tr> 52<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#ae65b4fd1c456532a438479b35228d4cf">kbdLinuxGetInfo</a> (DevicePtr pDev, <a class="el" href="struct__DMXLocalInitInfo.html">DMXLocalInitInfoPtr</a> info)</td></tr> 53<tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a541096c9032b400b6f7f8cc76c36f716">kbdLinuxOn</a> (DevicePtr pDev)</td></tr> 54<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a2f0498bfb85d9301b7bab802844b047d">kbdLinuxOff</a> (DevicePtr pDev)</td></tr> 55<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a50fd258e64aa03fd197af2a1a8306b32">kbdLinuxVTPreSwitch</a> (pointer p)</td></tr> 56<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a8c0e2439e4991b78f99c79e90f5e474d">kbdLinuxVTPostSwitch</a> (pointer p)</td></tr> 57<tr><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a11eda88b5082b0adaad1bbc723dae485">kbdLinuxVTSwitch</a> (pointer p, int vt, <a class="el" href="dmxinputinit_8h.html#adb9019a46004e627338bfb4a02800636">dmxVTSwitchReturnProcPtr</a> switch_return, pointer switch_return_data)</td></tr> 58<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a5c9ea7d8bd36c991d67988615ac57328">kbdLinuxRead</a> (DevicePtr pDev, <a class="el" href="dmxinputinit_8h.html#a1279820425966adabf5c77357e4a289c">dmxMotionProcPtr</a> motion, <a class="el" href="dmxinputinit_8h.html#adbd955b9ddbc5ffe38ff65e3f068f205">dmxEnqueueProcPtr</a> enqueue, <a class="el" href="dmxinputinit_8h.html#a838cb45fd92d5cf506e4179b601f7dbc">dmxCheckSpecialProcPtr</a> checkspecial, <a class="el" href="dmxinput_8h.html#a3a7195ab3516c5354bac4ca80b2eedb7">DMXBlockType</a> block)</td></tr> 59<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a278d93f44fccf1e642fa58c05bb2d06a">kbdLinuxCtrl</a> (DevicePtr pDev, KeybdCtrl *ctrl)</td></tr> 60<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="lnx-keyboard_8h.html#a0acb8c77b4bd032bda9aeb87a656b9e7">kbdLinuxBell</a> (DevicePtr pDev, int percent, int volume, int pitch, int duration)</td></tr> 61</table> 62<hr/><a name="details" id="details"></a><h2>Detailed Description</h2> 63<div class="textblock"><p>Interface to Linux keyboard driver. </p> 64<dl class="see"><dt><b>See also:</b></dt><dd><a class="el" href="lnx-keyboard_8c.html">lnx-keyboard.c</a> </dd></dl> 65</div><hr/><h2>Function Documentation</h2> 66<a class="anchor" id="a0acb8c77b4bd032bda9aeb87a656b9e7"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxBell" ref="a0acb8c77b4bd032bda9aeb87a656b9e7" args="(DevicePtr pDev, int percent, int volume, int pitch, int duration)" --> 67<div class="memitem"> 68<div class="memproto"> 69 <table class="memname"> 70 <tr> 71 <td class="memname">void kbdLinuxBell </td> 72 <td>(</td> 73 <td class="paramtype">DevicePtr </td> 74 <td class="paramname"><em>pDev</em>, </td> 75 </tr> 76 <tr> 77 <td class="paramkey"></td> 78 <td></td> 79 <td class="paramtype">int </td> 80 <td class="paramname"><em>percent</em>, </td> 81 </tr> 82 <tr> 83 <td class="paramkey"></td> 84 <td></td> 85 <td class="paramtype">int </td> 86 <td class="paramname"><em>volume</em>, </td> 87 </tr> 88 <tr> 89 <td class="paramkey"></td> 90 <td></td> 91 <td class="paramtype">int </td> 92 <td class="paramname"><em>pitch</em>, </td> 93 </tr> 94 <tr> 95 <td class="paramkey"></td> 96 <td></td> 97 <td class="paramtype">int </td> 98 <td class="paramname"><em>duration</em> </td> 99 </tr> 100 <tr> 101 <td></td> 102 <td>)</td> 103 <td></td><td></td> 104 </tr> 105 </table> 106</div> 107<div class="memdoc"> 108<p>Ring the bell.</p> 109<p>Note: we completely ignore the <em>volume</em>, since Linux's ioctl() interface does not provide a way to control it. If it did, the XBell manpage tells how the actual volume is a function of the percent and the (base) volume.</p> 110<p>Note that most of the other PC-based bell drivers compute the duration for KDMKTONE as a function of the volume and the duration. For some drivers, the duration is only measured in mS if the volume is 50, and is scaled by the volume for other values. This seems confusing and possibly incorrect (the xset man page says that the bell will be "as closely as it can to the user's specifications" -- if we ignore the volume and set the duration correctly, then we'll get one parameter "wrong" -- but if we use the volume to scale the duration, then we'll get both parameters "wrong"). </p> 111 112<p>References <a class="el" href="lnx-keyboard_8c.html#aacf069d346230dd96812d5395728eef2">GETPRIV</a>.</p> 113 114</div> 115</div> 116<a class="anchor" id="aaeba8e3220761201a64b5da3e2f85e52"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxCreatePrivate" ref="aaeba8e3220761201a64b5da3e2f85e52" args="(DeviceIntPtr pKeyboard)" --> 117<div class="memitem"> 118<div class="memproto"> 119 <table class="memname"> 120 <tr> 121 <td class="memname">pointer kbdLinuxCreatePrivate </td> 122 <td>(</td> 123 <td class="paramtype">DeviceIntPtr </td> 124 <td class="paramname"><em>pKeyboard</em></td><td>)</td> 125 <td></td> 126 </tr> 127 </table> 128</div> 129<div class="memdoc"> 130<p>Create a private structure for use within this file. </p> 131 132<p>References <a class="el" href="struct__myPrivate.html#a6b26eb0acc0b932c8dee8277501e6273">_myPrivate::fd</a>, and <a class="el" href="struct__myPrivate.html#a1f72c73bb97bf77b8f5359eabf81fb79">_myPrivate::pKeyboard</a>.</p> 133 134</div> 135</div> 136<a class="anchor" id="a278d93f44fccf1e642fa58c05bb2d06a"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxCtrl" ref="a278d93f44fccf1e642fa58c05bb2d06a" args="(DevicePtr pDev, KeybdCtrl *ctrl)" --> 137<div class="memitem"> 138<div class="memproto"> 139 <table class="memname"> 140 <tr> 141 <td class="memname">void kbdLinuxCtrl </td> 142 <td>(</td> 143 <td class="paramtype">DevicePtr </td> 144 <td class="paramname"><em>pDev</em>, </td> 145 </tr> 146 <tr> 147 <td class="paramkey"></td> 148 <td></td> 149 <td class="paramtype">KeybdCtrl * </td> 150 <td class="paramname"><em>ctrl</em> </td> 151 </tr> 152 <tr> 153 <td></td> 154 <td>)</td> 155 <td></td><td></td> 156 </tr> 157 </table> 158</div> 159<div class="memdoc"> 160<p>Set the LEDs. </p> 161 162<p>References <a class="el" href="lnx-keyboard_8c.html#aacf069d346230dd96812d5395728eef2">GETPRIV</a>.</p> 163 164</div> 165</div> 166<a class="anchor" id="a71f565aa8f6824d52f817dc4a5e504f7"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxDestroyPrivate" ref="a71f565aa8f6824d52f817dc4a5e504f7" args="(pointer private)" --> 167<div class="memitem"> 168<div class="memproto"> 169 <table class="memname"> 170 <tr> 171 <td class="memname">void kbdLinuxDestroyPrivate </td> 172 <td>(</td> 173 <td class="paramtype">pointer </td> 174 <td class="paramname"><em>priv</em></td><td>)</td> 175 <td></td> 176 </tr> 177 </table> 178</div> 179<div class="memdoc"> 180<p>Destroy a private structure. </p> 181 182</div> 183</div> 184<a class="anchor" id="ae65b4fd1c456532a438479b35228d4cf"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxGetInfo" ref="ae65b4fd1c456532a438479b35228d4cf" args="(DevicePtr pDev, DMXLocalInitInfoPtr info)" --> 185<div class="memitem"> 186<div class="memproto"> 187 <table class="memname"> 188 <tr> 189 <td class="memname">void kbdLinuxGetInfo </td> 190 <td>(</td> 191 <td class="paramtype">DevicePtr </td> 192 <td class="paramname"><em>pDev</em>, </td> 193 </tr> 194 <tr> 195 <td class="paramkey"></td> 196 <td></td> 197 <td class="paramtype"><a class="el" href="struct__DMXLocalInitInfo.html">DMXLocalInitInfoPtr</a> </td> 198 <td class="paramname"><em>info</em> </td> 199 </tr> 200 <tr> 201 <td></td> 202 <td>)</td> 203 <td></td><td></td> 204 </tr> 205 </table> 206</div> 207<div class="memdoc"> 208<p>Fill the <em>info</em> structure with information needed to initialize <em>pDev</em>. </p> 209 210<p>References <a class="el" href="struct__DMXLocalInitInfo.html#a24b09c34e0cf80ec33f093e908206be4">_DMXLocalInitInfo::focusClass</a>, <a class="el" href="struct__DMXLocalInitInfo.html#af19caac0e20a9106b73714c9c7991ce5">_DMXLocalInitInfo::kbdFeedbackClass</a>, <a class="el" href="lnx-keyboard_8c.html#ad3e8695c18469949e1ed00f7cd8055a5">kbdLinuxGetMap()</a>, <a class="el" href="struct__DMXLocalInitInfo.html#a214969f0843dcb70d8f7577f58bafa48">_DMXLocalInitInfo::keyboard</a>, <a class="el" href="struct__DMXLocalInitInfo.html#a06626a99542714bbd032e9e12a8c6b55">_DMXLocalInitInfo::keyClass</a>, <a class="el" href="struct__DMXLocalInitInfo.html#a02861e7e9c24381a229567d36e7a68b7">_DMXLocalInitInfo::keySyms</a>, and <a class="el" href="struct__DMXLocalInitInfo.html#a2e345080abf875ce6f85e63ed631cbcd">_DMXLocalInitInfo::modMap</a>.</p> 211 212</div> 213</div> 214<a class="anchor" id="a24c8cbb95ad1f21d590f57cdb22c25f4"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxInit" ref="a24c8cbb95ad1f21d590f57cdb22c25f4" args="(DevicePtr pDev)" --> 215<div class="memitem"> 216<div class="memproto"> 217 <table class="memname"> 218 <tr> 219 <td class="memname">void kbdLinuxInit </td> 220 <td>(</td> 221 <td class="paramtype">DevicePtr </td> 222 <td class="paramname"><em>pDev</em></td><td>)</td> 223 <td></td> 224 </tr> 225 </table> 226</div> 227<div class="memdoc"> 228<p>Initialize the <em>pDev</em> as a Linux keyboard. </p> 229 230<p>References <a class="el" href="lnx-keyboard_8c.html#a11bcea7c6bc7dbe400a3855f5b8676ce">FATAL1</a>, <a class="el" href="lnx-keyboard_8c.html#aacf069d346230dd96812d5395728eef2">GETPRIV</a>, and <a class="el" href="lnx-keyboard_8c.html#a583121fb5591debead8398c1626f2385">kbdLinuxOpenConsole()</a>.</p> 231 232</div> 233</div> 234<a class="anchor" id="a2f0498bfb85d9301b7bab802844b047d"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxOff" ref="a2f0498bfb85d9301b7bab802844b047d" args="(DevicePtr pDev)" --> 235<div class="memitem"> 236<div class="memproto"> 237 <table class="memname"> 238 <tr> 239 <td class="memname">void kbdLinuxOff </td> 240 <td>(</td> 241 <td class="paramtype">DevicePtr </td> 242 <td class="paramname"><em>pDev</em></td><td>)</td> 243 <td></td> 244 </tr> 245 </table> 246</div> 247<div class="memdoc"> 248<p>Turn <em>pDev</em> off (i.e., stop taking input from <em>pDev</em>). </p> 249 250<p>References <a class="el" href="lnx-keyboard_8c.html#aacf069d346230dd96812d5395728eef2">GETPRIV</a>, and <a class="el" href="lnx-keyboard_8c.html#ac4263fa687463ddbe1622bdb82a44b08">kbdLinuxCloseConsole()</a>.</p> 251 252</div> 253</div> 254<a class="anchor" id="a541096c9032b400b6f7f8cc76c36f716"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxOn" ref="a541096c9032b400b6f7f8cc76c36f716" args="(DevicePtr pDev)" --> 255<div class="memitem"> 256<div class="memproto"> 257 <table class="memname"> 258 <tr> 259 <td class="memname">int kbdLinuxOn </td> 260 <td>(</td> 261 <td class="paramtype">DevicePtr </td> 262 <td class="paramname"><em>pDev</em></td><td>)</td> 263 <td></td> 264 </tr> 265 </table> 266</div> 267<div class="memdoc"> 268<p>Turn <em>pDev</em> on (i.e., take input from <em>pDev</em>). </p> 269 270<p>References <a class="el" href="lnx-keyboard_8c.html#a11bcea7c6bc7dbe400a3855f5b8676ce">FATAL1</a>, and <a class="el" href="lnx-keyboard_8c.html#aacf069d346230dd96812d5395728eef2">GETPRIV</a>.</p> 271 272</div> 273</div> 274<a class="anchor" id="a5c9ea7d8bd36c991d67988615ac57328"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxRead" ref="a5c9ea7d8bd36c991d67988615ac57328" args="(DevicePtr pDev, dmxMotionProcPtr motion, dmxEnqueueProcPtr enqueue, dmxCheckSpecialProcPtr checkspecial, DMXBlockType block)" --> 275<div class="memitem"> 276<div class="memproto"> 277 <table class="memname"> 278 <tr> 279 <td class="memname">void kbdLinuxRead </td> 280 <td>(</td> 281 <td class="paramtype">DevicePtr </td> 282 <td class="paramname"><em>pDev</em>, </td> 283 </tr> 284 <tr> 285 <td class="paramkey"></td> 286 <td></td> 287 <td class="paramtype"><a class="el" href="dmxinputinit_8h.html#a1279820425966adabf5c77357e4a289c">dmxMotionProcPtr</a> </td> 288 <td class="paramname"><em>motion</em>, </td> 289 </tr> 290 <tr> 291 <td class="paramkey"></td> 292 <td></td> 293 <td class="paramtype"><a class="el" href="dmxinputinit_8h.html#adbd955b9ddbc5ffe38ff65e3f068f205">dmxEnqueueProcPtr</a> </td> 294 <td class="paramname"><em>enqueue</em>, </td> 295 </tr> 296 <tr> 297 <td class="paramkey"></td> 298 <td></td> 299 <td class="paramtype"><a class="el" href="dmxinputinit_8h.html#a838cb45fd92d5cf506e4179b601f7dbc">dmxCheckSpecialProcPtr</a> </td> 300 <td class="paramname"><em>checkspecial</em>, </td> 301 </tr> 302 <tr> 303 <td class="paramkey"></td> 304 <td></td> 305 <td class="paramtype"><a class="el" href="dmxinput_8h.html#a3a7195ab3516c5354bac4ca80b2eedb7">DMXBlockType</a> </td> 306 <td class="paramname"><em>block</em> </td> 307 </tr> 308 <tr> 309 <td></td> 310 <td>)</td> 311 <td></td><td></td> 312 </tr> 313 </table> 314</div> 315<div class="memdoc"> 316 317</div> 318</div> 319<a class="anchor" id="a8c0e2439e4991b78f99c79e90f5e474d"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxVTPostSwitch" ref="a8c0e2439e4991b78f99c79e90f5e474d" args="(pointer p)" --> 320<div class="memitem"> 321<div class="memproto"> 322 <table class="memname"> 323 <tr> 324 <td class="memname">void kbdLinuxVTPostSwitch </td> 325 <td>(</td> 326 <td class="paramtype">pointer </td> 327 <td class="paramname"><em>p</em></td><td>)</td> 328 <td></td> 329 </tr> 330 </table> 331</div> 332<div class="memdoc"> 333<p>Currently unused hook called after returning from a VT switch. </p> 334 335</div> 336</div> 337<a class="anchor" id="a50fd258e64aa03fd197af2a1a8306b32"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxVTPreSwitch" ref="a50fd258e64aa03fd197af2a1a8306b32" args="(pointer p)" --> 338<div class="memitem"> 339<div class="memproto"> 340 <table class="memname"> 341 <tr> 342 <td class="memname">void kbdLinuxVTPreSwitch </td> 343 <td>(</td> 344 <td class="paramtype">pointer </td> 345 <td class="paramname"><em>p</em></td><td>)</td> 346 <td></td> 347 </tr> 348 </table> 349</div> 350<div class="memdoc"> 351<p>Currently unused hook called prior to an VT switch. </p> 352 353</div> 354</div> 355<a class="anchor" id="a11eda88b5082b0adaad1bbc723dae485"></a><!-- doxytag: member="lnx-keyboard.h::kbdLinuxVTSwitch" ref="a11eda88b5082b0adaad1bbc723dae485" args="(pointer p, int vt, dmxVTSwitchReturnProcPtr switch_return, pointer switch_return_data)" --> 356<div class="memitem"> 357<div class="memproto"> 358 <table class="memname"> 359 <tr> 360 <td class="memname">int kbdLinuxVTSwitch </td> 361 <td>(</td> 362 <td class="paramtype">pointer </td> 363 <td class="paramname"><em>p</em>, </td> 364 </tr> 365 <tr> 366 <td class="paramkey"></td> 367 <td></td> 368 <td class="paramtype">int </td> 369 <td class="paramname"><em>vt</em>, </td> 370 </tr> 371 <tr> 372 <td class="paramkey"></td> 373 <td></td> 374 <td class="paramtype">void(*)(pointer) </td> 375 <td class="paramname"><em>switch_return</em>, </td> 376 </tr> 377 <tr> 378 <td class="paramkey"></td> 379 <td></td> 380 <td class="paramtype">pointer </td> 381 <td class="paramname"><em>switch_return_data</em> </td> 382 </tr> 383 <tr> 384 <td></td> 385 <td>)</td> 386 <td></td><td></td> 387 </tr> 388 </table> 389</div> 390<div class="memdoc"> 391<p>Tell the operating system to switch to <em>vt</em>. The <em>switch_return</em> function is called with the <em>switch_return_data</em> when the VT is switched back to the pre-switch VT (i.e., the user returns to the DMX session). </p> 392 393<p>References <a class="el" href="lnx-keyboard_8c.html#a6bce6020b913db8afe5d94bc63d1b355">FATAL0</a>, <a class="el" href="struct__myPrivate.html#a6b26eb0acc0b932c8dee8277501e6273">_myPrivate::fd</a>, <a class="el" href="lnx-keyboard_8c.html#a49faeb3e9d06f702f1bd45ffc6f7c8b7">kbdLinuxActivate()</a>, <a class="el" href="struct__myPrivate.html#ab4797772b07f0fc6aca12ca15bf58b26">_myPrivate::switch_return</a>, <a class="el" href="struct__myPrivate.html#a263e4371987e44a409cae181d97ce60b">_myPrivate::switch_return_data</a>, <a class="el" href="struct__myPrivate.html#a7b46718db81521ae01ffbbe8f32a0203">_myPrivate::switched</a>, and <a class="el" href="struct__myPrivate.html#a463f3cda6fa6032ea0d976d35cd11c30">_myPrivate::vtno</a>.</p> 394 395</div> 396</div> 397</div> 398</div> 399 <div id="nav-path" class="navpath"> 400 <ul> 401 <li class="navelem"><a class="el" href="lnx-keyboard_8h.html">lnx-keyboard.h</a> </li> 402 <hr> 403 <address> 404 <small> 405 Generated June 29, 2004 for <a 406 href="http://dmx.sourceforge.net">Distributed Multihead X</a> by 407 <a href="http://www.doxygen.org/index.html">doxygen</a> 408 1.3.4. 409 </small> 410 </addres> 411 </hr> 412 </body> 413</html> 414