summaryrefslogtreecommitdiffstats
path: root/_build/static/archives/extend/attachments/20130718/c50bef17/attachment.html
blob: cf4bec2f9b0bce1ccce7a0416a63a58a6cb7f06b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<tt>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&nbsp;style=&quot;font-size:&nbsp;12px;&quot;&gt;My&nbsp;issue&nbsp;is&nbsp;the&nbsp;other&nbsp;way&nbsp;round.&nbsp;&nbsp;My&nbsp;handler&nbsp;crashes&nbsp;-&nbsp;and&nbsp;terminate&nbsp;gets&nbsp;called,&nbsp;but&nbsp;the&nbsp;linked&nbsp;process&nbsp;is&nbsp;NOT&nbsp;stopped&nbsp;(unless&nbsp;I&nbsp;stop&nbsp;it&nbsp;in&nbsp;terminate&nbsp;having&nbsp;stashed&nbsp;any&nbsp;processes&nbsp;I&nbsp;need&nbsp;to&nbsp;stop&nbsp;in&nbsp;the&nbsp;process&nbsp;dictionary&nbsp;-&nbsp;this&nbsp;is&nbsp;what&nbsp;I'm&nbsp;currently&nbsp;doing,&nbsp;but&nbsp;yuck!)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&nbsp;style=&quot;font-size:&nbsp;12px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&nbsp;style=&quot;font-size:&nbsp;12px;&quot;&gt;.&nbsp;&nbsp;My&nbsp;question&nbsp;is&nbsp;whether&nbsp;it&nbsp;wouldn't&nbsp;be&nbsp;better&nbsp;to&nbsp;no&nbsp;re-use&nbsp;the&nbsp;handler&nbsp;process&nbsp;that&nbsp;has&nbsp;crashed&nbsp;and&nbsp;replace&nbsp;it&nbsp;so&nbsp;that&nbsp;handler's&nbsp;can&nbsp;use&nbsp;the&nbsp;canonical&nbsp;erlang&nbsp;way&nbsp;of&nbsp;stopping&nbsp;related&nbsp;processes&nbsp;rather&nbsp;than&nbsp;having&nbsp;to&nbsp;do&nbsp;it&nbsp;by&nbsp;hand.&nbsp;&nbsp;&lt;/span&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;&lt;div&gt;&lt;span&nbsp;style=&quot;font-size:&nbsp;12px;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&nbsp;style=&quot;font-size:&nbsp;12px;&quot;&gt;Obviously&nbsp;if&nbsp;the&nbsp;handler&nbsp;does&nbsp;not&nbsp;crash&nbsp;there's&nbsp;no&nbsp;need&nbsp;to&nbsp;kill&nbsp;the&nbsp;process,&nbsp;so&nbsp;the&nbsp;current&nbsp;efficiency&nbsp;saving&nbsp;works&nbsp;in&nbsp;the&nbsp;&quot;normal&quot;&nbsp;case/&lt;/span&gt;&lt;/div&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;--&nbsp;&lt;/div&gt;&lt;div&gt;Dr&nbsp;Adrian&nbsp;Roe&lt;/div&gt;&lt;div&gt;Director&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&nbsp;style=&quot;color:&nbsp;#A0A0A8;&quot;&gt;On&nbsp;Thursday,&nbsp;18&nbsp;July&nbsp;2013&nbsp;at&nbsp;11:20,&nbsp;Loïc&nbsp;Hoguin&nbsp;wrote:&lt;/p&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;blockquote&nbsp;type=&quot;cite&quot;&nbsp;style=&quot;border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;I&nbsp;don't&nbsp;know&nbsp;what&nbsp;happens&nbsp;but&nbsp;there's&nbsp;two&nbsp;things&nbsp;I&nbsp;know:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp;*&nbsp;&nbsp;Handlers&nbsp;don't&nbsp;trap_exit,&nbsp;so&nbsp;if&nbsp;the&nbsp;linked&nbsp;process&nbsp;crashes,&nbsp;they&nbsp;&lt;/div&gt;&lt;div&gt;crash&nbsp;too&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp;*&nbsp;&nbsp;If&nbsp;the&nbsp;handler&nbsp;crashes,&nbsp;we&nbsp;close&nbsp;the&nbsp;connection&nbsp;and&nbsp;stop&nbsp;the&nbsp;&lt;/div&gt;&lt;div&gt;handler;&nbsp;if&nbsp;not&nbsp;this&nbsp;is&nbsp;a&nbsp;bug&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;After&nbsp;your&nbsp;log&nbsp;message&nbsp;the&nbsp;handler&nbsp;should&nbsp;stop&nbsp;unless&nbsp;there's&nbsp;a&nbsp;bug&nbsp;&lt;/div&gt;&lt;div&gt;somewhere.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;On&nbsp;07/18/2013&nbsp;12:15&nbsp;PM,&nbsp;Adrian&nbsp;Roe&nbsp;wrote:&lt;/div&gt;&lt;blockquote&nbsp;type=&quot;cite&quot;&gt;&lt;div&gt;&lt;div&gt;We&nbsp;have&nbsp;been&nbsp;using&nbsp;spawn_linked&nbsp;workers&nbsp;to&nbsp;handle&nbsp;tasks&nbsp;that&nbsp;live&nbsp;for&lt;/div&gt;&lt;div&gt;the&nbsp;lifetime&nbsp;of&nbsp;a&nbsp;single&nbsp;HTTP&nbsp;request&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Although&nbsp;in&nbsp;the&nbsp;cowboy&nbsp;guide&nbsp;it&nbsp;is&nbsp;clear&nbsp;that&nbsp;Cowboy&nbsp;can&nbsp;use&nbsp;&quot;One&lt;/div&gt;&lt;div&gt;Process&nbsp;of&nbsp;Many&nbsp;Requests&quot;&nbsp;I&nbsp;am&nbsp;surprised&nbsp;that&nbsp;this&nbsp;is&nbsp;the&nbsp;case&nbsp;even&nbsp;if&lt;/div&gt;&lt;div&gt;the&nbsp;handler&nbsp;crashes.&nbsp;&nbsp;For&nbsp;example,&nbsp;our&nbsp;use&nbsp;case&nbsp;is&nbsp;to&nbsp;copy&nbsp;a&nbsp;large&nbsp;file&lt;/div&gt;&lt;div&gt;to&nbsp;the&nbsp;server&nbsp;over&nbsp;HTTP&nbsp;where&nbsp;a&nbsp;worker&nbsp;process&nbsp;relays&nbsp;the&nbsp;file&nbsp;contents&lt;/div&gt;&lt;div&gt;to&nbsp;long&nbsp;term&nbsp;storage.&nbsp;&nbsp;The&nbsp;worker&nbsp;process&nbsp;is&nbsp;spawn_linked&nbsp;from&nbsp;the&nbsp;HTTP&lt;/div&gt;&lt;div&gt;handler&nbsp;and&nbsp;(for&nbsp;our&nbsp;use&nbsp;case)&nbsp;should&nbsp;die&nbsp;if&nbsp;the&nbsp;handler&nbsp;stops.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;If&nbsp;the&nbsp;client&nbsp;stops&nbsp;the&nbsp;upload&nbsp;(for&nbsp;example&nbsp;by&nbsp;browsing&nbsp;away,&nbsp;or&nbsp;losing&lt;/div&gt;&lt;div&gt;connectivity)&nbsp;we&nbsp;correctly&nbsp;receive&nbsp;an&nbsp;error&nbsp;(see&nbsp;sample&nbsp;Lager&nbsp;trace&lt;/div&gt;&lt;div&gt;below),&nbsp;but&nbsp;what&nbsp;we&nbsp;are&nbsp;seeing&nbsp;is&nbsp;that&nbsp;spawn_linked&nbsp;processes&nbsp;are&nbsp;NOT&lt;/div&gt;&lt;div&gt;being&nbsp;killed.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Is&nbsp;this&nbsp;intended&nbsp;behaviour&nbsp;-&nbsp;I&nbsp;accept&nbsp;it&nbsp;makes&nbsp;sense&nbsp;to&nbsp;reuse&nbsp;the&lt;/div&gt;&lt;div&gt;processes&nbsp;but&nbsp;should&nbsp;this&nbsp;continue&nbsp;to&nbsp;be&nbsp;the&nbsp;case&nbsp;even&nbsp;if&nbsp;the&nbsp;previous&lt;/div&gt;&lt;div&gt;use&nbsp;of&nbsp;the&nbsp;process&nbsp;crashed?&nbsp;&nbsp;If&nbsp;it&nbsp;is&nbsp;intended&nbsp;behaviour&nbsp;I&nbsp;think&nbsp;the&lt;/div&gt;&lt;div&gt;docs&nbsp;should&nbsp;highlight&nbsp;this&nbsp;as&nbsp;we've&nbsp;been&nbsp;leaking&nbsp;processes&nbsp;for&nbsp;some&nbsp;time&lt;/div&gt;&lt;div&gt;now,&nbsp;but&nbsp;I've&nbsp;always&nbsp;seen&nbsp;it&nbsp;as&nbsp;erlang's&nbsp;job&nbsp;to&nbsp;look&nbsp;after&nbsp;related&lt;/div&gt;&lt;div&gt;process&nbsp;trees&nbsp;in&nbsp;the&nbsp;event&nbsp;of&nbsp;error.&nbsp;&nbsp;Our&nbsp;current&nbsp;workaround&nbsp;is&nbsp;to&nbsp;hold&lt;/div&gt;&lt;div&gt;a&nbsp;list&nbsp;of&nbsp;linked&nbsp;processes&nbsp;in&nbsp;process&nbsp;storage&nbsp;and&nbsp;then&nbsp;kill&nbsp;them&nbsp;in&nbsp;the&lt;/div&gt;&lt;div&gt;terminate&nbsp;handler&nbsp;which&nbsp;is&nbsp;ugly&nbsp;in&nbsp;the&nbsp;extreme!!&nbsp;&nbsp;We&nbsp;don't&nbsp;know&nbsp;the&nbsp;PIDS&lt;/div&gt;&lt;div&gt;of&nbsp;the&nbsp;linked&nbsp;processes&nbsp;until&nbsp;it&nbsp;is&nbsp;too&nbsp;late&nbsp;to&nbsp;return&nbsp;State&nbsp;to&nbsp;Cowboy&lt;/div&gt;&lt;div&gt;(i.e.&nbsp;we&nbsp;are&nbsp;already&nbsp;in&nbsp;our&nbsp;handle&nbsp;code)...&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Kind&nbsp;regards&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Adrian&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;16:09:32.347&nbsp;[info]&nbsp;Trailer&nbsp;upload&nbsp;failed&nbsp;with&nbsp;reason&lt;/div&gt;&lt;div&gt;{case_clause,{error,closed}}&lt;/div&gt;&lt;div&gt;16:09:32.348&nbsp;[error]&nbsp;**&nbsp;Cowboy&nbsp;handler&nbsp;upload_trailer_resource&lt;/div&gt;&lt;div&gt;terminating&nbsp;in&nbsp;handle/2&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;the&nbsp;reason&nbsp;error:{case_clause,{error,closed}}&lt;/div&gt;&lt;div&gt;**&nbsp;Handler&nbsp;state&nbsp;was&nbsp;{state,undefined,0,undefined,undefined,undefined}&lt;/div&gt;&lt;div&gt;**&nbsp;Request&nbsp;was&lt;/div&gt;&lt;div&gt;[{socket,#Port&lt;0.11230&gt;},{transport,ranch_tcp},{connection,keepalive},{pid,&lt;0.1987.0&gt;},{method,&lt;&lt;&quot;POST&quot;&gt;&gt;},{version,'HTTP/1.1'},{peer,{{84,92,32,116},64136}},{host,&lt;&lt;&quot;54.225.117.108&quot;&gt;&gt;},{host_info,undefined},{port,8000},{path,&lt;&lt;&quot;/upload_trailer&quot;&gt;&gt;},{path_info,undef&lt;/div&gt;&lt;div&gt;ined},{qs,&lt;&lt;&quot;name=linux-7.4.21.zip&amp;size=54015414&quot;&gt;&gt;},{qs_vals,undefined},{bindings,[]},{headers,[{&lt;&lt;&quot;host&quot;&gt;&gt;,&lt;&lt;&quot;54.225.117.108:8000&quot;&gt;&gt;},{&lt;&lt;&quot;connection&quot;&gt;&gt;,&lt;&lt;&quot;keep-alive&quot;&gt;&gt;},{&lt;&lt;&quot;content-length&quot;&gt;&gt;,&lt;&lt;&quot;54015414&quot;&gt;&gt;},{&lt;&lt;&quot;origin&quot;&gt;&gt;,&lt;&lt;&quot;&lt;a&nbsp;href=&quot;http://54.225.117.108:8000&quot;&gt;http://54.225.117.108:8000&lt;/a&gt;&quot;&gt;&gt;},{&lt;&lt;&quot;user-agent&quot;&gt;&gt;,&lt;&lt;&quot;M&lt;/div&gt;&lt;div&gt;ozilla/5.0&nbsp;(Macintosh;&nbsp;Intel&nbsp;Mac&nbsp;OS&nbsp;X&nbsp;10_8_4)&nbsp;AppleWebKit/537.36&nbsp;(KHTML,&lt;/div&gt;&lt;div&gt;like&nbsp;Gecko)&nbsp;Chrome/28.0.1500.71&lt;/div&gt;&lt;div&gt;Safari/537.36&quot;&gt;&gt;},{&lt;&lt;&quot;content-type&quot;&gt;&gt;,&lt;&lt;&gt;&gt;},{&lt;&lt;&quot;accept&quot;&gt;&gt;,&lt;&lt;&quot;*/*&quot;&gt;&gt;},{&lt;&lt;&quot;referer&quot;&gt;&gt;,&lt;&lt;&quot;&lt;a&nbsp;href=&quot;http://54.225.117.108:8000&quot;&gt;http://54.225.117.108:8000&lt;/a&gt;/&quot;&gt;&gt;},{&lt;&lt;&quot;accept-encoding&quot;&gt;&gt;,&lt;&lt;&quot;gzip,deflate,sdch&quot;&gt;&gt;},{&lt;&lt;&quot;acce&lt;/div&gt;&lt;div&gt;pt-language&quot;&gt;&gt;,&lt;&lt;&quot;en-US,en;q=0.8&quot;&gt;&gt;},{&lt;&lt;&quot;cookie&quot;&gt;&gt;,&lt;&lt;&quot;__jwpusr=cbc133d7-1b49-443c-8a13-364660cc93e5;&lt;/div&gt;&lt;div&gt;id3as_manager=f4803c004d71dde3b64394f6e6f44faa54970e93&quot;&gt;&gt;}]},{p_headers,[{&lt;&lt;&quot;connection&quot;&gt;&gt;,[&lt;&lt;&quot;keep-alive&quot;&gt;&gt;]}]},{cookies,undefined},{meta,[]},{body_state,waiting},{multipart,unde&lt;/div&gt;&lt;div&gt;fined},{buffer,&lt;&lt;&gt;&gt;},{resp_compress,true},{resp_state,waiting},{resp_headers,[]},{resp_body,&lt;&lt;&gt;&gt;},{onresponse,undefined}]&lt;/div&gt;&lt;div&gt;**&nbsp;Stacktrace:&lt;/div&gt;&lt;div&gt;[{i_cowboy,stream_body,0,[{file,&quot;src/i_cowboy.erl&quot;},{line,76}]},{upload_trailer_resource,stream_upload_file,4,[{file,&quot;src/endpoints/upload_trailer_resource.erl&quot;},{line,247}]},{upload_trailer_resource,upload_file,1,[{file,&quot;src/endpoints/upload_trailer_resource.erl&quot;}&lt;/div&gt;&lt;div&gt;,{line,237}]},{upload_trailer_resource,head_or_post,1,[{file,&quot;src/endpoints/upload_trailer_resource.erl&quot;},{line,202}]},{upload_trailer_resource,sequence,2,[{file,&quot;src/endpoints/upload_trailer_resource.erl&quot;},{line,106}]},{upload_trailer_resource,process_request,1,[{file,&quot;src/endpo&lt;/div&gt;&lt;div&gt;ints/upload_trailer_resource.erl&quot;},{line,212}]},{i_cowboy,do,3,[{file,&quot;src/i_cowboy.erl&quot;},{line,29}]},{cowboy_handler,handler_handle,4,[{file,&quot;src/cowboy_handler.erl&quot;},{line,119}]}]&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;--&lt;/div&gt;&lt;div&gt;Dr&nbsp;Adrian&nbsp;Roe&lt;/div&gt;&lt;div&gt;Director&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;_______________________________________________&lt;/div&gt;&lt;div&gt;Extend&nbsp;mailing&nbsp;list&lt;/div&gt;&lt;div&gt;&lt;a&nbsp;href=&quot;mailto:[email protected]&quot;&gt;[email protected]&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a&nbsp;href=&quot;http://lists.ninenines.eu:81/listinfo/extend&quot;&gt;http://lists.ninenines.eu:81/listinfo/extend&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;--&nbsp;&lt;/div&gt;&lt;div&gt;Loïc&nbsp;Hoguin&lt;/div&gt;&lt;div&gt;Erlang&nbsp;Cowboy&lt;/div&gt;&lt;div&gt;Nine&nbsp;Nines&lt;/div&gt;&lt;div&gt;&lt;a&nbsp;href=&quot;http://ninenines.eu&quot;&gt;http://ninenines.eu&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/blockquote&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;br&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</tt>