
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Library_-_Code</id>
		<title>Library - Code - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Library_-_Code"/>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;action=history"/>
		<updated>2026-05-05T03:34:26Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11275&amp;oldid=prev</id>
		<title>Robot at 21:44, 22 May 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11275&amp;oldid=prev"/>
				<updated>2024-05-22T21:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 21:44, 22 May 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l28&quot; &gt;Line 28:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 28:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; global file&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; global file&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; file = html_file_path&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; file = html_file_path&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # app.run(host=host, port=port, debug=True)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; socketio.run(app, allow_unsafe_werkzeug=True, host=host, port=port, debug=True)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; socketio.run(app, allow_unsafe_werkzeug=True, host=host, port=port, debug=True)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l41&quot; &gt;Line 41:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 40:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup = BeautifulSoup(html_content, 'html.parser')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup = BeautifulSoup(html_content, 'html.parser')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Find all buttons with IDs&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; buttons = soup.find_all('button', {'id': True})&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; buttons = soup.find_all('button', {'id': True})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Add event listener for each button copy&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for button in buttons:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for button in buttons:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; button_id = button['id']&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; button_id = button['id']&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l50&quot; &gt;Line 50:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 47:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; button['onmouseup'] = f&amp;quot;sendButtonClick('{button_id}')&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; button['onmouseup'] = f&amp;quot;sendButtonClick('{button_id}')&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Find all text fields with IDs&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; text_fields = soup.find_all('input', {'type': 'text', 'id': True})&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; text_fields = soup.find_all('input', {'type': 'text', 'id': True})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Add event listener for each text field&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for text_field in text_fields:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for text_field in text_fields:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; text_field_id = text_field['id']&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; text_field_id = text_field['id']&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l60&quot; &gt;Line 60:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 55:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; images = soup.find_all('img', {'id': True})&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; images = soup.find_all('img', {'id': True})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Add event listener for each img element&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for img in images:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; for img in images:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; img_id = img['id']&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; img_id = img['id']&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l111&quot; &gt;Line 111:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 105:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; container_div.append(canvas)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; container_div.append(canvas)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; # Create div to contain buttons&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; buttons_div = soup.new_tag('div')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; buttons_div = soup.new_tag('div')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; buttons_div['class'] = 'canvas-buttons'&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; buttons_div['class'] = 'canvas-buttons'&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; # &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Create &lt;/del&gt;buttons for drawing functionalities&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; # &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;create &lt;/ins&gt;buttons for drawing functionalities&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; free_draw_btn = soup.new_tag('button')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; free_draw_btn = soup.new_tag('button')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; free_draw_btn['id'] = f'{canvas_id}-freeDrawBtn'&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; free_draw_btn['id'] = f'{canvas_id}-freeDrawBtn'&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l159&quot; &gt;Line 159:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 152:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; soup.head.append(socket_script_tag)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; soup.head.append(socket_script_tag)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; # &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;JavaScript &lt;/del&gt;code for drawing functionalities&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; # &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;javascript &lt;/ins&gt;code for drawing functionalities&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; canvas_script = f&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; canvas_script = f&amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l409&quot; &gt;Line 409:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 402:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup = BeautifulSoup(html_content, 'html.parser')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup = BeautifulSoup(html_content, 'html.parser')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Create a &amp;lt;link&amp;gt; tag for the CSS file&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; link_tag = soup.new_tag('link', rel='stylesheet', type='text/css', href=f'{css_file_path}')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; link_tag = soup.new_tag('link', rel='stylesheet', type='text/css', href=f'{css_file_path}')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # Append the &amp;lt;link&amp;gt; tag to the &amp;lt;head&amp;gt; section of the HTML&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup.head.append(link_tag)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; soup.head.append(link_tag)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l443&quot; &gt;Line 443:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 434:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def button_hold():&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;def button_hold():&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; button_id = request.json['buttonId']&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; button_id = request.json['buttonId']&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; # You can handle the button hold event here&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; print(f&amp;quot;Button '{button_id}' is being held&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; print(f&amp;quot;Button '{button_id}' is being held&amp;quot;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; button_hold_signal.send(app, button_id=button_id)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; button_hold_signal.send(app, button_id=button_id)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l508&quot; &gt;Line 508:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 498:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;quot;&amp;quot;&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; socketio.emit('add_text', {'script': script})&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; socketio.emit('add_text', {'script': script})&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11274&amp;oldid=prev</id>
		<title>Robot at 21:39, 22 May 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11274&amp;oldid=prev"/>
				<updated>2024-05-22T21:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 21:39, 22 May 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Return back to project page: [[Spike Prime - &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Game Controller &lt;/del&gt;- Jakub Vojtek|&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Game Controller &lt;/del&gt;- Jakub Vojtek]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Return back to project page: [[Spike Prime - &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Avalanche Cannon &lt;/ins&gt;- Jakub Vojtek| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Avalanche Cannon &lt;/ins&gt;- Jakub Vojtek]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Python code for the Web app library:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Python code for the Web app library:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11273&amp;oldid=prev</id>
		<title>Robot: Created page with &quot;Return back to project page: Game Controller - Jakub Vojtek  Python code for the Web app library:  &lt;syntaxhighlight lang=pytho...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Library_-_Code&amp;diff=11273&amp;oldid=prev"/>
				<updated>2024-05-22T21:38:54Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;Return back to project page: &lt;a href=&quot;/robowiki/index.php?title=Spike_Prime_-_Game_Controller_-_Jakub_Vojtek&quot; title=&quot;Spike Prime - Game Controller - Jakub Vojtek&quot;&gt;Game Controller - Jakub Vojtek&lt;/a&gt;  Python code for the Web app library:  &amp;lt;syntaxhighlight lang=pytho...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Return back to project page: [[Spike Prime - Game Controller - Jakub Vojtek|Game Controller - Jakub Vojtek]]&lt;br /&gt;
&lt;br /&gt;
Python code for the Web app library:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
from flask import Flask, render_template, request, Response&lt;br /&gt;
from flask_socketio import SocketIO&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
from blinker import signal&lt;br /&gt;
import cv2&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
socketio = SocketIO(app)&lt;br /&gt;
&lt;br /&gt;
button_click_signal = signal('button-click')&lt;br /&gt;
button_hold_signal = signal('button-hold')&lt;br /&gt;
image_click_signal = signal('image-click')&lt;br /&gt;
textfield_change_signal = signal('textfield-change')&lt;br /&gt;
&lt;br /&gt;
file = None&lt;br /&gt;
video_feed_path = None&lt;br /&gt;
&lt;br /&gt;
css = False&lt;br /&gt;
css_file_path = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def run_app(html_file_path, host='0.0.0.0', port=5000):&lt;br /&gt;
    global file&lt;br /&gt;
    file = html_file_path&lt;br /&gt;
    # app.run(host=host, port=port, debug=True)&lt;br /&gt;
    socketio.run(app, allow_unsafe_werkzeug=True, host=host, port=port, debug=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def read_html_file(file_path):&lt;br /&gt;
    with open(file_path, 'r') as file:&lt;br /&gt;
        html_content = file.read()&lt;br /&gt;
    return html_content&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def add_event_listeners(html_content):&lt;br /&gt;
    soup = BeautifulSoup(html_content, 'html.parser')&lt;br /&gt;
&lt;br /&gt;
    # Find all buttons with IDs&lt;br /&gt;
    buttons = soup.find_all('button', {'id': True})&lt;br /&gt;
&lt;br /&gt;
    # Add event listener for each button copy&lt;br /&gt;
    for button in buttons:&lt;br /&gt;
        button_id = button['id']&lt;br /&gt;
        button['onmousedown'] = f&amp;quot;sendButtonHold('{button_id}')&amp;quot;&lt;br /&gt;
        button['onmouseup'] = f&amp;quot;sendButtonClick('{button_id}')&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Find all text fields with IDs&lt;br /&gt;
    text_fields = soup.find_all('input', {'type': 'text', 'id': True})&lt;br /&gt;
&lt;br /&gt;
    # Add event listener for each text field&lt;br /&gt;
    for text_field in text_fields:&lt;br /&gt;
        text_field_id = text_field['id']&lt;br /&gt;
        text_field['onchange'] = f&amp;quot;sendTextFieldContent('{text_field_id}', this.value)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    images = soup.find_all('img', {'id': True})&lt;br /&gt;
&lt;br /&gt;
    # Add event listener for each img element&lt;br /&gt;
    for img in images:&lt;br /&gt;
        img_id = img['id']&lt;br /&gt;
        img['onclick'] = f&amp;quot;sendImageClick(event, '{img_id}')&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    script_tag = soup.new_tag('script')&lt;br /&gt;
    script_tag.string = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    function sendTextFieldContent(textFieldId, content) {&lt;br /&gt;
        var xhr = new XMLHttpRequest();&lt;br /&gt;
        xhr.open('POST', '/text_field_content', true);&lt;br /&gt;
        xhr.setRequestHeader('Content-Type', 'application/json');&lt;br /&gt;
        xhr.send(JSON.stringify({textFieldId: textFieldId, content: content}));&lt;br /&gt;
    };&lt;br /&gt;
    function sendButtonClick(buttonId) {&lt;br /&gt;
        var xhr = new XMLHttpRequest();&lt;br /&gt;
        xhr.open('POST', '/button_click', true);&lt;br /&gt;
        xhr.setRequestHeader('Content-Type', 'application/json');&lt;br /&gt;
        xhr.send(JSON.stringify({buttonId: buttonId}));&lt;br /&gt;
    };&lt;br /&gt;
    function sendButtonHold(buttonId) {&lt;br /&gt;
        var xhr = new XMLHttpRequest();&lt;br /&gt;
        xhr.open('POST', '/button_hold', true);&lt;br /&gt;
        xhr.setRequestHeader('Content-Type', 'application/json');&lt;br /&gt;
        xhr.send(JSON.stringify({buttonId: buttonId}));&lt;br /&gt;
    };&lt;br /&gt;
    function sendImageClick(event, imgId) {&lt;br /&gt;
        var img = document.getElementById(imgId);&lt;br /&gt;
        var rect = img.getBoundingClientRect();&lt;br /&gt;
        var x = Math.round(event.clientX - rect.left);&lt;br /&gt;
        var y = Math.round(event.clientY - rect.top);&lt;br /&gt;
        var position = &amp;quot;(&amp;quot; + x + &amp;quot;, &amp;quot; + y + &amp;quot;)&amp;quot;;&lt;br /&gt;
        var xhr = new XMLHttpRequest();&lt;br /&gt;
        xhr.open('POST', '/image_click', true);&lt;br /&gt;
        xhr.setRequestHeader('Content-Type', 'application/json');&lt;br /&gt;
        xhr.send(JSON.stringify({imgId: imgId, position: position}));&lt;br /&gt;
    }&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    soup.head.append(script_tag)&lt;br /&gt;
&lt;br /&gt;
    canvases = soup.find_all('canvas')&lt;br /&gt;
&lt;br /&gt;
    for canvas in canvases:&lt;br /&gt;
        canvas_id = canvas['id']&lt;br /&gt;
&lt;br /&gt;
        container_div = soup.new_tag('div')&lt;br /&gt;
        container_div['class'] = 'canvas-container'&lt;br /&gt;
&lt;br /&gt;
        canvas.insert_before(container_div)&lt;br /&gt;
&lt;br /&gt;
        container_div.append(canvas)&lt;br /&gt;
&lt;br /&gt;
        # Create div to contain buttons&lt;br /&gt;
        buttons_div = soup.new_tag('div')&lt;br /&gt;
        buttons_div['class'] = 'canvas-buttons'&lt;br /&gt;
&lt;br /&gt;
        # Create buttons for drawing functionalities&lt;br /&gt;
        free_draw_btn = soup.new_tag('button')&lt;br /&gt;
        free_draw_btn['id'] = f'{canvas_id}-freeDrawBtn'&lt;br /&gt;
        free_draw_btn.string = 'Free Draw'&lt;br /&gt;
        buttons_div.append(free_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        line_draw_btn = soup.new_tag('button')&lt;br /&gt;
        line_draw_btn['id'] = f'{canvas_id}-lineDrawBtn'&lt;br /&gt;
        line_draw_btn.string = 'Draw Line'&lt;br /&gt;
        buttons_div.append(line_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        rectangle_draw_btn = soup.new_tag('button')&lt;br /&gt;
        rectangle_draw_btn['id'] = f'{canvas_id}-rectangleDrawBtn'&lt;br /&gt;
        rectangle_draw_btn.string = 'Draw Rectangle'&lt;br /&gt;
        buttons_div.append(rectangle_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        filled_rectangle_draw_btn = soup.new_tag('button')&lt;br /&gt;
        filled_rectangle_draw_btn['id'] = f'{canvas_id}-filledRectangleDrawBtn'&lt;br /&gt;
        filled_rectangle_draw_btn.string = 'Draw Filled Rectangle'&lt;br /&gt;
        buttons_div.append(filled_rectangle_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        oval_draw_btn = soup.new_tag('button')&lt;br /&gt;
        oval_draw_btn['id'] = f'{canvas_id}-ovalDrawBtn'&lt;br /&gt;
        oval_draw_btn.string = 'Draw Oval'&lt;br /&gt;
        buttons_div.append(oval_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        filled_oval_draw_btn = soup.new_tag('button')&lt;br /&gt;
        filled_oval_draw_btn['id'] = f'{canvas_id}-filledOvalDrawBtn'&lt;br /&gt;
        filled_oval_draw_btn.string = 'Draw Filled Oval'&lt;br /&gt;
        buttons_div.append(filled_oval_draw_btn)&lt;br /&gt;
&lt;br /&gt;
        clear_btn = soup.new_tag('button')&lt;br /&gt;
        clear_btn['id'] = f'{canvas_id}-clearBtn'&lt;br /&gt;
        clear_btn.string = 'Clear'&lt;br /&gt;
        buttons_div.append(clear_btn)&lt;br /&gt;
&lt;br /&gt;
        container_div.append(buttons_div)&lt;br /&gt;
&lt;br /&gt;
        socket_script_tag = soup.new_tag('script',&lt;br /&gt;
                                         src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js&amp;quot;,&lt;br /&gt;
                                         integrity=&amp;quot;sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==&amp;quot;,&lt;br /&gt;
                                         crossorigin=&amp;quot;anonymous&amp;quot;)&lt;br /&gt;
        soup.head.append(socket_script_tag)&lt;br /&gt;
&lt;br /&gt;
        # JavaScript code for drawing functionalities&lt;br /&gt;
        canvas_script = f&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
            var socket = io();&lt;br /&gt;
            socket.on('connect', function() {{&lt;br /&gt;
                console.log(&amp;quot;socket connected&amp;quot;);&lt;br /&gt;
            }});&lt;br /&gt;
            var canvas = document.getElementById(&amp;quot;{canvas_id}&amp;quot;);&lt;br /&gt;
            var ctx_{canvas_id} = canvas.getContext(&amp;quot;2d&amp;quot;); &lt;br /&gt;
            var selectedMode = &amp;quot;freeDraw&amp;quot;;&lt;br /&gt;
            var startPoint = null;&lt;br /&gt;
            var isDrawing = false;&lt;br /&gt;
            var lastX = 0;&lt;br /&gt;
            var lastY = 0;&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-freeDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;freeDraw&amp;quot;;&lt;br /&gt;
                startPoint = null; &lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-lineDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;drawLine&amp;quot;;&lt;br /&gt;
                startPoint = null;&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-rectangleDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;drawRectangle&amp;quot;;&lt;br /&gt;
                startPoint = null;&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-filledRectangleDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;drawFilledRectangle&amp;quot;;&lt;br /&gt;
                startPoint = null; &lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-ovalDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;drawOval&amp;quot;;&lt;br /&gt;
                startPoint = null; &lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-filledOvalDrawBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                selectedMode = &amp;quot;drawFilledOval&amp;quot;;&lt;br /&gt;
                startPoint = null; &lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            document.getElementById(&amp;quot;{canvas_id}-clearBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {{&lt;br /&gt;
                var canvas = document.getElementById(&amp;quot;{canvas_id}&amp;quot;);&lt;br /&gt;
                var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
                ctx.clearRect(0, 0, canvas.width, canvas.height); &lt;br /&gt;
                selectedMode = &amp;quot;freeDraw&amp;quot;; &lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            canvas.addEventListener(&amp;quot;mousedown&amp;quot;, function(e) {{&lt;br /&gt;
                if (selectedMode === &amp;quot;freeDraw&amp;quot;) {{&lt;br /&gt;
                    isDrawing = true;&lt;br /&gt;
                    [lastX, lastY] = [e.offsetX, e.offsetY];&lt;br /&gt;
                }}&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            canvas.addEventListener(&amp;quot;mousemove&amp;quot;, function(e) {{&lt;br /&gt;
                if (isDrawing &amp;amp;&amp;amp; selectedMode === &amp;quot;freeDraw&amp;quot;) {{&lt;br /&gt;
                    ctx_{canvas_id}.beginPath();&lt;br /&gt;
                    ctx_{canvas_id}.moveTo(lastX, lastY);&lt;br /&gt;
                    ctx_{canvas_id}.lineTo(e.offsetX, e.offsetY);&lt;br /&gt;
                    ctx_{canvas_id}.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
                    ctx_{canvas_id}.lineWidth = 2;&lt;br /&gt;
                    ctx_{canvas_id}.stroke();&lt;br /&gt;
                    [lastX, lastY] = [e.offsetX, e.offsetY];&lt;br /&gt;
                }}&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            canvas.addEventListener(&amp;quot;mouseup&amp;quot;, function() {{&lt;br /&gt;
                isDrawing = false;&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            canvas.addEventListener(&amp;quot;mouseout&amp;quot;, function() {{&lt;br /&gt;
                isDrawing = false;&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            canvas.addEventListener(&amp;quot;click&amp;quot;, function(e) {{&lt;br /&gt;
                if (selectedMode === &amp;quot;drawLine&amp;quot;) {{&lt;br /&gt;
                    if (!startPoint) {{&lt;br /&gt;
                        startPoint = {{ x: e.offsetX, y: e.offsetY }};&lt;br /&gt;
                    }} else {{&lt;br /&gt;
                        drawLine(ctx_{canvas_id}, startPoint.x, startPoint.y, e.offsetX, e.offsetY);&lt;br /&gt;
                        startPoint = null; &lt;br /&gt;
                    }}&lt;br /&gt;
                }} else if (selectedMode === &amp;quot;drawRectangle&amp;quot;) {{&lt;br /&gt;
                    if (!startPoint) {{&lt;br /&gt;
                        startPoint = {{ x: e.offsetX, y: e.offsetY }};&lt;br /&gt;
                    }} else {{&lt;br /&gt;
                        drawRectangle(ctx_{canvas_id}, startPoint.x, startPoint.y, e.offsetX, e.offsetY);&lt;br /&gt;
                        startPoint = null;&lt;br /&gt;
                    }}&lt;br /&gt;
                }} else if (selectedMode === &amp;quot;drawFilledRectangle&amp;quot;) {{&lt;br /&gt;
                    if (!startPoint) {{&lt;br /&gt;
                        startPoint = {{ x: e.offsetX, y: e.offsetY }};&lt;br /&gt;
                    }} else {{&lt;br /&gt;
                        drawFilledRectangle(ctx_{canvas_id}, startPoint.x, startPoint.y, e.offsetX, e.offsetY);&lt;br /&gt;
                        startPoint = null;&lt;br /&gt;
                    }}&lt;br /&gt;
                }} else if (selectedMode === &amp;quot;drawOval&amp;quot;) {{&lt;br /&gt;
                    if (!startPoint) {{&lt;br /&gt;
                        startPoint = {{ x: e.offsetX, y: e.offsetY }};&lt;br /&gt;
                    }} else {{&lt;br /&gt;
                        drawOval(ctx_{canvas_id}, startPoint.x, startPoint.y, e.offsetX, e.offsetY);&lt;br /&gt;
                        startPoint = null;&lt;br /&gt;
                    }}&lt;br /&gt;
                }} else if (selectedMode === &amp;quot;drawFilledOval&amp;quot;) {{&lt;br /&gt;
                    if (!startPoint) {{&lt;br /&gt;
                        startPoint = {{ x: e.offsetX, y: e.offsetY }};&lt;br /&gt;
                    }} else {{&lt;br /&gt;
                        drawFilledOval(ctx_{canvas_id}, startPoint.x, startPoint.y, e.offsetX, e.offsetY);&lt;br /&gt;
                        startPoint = null;&lt;br /&gt;
                    }}&lt;br /&gt;
                }}&lt;br /&gt;
            }});&lt;br /&gt;
&lt;br /&gt;
            function drawLine(ctx, x1, y1, x2, y2, color = &amp;quot;black&amp;quot;) {{&lt;br /&gt;
                ctx.beginPath();&lt;br /&gt;
                ctx.moveTo(x1, y1);&lt;br /&gt;
                ctx.lineTo(x2, y2);&lt;br /&gt;
                ctx.strokeStyle = color;&lt;br /&gt;
                ctx.lineWidth = 2;&lt;br /&gt;
                ctx.stroke();&lt;br /&gt;
            }}&lt;br /&gt;
&lt;br /&gt;
            function drawRectangle(ctx, x1, y1, x2, y2, color = &amp;quot;black&amp;quot;) {{&lt;br /&gt;
                ctx.beginPath();&lt;br /&gt;
                ctx.strokeStyle = color;&lt;br /&gt;
                ctx.lineWidth = 2;&lt;br /&gt;
                ctx.strokeRect(x1, y1, x2 - x1, y2 - y1);&lt;br /&gt;
            }}&lt;br /&gt;
&lt;br /&gt;
            function drawFilledRectangle(ctx, x1, y1, x2, y2, color = &amp;quot;black&amp;quot;) {{&lt;br /&gt;
                ctx.fillStyle = color;&lt;br /&gt;
                ctx.fillRect(x1, y1, x2 - x1, y2 - y1);&lt;br /&gt;
            }}&lt;br /&gt;
&lt;br /&gt;
            function drawOval(ctx, x1, y1, x2, y2, color = &amp;quot;black&amp;quot;) {{&lt;br /&gt;
                var radiusX = Math.abs(x2 - x1) / 2;&lt;br /&gt;
                var radiusY = Math.abs(y2 - y1) / 2;&lt;br /&gt;
                var centerX = Math.min(x1, x2) + radiusX;&lt;br /&gt;
                var centerY = Math.min(y1, y2) + radiusY;&lt;br /&gt;
&lt;br /&gt;
                ctx.beginPath();&lt;br /&gt;
                ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);&lt;br /&gt;
                ctx.strokeStyle = color;&lt;br /&gt;
                ctx.lineWidth = 2;&lt;br /&gt;
                ctx.stroke();&lt;br /&gt;
            }}&lt;br /&gt;
&lt;br /&gt;
            function drawFilledOval(ctx, x1, y1, x2, y2, color = &amp;quot;black&amp;quot;) {{&lt;br /&gt;
                var radiusX = Math.abs(x2 - x1) / 2;&lt;br /&gt;
                var radiusY = Math.abs(y2 - y1) / 2;&lt;br /&gt;
                var centerX = Math.min(x1, x2) + radiusX;&lt;br /&gt;
                var centerY = Math.min(y1, y2) + radiusY;&lt;br /&gt;
&lt;br /&gt;
                ctx.beginPath();&lt;br /&gt;
                ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);&lt;br /&gt;
                ctx.fillStyle = color;&lt;br /&gt;
                ctx.fill();&lt;br /&gt;
            }}&lt;br /&gt;
            socket.on('draw_line', function(data) {{&lt;br /&gt;
                eval(data.script); &lt;br /&gt;
            }});&lt;br /&gt;
            socket.on('draw_oval', function(data) {{&lt;br /&gt;
                eval(data.script); &lt;br /&gt;
            }});&lt;br /&gt;
            socket.on('draw_rectangle', function(data) {{&lt;br /&gt;
                eval(data.script); &lt;br /&gt;
            }});&lt;br /&gt;
            socket.on('add_text', function(data) {{&lt;br /&gt;
                eval(data.script); &lt;br /&gt;
            }});&lt;br /&gt;
            &amp;lt;/script&amp;gt;&lt;br /&gt;
            &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        soup.body.append(BeautifulSoup(canvas_script, 'html.parser'))&lt;br /&gt;
        buttons_div.insert_after(script_tag)&lt;br /&gt;
&lt;br /&gt;
    link_tag = soup.new_tag('link', rel='stylesheet', type='text/css', href='/static/styles.css')&lt;br /&gt;
    soup.head.append(link_tag)&lt;br /&gt;
&lt;br /&gt;
    socket_script_tag = soup.new_tag('script',&lt;br /&gt;
                                     src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js&amp;quot;,&lt;br /&gt;
                                     integrity=&amp;quot;sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==&amp;quot;,&lt;br /&gt;
                                     crossorigin=&amp;quot;anonymous&amp;quot;)&lt;br /&gt;
    soup.head.append(socket_script_tag)&lt;br /&gt;
&lt;br /&gt;
    socket_script_tag = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
            var socket = io();&lt;br /&gt;
            socket.on('connect', function() {&lt;br /&gt;
                socket.emit('my event', {data: 'Im connected!'});&lt;br /&gt;
                console.log(&amp;quot;socket connected&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            function changeLabelText(labelId, newText) {&lt;br /&gt;
                var label = document.getElementById(labelId);&lt;br /&gt;
                if (label) {&lt;br /&gt;
                    label.innerText = newText;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            socket.on('change_label', function(data) {&lt;br /&gt;
                eval(data.script); // Execute the provided script&lt;br /&gt;
            });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    soup.head.append(BeautifulSoup(socket_script_tag, 'html.parser'))&lt;br /&gt;
&lt;br /&gt;
    return str(soup)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def set_img_src_to_camera(img_src, camera_index=0):&lt;br /&gt;
    global video_feed_path&lt;br /&gt;
    video_feed_path = img_src&lt;br /&gt;
&lt;br /&gt;
    if video_feed_path is not None:&lt;br /&gt;
        @app.route(video_feed_path)&lt;br /&gt;
        def video_feed():&lt;br /&gt;
            print(&amp;quot;Waiting for camera response&amp;quot;)&lt;br /&gt;
            return Response(generate_video_frame(camera_index), mimetype='multipart/x-mixed-replace; boundary=frame')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def generate_video_frame(camera_index):&lt;br /&gt;
    print(&amp;quot;Generating camera feed&amp;quot;)&lt;br /&gt;
    camera = cv2.VideoCapture(camera_index)&lt;br /&gt;
    while True:&lt;br /&gt;
        success, frame = camera.read()&lt;br /&gt;
        if not success:&lt;br /&gt;
            break&lt;br /&gt;
        else:&lt;br /&gt;
            ret, buffer = cv2.imencode('.jpg', frame)&lt;br /&gt;
            frame = buffer.tobytes()&lt;br /&gt;
            yield (b'--frame\r\n'&lt;br /&gt;
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')&lt;br /&gt;
&lt;br /&gt;
    camera.release()&lt;br /&gt;
    cv2.destroyAllWindows()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def add_css_file(css_path):&lt;br /&gt;
    global css_file_path&lt;br /&gt;
    css_file_path = css_path&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def add_css(html_content):&lt;br /&gt;
    soup = BeautifulSoup(html_content, 'html.parser')&lt;br /&gt;
&lt;br /&gt;
    # Create a &amp;lt;link&amp;gt; tag for the CSS file&lt;br /&gt;
    link_tag = soup.new_tag('link', rel='stylesheet', type='text/css', href=f'{css_file_path}')&lt;br /&gt;
&lt;br /&gt;
    # Append the &amp;lt;link&amp;gt; tag to the &amp;lt;head&amp;gt; section of the HTML&lt;br /&gt;
    soup.head.append(link_tag)&lt;br /&gt;
&lt;br /&gt;
    return str(soup)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@app.route('/')&lt;br /&gt;
def index():&lt;br /&gt;
    if file is not None:&lt;br /&gt;
        html_file_path = file&lt;br /&gt;
        html_content = read_html_file(html_file_path)&lt;br /&gt;
        if css_file_path is not None:&lt;br /&gt;
            modified_html_content = add_css(html_content)&lt;br /&gt;
        else:&lt;br /&gt;
            modified_html_content = html_content&lt;br /&gt;
        modified_html_content = add_event_listeners(modified_html_content)&lt;br /&gt;
        return modified_html_content&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;File path not provided&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@app.route('/button_click', methods=['POST'])&lt;br /&gt;
def button_click():&lt;br /&gt;
    button_id = request.json['buttonId']&lt;br /&gt;
    button_click_signal.send(app, button_id=button_id)&lt;br /&gt;
    return &amp;quot;Button clicked&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@app.route('/button_hold', methods=['POST'])&lt;br /&gt;
def button_hold():&lt;br /&gt;
    button_id = request.json['buttonId']&lt;br /&gt;
    # You can handle the button hold event here&lt;br /&gt;
    print(f&amp;quot;Button '{button_id}' is being held&amp;quot;)&lt;br /&gt;
    button_hold_signal.send(app, button_id=button_id)&lt;br /&gt;
    return &amp;quot;Button hold event received&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@app.route('/text_field_content', methods=['POST'])&lt;br /&gt;
def text_field_content():&lt;br /&gt;
    data = request.json&lt;br /&gt;
    text_field_id = data['textFieldId']&lt;br /&gt;
    content = data['content']&lt;br /&gt;
    textfield_change_signal.send(app, text_field_id=text_field_id, content=content)&lt;br /&gt;
    print(f&amp;quot;Content of text field with ID '{text_field_id}': {content}&amp;quot;)&lt;br /&gt;
    return &amp;quot;Text field content received&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@app.route('/image_click', methods=['POST'])&lt;br /&gt;
def image_click():&lt;br /&gt;
    data = request.json&lt;br /&gt;
    img_id = data['imgId']&lt;br /&gt;
    position = data['position']&lt;br /&gt;
    image_click_signal.send(app, img_id=img_id, position=position)&lt;br /&gt;
    return &amp;quot;Image click data received&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@socketio.on('change_label_text')&lt;br /&gt;
def change_label_text(label_id, new_text):&lt;br /&gt;
    script = f&amp;quot;changeLabelText('{label_id}', '{new_text}');&amp;quot;&lt;br /&gt;
    socketio.emit('change_label', {'script': script})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@socketio.on('draw_line')&lt;br /&gt;
def draw_line(canvas_id, x1, y1, x2, y2, color='black'):&lt;br /&gt;
    script = f&amp;quot;drawLine(ctx_{canvas_id}, {x1}, {y1}, {x2}, {y2}, '{color}');&amp;quot;&lt;br /&gt;
    socketio.emit('draw_line', {'script': script})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@socketio.on('draw_oval')&lt;br /&gt;
def draw_oval(canvas_id, x1, y1, x2, y2, filled=False, color='black'):&lt;br /&gt;
    if filled:&lt;br /&gt;
        script = f&amp;quot;drawOval(ctx_{canvas_id}, {x1}, {y1}, {x2}, {y2}, '{color}');&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        script = f&amp;quot;drawFilledOval(ctx_{canvas_id}, {x1}, {y1}, {x2}, {y2}, '{color}');&amp;quot;&lt;br /&gt;
    socketio.emit('draw_oval', {'script': script})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@socketio.on('draw_rectangle')&lt;br /&gt;
def draw_rectangle(canvas_id, x1, y1, x2, y2, filled=False, color='black'):&lt;br /&gt;
    if filled:&lt;br /&gt;
        script = f&amp;quot;drawRectangle(ctx_{canvas_id}, {x1}, {y1}, {x2}, {y2}, '{color}');&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        script = f&amp;quot;drawFilledRectangle(ctx_{canvas_id}, {x1}, {y1}, {x2}, {y2}, '{color}');&amp;quot;&lt;br /&gt;
    socketio.emit('draw_rectangle', {'script': script})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@socketio.on('add_text')&lt;br /&gt;
def add_text(canvas_id, x, y, text, color='black', font='12px Arial'):&lt;br /&gt;
    script = f&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    var canvas = document.getElementById(&amp;quot;{canvas_id}&amp;quot;);&lt;br /&gt;
    var ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
    ctx.font = &amp;quot;{font}&amp;quot;;&lt;br /&gt;
    ctx.fillStyle = &amp;quot;{color}&amp;quot;;&lt;br /&gt;
    ctx.fillText(&amp;quot;{text}&amp;quot;, {x}, {y});&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    socketio.emit('add_text', {'script': script})&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	</feed>