<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Amit Bahree&#39;s (useless?) insight!</title>
    <link>/</link>
    <description>Recent content on Amit Bahree&#39;s (useless?) insight!</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>🎉Announcing My New Book: Generative AI in Action📚</title>
      <link>/post/2024/10/book-release-genai-in-action/</link>
      <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/10/book-release-genai-in-action/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s rapidly evolving tech world, mastering &lt;strong&gt;Generative AI&lt;/strong&gt; isn&amp;rsquo;t just an advantage—it&amp;rsquo;s a necessity. Are you ready to harness its power to transform your business and solve real-world challenges? I&amp;rsquo;m excited to announce that my new book, &lt;em&gt;&lt;strong&gt;Generative AI in Action&lt;/strong&gt;&lt;/em&gt;, is now available in print and ebook formats from &lt;a
	
		href = &#34;https://www.manning.com/books/generative-ai-in-action&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manning Publications
	&lt;/span&gt;
&lt;/a&gt;. 📖&lt;/p&gt;
&lt;h3 id=&#34;special-launch-offer-&#34;&gt;Special Launch Offer 🌟&lt;/h3&gt;
&lt;p&gt;As a thank-you to my early supporters, I&amp;rsquo;m offering an exclusive discount. Use the code &lt;strong&gt;pbbahree&lt;/strong&gt; at checkout to receive &lt;strong&gt;45% off&lt;/strong&gt; your purchase of &lt;em&gt;Generative AI in Action&lt;/em&gt; in all formats (valid through Sept. 30, 2024)!&lt;/p&gt;
&lt;p&gt;Get your discounted copy &amp;#x1f449; &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		» here «
	&lt;/span&gt;
&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Bahree-HI.png&#34; alt=&#34;Cover of Generative AI in Action&#34;/&gt;
        &lt;figcaption&gt;Cover of Generative AI in Action&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;why-you-should-read-generative-ai-in-action-&#34;&gt;Why You Should Read &lt;em&gt;Generative AI in Action&lt;/em&gt; ✨&lt;/h3&gt;
&lt;h4 id=&#34;comprehensive-coverage&#34;&gt;Comprehensive Coverage&lt;/h4&gt;
&lt;p&gt;This book offers an in-depth introduction to Generative AI, covering foundation models, large language models (#LLMs), small language models (#SLMs), and practical applications. From the basics to advanced topics like prompt engineering, &lt;em&gt;Generative AI in Action&lt;/em&gt; provides everything you need to start building and scaling AI solutions. Whether you&amp;rsquo;re a beginner or a seasoned professional, you&amp;rsquo;ll find valuable insights to accelerate your AI journey.&lt;/p&gt;
&lt;h4 id=&#34;real-world-examples&#34;&gt;Real-World Examples&lt;/h4&gt;
&lt;p&gt;Discover how enterprises across industries are leveraging Generative AI to innovate and solve complex problems. Whether it&amp;rsquo;s improving customer engagement or optimizing operations, the practical examples provided can be directly applied to your projects for immediate impact.&lt;/p&gt;
&lt;h4 id=&#34;hands-on-techniques&#34;&gt;Hands-On Techniques&lt;/h4&gt;
&lt;p&gt;Dive into step-by-step guides and hands-on examples for integrating AI models into your workflows. Learn techniques such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Craft effective prompts to unlock the full potential of AI models like GPT-4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: Enhance your AI models with real-time data for improved accuracy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Adaptation&lt;/strong&gt;: Fine-tune AI models to meet your organization&amp;rsquo;s specific needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ethical-ai-and-best-practices&#34;&gt;Ethical AI and Best Practices&lt;/h4&gt;
&lt;p&gt;As AI becomes more critical in decision-making, understanding its ethical implications is crucial. &lt;em&gt;Generative AI in Action&lt;/em&gt; covers topics like privacy, security, and bias mitigation—ensuring your AI deployments are fair, transparent, and aligned with your organizational values.&lt;/p&gt;
&lt;h4 id=&#34;expert-insights&#34;&gt;Expert Insights&lt;/h4&gt;
&lt;p&gt;Drawing from my experience helping build the Azure AI platform, I share insider knowledge on leveraging the latest advancements in AI for your projects. This book provides you with the tools to make the most of cutting-edge technologies like large language models (LLMs) and small language models (SLMs).&lt;/p&gt;
&lt;h3 id=&#34;advanced-techniques-covered-in-the-book-&#34;&gt;Advanced Techniques Covered in the Book 🔥&lt;/h3&gt;
&lt;p&gt;Beyond the basics, &lt;em&gt;Generative AI in Action&lt;/em&gt; delves into advanced techniques essential for mastering Generative AI in modern enterprise environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt;: Strategies like zero-shot, few-shot, and many-shot learning, along with chain-of-thought reasoning, to optimize AI outputs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: Combine retrieval-based methods with generative models for real-time, relevant data integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Adaptation and Fine-Tuning&lt;/strong&gt;: Customize generative models to specific tasks using techniques such as low-rank adaptation and reinforcement learning from human feedback (RLHF).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chatting with Your Data&lt;/strong&gt;: Build AI-powered chat systems that interact with enterprise data using vector databases and retrieval techniques.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaling and Production Deployment&lt;/strong&gt;: Strategies for scaling AI solutions while ensuring performance, reliability, and compliance with enterprise standards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations and Benchmarks&lt;/strong&gt;: Learn to evaluate and benchmark AI models using traditional metrics and cutting-edge frameworks.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- ### A Special Thanks 🙌

A huge thank you to [Eric Boyd](https://www.linkedin.com/in/emboyd/), CVP Engineering, AI Platform at Microsoft, for writing the foreword for *Generative AI in Action*. His insights into AI&#39;s transformative power help set the stage for how this technology will shape the future.

I&#39;d also like to express my gratitude to [Wee Hyong Tok](https://www.linkedin.com/in/weehyongtok/), my technical editor. His expertise in AI and data has been invaluable in ensuring that this book is technically robust and accessible for developers, data scientists, and enterprise leaders. --&gt;
&lt;h3 id=&#34;explore-the-github-repository-&#34;&gt;Explore the GitHub Repository 💾&lt;/h3&gt;
&lt;p&gt;For those eager to dive into the code, the book has a companion GitHub repository filled with examples and projects to get you started. Check it out at &lt;a
	
		href = &#34;https://bit.ly/GenAIBook&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bit.ly/GenAIBook
	&lt;/span&gt;
&lt;/a&gt;. Explore the code, experiment, and start building your AI-powered solutions today.&lt;/p&gt;
&lt;h3 id=&#34;get-your-copy-today-&#34;&gt;Get Your Copy Today! 🛒&lt;/h3&gt;
&lt;p&gt;Don&amp;rsquo;t miss this opportunity to lead the AI revolution within your organization. Order your copy of &lt;em&gt;&lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt;&lt;/em&gt; and use the code &lt;strong&gt;pbbahree&lt;/strong&gt; to receive &lt;strong&gt;45% off&lt;/strong&gt; (valid through Sept. 30, 2024). Transform your organization&amp;rsquo;s AI capabilities today!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With gratitude&lt;/em&gt; 💚&lt;/p&gt;
&lt;p&gt;Amit Bahree.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;In the world of AI, there&amp;rsquo;s a thrill,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;With &amp;ldquo;Generative AI in Action,&amp;rdquo; you&amp;rsquo;ll skill.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;From prompts to fine-tuning,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Your projects are blooming,&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Grab your copy, and master the drill!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 4): Memory management and beyond</title>
      <link>/post/2026/04/building-microkernel-part4-memory-mmu/</link>
      <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/04/building-microkernel-part4-memory-mmu/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4 (this): Memory and beyond&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; - full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; - prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Recap from &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;: we added timer interrupts and preemptive multitasking. The ARM Generic Timer fires every 100ms, the GIC routes interrupts to our handler, and a full context switch (31 registers + SP + ELR + SPSR) lets the OS forcibly alternate between two threads that never yield. The kernel is now in charge of scheduling, not the tasks.&lt;/p&gt;
&lt;p&gt;Every program you&amp;rsquo;ve ever written has been lying to you about memory addresses. When your code reads at address &lt;code&gt;0x1000&lt;/code&gt;, it&amp;rsquo;s not actually reading the physical byte at &lt;code&gt;0x1000&lt;/code&gt; in RAM. There&amp;rsquo;s a hardware translator sitting between your code and memory, silently remapping every address. We&amp;rsquo;re about to build that translator.&lt;/p&gt;
&lt;p&gt;This is the final part of the series. Virtual memory is the foundation that makes modern operating systems possible: process isolation, memory protection, shared libraries, and even swap space. And the core mechanism is surprisingly elegant. You build a lookup table, point the hardware at it, flip a bit, and suddenly every memory access in the system goes through your table.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s build it. 😃&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;We implement virtual memory on AArch64:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Frame allocator&lt;/strong&gt;: A bump allocator that hands out 4KB physical memory pages (in this post, we&amp;rsquo;ll use a simple bump allocator, but in a real OS, you&amp;rsquo;ll need a more sophisticated allocator)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page tables&lt;/strong&gt;: 4-level translation structures that map virtual addresses to physical ones (in this post, we&amp;rsquo;ll use a 4-level page table, but in a real OS, you&amp;rsquo;ll need a more sophisticated page table)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MMU enablement&lt;/strong&gt;: Configure the hardware translation unit and flip it on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verification&lt;/strong&gt;: Write through a virtual address, read it back, and prove the translation worked&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLB&lt;/strong&gt;: A translation lookaside buffer that caches recent VA-to-PA translations (in this post, we&amp;rsquo;ll use a simple TLB, but in a real OS, you&amp;rsquo;ll need a more sophisticated TLB)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-why-virtual-memory&#34;&gt;1. Why virtual memory?&lt;/h2&gt;
&lt;p&gt;Virtual memory is the foundation that makes modern operating systems possible: process isolation, memory protection, shared libraries, and even swap space. And the core mechanism is surprisingly elegant. You build a lookup table, point the hardware at it, flip a bit, and suddenly every memory access in the system goes through your table. It&amp;rsquo;s an awesome example of how hardware and software can work together to create a powerful abstraction.&lt;/p&gt;
&lt;h3 id=&#34;11-the-mmu-is-hardware-not-software&#34;&gt;1.1 The MMU is hardware, not software&lt;/h3&gt;
&lt;p&gt;Before we dive in, let&amp;rsquo;s ensure we&amp;rsquo;re on the same page. The &lt;strong&gt;Memory Management Unit (MMU)&lt;/strong&gt; is a physical circuit inside the CPU, sitting between the processor core and the memory bus. When the CPU reads or writes any address, the MMU intercepts that access and translates it using a lookup table (the page table) before the request reaches RAM.&lt;/p&gt;
&lt;p&gt;This is not a software layer; it&amp;rsquo;s dedicated hardware that runs on every single memory access, at full speed, with no CPU involvement once configured. All we need to do is build the lookup table and tell the MMU where to find it.&lt;/p&gt;
&lt;h3 id=&#34;12-the-problem-with-physical-addressing&#34;&gt;1.2 The problem with physical addressing&lt;/h3&gt;
&lt;p&gt;Right now, our kernel uses physical addresses directly. Address &lt;code&gt;0x4000_0000&lt;/code&gt; in our code refers to physical byte &lt;code&gt;0x4000_0000&lt;/code&gt; in RAM. This works fine for a single kernel, but it falls apart when you want multiple tasks to run simultaneously and independently. Let&amp;rsquo;s say we want to run two tasks simultaneously: Task A and Task B. Task A wants to use address &lt;code&gt;0x1000&lt;/code&gt;, and Task B wants to use the same address. If we use physical addressing, we&amp;rsquo;ll have a problem. Task A will write to address &lt;code&gt;0x1000&lt;/code&gt;, and Task B will write to address &lt;code&gt;0x1000&lt;/code&gt;. This is a problem because Task A and Task B are running simultaneously and independently, and they shouldn&amp;rsquo;t be able to write to each other&amp;rsquo;s memory.&lt;/p&gt;
&lt;p&gt;This is where virtual memory comes in. Virtual memory is a system that allows each task to have its own view of the address space. Task A thinks it&amp;rsquo;s using address &lt;code&gt;0x1000&lt;/code&gt;, but the MMU translates that to physical address &lt;code&gt;0x4000_1000&lt;/code&gt;. Task B also thinks it&amp;rsquo;s using address &lt;code&gt;0x1000&lt;/code&gt;, but the MMU translates that to &lt;code&gt;0x4010_1000&lt;/code&gt;. Neither task is aware of the other&amp;rsquo;s memory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Task A sees:                    Physical memory:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x0000 -&amp;gt; 0x4000_0000 (RAM)      0x4000_0000: Task A code
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x1000 -&amp;gt; 0x4001_0000 (RAM)      0x4010_0000: Task B code
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  0x5000_0000: Kernel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Task B sees:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x0000 -&amp;gt; 0x4010_0000 (RAM)      ^ MMU translates
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x1000 -&amp;gt; 0x4011_0000 (RAM)      | every access&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Isolation&lt;/strong&gt;: Tasks can&amp;rsquo;t access each other. They have different translation tables.
&lt;strong&gt;Relocation&lt;/strong&gt;: Every task sees the same virtual addresses.
&lt;strong&gt;Protection&lt;/strong&gt;: You can mark pages read-only, non-executable, or kernel-only.
&lt;strong&gt;Flexibility&lt;/strong&gt;: Sparse virtual address spaces waste almost no physical memory. The flexibility of virtual memory is one of its most powerful features.&lt;/p&gt;
&lt;h2 id=&#34;2-pages-and-frames&#34;&gt;2. Pages and frames&lt;/h2&gt;
&lt;p&gt;The MMU doesn&amp;rsquo;t translate individual bytes. That would require billions of table entries (one per byte of address space). Instead, it groups addresses into fixed-size chunks called &lt;strong&gt;pages&lt;/strong&gt;. We use 4KB pages (4096 bytes = 2^12), which has been the standard since the 1980s.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;page&lt;/strong&gt; is a 4KB block in the virtual address space. A &lt;strong&gt;frame&lt;/strong&gt; is a 4KB block in physical memory. The page table maps pages to frames. Think of it like a library catalog: a page is a shelf label (where you look), and a frame is the actual physical shelf (where the books are). The catalog maps labels to shelves, and you can rearrange which label points to which shelf without moving any books.&lt;/p&gt;
&lt;p&gt;Think of the relationship between a page and a frame as a one-to-one mapping - one page maps to one frame. However, a page and frame can be different sizes. For example, a page can be 4KB, but a frame can be 2MB; this is because the page table is a tree, and the levels of the tree can be different sizes.&lt;/p&gt;
&lt;p&gt;The bottom 12 bits of an address (the offset within the page) pass through untranslated, since both the virtual page and the physical frame share the same internal layout. For example, if virtual address &lt;code&gt;0x4000_1ABC&lt;/code&gt; maps to physical frame &lt;code&gt;0x7000_1000&lt;/code&gt;, then the offset &lt;code&gt;0xABC&lt;/code&gt; (the low 12 bits) is the same on both sides. The MMU only translates the upper bits, replacing &lt;code&gt;0x4000_1&lt;/code&gt; with &lt;code&gt;0x7000_1&lt;/code&gt;, and the offset passes straight through.&lt;/p&gt;
&lt;p&gt;Why 4KB specifically? It&amp;rsquo;s a trade-off. Smaller pages (e.g., 512 bytes) give finer-grained control over permissions and sharing, but need 8x more table entries to cover the same address range. On the other hand, larger pages (say 64KB) waste space when a program only needs a few hundred bytes - the rest of the page sits allocated but unused (this is called internal fragmentation). 4KB balances these concerns well for general-purpose systems. ARM also supports 16KB and 64KB granules, but Linux uses 4 KB on ARM, and we&amp;rsquo;ll use the same.&lt;/p&gt;
&lt;h2 id=&#34;3-the-page-table-walk&#34;&gt;3. The page table walk&lt;/h2&gt;
&lt;p&gt;Let us walk through how the hardware translates a 48-bit virtual address (VA). First yt splits the address into five fields, and each field indexes into a different level of the page table. Think of it like a postal address: country, city, street, house number. Each part narrows down the search. At the end of the day, it&amp;rsquo;s a lot like a tree, with the top level being the most general, and the bottom level being the most specific.&lt;/p&gt;
&lt;p&gt;The hardware starts at the root (L0), uses the first 9 bits to locate the L1 table, then uses the next 9 bits to locate the L2 table, then the next 9 bits to locate the L3 table, and finally uses the last 9 bits to locate the page within that table. The final 12 bits are the offset within the page.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;48-bit Virtual Address (VA):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;// VA = virtual address; PA = physical address. Low 12 bits are the page offset and pass through unchanged during translation.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+------+------+------+------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  L0  |  L1  |  L2  |  L3  | Page Offset  |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  9b  |  9b  |  9b  |  9b  |    12b       |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+------+------+------+------+--------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 47:39  38:30  29:21  20:12      11:0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each 9-bit index can hold values 0 through 511, so each page table has exactly 512 entries. At 8 bytes per entry, that&amp;rsquo;s 512 x 8 = 4096 bytes. One page table fits exactly in one 4KB page. Not a coincidence - the hardware designers intentionally made it this way to simplify memory management.&lt;/p&gt;
&lt;p&gt;The hardware walks the tree on every memory access, starting from the root (L0) and following the pointers down to the leaf (L3) that contains the physical frame address. If any entry along the way is invalid, the MMU raises a page fault exception, which the OS can handle (e.g., by loading a page from disk or killing the offending process).&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    A[&amp;#34;Virtual Address: 0x8000_1234&amp;#34;] --&amp;gt; B[&amp;#34;L0 index = bits 47:39 = 0&amp;#34;]
    B --&amp;gt; C[&amp;#34;L0 Table entry 0&amp;#34;]
    C --&amp;gt; D[&amp;#34;Points to L1 Table&amp;#34;]
    D --&amp;gt; E[&amp;#34;L1 index = bits 38:30 = 2&amp;#34;]
    E --&amp;gt; F[&amp;#34;L1 Table entry 2&amp;#34;]
    F --&amp;gt; G[&amp;#34;Points to L2 Table&amp;#34;]
    G --&amp;gt; H[&amp;#34;L2 index = bits 29:21 = 0&amp;#34;]
    H --&amp;gt; I[&amp;#34;L2 Table entry 0&amp;#34;]
    I --&amp;gt; J[&amp;#34;Points to L3 Table&amp;#34;]
    J --&amp;gt; K[&amp;#34;L3 index = bits 20:12 = 0&amp;#34;]
    K --&amp;gt; L[&amp;#34;L3 Table entry 0&amp;#34;]
    L --&amp;gt; M[&amp;#34;Physical Frame address&amp;#34;]
    M --&amp;gt; N[&amp;#34;Add page offset (bits 11:0 = 0x234)&amp;#34;]
    N --&amp;gt; O[&amp;#34;Physical Address&amp;#34;]

    style A fill:#9ff,stroke:#333
    style M fill:#ff9,stroke:#333
    style O fill:#9f9,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Virtual address translation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;31-working-example&#34;&gt;3.1 Working example&lt;/h3&gt;
&lt;p&gt;Let us use the same example as above, but let&amp;rsquo;s use a different virtual address: &lt;code&gt;0x8000_0000&lt;/code&gt; to help us understand the translation process. We&amp;rsquo;ll trace the translation of VA &lt;code&gt;0x8000_0000&lt;/code&gt; (the test address we&amp;rsquo;ll use later):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L0 index&lt;/strong&gt;: bits 47:39 = &lt;code&gt;0x8000_0000 &amp;gt;&amp;gt; 39&lt;/code&gt; = 0. First entry in L0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L1 index&lt;/strong&gt;: bits 38:30 = &lt;code&gt;(0x8000_0000 &amp;gt;&amp;gt; 30) &amp;amp; 0x1FF&lt;/code&gt; = 2. Third entry in L1 (covers the 2-3 GB range).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L2 index&lt;/strong&gt;: bits 29:21 = &lt;code&gt;(0x8000_0000 &amp;gt;&amp;gt; 21) &amp;amp; 0x1FF&lt;/code&gt; = 0. First entry in L2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L3 index&lt;/strong&gt;: bits 20:12 = &lt;code&gt;(0x8000_0000 &amp;gt;&amp;gt; 12) &amp;amp; 0x1FF&lt;/code&gt; = 0. First entry in L3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page offset&lt;/strong&gt;: bits 11:0 = 0. Start of the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the hardware walks: &lt;code&gt;L0[0] -&amp;gt; L1[2] -&amp;gt; L2[0] -&amp;gt; L3[0] -&amp;gt; physical frame&lt;/code&gt;; then adds the page offset (0 in this case) to get the final physical address. If any of those entries were invalid, we&amp;rsquo;d get a page fault instead.&lt;/p&gt;
&lt;p&gt;This multi-level structure allows us to efficiently map a huge virtual address space without needing an enormous flat page table. Each level of the tree only exists for the parts of the address space we actually use. If a program only uses a few megabytes of memory, we only need a handful of page table entries, not billions.&lt;/p&gt;
&lt;h2 id=&#34;4-why-4-levels&#34;&gt;4. Why 4 levels?&lt;/h2&gt;
&lt;p&gt;Imagine a naive single-level page table with a 48-bit virtual address space (256 TB) and 4KB pages, you&amp;rsquo;d need 256 TB / 4 KB = 68 billion entries. At 8 bytes each, that&amp;rsquo;s &lt;strong&gt;512 GB per process&lt;/strong&gt; just for the page table, which is completely impractical. Even if you had that much RAM, the CPU would be overwhelmed trying to search through such a huge table on every memory access. That&amp;rsquo;s why we use a multi-level page table.&lt;/p&gt;
&lt;p&gt;Each level of the tree allows us to cover a large portion of the address space with a single entry. The top-level L0 table has 512 entries, each covering 512 GB. The next level, L1, has 512 entries, each covering 1 GB. The next level, L2, has 512 entries, each covering 2 MB. Finally, the L3 level has 512 entries, each covering 4 KB (one page).&lt;/p&gt;
&lt;p&gt;The solution is a tree structure where you only allocate page table nodes for memory regions you actually use; a small program using 8 KB of memory needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 L0 table (4 KB)&lt;/li&gt;
&lt;li&gt;1 L1 table (4 KB)&lt;/li&gt;
&lt;li&gt;1 L2 table (4 KB)&lt;/li&gt;
&lt;li&gt;1 L3 table (4 KB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: 16 KB&lt;/strong&gt; of page table overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compare that to 512 GB for the flat table. That&amp;rsquo;s a factor of 33 million. Wow! 🫨 Memory efficiency is the main reason for the multi-level design. The tree structure also allows for efficient lookups. The hardware walks down the tree, and if it encounters an invalid entry at any level, it can immediately raise a page fault without searching a huge flat table.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig2&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    L0[&amp;#34;L0 Table (root)&amp;lt;br/&amp;gt;512 entries&amp;lt;br/&amp;gt;each covers 512 GB&amp;#34;]
    L1a[&amp;#34;L1 Table&amp;lt;br/&amp;gt;512 entries&amp;lt;br/&amp;gt;each covers 1 GB&amp;#34;]
    L2a[&amp;#34;L2 Table&amp;lt;br/&amp;gt;512 entries&amp;lt;br/&amp;gt;each covers 2 MB&amp;#34;]
    L3a[&amp;#34;L3 Table&amp;lt;br/&amp;gt;512 entries&amp;lt;br/&amp;gt;each covers 4 KB&amp;#34;]
    P1[&amp;#34;4 KB Frame&amp;#34;]
    P2[&amp;#34;4 KB Frame&amp;#34;]

    L0 --&amp;gt; L1a
    L0 -.-&amp;gt; L1b[&amp;#34;(unused)&amp;#34;]
    L1a --&amp;gt; L2a
    L1a -.-&amp;gt; L2b[&amp;#34;(unused)&amp;#34;]
    L2a --&amp;gt; L3a
    L2a -.-&amp;gt; L3b[&amp;#34;(unused)&amp;#34;]
    L3a --&amp;gt; P1
    L3a --&amp;gt; P2

    style L0 fill:#f99,stroke:#333
    style L1a fill:#ff9,stroke:#333
    style L2a fill:#9f9,stroke:#333
    style L3a fill:#9ff,stroke:#333
    style P1 fill:#99f,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;Figure 2: Page table tree structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Of course, in the real world, programs use scattered memory regions (heap, stack, code, libraries at various addresses), but since the tree is sparse, you only pay for what you use. The multi-level structure also allows for efficient lookups. The hardware walks down the tree, and if it encounters an invalid entry at any level, it can immediately raise a page fault.&lt;/p&gt;
&lt;h2 id=&#34;5-frame-allocator&#34;&gt;5. Frame allocator&lt;/h2&gt;
&lt;p&gt;Before we can build page tables, we need a way to allocate physical memory. Our frame allocator is the simplest kind: a bump allocator.&lt;/p&gt;
&lt;p&gt;A what now? In terms of frame allocators, there are many strategies you can use. A bump allocator is the simplest: it just keeps a pointer to the next free frame and increments it on each allocation. This is fast and simple, but it can&amp;rsquo;t free memory.&lt;/p&gt;
&lt;p&gt;There is also a free list allocator that maintains a linked list of free frames, allowing for reuse but with more overhead. And finally, there is a bitmap allocator that uses a bitmap to track which frames are free or in use, which can be more space-efficient but also more complex.&lt;/p&gt;
&lt;p&gt;For our demo, the bump allocator is sufficient since we only need to allocate a few frames during initialization.&lt;/p&gt;
&lt;p&gt;There are two main challenges here: finding free memory to use as frames, and ensuring we don&amp;rsquo;t overwrite our kernel code or stack. We solve both by starting our allocator at the end of the kernel image (after the stack) and just bumping up from there. The linker script gives us a symbol (&lt;code&gt;__stack_top&lt;/code&gt;) that marks the end of the kernel image, so we can safely start allocating frames from that point onward. This way, we avoid overwriting any critical data structures.&lt;/p&gt;
&lt;p&gt;In a real OS, you&amp;rsquo;d want a more robust memory management system that can handle fragmentation and support freeing frames, but this simple approach is enough for our demo.&lt;/p&gt;
&lt;h3 id=&#34;51-the-actual-code&#34;&gt;5.1 The actual code&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s look at the code; below is the implementation from &lt;code&gt;mem.rs&lt;/code&gt;. The &lt;code&gt;FrameAlloc&lt;/code&gt; struct keeps track of the next free frame and the end of available memory. The &lt;code&gt;alloc()&lt;/code&gt; method returns the next free frame and advances the pointer, or returns &lt;code&gt;None&lt;/code&gt; if we&amp;rsquo;ve run out of memory.&lt;/p&gt;
&lt;p&gt;The code below is a simplified version of a frame allocator, suitable for our demo; in a production OS, you&amp;rsquo;d want to handle fragmentation, support freeing frames, and possibly implement more complex allocation strategies. The constants at the top define the RAM region provided by QEMU&amp;rsquo;s virt machine, and the &lt;code&gt;align_up&lt;/code&gt; function ensures that our allocations are properly aligned to page boundaries.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_START&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x4000_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_SIZE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_END&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_START&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_SIZE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PAGE_SIZE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;4096&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; __stack_top: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;align_up&lt;/span&gt;(x: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;, align: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; align &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;(align &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;FrameAlloc&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    next: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    end: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; FrameAlloc {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;(start: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;, end: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; { next: &lt;span style=&#34;color:#eed49f&#34;&gt;start&lt;/span&gt;, end }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;alloc&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Option&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; p &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.next;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; p &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PAGE_SIZE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.end {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;None&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PAGE_SIZE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Some&lt;/span&gt;(p)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Frame allocator (mem.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;QEMU&amp;rsquo;s virt machine gives us 256 MB of RAM starting at &lt;code&gt;0x4000_0000&lt;/code&gt;. The kernel image and stack live at the beginning of this region. We start allocating frames after the stack ends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;__stack_top&lt;/code&gt; linker symbol&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This doesn&amp;rsquo;t hold a value like a normal variable. Its &lt;em&gt;address&lt;/em&gt; marks the end of the kernel image in memory. The linker script defines it. We take its address using &lt;code&gt;&amp;amp;__stack_top as *const u8 as u64&lt;/code&gt; to determine where free memory begins. This is a common pattern in OS development: using linker symbols to mark important memory boundaries (like the end of the kernel, the start of the heap, etc.) without hardcoding addresses. The linker ensures that &lt;code&gt;__stack_top&lt;/code&gt; is placed at the correct location in the final binary, so we can rely on it to give us the starting point for our frame allocator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;align_up&lt;/code&gt; bit trick&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The expression &lt;code&gt;(x + align - 1) &amp;amp; !(align - 1)&lt;/code&gt; rounds &lt;code&gt;x&lt;/code&gt; up to the next multiple of &lt;code&gt;align&lt;/code&gt;. Here&amp;rsquo;s how. If &lt;code&gt;align&lt;/code&gt; is 4096 (&lt;code&gt;0x1000&lt;/code&gt;), then &lt;code&gt;align - 1&lt;/code&gt; is 0xFFF (twelve 1-bits). Adding that ensures we overshoot if not already aligned. The bitwise AND with &lt;code&gt;!(align - 1)&lt;/code&gt; = &lt;code&gt;0xFFFF_FFFF_FFFF_F000&lt;/code&gt; clears the bottom 12 bits, snapping down to the nearest page boundary. This helps ensure that all our frame allocations are properly aligned to page boundaries, which is a requirement for the MMU.&lt;/p&gt;
&lt;p&gt;Working example: &lt;code&gt;align_up(0x4083, &lt;/code&gt;0x1000&lt;code&gt;)&lt;/code&gt; = &lt;code&gt;(0x4083 + 0xFFF) &amp;amp; 0xFFFFF000&lt;/code&gt; = &lt;code&gt;0x5082 &amp;amp; 0xFFFFF000&lt;/code&gt; = &lt;code&gt;0x5000&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;6-page-table-structures-in-rust&#34;&gt;6. Page table structures in Rust&lt;/h2&gt;
&lt;p&gt;OK, now let&amp;rsquo;s define the page table structures for our page table. Each level of the page table is represented by a &lt;code&gt;PageTable&lt;/code&gt; struct, which contains an array of 512 entries. We declare static instances for the L0, L1, and L2 tables, as well as a separate L3 table for our test virtual address. The hardware requires these tables to be 4KB-aligned, so we use &lt;code&gt;#[repr(align(4096))]&lt;/code&gt; to ensure that the Rust compiler places them at the correct boundaries in memory.&lt;/p&gt;
&lt;p&gt;The code below defines the &lt;code&gt;PageTable&lt;/code&gt; struct and the static instances for each level of the page table. Each table has 512 entries, and we initialize them to zero. The &lt;code&gt;new()&lt;/code&gt; method is a &lt;code&gt;const fn&lt;/code&gt;, allowing us to create these tables at compile time.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(align(4096))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    entries: [&lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; PageTable {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; { entries: [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;] }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L0&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_0&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new(); &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// VA 0..1GB (UART)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_1&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new(); &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// VA 1..2GB (RAM)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_2&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new(); &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// VA 2..3GB (test VA)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L3_TEST&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;PageTable&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PageTable::new();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Page table struct and static tables (mem.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;#[repr(align(4096))]&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As we touched earlier, the hardware requires page tables to be 4KB-aligned. This means the physical address of each table must be divisible by 4096, which guarantees the low 12 bits are all zeros. This isn&amp;rsquo;t just a performance optimization - it&amp;rsquo;s a hard requirement. The hardware uses the lower 12 bits of page table pointers to store attribute flags (valid bit, table/block bit, etc.).&lt;/p&gt;
&lt;p&gt;If the table weren&amp;rsquo;t aligned, its address would have non-zero low bits that would collide with the flag bits, and the MMU would misinterpret flags as address bits or vice versa. Each table is exactly 4KB (512 entries x 8 bytes per entry), conveniently fitting within a single physical frame.&lt;/p&gt;
&lt;p&gt;Without &lt;code&gt;#[repr(align(4096))]&lt;/code&gt;, Rust would use its default alignment for &lt;code&gt;[u64; 512]&lt;/code&gt;, which is just 8 bytes (the alignment of &lt;code&gt;u64&lt;/code&gt;). That&amp;rsquo;s not nearly enough. The &lt;code&gt;repr(align)&lt;/code&gt; attribute tells the Rust compiler and linker to place this struct at a 4096-byte boundary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;static mut&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Page tables must live at fixed, known addresses because we write those addresses into hardware registers (&lt;code&gt;TTBR0_EL1&lt;/code&gt;) and into other page table entries (each table descriptor contains the physical address of the next-level table). &lt;code&gt;static mut&lt;/code&gt; gives us globally accessible, mutable, fixed-address data.&lt;/p&gt;
&lt;p&gt;Normally, &lt;code&gt;static mut&lt;/code&gt; is dangerous in Rust (data race risk), but it&amp;rsquo;s fine here because we only modify these tables during single-threaded initialization before the MMU is on. Once the MMU is enabled, we never modify these tables again in our demo. A real OS would need proper synchronization (and TLB invalidation) when modifying page tables at runtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why separate L2 tables?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We have three L2 tables (&lt;code&gt;TT_L2_0&lt;/code&gt;, &lt;code&gt;TT_L2_1&lt;/code&gt;, &lt;code&gt;TT_L2_2&lt;/code&gt;) for the three 1GB regions we map. Each L1 entry covers 1GB, and each L2 table covers the 512 2MB sub-regions within that 1GB range. We could theoretically use one big L2 table, but splitting them makes the code clearer and matches the logical structure: one for UART (0-1GB), one for RAM (1-2GB), one for our test VA (2-3GB).&lt;/p&gt;
&lt;p&gt;In a real OS, you&amp;rsquo;d likely have many more L2 tables as you map more of the address space, but for our learning purposes, three is enough to illustrate the concept.&lt;/p&gt;
&lt;h2 id=&#34;7-descriptor-format&#34;&gt;7. Descriptor format&lt;/h2&gt;
&lt;p&gt;A descriptor is a 64-bit value that encodes both the physical address of the next-level table (or the mapped frame) and various attribute flags (valid, block/table bit, access permissions, etc.). This is the format defined by the ARM architecture for page table entries. The hardware expects this exact layout, and any deviation will cause translation failures or incorrect behavior.&lt;/p&gt;
&lt;p&gt;Below we have the bit layout of a page table entry (descriptor) for AArch64. The upper bits (47:12) contain the physical address of the next-level table or the mapped frame, while the lower bits contain various flags that control how the MMU interprets this entry.&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+----------------------------------+----------+----+--+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   Physical Address [47:12]       | Attributes| TBL|V |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   (36 bits)                      |           |    |  |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+----------------------------------+----------+----+--+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 63                                              1   0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Key bits:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [0]  : Valid (1 = entry is active)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [1]  : Table/Page (1) vs Block (0)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [10] : AF (Access Flag, must be 1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [9:8]: SH (Shareability)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [4:2]: AttrIndx (memory type index into MAIR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [54] : UXN (User Execute Never)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [53] : PXN (Privileged Execute Never)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Descriptor format (64 bits)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And below are the descriptor constants from our code; these are the flags we OR into the entries when building our page tables.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// table/page descriptor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_BLOCK&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// block descriptor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;AF&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Access Flag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SH_INNER&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0b11&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Inner Shareable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ATTRIDX0&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Normal memory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ATTRIDX1&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Device memory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PXN&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;53&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UXN&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;54&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Descriptor bit constants (mem.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;DESC_VALID&lt;/code&gt; bit indicates that an entry is valid.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;DESC_TABLE&lt;/code&gt; bit indicates that this entry points to another table (as opposed to a block or page).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;AF&lt;/code&gt; bit is the Access Flag, which must be set for the MMU to consider the entry valid.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;SH_INNER&lt;/code&gt; bits mark the memory as inner shareable, which affects caching and ordering.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;ATTRIDX0&lt;/code&gt; and &lt;code&gt;ATTRIDX1&lt;/code&gt; bits select between normal and device memory types defined in the MAIR register.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;PXN&lt;/code&gt; and &lt;code&gt;UXN&lt;/code&gt; bits control execution permissions for privileged and user modes, respectively.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why you can OR flags into addresses?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Page tables are 4KB-aligned, so the low 12 bits of any table address are guaranteed zero. We can safely OR attribute flags into those bits without corrupting the address. The address lives in bits 47:12, the flags live in bits 11:0 (plus some high bits like UXN/PXN). This is a common hardware trick: alignment guarantees give you &amp;ldquo;free&amp;rdquo; bits for metadata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table vs Block vs Page descriptors&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At L0, L1, and L2, bit [1] = 1 means &amp;ldquo;this entry points to another table&amp;rdquo; (table descriptor). At L1 and L2, bit [1] = 0 means &amp;ldquo;this entry directly maps a large region&amp;rdquo; (block descriptor, 1GB at L1 or 2MB at L2). At L3, bit [1] = 1 means &amp;ldquo;this entry maps a 4KB page&amp;rdquo; (page descriptor). Blocks are useful for mapping large contiguous regions with a single entry, rather than an entire next-level table.&lt;/p&gt;
&lt;h2 id=&#34;8-building-page-tables&#34;&gt;8. Building page tables&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s build the actual page tables. We have two goals here: create some identity mappings for the kernel and peripherals, and create one non-identity mapping to prove that translation is working.&lt;/p&gt;
&lt;p&gt;Our &lt;code&gt;build_tables()&lt;/code&gt; function creates three kinds of mappings. The first two are identity mappings for the UART and RAM, which are necessary for the kernel to continue functioning after the MMU is enabled. The third mapping is a non-identity mapping for a test virtual address (&lt;code&gt;0x8000_0000&lt;/code&gt;) that points to an allocated frame. This allows us to verify that the MMU is correctly translating addresses.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the mapping layout:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Virtual Address&lt;/th&gt;
          &lt;th&gt;Physical Address&lt;/th&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Size&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x0900_0000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;0x0900_0000&lt;/code&gt; (UART)&lt;/td&gt;
          &lt;td&gt;Device&lt;/td&gt;
          &lt;td&gt;2MB block&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x4000_0000&lt;/code&gt; - &lt;code&gt;0x5000_0000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Same (RAM)&lt;/td&gt;
          &lt;td&gt;Normal&lt;/td&gt;
          &lt;td&gt;2MB blocks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x8000_0000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;frame0&lt;/code&gt; (allocated)&lt;/td&gt;
          &lt;td&gt;Normal&lt;/td&gt;
          &lt;td&gt;4KB page&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;As we touched on earlier, the first two are &lt;strong&gt;identity mappings&lt;/strong&gt; (VA = PA). This is critical during boot because the kernel code was loaded at specific physical addresses, and the program counter already contains a physical address.&lt;/p&gt;
&lt;p&gt;When the MMU turns on, it translates &lt;em&gt;all&lt;/em&gt; addresses, including the instruction the CPU is currently executing. If that address isn&amp;rsquo;t identity-mapped, the CPU can&amp;rsquo;t fetch the next instruction and crashes.&lt;/p&gt;
&lt;p&gt;The UART is identity-mapped, so we can keep printing debug messages after the MMU is on. The RAM is identity-mapped so the kernel can continue accessing its data structures. The test VA is a non-identity mapping that points to an allocated frame, allowing us to verify that the MMU is correctly translating addresses.&lt;/p&gt;
&lt;p&gt;Lets us double-click and see what the code looks like for building these tables. The function &lt;code&gt;build_tables()&lt;/code&gt; initializes the page tables with the appropriate entries to create the mappings described above. It sets up the L0, L1, and L2 tables to point to each other, and then fills in the L2 and L3 entries for the UART, RAM, and test VA. The function returns the physical address of the L0 table (which we will load into &lt;code&gt;TTBR0_EL1&lt;/code&gt;) and the test virtual address for later verification.&lt;/p&gt;
&lt;p&gt;Note, the code uses unsafe blocks to modify the static mutable page tables, which is necessary because we&amp;rsquo;re directly manipulating memory structures that the hardware will read.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;build_tables&lt;/span&gt;(frame0: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) -&amp;gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; test_va: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x8000_0000&lt;/span&gt;; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 2GB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L0&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_0&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_1&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_2&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L3_TEST&lt;/span&gt;.entries &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// L0[0] -&amp;gt; L1 (covers low VA range)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L0&lt;/span&gt;.entries[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// L1[0] (0..1GB) -&amp;gt; L2_0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt;.entries[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// L1[1] (1..2GB) -&amp;gt; L2_1 (RAM at 0x4000_0000)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt;.entries[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// L1[2] (2..3GB) -&amp;gt; L2_2 (test VA)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L1&lt;/span&gt;.entries[&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_2&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Map UART 0x0900_0000 as a 2MB device block (identity).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; uart_va: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0900_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; uart_l2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((uart_va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x1FF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_0&lt;/span&gt;.entries[uart_l2] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (uart_va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFFFF_FFFF_FFE0_0000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_BLOCK&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ATTRIDX1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;AF&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PXN&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UXN&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Map RAM 0x4000_0000..0x5000_0000 as 2MB blocks, normal memory.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; blocks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_SIZE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;blocks {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_START&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; pa &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; va;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; idx &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x1FF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_1&lt;/span&gt;.entries[idx] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (pa &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFFFF_FFFF_FFE0_0000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_BLOCK&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ATTRIDX0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;AF&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SH_INNER&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Map test_va -&amp;gt; frame0 as a single 4KB page (through L3).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; test_l2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((test_va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x1FF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L2_2&lt;/span&gt;.entries[test_l2] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L3_TEST&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; test_l3 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((test_va &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;12&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x1FF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L3_TEST&lt;/span&gt;.entries[test_l3] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (frame0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFFFF_FFFF_FFFF_F000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_VALID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;DESC_TABLE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ATTRIDX0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;AF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SH_INNER&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; ttbr0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;raw &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TT_L0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; _ &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (ttbr0, test_va)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Building page tables (mem.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next, let us walk through the three mapping types - identity map for UART, identity map for RAM, and non-identity map for the test VA.&lt;/p&gt;
&lt;h3 id=&#34;81-uart-identity-map-device-memory&#34;&gt;8.1 UART identity map (device memory)&lt;/h3&gt;
&lt;p&gt;The UART lives at physical address &lt;code&gt;0x0900_0000&lt;/code&gt;. We need it identity-mapped so we can keep printing after the MMU is on. If we didn&amp;rsquo;t map it, any access to the UART registers would fail once the MMU is enabled, and we&amp;rsquo;d lose our ability to print debug messages.&lt;/p&gt;
&lt;p&gt;The UART is a memory-mapped device, so we mark it as device memory in the page table entry. Device memory has different caching and ordering rules than normal RAM, which is critical for correct operation. We also set the execute-never bits (&lt;code&gt;PXN&lt;/code&gt; and &lt;code&gt;UXN&lt;/code&gt;) to prevent any code execution from that region, which is a common safety measure for peripheral registers.&lt;/p&gt;
&lt;p&gt;To find which L2 entry to write, we extract the L2 index from the address using a right bit shift: &lt;code&gt;0x0900_0000 &amp;gt;&amp;gt; 21 = 72&lt;/code&gt;. The &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; operator shifts the binary representation right by 21 positions — equivalent to dividing by $2^{21}$ — which moves the L2 index field (bits 29:21 per the page table layout) down to the lowest bit positions. As a sanity check: each L2 entry covers 2MB, so entry 72 starts at $72 x 2 MB = 144 MB = 0x09000000. That&amp;rsquo;s exactly where our UART lives.&lt;/p&gt;
&lt;p&gt;We write this entry with &lt;code&gt;ATTRIDX1&lt;/code&gt; (device memory), &lt;code&gt;PXN&lt;/code&gt; and &lt;code&gt;UXN&lt;/code&gt; (prevent any code execution from UART registers), and &lt;code&gt;AF&lt;/code&gt; (access flag, required by the hardware). This creates a single 2MB block mapping for the UART. We could descend to L3 for finer-grained 4KB page control, but the UART registers are all within this one 2MB region, so a block descriptor is simpler and more efficient.&lt;/p&gt;
&lt;h3 id=&#34;82-ram-identity-map-normal-memory-2mb-blocks&#34;&gt;8.2 RAM identity map (normal memory, 2MB blocks)&lt;/h3&gt;
&lt;p&gt;The RAM identity map is straightforward. We want the entire RAM region to be accessible at the same addresses as their physical locations, so we can continue using our existing code without modification. In our case, the RAM spans &lt;code&gt;0x4000_0000&lt;/code&gt; to &lt;code&gt;0x5000_0000&lt;/code&gt; (256 MB). That&amp;rsquo;s 128 blocks, each 2 MB. We loop through all 128 and create block descriptors with &lt;code&gt;ATTRIDX0&lt;/code&gt; (normal memory, cacheable) and &lt;code&gt;SH_INNER&lt;/code&gt; (inner shareable, for future multi-core support).&lt;/p&gt;
&lt;p&gt;Using 2MB blocks instead of 4KB pages means we only need 128 L2 entries, not 65,536 L3 entries. Fewer entries means less memory used for page tables and fewer TLB misses. The downside is that we can&amp;rsquo;t set different permissions for individual 4KB pages within those 2MB blocks, but for our simple kernel, that&amp;rsquo;s not a concern.&lt;/p&gt;
&lt;p&gt;In a real OS, you might want finer-grained control and use page descriptors at L3 for some regions. The loop calculates the virtual and physical addresses for each block, which are the same because of the identity mapping. The L2 index is calculated as &lt;code&gt;(va &amp;gt;&amp;gt; 21) &amp;amp; 0x1FF&lt;/code&gt;, which gives us the correct entry in the L2 table for each 2MB block.&lt;/p&gt;
&lt;h3 id=&#34;83-test-va-mapping-4kb-page-through-l3&#34;&gt;8.3 Test VA mapping (4KB page through L3)&lt;/h3&gt;
&lt;p&gt;Before we dive in: &lt;code&gt;VA&lt;/code&gt; stands for &amp;ldquo;virtual address&amp;rdquo; - an address used by software which the MMU translates to a physical address (&lt;code&gt;PA&lt;/code&gt;). The low 12 bits are the page offset and remain the same after translation; the MMU replaces the upper bits (the virtual page number) with the physical frame number. In short VA = virtual address, PA = physical address, and offset bits pass through unchanged.&lt;/p&gt;
&lt;p&gt;Finally, the test VA mapping is the most interesting one. We want to prove that the MMU is actually translating addresses, so we create a non-identity mapping: virtual address &lt;code&gt;0x8000_0000&lt;/code&gt; maps to a physical frame we allocated earlier (let&amp;rsquo;s call it &lt;code&gt;frame0&lt;/code&gt;). This means that when we access &lt;code&gt;0x8000_0000&lt;/code&gt; in our code, the MMU will translate it to &lt;code&gt;frame0&lt;/code&gt; in physical memory. If we can read and write to that address successfully, it proves that the MMU is working correctly.&lt;/p&gt;
&lt;p&gt;It is also important to note that this is &lt;em&gt;not&lt;/em&gt; an identity map. The VA and PA are different. This is the whole point: proving that the MMU is actually translating.&lt;/p&gt;
&lt;p&gt;The walk: &lt;code&gt;L0[0] -&amp;gt; L1[2] -&amp;gt; L2_2[0] -&amp;gt; L3_TEST[0] -&amp;gt; frame0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This demonstrates a full 4-level walk with a non-identity mapping. The L0 entry points to the L1 table, the L1 entry at index 2 points to the L2_2 table, the L2_2 entry at index 0 points to the L3_TEST table, and the L3_TEST entry at index 0 maps to &lt;code&gt;frame0&lt;/code&gt;. This shows that the MMU is correctly following the page table pointers and applying the translations as expected.&lt;/p&gt;
&lt;p&gt;Why L1 index 2? Because &lt;code&gt;0x8000_0000 &amp;gt;&amp;gt; 30 = 2&lt;/code&gt;. Each L1 entry covers 1GB. Index 0 covers 0-1GB, index 1 covers 1-2GB, index 2 covers 2-3GB. Our test address is at the start of the 2-3GB range. We point L1[2] to &lt;code&gt;TT_L2_2&lt;/code&gt;, then L2_2[0] points to &lt;code&gt;TT_L3_TEST&lt;/code&gt;, and finally L3_TEST[0] maps the 4KB page to &lt;code&gt;frame0&lt;/code&gt;. This demonstrates a full 4-level walk with a non-identity mapping.&lt;/p&gt;
&lt;h2 id=&#34;9-mmu-configuration&#34;&gt;9. MMU configuration&lt;/h2&gt;
&lt;p&gt;MMU configuration is critical. The hardware uses the values in these registers to control how it performs address translation. If you get any of these wrong, the MMU won&amp;rsquo;t work as expected. You might get immediate faults, or worse, silent data corruption due to incorrect caching or permissions. Understanding what each register does and how it interacts with the page tables is essential for successful MMU setup. When we enable the MMU, the hardware reads these registers to determine how to interpret our page tables and perform translations.&lt;/p&gt;
&lt;p&gt;Three system registers control how the MMU translates addresses. Getting any of these wrong means either an immediate CPU fault or (worse) silently incorrect translations that can cause data corruption or security issues. Let us walk through each one and explain the fields we set and why.&lt;/p&gt;
&lt;p&gt;These registers are: MAIR_EL1 (Memory Attribute Indirection Register), TCR_EL1 (Translation Control Register), and TTBR0_EL1 (Translation Table Base Register 0). Let&amp;rsquo;s dig into each one in detail.&lt;/p&gt;
&lt;h3 id=&#34;91-mair_el1-memory-attribute-indirection-register&#34;&gt;9.1 MAIR_EL1 (Memory Attribute Indirection Register)&lt;/h3&gt;
&lt;p&gt;The MAIR defines the memory types that page table entries can reference. Each type specifies caching and ordering rules for memory accesses. This register defines up to 8 memory types (indexed 0 through 7). Each page table entry&amp;rsquo;s &lt;code&gt;AttrIndx&lt;/code&gt; field (bits [4:2]) selects one of these types. Rather than encoding full memory attributes in every page table entry (which would take too many bits), ARM uses this level of indirection: the page table entry says &amp;ldquo;use type 3&amp;rdquo; and MAIR defines what &amp;ldquo;type 3&amp;rdquo; means.&lt;/p&gt;
&lt;p&gt;We define two types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Attr0 = 0xFF&lt;/strong&gt;: Normal memory, write-back write-allocate. This is the highest-performance caching mode for RAM. Both inner and outer caches are enabled, writes go to the cache first and are flushed to the RAM later. The &lt;code&gt;0xFF&lt;/code&gt; encoding means inner write-back read/write-allocate (bits [7:4] = 0xF) and outer write-back read/write-allocate (&lt;code&gt;bits [3:0] = 0xF&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attr1 = 0x04&lt;/strong&gt;: Device memory, nGnRE. The acronym stands for non-Gathering, non-Reordering, Early-acknowledgment. Every access goes directly to hardware, in exactly the order your code specifies. No caching, no write combining, no speculative reads. The CPU treats each load and store as a side effect that must be visible to the device immediately. nGnRE is a common choice for memory-mapped peripherals like the UART, ensuring correct behavior without risking stale data or out-of-order accesses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why two types?&lt;/p&gt;
&lt;p&gt;Because UART registers and RAM need fundamentally different treatment. If you cache UART reads, you&amp;rsquo;ll see stale data (the UART has new input, but the cache still holds the old value). If you make RAM non-cacheable, performance drops by 10-100x because every load and store goes directly to DRAM instead of hitting the L1 cache. Getting this distinction right is one of the most common stumbling blocks in bare-metal ARM development. The MAIR allows us to define these types once and then reference them in our page tables, keeping our entries compact while still providing the necessary flexibility.&lt;/p&gt;
&lt;h3 id=&#34;92-tcr_el1-translation-control-register&#34;&gt;9.2 TCR_EL1 (Translation Control Register)&lt;/h3&gt;
&lt;p&gt;This is the most complex of the three registers. It configures the virtual address width, page granule, caching for the page table walk itself, and which translation tables are active. All of these are necessary for the MMU to function correctly. The TCR tells the hardware how to interpret our page tables and how to perform translations. If we set the virtual address size too small, we won&amp;rsquo;t be able to use the full address space. If we set the wrong granule size, the hardware will misinterpret our page table entries. If we forget to disable TTBR1, we might accidentally have translations from that register interfering with our intended mappings.&lt;/p&gt;
&lt;p&gt;Before the field-by-field breakdown, one quick definition: a &lt;strong&gt;granule&lt;/strong&gt; is the MMU page size for this translation regime. In this post, granule = 4KB, which means each translation unit is 4KB, page-table pages are 4KB, and all descriptor math (offset bits, alignment, index extraction) is based on that size. A useful mental model: if the granule changes, the &amp;ldquo;grid&amp;rdquo; the MMU uses to carve up memory changes too.&lt;/p&gt;
&lt;p&gt;Here are the fields we set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;T0SZ = 16&lt;/strong&gt;: This determines the virtual address size. The formula is: VA bits = 64 - T0SZ. So 64 - 16 = 48 bits, giving us a 256 TB virtual address space. Larger T0SZ values mean smaller address spaces but fewer levels of page table to walk. We choose 16 to get a 48-bit VA space, which is more than enough for our demo and matches what Linux typically uses on AArch64. Setting this too small (e.g., T0SZ=32 for a 32-bit VA space) would limit us to 4 GB of virtual memory, which isn&amp;rsquo;t enough for modern OSes. Setting it too large (e.g., T0SZ=0 for a full 64-bit VA space) would require more levels of page tables and more memory overhead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TG0 = 0b00&lt;/strong&gt;: Selects a 4KB granule for TTBR0 translations. This must match the software side (&lt;code&gt;PAGE_SIZE = 4096&lt;/code&gt;) and the table assumptions we&amp;rsquo;ve used throughout the post. ARM also supports 16KB and 64KB granules, but if TG0 says 16KB while your tables are laid out for 4KB, the MMU parses the descriptors with the wrong geometry (different alignment and bit interpretation), and translations fail immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IRGN0/ORGN0 = 0b01&lt;/strong&gt;: The page table walk hardware itself does memory reads to traverse the tree. These fields control caching for those reads. Write-back write-allocate means the table entries get cached, so repeated walks to the same region are fast. If we set these to non-cacheable, every walk would go to RAM, causing a huge performance hit. If we set them to write-through, we lose the performance benefits of caching. Write-back write-allocate is the best choice for page table walks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SH0 = 0b11&lt;/strong&gt;: Inner shareable. This ensures that page table updates are visible across cores in a multi-core system. Even on our single-core setup, it&amp;rsquo;s good practice to set this correctly. If we set it to non-shareable, other cores might not see updates to the page tables, leading to stale translations and hard-to-debug issues in a multi-core OS. Setting it to outer shareable is also an option, but inner shareable is typically recommended for page tables since they are frequently accessed and updated by the CPU.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EPD1 = 1&lt;/strong&gt;: Disable TTBR1 translations. AArch64 supports two translation table base registers: TTBR0 (typically for user space, lower VA range) and TTBR1 (typically for kernel, upper VA range). We only use TTBR0, so we disable TTBR1 to avoid accidental translations. If we forget to disable TTBR1, and it contains a non-zero value, the hardware might use it for addresses in the upper VA range, causing unexpected translations and potential security issues. Disabling it ensures that only TTBR0 is used for all translations, simplifying our setup and reducing the risk of mistakes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IPS = 0b010&lt;/strong&gt;: 40-bit physical address space, supporting up to 1 TB of physical RAM. QEMU&amp;rsquo;s virt machine only has 256 MB, but setting this wider does no harm and matches what Linux typically uses. Setting IPS too small (e.g., 32-bit PA space) would limit us to 4 GB of physical memory, which isn&amp;rsquo;t enough for modern hardware. Setting it too large (e.g., 48-bit PA space) would require more bits in page table entries for addresses, reducing the number of bits available for flags and potentially causing issues with our simple page table setup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;93-ttbr0_el1-translation-table-base-register&#34;&gt;9.3 TTBR0_EL1 (Translation Table Base Register)&lt;/h3&gt;
&lt;p&gt;This is the simplest of the three registers - it holds the physical address of our L0 page table. The MMU uses it as the starting point for every translation. When the CPU accesses virtual address X, the hardware reads TTBR0 to find the L0 table, then walks from there. Changing TTBR0 changes the entire virtual address space - that&amp;rsquo;s how operating systems switch between process page tables on a context switch. In our case, we set TTBR0 to the physical address of &lt;code&gt;TT_L0&lt;/code&gt;, which is the root of our page table tree. This tells the MMU where to start when translating addresses.&lt;/p&gt;
&lt;p&gt;If we set TTBR0 to the wrong address, the MMU will read garbage data as the L0 table, causing all translations to fail. If it points to a valid but incorrect page table, we might get seemingly random translations that are very hard to debug.&lt;/p&gt;
&lt;p&gt;Ensuring that TTBR0 points to the correct physical address of our L0 table is critical for the MMU to function correctly. We calculate this address using &lt;code&gt;&amp;amp;raw const TT_L0 as *const _ as u64&lt;/code&gt;, which gives us the physical address of the &lt;code&gt;TT_L0&lt;/code&gt; static variable. This is the root of our page table hierarchy, and the MMU will use it to start translating virtual addresses.&lt;/p&gt;
&lt;h2 id=&#34;10-enabling-the-mmu&#34;&gt;10. Enabling the MMU&lt;/h2&gt;
&lt;p&gt;Enabling the MMU is a delicate dance of setting up the right registers, ensuring all memory writes are visible to the hardware, and then flipping the enable bit. The sequence matters, and so do the &lt;strong&gt;barriers&lt;/strong&gt;. A barrier is a CPU instruction that forces ordering: &amp;ldquo;finish these operations first, then continue&amp;rdquo;. In this section we&amp;rsquo;ll use two of them: &lt;code&gt;dsb&lt;/code&gt; (complete/commit prior memory effects) and &lt;code&gt;isb&lt;/code&gt; (refresh the instruction pipeline after control-register changes). If you skip a barrier or use the wrong order, the MMU can observe stale state and fail in ways that are very hard to debug, sometimes before even UART prints still work.&lt;/p&gt;
&lt;p&gt;The listing below is the actual &lt;code&gt;enable_mmu&lt;/code&gt; assembly from &lt;code&gt;boot.S&lt;/code&gt;. It performs the following steps: one, configure the MAIR and TCR registers; two, set TTBR0 to point to our L0 table; three, use barriers to ensure all writes are visible and the TLB is flushed; and four, set the M bit in &lt;code&gt;SCTLR_EL1&lt;/code&gt; to turn on the MMU.&lt;/p&gt;
&lt;p&gt;The code can be a bit intimidating at first glance, but each step is necessary for correct MMU operation. The barriers (&lt;code&gt;dsb&lt;/code&gt; and &lt;code&gt;isb&lt;/code&gt;) ensure that all previous memory operations are complete and visible to the hardware before we enable the MMU. The TLB invalidate ensures that no stale translations are cached when we turn on the MMU. Finally, setting the M bit in &lt;code&gt;SCTLR_EL1&lt;/code&gt; actually enables the MMU; until that point, all addresses remain physical.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.global&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;enable_mmu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;enable_mmu:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// MAIR_EL1: Attr0 = 0xFF (Normal WBWA), Attr1 = 0x04 (Device nGnRE)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xFF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x04
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;mair_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// TCR_EL1: T0SZ=16, 4k granule, SH=inner, IRGN/ORGN=WBWA, EPD1=1, IPS=40-bit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#16                  // T0SZ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b11)              // SH0 = inner shareable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#12
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b01)              // ORGN0 = WBWA
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b01)              // IRGN0 = WBWA
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1)                 // EPD1 = disable TTBR1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#23
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b010)             // IPS = 40-bit PA
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;tcr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// TTBR0_EL1 (x0 = L0 table base, passed as argument)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ttbr0_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Synchronize and invalidate TLB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;dsb&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;tlbi&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vmalle1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;dsb&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable MMU: read-modify-write SCTLR_EL1 to set M=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;sctlr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#1              // M = 1 (MMU on)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 2)       // C = 0 (data cache off)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 12)      // I = 0 (instruction cache off)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sctlr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: enable_mmu assembly (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let us walk through the critical steps and barriers in this code as they are often the source of confusion and bugs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;dsb sy&lt;/code&gt; (Data Synchronization Barrier, System)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This Waits until all pending memory writes complete. Our page table entries might still be in write buffers, not yet committed to RAM. Without this, the MMU could read a partially-written entry.&lt;/p&gt;
&lt;p&gt;This is a common pitfall: you set up your page tables in memory, but the CPU hasn&amp;rsquo;t actually written them to RAM yet. If you enable the MMU before those writes are visible, the hardware will read garbage data for your page tables, causing all translations to fail.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;dsb sy&lt;/code&gt; ensures that all those writes are flushed out and visible to the MMU before we proceed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;isb&lt;/code&gt; (Instruction Synchronization Barrier)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This flushes the CPU&amp;rsquo;s instruction pipeline. After changing a system register, the pipeline still contains instructions fetched under the old settings. &lt;code&gt;isb&lt;/code&gt; forces the CPU to re-fetch everything.&lt;/p&gt;
&lt;p&gt;This is crucial after enabling the MMU because the very next instructions will be executed with virtual address translation active. If we didn&amp;rsquo;t have this barrier, the CPU might execute some instructions with the old physical address mappings, which could lead to unpredictable behavior or crashes. The &lt;code&gt;isb&lt;/code&gt; ensures that all subsequent instructions are fetched and executed under the new MMU configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;tlbi vmalle1&lt;/code&gt; (TLB Invalidate All at EL1)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The TLB caches old VA-to-PA translations. Stale entries could cause the MMU to use wrong translations. This instruction throws them all away. If we forget this step, the TLB might still contain entries from before we set up our new page tables, leading to incorrect translations and very confusing bugs.&lt;/p&gt;
&lt;p&gt;For example, if the TLB has an old entry for a virtual address that points to a different physical address than what we set up in our new tables, the MMU will use that stale translation instead of the correct one, causing memory corruption or faults. The &lt;code&gt;tlbi vmalle1&lt;/code&gt; ensures that all TLB entries are invalidated, so the MMU will fetch fresh translations from our newly configured page tables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The read-modify-write pattern&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mrs x1, sctlr_el1&lt;/code&gt; reads the entire system control register. &lt;code&gt;orr x1, x1, #1&lt;/code&gt; sets bit 0 (MMU enable) while preserving everything else. &lt;code&gt;bic&lt;/code&gt; clears the cache bits (we leave caches off for simplicity). &lt;code&gt;msr sctlr_el1, x1&lt;/code&gt; writes it back. We don&amp;rsquo;t just write a fresh value because SCTLR has dozens of other control bits we don&amp;rsquo;t want to disturb.&lt;/p&gt;
&lt;p&gt;If we just wrote &lt;code&gt;msr sctlr_el1, #1&lt;/code&gt;, we&amp;rsquo;d accidentally clear all those other bits, which could disable caches, change endianness, or cause other unintended side effects. By using the read-modify-write pattern, we ensure that we only change the bits we intend to (enabling the MMU) while leaving all other settings intact.&lt;/p&gt;
&lt;p&gt;After this function returns, every memory access goes through the page tables. Even the stack pointer is now a virtual address (which is fine because we identity-mapped RAM). If we set up everything correctly, the MMU will translate addresses according to our page tables, and we can access the UART and RAM through their virtual addresses. If we made a mistake in any of the previous steps (e.g., incorrect MAIR/TCR settings, wrong TTBR0 value, missing barriers), we might end up with a non-functional MMU, which can be very difficult to debug since even our debug prints might not work.&lt;/p&gt;
&lt;p&gt;The sequence diagram below summarizes the interactions between our Rust code, the assembly function that enables the MMU, and the MMU hardware itself. It shows the steps taken to configure the MMU and the critical barriers that ensure correct operation.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig3&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Rust as Rust Code
    participant ASM as enable_mmu (Assembly)
    participant MMU as MMU Hardware

    Rust-&amp;gt;&amp;gt;ASM: Call enable_mmu(ttbr0)
    activate ASM
    ASM-&amp;gt;&amp;gt;MMU: Write MAIR_EL1 (memory attributes)
    ASM-&amp;gt;&amp;gt;MMU: Write TCR_EL1 (translation control)
    ASM-&amp;gt;&amp;gt;MMU: Write TTBR0_EL1 (page table base)
    ASM-&amp;gt;&amp;gt;MMU: dsb sy + isb (drain writes)
    ASM-&amp;gt;&amp;gt;MMU: tlbi vmalle1 (flush TLB)
    ASM-&amp;gt;&amp;gt;MMU: dsb ish + isb (ensure flush complete)
    ASM-&amp;gt;&amp;gt;MMU: Set SCTLR_EL1.M=1 (enable!)
    ASM-&amp;gt;&amp;gt;MMU: isb (flush pipeline)
    MMU-&amp;gt;&amp;gt;MMU: Translation now active
    ASM-&amp;gt;&amp;gt;Rust: Return (virtual addresses in use)
    deactivate ASM
    Note over Rust: All memory accesses&amp;lt;br/&amp;gt;now go through page tables&lt;/pre&gt;
    &lt;figcaption&gt;Figure 3: MMU enablement sequence&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;11-running-the-demo&#34;&gt;11. Running the demo&lt;/h2&gt;
&lt;p&gt;OK, we built the page tables, we configured the MMU registers, and we enabled the MMU. How do we know it worked? The only way to truly prove that the MMU is functioning correctly is to perform a memory access through a virtual address that goes through our page tables and see if we get the expected result. If the MMU isn&amp;rsquo;t working, we&amp;rsquo;ll either get a fault (if the hardware detects an invalid access) or incorrect data (if the hardware misinterprets our page tables). In our demo, we write a known value (&lt;code&gt;0xDEAD_BEEF&lt;/code&gt;) to the test virtual address (&lt;code&gt;0x8000_0000&lt;/code&gt;) that we set up to point to &lt;code&gt;frame0&lt;/code&gt;. If we can read back the same value from that virtual address after enabling the MMU, it proves that the MMU is correctly translating addresses through our page tables.&lt;/p&gt;
&lt;p&gt;The listings below show how to run the full memory management demo, which includes frame allocation, page table construction, MMU enablement, and virtual address translation. The &lt;code&gt;demo()&lt;/code&gt; function in &lt;code&gt;mem.rs&lt;/code&gt; orchestrates all these steps and prints out the results.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;demo&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: demo start&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; kernel_end &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;__stack_top &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; free_start &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; align_up(kernel_end, &lt;span style=&#34;color:#eed49f&#34;&gt;PAGE_SIZE&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: kernel_end=0x&amp;#34;&lt;/span&gt;, kernel_end);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: free_start=0x&amp;#34;&lt;/span&gt;, free_start);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: ram_end=0x&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_END&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; fa &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; FrameAlloc::new(free_start, &lt;span style=&#34;color:#eed49f&#34;&gt;RAM_END&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate a few frames and write/read patterns.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; f0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; fa.alloc().expect(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;no frame&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; f1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; fa.alloc().expect(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;no frame&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: frame0=0x&amp;#34;&lt;/span&gt;, f0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: frame1=0x&amp;#34;&lt;/span&gt;, f1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        write_volatile(f0 &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0xAABB_CCDD&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        write_volatile(f1 &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0x1122_3344&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; r0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; read_volatile(f0 &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; r1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; read_volatile(f1 &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: read0=0x&amp;#34;&lt;/span&gt;, r0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: read1=0x&amp;#34;&lt;/span&gt;, r1);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Build page tables and enable MMU.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; (ttbr0, test_va) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; build_tables(f0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: ttbr0=0x&amp;#34;&lt;/span&gt;, ttbr0);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: test_va=0x&amp;#34;&lt;/span&gt;, test_va);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: enabling MMU (caches off)...&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { enable_mmu(ttbr0) };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If we survived, translation is live!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; p &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_va &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        write_volatile(p, &lt;span style=&#34;color:#f5a97f&#34;&gt;0xDEAD_BEEF&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; r &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; read_volatile(p) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        put_hex(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: test_va_read=0x&amp;#34;&lt;/span&gt;, r);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mm: demo done (MMU is ON)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Memory management demo (mem.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The code allocates frames, builds the page tables with the mappings we discussed, enables the MMU, and then performs a read/write test on the virtual address to verify that translation is working. The expected output includes the addresses of the kernel end, free memory start, RAM end, allocated frames, page table base, test virtual address, and the value read back from the test virtual address after MMU enablement.&lt;/p&gt;
&lt;p&gt;The unsafe blocks are necessary because we&amp;rsquo;re directly manipulating memory and hardware registers, which is inherently unsafe in Rust. The &lt;code&gt;write_volatile&lt;/code&gt; and &lt;code&gt;read_volatile&lt;/code&gt; functions are used to ensure that the compiler doesn&amp;rsquo;t optimize away our memory accesses, which is critical when working with memory-mapped hardware and page tables.&lt;/p&gt;
&lt;p&gt;Now, let us build and run the demo with the following commands:&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-memory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Build and run the memory demo&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Below the listing shows a trace from my run and gives you a sense of the expected output; of course the exact addresses may vary, but the key part is that we see the correct values read back from the test virtual address, proving that translation works.&lt;/p&gt;
&lt;figure&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: memory management demo (frames + page tables)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: kernel_end=0x000000004009A010
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: free_start=0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: ram_end=0x0000000050000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: frame0=0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: frame1=0x000000004009C000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: read0=0x00000000AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: read1=0x0000000011223344
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: ttbr0=0x0000000040085000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: test_va=0x0000000080000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: enabling MMU (caches off)...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: test_va_read=0x00000000DEADBEEF
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo done (MMU is ON)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Memory management demo output&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;fig4&#34;&gt;
&lt;img src=&#34;images/demo-memory.png&#34; alt=&#34;Memory management demo: frame allocation, page table construction, MMU enable, and virtual address translation&#34; title=&#34;Memory management demo: frame allocation, page table construction, MMU enable, and virtual address translation&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Memory management demo showing frame allocation, page table construction, MMU enablement, and virtual address translation.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;So did it all work? Or is it all mumbo jumbo? Well, the three things prove it worked:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The MMU enabled without crashing.&lt;/strong&gt; If our page tables had any errors (unmapped kernel code, unmapped stack, misaligned tables), the CPU would have faulted immediately. The fact that we got to the point of printing &amp;ldquo;MMU is ON&amp;rdquo; means the MMU is functioning well enough to fetch instructions and access memory without faults. This is the first and most basic proof that the MMU is working. If there were any critical errors in our page tables or MMU configuration, we would have seen a fault as soon as we enabled the MMU, and we wouldn&amp;rsquo;t have been able to print anything afterward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The UART still works after MMU enable.&lt;/strong&gt; That means our device memory identity mapping is correct. If we had forgotten to map the UART or set the wrong attributes, we would have lost our ability to print immediately after enabling the MMU. The fact that we can still print debug messages after MMU enablement is a strong indication that our page tables are correctly set up to allow access to the UART registers, and that the MMU is correctly translating those addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;test_va_read=0xDEADBEEF&lt;/code&gt;&lt;/strong&gt;: We wrote &lt;code&gt;0xDEAD_BEEF&lt;/code&gt; to virtual address &lt;code&gt;0x8000_0000&lt;/code&gt;, and read it back successfully. The MMU translated that VA through our L0/L1/L2/L3 tables to the physical frame we allocated. Translation works. This is the ultimate proof that our MMU setup is correct. Woot!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the MMU wasn&amp;rsquo;t working, we would either get a fault when trying to access &lt;code&gt;test_va&lt;/code&gt;, or we would read back an incorrect value. The fact that we read back the exact value we wrote confirms that the MMU is correctly translating virtual addresses to physical addresses according to our page tables.&lt;/p&gt;
&lt;h2 id=&#34;12-the-tlb-translation-lookaside-buffer&#34;&gt;12. The TLB (Translation Lookaside Buffer)&lt;/h2&gt;
&lt;p&gt;You might be wondering - doesn&amp;rsquo;t walking 4 levels of page tables on &lt;em&gt;every&lt;/em&gt; memory access make everything incredibly slow? Each level requires a memory read, so that&amp;rsquo;s 4 extra memory accesses for every load or store your program does. If a simple &lt;code&gt;mov x0, [x1]&lt;/code&gt; normally takes ~4 cycles, adding 4 table lookups would make it ~20 cycles. That&amp;rsquo;s a 5x slowdown on everything  - obviously unacceptable for a real OS.&lt;/p&gt;
&lt;p&gt;Fortunately, the hardware has a solution to this problem - its called the &lt;strong&gt;Translation Lookaside Buffer (TLB)&lt;/strong&gt;. The TLB is a small, fast cache that stores recent virtual-to-physical address translations. When the MMU needs to translate a VA, it first checks the TLB to see if it already has a cached translation for that address. If it does (a TLB hit), it can get the physical address in about 1 cycle, which is much faster than walking the page tables. If it doesn&amp;rsquo;t (a TLB miss), then it falls back to walking the full page table tree.&lt;/p&gt;
&lt;p&gt;Think of the TLB like a cheat sheet: instead of walking the full page table tree every time, the MMU first checks if it already knows the answer from a recent lookup. The TLB is typically 48-1536 entries (varying by CPU), stored in extremely fast SRAM right next to the MMU logic.&lt;/p&gt;
&lt;p&gt;On a TLB hit (which happens ~95-99% of the time for typical workloads), the MMU gets the physical address in about 1 cycle - the same speed as if there were no translation at all. The high hit rate comes from &lt;strong&gt;temporal locality&lt;/strong&gt; (programs tend to access the same addresses repeatedly) and &lt;strong&gt;spatial locality&lt;/strong&gt; (a single 4KB page covers many consecutive accesses). Only on a TLB miss does the hardware walk the full 4-level tree, which might take 20-40 cycles depending on whether the page table entries themselves are in the data cache.&lt;/p&gt;
&lt;p&gt;When you switch between processes (changing TTBR0 to a different page table), you need to invalidate the TLB because the old translations belong to a different address space. Without invalidation, Process B might use a stale TLB entry from Process A and access the wrong physical memory - a security and correctness disaster. That&amp;rsquo;s what our &lt;code&gt;tlbi vmalle1&lt;/code&gt; instruction does in &lt;code&gt;enable_mmu&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;ARM supports &lt;strong&gt;ASIDs&lt;/strong&gt; (Address Space IDs) to avoid this cost. Each TLB entry is tagged with a small process ID (8 or 16 bits). When you switch to Process B, the TLB entries tagged with Process A&amp;rsquo;s ASID are simply ignored rather than flushed. Process B&amp;rsquo;s entries from a previous run might still be there, avoiding cold-start misses. This is a significant optimization on context-switch-heavy workloads, but it&amp;rsquo;s a story for another day.&lt;/p&gt;
&lt;h2 id=&#34;13-summary&#34;&gt;13. Summary&lt;/h2&gt;
&lt;p&gt;To wrap up, let&amp;rsquo;s take a step back and look at the big picture. We started with a blank slate and built up a functioning kernel with memory management capabilities. We implemented a frame allocator to manage physical memory, constructed multi-level page tables to define our virtual address space, configured the MMU registers to tell the hardware how to perform translations, and finally enabled the MMU to activate virtual memory.&lt;/p&gt;
&lt;p&gt;That is pretty cool, and not because the code is sophisticated (I can tell you - it&amp;rsquo;s not, it&amp;rsquo;s a teaching OS); but because these are the same fundamental mechanisms used by Linux, Windows, macOS, and every other operating system with the differences are in scale and sophistication, not in kind. A 4-level page table walk on Linux works exactly the same way ours does. The context switch saves the same registers. The GIC uses the same IAR/EOIR protocol.&lt;/p&gt;
&lt;p&gt;Just for fun, let&amp;rsquo;s compare our tiny teaching kernel to real-world operating systems and see how we stack up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rustOS vs Linux&lt;/strong&gt;: Linux has ~30 million lines of code, supports 30+ architectures, has 10,000+ drivers, CFS scheduling, demand paging, swap, huge pages, NUMA, SELinux, namespaces, cgroups, and a full TCP/IP stack. We have about ~2K lines and a UART. But our boot sequence, IPC mechanism, context switch, and page table setup are structurally identical to what Linux does. If you read Linux&amp;rsquo;s &lt;code&gt;arch/arm64/kernel/head.S&lt;/code&gt;, you&amp;rsquo;ll recognize the EL2-to-EL1 drop, the vector table installation, and the MMU enable sequence. You built that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rustOS vs seL4&lt;/strong&gt;: &lt;a
	
		href = &#34;https://sel4.systems/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seL4
	&lt;/span&gt;
&lt;/a&gt; is a formally verified microkernel used in aerospace and medical devices. About ~10K lines of kernel code, backed by 200K lines of mathematical proofs showing the code behaves correctly. Its IPC takes ~100 cycles (whilst we don&amp;rsquo;t measure ours, it will be much slower). It has capability-based security, hard real-time guarantees, and true user/kernel separation. Our IPC design (endpoint-based mailboxes) is actually inspired by seL4&amp;rsquo;s endpoint model, just without the verification or performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rustOS vs xv6&lt;/strong&gt;: MIT&amp;rsquo;s &lt;a
	
		href = &#34;https://pdos.csail.mit.edu/6.828/2023/xv6.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xv6
	&lt;/span&gt;
&lt;/a&gt; is the closest comparison. It&amp;rsquo;s a teaching OS in about ~10K lines of C, with a monolithic Unix-like design. It has a shell, a filesystem, &lt;code&gt;fork()&lt;/code&gt;/&lt;code&gt;exec()&lt;/code&gt;, and pipe-based IPC. Where xv6 goes deeper into Unix APIs, we go deeper into bare-metal ARM specifics.&lt;/p&gt;
&lt;p&gt;If you want to keep going, here&amp;rsquo;s a rough roadmap, loosely ordered by difficulty and dependency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heap allocator&lt;/strong&gt;. Right now everything is on the stack. Implementing &lt;code&gt;GlobalAlloc&lt;/code&gt; (start with a linked-list allocator) unlocks &lt;code&gt;Box&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, and the whole &lt;code&gt;alloc&lt;/code&gt; crate. This enables almost everything else. Phil Oppermann&amp;rsquo;s &lt;a
	
		href = &#34;https://os.phil-opp.com/heap-allocation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		heap allocation post
	&lt;/span&gt;
&lt;/a&gt; is an excellent guide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Process abstraction&lt;/strong&gt;. Replace our static two-thread array with a proper process table: PIDs, state machine (ready, running, blocked), dynamic creation and destruction. See OSTEP &lt;a
	
		href = &#34;https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-intro.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chapter 4
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User mode&lt;/strong&gt;. Drop from EL1 to EL0 to run user code. This requires per-process page tables (TTBR0 swap on context switch), separate user/kernel stacks, and exception handling for the EL0-to-EL1 transition. High difficulty, high reward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;System calls&lt;/strong&gt;. The user-kernel API. On ARM, the &lt;code&gt;svc&lt;/code&gt; instruction traps from EL0 to EL1. You need a syscall dispatch table, argument passing conventions, and at minimum &lt;code&gt;exit()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;, and &lt;code&gt;yield()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll stop there, but the sky&amp;rsquo;s the limit. You can implement filesystems, drivers, networking, SMP, graphics, and more. The only real limit is your time and interest.&lt;/p&gt;
&lt;h2 id=&#34;15-resources-for-going-deeper&#34;&gt;15. Resources for going deeper&lt;/h2&gt;
&lt;p&gt;I did not set out to write a 5-part series on OS development, but quite a few folks reached out; so I wanted to provide a roadmap for those who want to go deeper. I am no expert and these are some of the better resources who are the experts in the field and are awesoeme for learning more about operating systems, ARM architecture, and low-level programming. This is by no means an exhaustive list, but it should give you a solid starting point for further exploration.&lt;/p&gt;
&lt;h3 id=&#34;151-books&#34;&gt;15.1 Books&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Operating Systems: Three Easy Pieces&lt;/em&gt; (Arpaci-Dusseau). Free online at &lt;a
	
		href = &#34;https://pages.cs.wisc.edu/~remzi/OSTEP/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ostep.org
	&lt;/span&gt;
&lt;/a&gt;. I think these are one of the best introductions to OS concepts! 💖&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Computer Systems: A Programmer&amp;rsquo;s Perspective&lt;/em&gt; (Bryant &amp;amp; O&amp;rsquo;Hallaron). Essential CS fundamentals.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Linux Kernel Development&lt;/em&gt; (Robert Love). Practical Linux internals.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;152-papers&#34;&gt;15.2 Papers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://people.eecs.berkeley.edu/~brewer/cs262/unix.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The UNIX Time-Sharing System
	&lt;/span&gt;
&lt;/a&gt; (Ritchie &amp;amp; Thompson, 1974). The original.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://dl.acm.org/doi/10.1145/168619.168633&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Improving IPC by Kernel Design
	&lt;/span&gt;
&lt;/a&gt; (Liedtke, 1993). Fast IPC in L4.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://sel4.systems/About/seL4-whitepaper.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seL4: Formal Verification of an OS Kernel
	&lt;/span&gt;
&lt;/a&gt; (Klein et al., 2009).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;153-projects&#34;&gt;15.3 Projects&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;xv6&lt;/strong&gt;: &lt;a
	
		href = &#34;https://pdos.csail.mit.edu/6.828/2023/xv6.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MIT&amp;rsquo;s teaching OS
	&lt;/span&gt;
&lt;/a&gt;. Comes with a free textbook explaining every line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Writing an OS in Rust&lt;/strong&gt;: &lt;a
	
		href = &#34;https://os.phil-opp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		os.phil-opp.com
	&lt;/span&gt;
&lt;/a&gt;. Philipp Oppermann&amp;rsquo;s excellent x86_64 blog series.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redox&lt;/strong&gt;: &lt;a
	
		href = &#34;https://www.redox-os.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		redox-os.org
	&lt;/span&gt;
&lt;/a&gt;. A Unix-like OS written entirely in Rust.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tock&lt;/strong&gt;: &lt;a
	
		href = &#34;https://www.tockos.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		tockos.org
	&lt;/span&gt;
&lt;/a&gt;. An embedded OS in Rust.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;154-communities&#34;&gt;15.4 Communities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://wiki.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev Wiki
	&lt;/span&gt;
&lt;/a&gt;. Invaluable reference for everything.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://forum.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev Forum
	&lt;/span&gt;
&lt;/a&gt;. Helpful community.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://reddit.com/r/osdev&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		r/osdev
	&lt;/span&gt;
&lt;/a&gt;. Reddit community.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;16-final-thoughts&#34;&gt;16. Final thoughts&lt;/h2&gt;
&lt;p&gt;Building an OS is hard. You&amp;rsquo;ve dealt with assembly boot code, interrupt timing constraints, context switching where a single wrong byte offset corrupts everything, and page tables where one misplaced bit means instant crash.&lt;/p&gt;
&lt;p&gt;But you&amp;rsquo;ve also seen that it&amp;rsquo;s &lt;em&gt;possible&lt;/em&gt;. The mechanisms aren&amp;rsquo;t magic. A timer fires, you save some registers, you load others, you jump. An address goes through a tree lookup. That&amp;rsquo;s it. The complexity in real operating systems comes from scale (thousands of devices, millions of users, decades of edge cases), not from fundamentally different ideas.&lt;/p&gt;
&lt;p&gt;Even if you never write another line of kernel code, you now know why &lt;code&gt;malloc&lt;/code&gt; can fail, why programs crash with &amp;ldquo;segmentation fault,&amp;rdquo; why &lt;code&gt;fork()&lt;/code&gt; is fast (copy-on-write page tables), and why your laptop doesn&amp;rsquo;t freeze when one tab hangs (preemptive scheduling). You see through the abstractions.&lt;/p&gt;
&lt;p&gt;Thanks for following along. Hopefully you picked up as much reading this as I did building it. And remember, next time you get a segfault, you know exactly what&amp;rsquo;s going on under the hood. Happy hacking! 😍&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 4 (this): Memory and beyond&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 3): Concurrency, interrupts and preemption</title>
      <link>/post/2026/03/building-microkernel-part3-concurrency-preemption/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/03/building-microkernel-part3-concurrency-preemption/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3 (this): Concurrency&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Recap from &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;: we built message-passing IPC with a mailbox router and a cooperative scheduler. Two tasks — PingTask and PongTask — exchange messages through endpoint-based routing, taking turns via &lt;code&gt;poll()&lt;/code&gt;. It works great, as long as every task plays nice.&lt;/p&gt;
&lt;p&gt;Right now, our tasks are polite. They take turns, each one calling &lt;code&gt;poll()&lt;/code&gt; and returning promptly. But what happens when a task doesn&amp;rsquo;t feel like returning? The whole system freezes. That&amp;rsquo;s the problem we&amp;rsquo;re solving today.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to teach our kernel to yank the CPU away from a misbehaving task, save everything that task was doing, and hand control to somebody else. By the end of this post, two threads will be running infinite loops, never yielding or returning, yet they&amp;rsquo;ll alternate perfectly. The OS will be in charge, not the tasks. 😈&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;We add timer interrupts and preemptive multitasking to rustOS on AArch64:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timer interrupts&lt;/strong&gt; fire every 100ms, giving us a real tick counter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The GIC&lt;/strong&gt; routes hardware interrupts to our handler&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exception vectors&lt;/strong&gt; catch IRQs and dispatch them to Rust code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context switching&lt;/strong&gt; saves all 31 general-purpose registers (plus SP, ELR, SPSR) from one thread and restores another&amp;rsquo;s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preemptive scheduling&lt;/strong&gt; means tasks can&amp;rsquo;t monopolize the CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few terms we&amp;rsquo;ll define as we go, but here&amp;rsquo;s the quick version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cooperative scheduling&lt;/strong&gt;: Tasks voluntarily give up the CPU. If one task loops forever, everyone else starves, and the system locks up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preemptive scheduling&lt;/strong&gt;: The OS forcibly takes the CPU away on a timer tick. No task can hog the processor because the OS interrupts it and switches to another task.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context switch&lt;/strong&gt;: Saving the complete CPU state of one task and loading another&amp;rsquo;s, so the second task resumes exactly where it left off. This includes all registers, the stack pointer, and CPU flags.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: ~4-6 hours&lt;/p&gt;
&lt;h2 id=&#34;1-why-interrupts-matter&#34;&gt;1. Why interrupts matter&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with the problem. Why do we need interrupts? Why can&amp;rsquo;t we just keep polling?&lt;/p&gt;
&lt;h3 id=&#34;11-the-polling-problem&#34;&gt;1.1 The polling problem&lt;/h3&gt;
&lt;p&gt;Remember our scheduler from Part 2?&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; task &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; tasks.iter_mut() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        task.poll(logger, router, tick);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Just counting loop iterations, not real time!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: The fake tick counter from Part 2&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This has three problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, &lt;code&gt;tick&lt;/code&gt; doesn&amp;rsquo;t mean anything real. One iteration isn&amp;rsquo;t one millisecond or one second. It&amp;rsquo;s, however, the length of time the tasks take.&lt;/li&gt;
&lt;li&gt;Second, the CPU burns at 100% spinning through that tight loop even when there&amp;rsquo;s nothing to do.&lt;/li&gt;
&lt;li&gt;And third, if any task decides to loop forever inside &lt;code&gt;poll()&lt;/code&gt;, the entire system locks up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think about it this way. Without interrupts, your CPU is like a waiter who walks to each table asking, &amp;ldquo;Ready to order?&amp;rdquo; If table 3 is still deciding, the waiter is stuck standing there forever. Everyone else is hungry and just waiting. With interrupts, each table has a bell. The waiter can do something else (or just rest) and respond when a bell rings.&lt;/p&gt;
&lt;h3 id=&#34;12-the-solution-timer-interrupts&#34;&gt;1.2 The solution: Timer interrupts&lt;/h3&gt;
&lt;p&gt;What if hardware could tap the CPU on the shoulder at regular intervals? That&amp;rsquo;s exactly what a timer interrupt does. We configure a piece of hardware to fire a signal every 100 milliseconds. The CPU stops whatever it&amp;rsquo;s doing, runs our handler, and then goes back. Now we have real time. And if we&amp;rsquo;re clever about what the handler does, we can use it to switch between tasks.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TICKS&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;AtomicU64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AtomicU64::new(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Called by hardware every 100ms, not by our code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;timer_irq_handler&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eed49f&#34;&gt;TICKS&lt;/span&gt;.fetch_add(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Main loop can now sleep between interrupts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TICKS&lt;/span&gt;.load(Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; task &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; tasks.iter_mut() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        task.poll(logger, router, tick);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hal::arch::halt();  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Sleep until next interrupt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Timer-driven tick counter (conceptual)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;2-what-is-an-interrupt&#34;&gt;2. What is an interrupt?&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s literally a wire on the CPU chip (well, a signal line) dedicated to receiving interrupt requests. Between executing each instruction, the CPU checks this signal. When it sees the line asserted (fancy way of saying the voltage changed by an external device), the CPU finishes its current instruction, saves its state, looks up the address of a handler function from a table in memory, and jumps there.&lt;/p&gt;
&lt;p&gt;Think of it like a doorbell ringing while you&amp;rsquo;re reading a book. You finish your sentence, bookmark your page, answer the door, deal with whatever it is, then come back and pick up exactly where you left off. The bookmark is your &amp;ldquo;saved state.&amp;rdquo; Answering the door is the &amp;ldquo;handler.&amp;rdquo;&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant CPU
    participant Hardware as Timer Hardware
    participant Handler as IRQ Handler
    participant Task as Task A Code

    Task-&amp;gt;&amp;gt;CPU: mov x0, #42
    Task-&amp;gt;&amp;gt;CPU: add x1, x0, #10
    Hardware-&amp;gt;&amp;gt;CPU: Timer IRQ Signal
    activate CPU
    Note over CPU: Save CPU State&amp;lt;br/&amp;gt;(x0-x30, SP, PC, flags)
    CPU-&amp;gt;&amp;gt;Handler: Jump to handler
    activate Handler
    Handler-&amp;gt;&amp;gt;Handler: TICKS += 1
    Handler-&amp;gt;&amp;gt;Hardware: Acknowledge IRQ
    Handler-&amp;gt;&amp;gt;CPU: Return
    deactivate Handler
    Note over CPU: Restore CPU State
    CPU-&amp;gt;&amp;gt;Task: Resume at add x1, x0, #10
    deactivate CPU
    Task-&amp;gt;&amp;gt;CPU: ... continue execution ...&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Interrupt handling flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A few key properties of interrupts that make them special:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous&lt;/strong&gt;: They can happen at any point during execution - literally between any two instructions. Your code doesn&amp;rsquo;t ask for them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware-driven&lt;/strong&gt;: The CPU doesn&amp;rsquo;t poll. A physical signal line tells it &amp;ldquo;something needs attention.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context preservation&lt;/strong&gt;: The handler must not corrupt the interrupted program&amp;rsquo;s state. When the handler returns, the original code must resume as if nothing happened.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;21-irqs-and-exception-types&#34;&gt;2.1 IRQs and exception types&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IRQ&lt;/strong&gt; stands for Interrupt Request. It&amp;rsquo;s a signal from a hardware device (timer, UART, network card, etc.) asking the CPU to pause and handle something. On ARM, there are four types of exceptions:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Trigger&lt;/th&gt;
          &lt;th&gt;Example&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Synchronous&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Caused by an instruction&lt;/td&gt;
          &lt;td&gt;Undefined instruction, data abort&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;IRQ&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Hardware interrupt request&lt;/td&gt;
          &lt;td&gt;Timer, UART&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;FIQ&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Fast interrupt request&lt;/td&gt;
          &lt;td&gt;High-priority devices&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SError&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Asynchronous system error&lt;/td&gt;
          &lt;td&gt;Memory system errors&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For our timer, we care about the IRQ. The other types we&amp;rsquo;ll handle later (or just hang on, for now).&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see &amp;ldquo;mask&amp;rdquo; and &amp;ldquo;unmask&amp;rdquo; a lot in this post. &lt;strong&gt;Masked&lt;/strong&gt; means blocked. When an interrupt is masked, the hardware device still generates the signal, but the CPU ignores it. Think of it like &amp;ldquo;Do Not Disturb&amp;rdquo; on your phone: calls still come in, your phone just doesn&amp;rsquo;t ring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unmasked&lt;/strong&gt; means enabled. The CPU will respond to the interrupt signal normally. We mask interrupts during critical setup (like installing the handler table) and unmask them once everything&amp;rsquo;s ready. If an interrupt fired before the handler table was installed, the CPU would jump to garbage memory and crash.&lt;/p&gt;
&lt;h2 id=&#34;3-the-arm-generic-timer&#34;&gt;3. The ARM Generic Timer&lt;/h2&gt;
&lt;p&gt;ARM processors have a built-in timer called the &lt;strong&gt;Generic Timer&lt;/strong&gt;. Unlike external timer chips that communicate over a bus, this timer is integrated into the CPU itself. It counts at a fixed frequency and generates an interrupt when the countdown reaches zero. It&amp;rsquo;s perfect for our needs: we can set it to fire every 100ms, and it will reliably interrupt the CPU at that interval. The Generic Timer is a standard feature on all ARMv8-A (AArch64) CPUs, so our code will work on real hardware, not just QEMU. The only catch is that the platform firmware determines the timer&amp;rsquo;s frequency and can vary, so we need to read it at runtime. This is a common pattern in OS development: you write code that adapts to the hardware it&amp;rsquo;s running on, rather than hardcoding assumptions.&lt;/p&gt;
&lt;h3 id=&#34;31-timer-registers&#34;&gt;3.1 Timer registers&lt;/h3&gt;
&lt;p&gt;In reality, there are actually several timers available (physical, virtual, hypervisor), each with its own set of registers. The reason for this complexity is that ARM&amp;rsquo;s architecture supports multiple execution levels (EL0 for user code, EL1 for kernel, EL2 for hypervisor, EL3 for secure monitor). Each level has access to different timers. We only care about the &lt;strong&gt;physical timer&lt;/strong&gt; accessible at EL1, since that&amp;rsquo;s what our kernel runs on. Specifically, we use the &lt;strong&gt;CNTP&lt;/strong&gt; (Counter-timer Physical Timer) registers, which is a subset of the full Generic Timer system and is accessible from EL1 (kernel privilege):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CNTFRQ_EL0&lt;/code&gt;&lt;/strong&gt;: The timer&amp;rsquo;s frequency in Hz. Read-only, set by firmware. On QEMU virt, it&amp;rsquo;s typically 62,500,000 (62.5 MHz).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CNTP_TVAL_EL0&lt;/code&gt;&lt;/strong&gt;: The countdown value. Write a number here, and the timer counts down to zero, then fires an interrupt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CNTP_CTL_EL0&lt;/code&gt;&lt;/strong&gt;: Control register. Bit 0 enables the timer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A quick note on those &lt;code&gt;_EL0&lt;/code&gt; suffixes. That doesn&amp;rsquo;t mean the register &amp;ldquo;belongs to&amp;rdquo; userspace. It means the register is &lt;strong&gt;accessible from EL0 and above&lt;/strong&gt;. Our kernel at EL1 can read and write it just fine. Registers named &lt;code&gt;_EL1&lt;/code&gt; are only accessible from EL1 and above.&lt;/p&gt;
&lt;h3 id=&#34;32-programming-the-timer&#34;&gt;3.2 Programming the timer&lt;/h3&gt;
&lt;p&gt;Programming the timer is straightforward. We read the frequency, calculate the countdown value for our desired tick interval (100ms), write it to &lt;code&gt;CNTP_TVAL_EL0&lt;/code&gt;, and enable the timer. The timer will then count down at the specified frequency, and when it reaches zero, it will fire an IRQ. We don&amp;rsquo;t need to worry about the timer counting down while we&amp;rsquo;re in the handler. The hardware takes care of that. When the timer fires, it automatically resets and starts counting down again. We just need to reprogram it with the same value to ensure it continues firing every 100ms. We do need to worry about the timer firing while we&amp;rsquo;re in the handler, but that&amp;rsquo;s actually a good thing. It means we can use the timer to drive our scheduler. Every time the timer fires, we can check if it&amp;rsquo;s time to switch tasks.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how we set up a 100ms tick. We read the frequency, divide by 10 to get the countdown value for 100ms, write it to &lt;code&gt;CNTP_TVAL_EL0&lt;/code&gt;, and enable the timer:&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;program_timer&lt;/span&gt;(freq: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 100ms tick: frequency / 10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; tval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (freq &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;msr cntp_tval_el0, {tval}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mov x0, #1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;msr cntp_ctl_el0, x0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt;(reg) tval,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            out(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x0&amp;#34;&lt;/span&gt;) _,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            options(nostack, nomem)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Timer programming (from timer.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If the frequency is 62,500,000 Hz, then &lt;code&gt;freq / 10 = 6,250,000&lt;/code&gt;. The timer counts down from 6,250,000 at 62.5 MHz, reaching zero in exactly 100ms. When it hits zero, IRQ 30 fires (that&amp;rsquo;s the physical timer&amp;rsquo;s assigned interrupt ID on ARM).&lt;/p&gt;
&lt;p&gt;Note that the timer doesn&amp;rsquo;t automatically reload. It just fires once - it is a one-shot timer. If we want it to fire again after the next 100ms, we have to write &lt;code&gt;CNTP_TVAL_EL0&lt;/code&gt; again. This gives us flexibility: we can change the tick interval on the fly if we want. We do this inside the IRQ handler every time the timer interrupt fires.&lt;/p&gt;
&lt;h2 id=&#34;4-the-gic-generic-interrupt-controller&#34;&gt;4. The GIC (Generic Interrupt Controller)&lt;/h2&gt;
&lt;p&gt;The Generic Interrupt Controller (GIC) is the hardware component responsible for managing and routing interrupts on ARM systems. It acts as a traffic cop, receiving interrupt signals from various hardware devices (like our timer) and directing them to the appropriate CPU core. The GIC also handles prioritization, masking, and acknowledgment of interrupts.&lt;/p&gt;
&lt;p&gt;When the timer fires, it sends an interrupt signal to the GIC. The GIC then checks its configuration to determine which CPU core should handle that interrupt and delivers it accordingly. The GIC also provides registers to enable/disable specific interrupts, set their priorities, and acknowledge them once handled.&lt;/p&gt;
&lt;p&gt;The only thing to note is that the timer can generate an interrupt, but something needs to route that interrupt to the CPU core. That&amp;rsquo;s the GIC&amp;rsquo;s job.&lt;/p&gt;
&lt;h3 id=&#34;41-why-two-components&#34;&gt;4.1 Why two components?&lt;/h3&gt;
&lt;p&gt;The GIC is split into two parts:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GICD (Distributor)&lt;/strong&gt;: One per system, shared by all cores. It receives interrupts from all hardware devices and decides which CPU core should handle each one. Think of it as a switchboard operator receiving all incoming calls. Then it forwards the call to the correct phone (core) based on its configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GICC (CPU Interface)&lt;/strong&gt;: One per core. It delivers interrupts to its specific CPU and handles acknowledgment. Think of it as the phone on each person&amp;rsquo;s desk. The GICC listens for calls from the GICD and rings when an interrupt is delivered. It also provides registers for the CPU to acknowledge that it has handled the interrupt, allowing the GICD to send the next one.&lt;/p&gt;
&lt;p&gt;This split matters for multi-core systems (which core handles the timer? which core handles the UART?), but even on our single-core setup, we need to configure both. This helps us write code that works on real hardware with multiple cores, not just in QEMU, and it also gives us a clearer separation of concerns in our code. The GICD is responsible for global interrupt configuration, while the GICC is responsible for local interrupt delivery and acknowledgment on each core.&lt;/p&gt;
&lt;h3 id=&#34;42-memory-mapped-registers&#34;&gt;4.2 Memory-mapped registers&lt;/h3&gt;
&lt;p&gt;Memory-mapped I/O means that hardware devices expose their control registers as specific addresses in the system&amp;rsquo;s memory map. To interact with the GIC, we read and write to these addresses. This is done using special functions that perform volatile reads and writes, ensuring that the compiler doesn&amp;rsquo;t optimize these accesses away. We treat these addresses as pointers to hardware registers. When we write to a GIC register, we&amp;rsquo;re actually sending commands to the hardware. When we read from a GIC register, we&amp;rsquo;re getting status information from the hardware.&lt;/p&gt;
&lt;p&gt;On QEMU&amp;rsquo;s virt machine, the GIC lives at these addresses:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GICD: 0x0800_0000 (Distributor)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GICC: 0x0801_0000 (CPU Interface)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are the registers we&amp;rsquo;ll touch:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GICD registers:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Offset&lt;/th&gt;
          &lt;th&gt;Register&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICD_CTLR&lt;/td&gt;
          &lt;td&gt;Bit 0 enables the distributor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x100&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICD_ISENABLER0&lt;/td&gt;
          &lt;td&gt;Write a 1-bit to enable that IRQ number&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x400&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICD_IPRIORITYR&lt;/td&gt;
          &lt;td&gt;Priority for each IRQ (lower = higher priority)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x800&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICD_ITARGETSR&lt;/td&gt;
          &lt;td&gt;Which CPU core handles each IRQ&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;GICC registers:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Offset&lt;/th&gt;
          &lt;th&gt;Register&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICC_CTLR&lt;/td&gt;
          &lt;td&gt;Bit 0 enables this core&amp;rsquo;s interface&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x004&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICC_PMR&lt;/td&gt;
          &lt;td&gt;Priority mask: only deliver IRQs above this priority&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x00C&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICC_IAR&lt;/td&gt;
          &lt;td&gt;Read this to learn which IRQ fired (and tell GIC you&amp;rsquo;re handling it)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0x010&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;GICC_EOIR&lt;/td&gt;
          &lt;td&gt;Write the IRQ number here to say &amp;ldquo;I&amp;rsquo;m done&amp;rdquo;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The IAR/EOIR protocol is important. Reading GICC_IAR does two things at once: it returns the interrupt number and atomically marks that interrupt as &amp;ldquo;active.&amp;rdquo; Writing GICC_EOIR marks it &amp;ldquo;complete.&amp;rdquo; If you forget the EOIR write, the GIC thinks you&amp;rsquo;re still handling that interrupt and won&amp;rsquo;t deliver another one. Classic bug that makes the system appear to freeze after the first interrupt. Always remember: read IAR to start handling, write EOIR to finish.&lt;/p&gt;
&lt;h3 id=&#34;43-the-actual-init-code&#34;&gt;4.3 The actual init code&lt;/h3&gt;
&lt;p&gt;Let us bring it all together. Here&amp;rsquo;s our real &lt;code&gt;timer::init()&lt;/code&gt; function. It sets up the GIC, programs the timer, and unmasks IRQs:&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TICKS&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;AtomicU64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AtomicU64::new(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;CNTFRQ&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;AtomicU64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AtomicU64::new(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;GICD_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0800_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;GICC_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0801_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;IRQ_CNTPNS&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;init&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable GIC distributor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    mmio_write32(&lt;span style=&#34;color:#eed49f&#34;&gt;GICD_BASE&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0x000&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable GIC CPU interface, accept all priorities
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    mmio_write32(&lt;span style=&#34;color:#eed49f&#34;&gt;GICC_BASE&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0x004&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFF&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mmio_write32(&lt;span style=&#34;color:#eed49f&#34;&gt;GICC_BASE&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0x000&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable physical timer interrupt (IRQ 30)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    enable_irq(&lt;span style=&#34;color:#eed49f&#34;&gt;IRQ_CNTPNS&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Read counter frequency and program timer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; freq: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mrs {0}, cntfrq_el0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            out(reg) freq,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            options(nostack, nomem)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eed49f&#34;&gt;CNTFRQ&lt;/span&gt;.store(freq, Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    program_timer(freq);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Unmask IRQs (clear DAIF.I)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;msr daifclr, #2&amp;#34;&lt;/span&gt;, options(nostack, nomem));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Full timer and GIC initialization (timer.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;What is important is that the sequence really matters. We enable the distributor first, then the CPU interface, then the specific IRQ, then program the timer, and finally unmask interrupts at the CPU level. If we unmasked interrupts before the GIC was ready, the CPU might see a spurious interrupt and crash. If we enabled the timer before the GIC, the timer would fire, but the interrupt would never reach the CPU. If we enabled the CPU interface before the distributor, the CPU would be ready to receive interrupts, but none would be sent. The order of operations is crucial for a stable system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;AtomicU64&lt;/code&gt; instead of a regular &lt;code&gt;u64&lt;/code&gt;?&lt;/strong&gt; Even on a single-core system, interrupt handlers create concurrency. The main loop and the interrupt handler interleave unpredictably. If the main loop reads &lt;code&gt;TICKS&lt;/code&gt; as two 32-bit halves (which happens on architectures without native 64-bit atomic loads) and the timer interrupt fires between the two halves, you get a corrupted value. &lt;code&gt;AtomicU64&lt;/code&gt; guarantees each load and store is indivisible. We use &lt;code&gt;Ordering::Relaxed&lt;/code&gt; because on a single core, there&amp;rsquo;s no other CPU to synchronize with. The atomicity is still needed to prevent tearing, but we don&amp;rsquo;t need stronger ordering guarantees since there&amp;rsquo;s no cross-core communication.&lt;/p&gt;
&lt;h2 id=&#34;5-the-exception-vector-table&#34;&gt;5. The exception vector table&lt;/h2&gt;
&lt;p&gt;The exception vector table is a key piece of the interrupt handling mechanism. It&amp;rsquo;s a fixed block of memory that the CPU consults when an exception (like an IRQ) occurs. The CPU uses the exception type and the current execution context to calculate an offset into this table, where it expects to find a branch instruction to the appropriate handler.&lt;/p&gt;
&lt;p&gt;When an IRQ fires, the CPU needs to know where to jump. On ARM, you set up a &lt;strong&gt;vector table&lt;/strong&gt;: a fixed-layout block of code in memory containing branch instructions for each exception type.&lt;/p&gt;
&lt;p&gt;AArch64&amp;rsquo;s vector table has 16 entries arranged in a 4x4 grid: 4 exception types (Synchronous, IRQ, FIQ, SError) × 4 execution contexts. The contexts are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Current EL, SP0&lt;/strong&gt; (using the EL0 stack pointer, uncommon)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Current EL, SPx&lt;/strong&gt; (using the current EL&amp;rsquo;s own stack pointer, the normal case for kernel code)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower EL, AArch64&lt;/strong&gt; (interrupts from user mode running 64-bit code)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower EL, AArch32&lt;/strong&gt; (interrupts from 32-bit code)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For our kernel running at EL1, the &amp;ldquo;Current EL, SPx&amp;rdquo; row is the one that matters. That&amp;rsquo;s at offset &lt;code&gt;0x200&lt;/code&gt; from the table base.&lt;/p&gt;
&lt;p&gt;Each entry gets exactly 0x80 (128) bytes of space. That&amp;rsquo;s enough room for a branch instruction to a larger handler elsewhere. The &lt;code&gt;.align 11&lt;/code&gt; directive aligns the table to 2^11 = 2048 bytes, which is a hardware requirement: the CPU will fault if &lt;code&gt;VBAR_EL1&lt;/code&gt; points to an unaligned address. That&amp;rsquo;s why we have the &lt;code&gt;.align 11&lt;/code&gt; at the start of the table. Each entry is a simple branch to a common handler for that exception type. For now, all IRQ entries point to the same &lt;code&gt;exc_irq&lt;/code&gt; handler, which will read the interrupt ID and dispatch accordingly.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the actual vector table from our &lt;code&gt;boot.S&lt;/code&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.align&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;vectors:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x000: Current EL, SP0, Sync
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_sync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x080: Current EL, SP0, IRQ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_irq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x100: Current EL, SP0, FIQ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_fiq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x180: Current EL, SP0, SError
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_serr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x200: Current EL, SPx, Sync
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_sync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x280: Current EL, SPx, IRQ   &amp;lt;--- Timer IRQs land here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_irq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x300: Current EL, SPx, FIQ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_fiq&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x380: Current EL, SPx, SError
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;exc_serr&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;.space&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x80&lt;/span&gt; - &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 0x400-0x780: Lower EL entries (same pattern)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;...&lt;/span&gt; (&lt;span style=&#34;color:#eed49f&#34;&gt;all&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;branches&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;to&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;the&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;same&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;handlers&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;now&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Exception vector table (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The table is installed during boot with:&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;el1_start:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;vectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vbar_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Installing the vector table (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;VBAR_EL1&lt;/code&gt; (Vector Base Address Register) tells the CPU where the table lives. The &lt;code&gt;isb&lt;/code&gt; (Instruction Synchronization Barrier) flushes the pipeline so the CPU sees the new table address immediately. If we forgot the &lt;code&gt;isb&lt;/code&gt;, the CPU might still use the old (zero) value of &lt;code&gt;VBAR_EL1&lt;/code&gt; for a few instructions, and if an interrupt fired during that window, it would jump to address 0 and crash. Always remember to use &lt;code&gt;isb&lt;/code&gt; after changing &lt;code&gt;VBAR_EL1&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;6-the-rust-irq-handler&#34;&gt;6. The Rust IRQ handler&lt;/h2&gt;
&lt;p&gt;In Rust, we write a safe wrapper around the raw assembly handler. The assembly code in &lt;code&gt;exc_irq&lt;/code&gt; will save all the registers, call our Rust function, and then restore registers based on the return value. This way, we can write our interrupt handling logic in Rust without worrying about the low-level details of context saving and restoring. The reason we return a pointer to a &lt;code&gt;Context&lt;/code&gt; struct is that the handler can decide to switch to a different thread. If it returns the same pointer it was given, the assembly code will restore that context and resume the same thread. If it returns a different pointer, the assembly code will restore the new context, effectively switching threads. This is how we implement preemptive multitasking: the timer interrupt can decide to switch to a different thread every time it fires.&lt;/p&gt;
&lt;p&gt;When a timer interrupt fires, the CPU jumps to &lt;code&gt;exc_irq&lt;/code&gt; in the vector table, which (after saving context, more on that later) calls our Rust handler. Here&amp;rsquo;s the actual code:&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;rust_irq_handler&lt;/span&gt;(current: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; Context) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; Context {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; iar &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; mmio_read32(&lt;span style=&#34;color:#eed49f&#34;&gt;GICC_BASE&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;GICC_IAR&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; iar &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x3FF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; next: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; Context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; current;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;IRQ_CNTPNS&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;TICKS&lt;/span&gt;.fetch_add(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, Ordering::Relaxed) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; freq &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;CNTFRQ&lt;/span&gt;.load(Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; freq &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            program_timer(freq);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Switch threads every 5 ticks (~500ms with 100ms tick).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;super&lt;/span&gt;::preempt::switch_next(current);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// End of interrupt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    mmio_write32(&lt;span style=&#34;color:#eed49f&#34;&gt;GICC_BASE&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;GICC_EOIR&lt;/span&gt;, iar);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    next
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Rust IRQ handler (timer.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If we look closely at the signature, we see that it takes a &lt;code&gt;*mut Context&lt;/code&gt; (a pointer to the current thread&amp;rsquo;s saved state) and returns a &lt;code&gt;*const Context&lt;/code&gt; (a pointer to the next thread&amp;rsquo;s state). If no switch is needed, it returns the same pointer it was given. The assembly code that calls this function uses the return value to decide which context to restore.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what happens step by step:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Read IAR&lt;/strong&gt;: Find out which interrupt fired. We mask with &lt;code&gt;0x3FF&lt;/code&gt; because the lower 10 bits hold the interrupt ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check if it&amp;rsquo;s the timer&lt;/strong&gt;: ID 30 is our physical timer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increment tick counter&lt;/strong&gt;: &lt;code&gt;fetch_add&lt;/code&gt; atomically adds 1 and returns the old value, so we add 1 to get the current tick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reprogram timer&lt;/strong&gt;: Set up the next 100ms countdown. Without this, the timer only fires once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maybe switch threads&lt;/strong&gt;: Every 5 ticks (500ms), call &lt;code&gt;switch_next&lt;/code&gt; to pick the other thread.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write EOIR&lt;/strong&gt;: Tell the GIC we&amp;rsquo;re done handling this interrupt.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;7-daif-bits-and-unmasking&#34;&gt;7. DAIF bits and unmasking&lt;/h2&gt;
&lt;p&gt;ARM has four masking bits in the processor state register (PSTATE), collectively called &lt;strong&gt;DAIF&lt;/strong&gt;. These processor flags control whether certain types of exceptions are masked (blocked) or unmasked (enabled) and are critical for safely handling interrupts - hence the name &amp;ldquo;DAIF&amp;rdquo; for Debug, SError, IRQ, FIQ.  These bits act as individual on/off switches for different categories of exceptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; (bit 3): Debug exceptions — breakpoints, watchpoints, single-step traps. Used by debuggers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt; (bit 2): SError (asynchronous aborts) — serious hardware errors like uncorrectable memory faults. You generally want these enabled so the system can respond to hardware failures rather than silently ignoring them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt; (bit 1): IRQ (normal interrupts) — this is the one we care about most. Timer interrupts, UART receive interrupts, and most peripheral interrupts are IRQs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F&lt;/strong&gt; (bit 0): FIQ (fast interrupts) — a higher-priority interrupt channel. On some systems, FIQ is reserved for secure-world use (TrustZone). We don&amp;rsquo;t use it in our kernel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a bit is &lt;strong&gt;set&lt;/strong&gt; (1), that exception type is &lt;strong&gt;masked&lt;/strong&gt; (blocked). By default, when the CPU enters EL1, all four bits are set, meaning everything is blocked. This is a safety measure: the kernel starts with interrupts disabled so it can set up handlers and data structures before anything fires.&lt;/p&gt;
&lt;p&gt;The instruction &lt;code&gt;msr daifclr, #2&lt;/code&gt; means &amp;ldquo;DAIF Clear with bitmask 0b0010,&amp;rdquo; which clears only the I bit, unmasking normal IRQs. We deliberately leave D, A, and F alone. We do this at the very end of &lt;code&gt;timer::init()&lt;/code&gt;, after the GIC is configured, the timer is programmed, and the vector table is installed. The ordering is crucial: if we unmasked IRQs before the vector table was ready, the first timer tick would jump to an uninitialized address, causing the system to crash.&lt;/p&gt;
&lt;p&gt;You might wonder: why not just unmask everything? Because we want precise control. We only enable what we&amp;rsquo;ve set up handlers for. Unmasking FIQ without a handler would cause the same crash problem. And debug exceptions should only be enabled when we actually have a debugger attached. BTW, leaving them masked by default is a good defensive programming practice.&lt;/p&gt;
&lt;h2 id=&#34;8-running-the-timer-demo&#34;&gt;8. Running the timer demo&lt;/h2&gt;
&lt;p&gt;OK, this is the moment of truth. Let&amp;rsquo;s build and run the timer demo. If everything is set up correctly, you should see the system boot, print a message about the timer demo, and then enter an idle loop that wakes on each timer tick. You can run just the timer demo (without preemption) using the &lt;code&gt;demo-timer&lt;/code&gt; feature:&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-timer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Build and run the timer demo&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: timer interrupts demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: timer started, entering idle loop&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The system enters a &lt;code&gt;wfe&lt;/code&gt; (Wait For Event) loop and wakes on each timer tick. At this point, we&amp;rsquo;re not printing ticks to keep things simple. The key proof that it works: the system doesn&amp;rsquo;t hang. If interrupts weren&amp;rsquo;t firing, &lt;code&gt;wfe&lt;/code&gt; would sleep forever.&lt;/p&gt;
&lt;p&gt;Now here&amp;rsquo;s the key insight: if we can interrupt a running task, we can save its state and run a different task instead. Think about what the interrupt handler already does. When a timer IRQ fires, the CPU automatically saves the program counter and status flags. Our handler saves the remaining registers. After incrementing the tick counter, we restore everything and resume the interrupted code. The interrupted code never knows it was paused. But what if, instead of restoring the &lt;em&gt;same&lt;/em&gt; code&amp;rsquo;s registers, we restored &lt;em&gt;different&lt;/em&gt; code&amp;rsquo;s registers? We&amp;rsquo;d resume a completely different thread. That&amp;rsquo;s preemptive multitasking. That&amp;rsquo;s the whole trick.&lt;/p&gt;
&lt;p&gt;Pretty cool, right? With just a timer interrupt and some context saving/restoring, we can switch between threads without them ever asking for it. The timer is the &amp;ldquo;clock&amp;rdquo; that drives our scheduler, and the interrupt handler is the &amp;ldquo;switchboard operator&amp;rdquo; that decides which thread to run next.&lt;/p&gt;
&lt;h2 id=&#34;9-what-is-cpu-context&#34;&gt;9. What is CPU context?&lt;/h2&gt;
&lt;p&gt;We talk about saving and restoring &amp;ldquo;context,&amp;rdquo; but what does that actually mean? We need to save enough of the CPU&amp;rsquo;s state so that when we switch back to a thread, it can resume exactly where it left off, with all its registers and flags intact. This includes all the general-purpose registers (x0-x30), the stack pointer (SP), the program counter (PC, stored in ELR_EL1), and the CPU flags (stored in SPSR_EL1).&lt;/p&gt;
&lt;p&gt;In other words, &lt;strong&gt;Context&lt;/strong&gt; is everything the CPU needs to resume a task exactly where it left off. Here&amp;rsquo;s our actual &lt;code&gt;Context&lt;/code&gt; struct from &lt;code&gt;preempt.rs&lt;/code&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(C)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Context&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; x: [&lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;],   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// x0..x30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; sp: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;,         &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Stack pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; elr: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;,        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Exception Link Register (where to resume)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; spsr: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;,       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Saved Program Status Register (CPU flags)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Context struct (preempt.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Size&lt;/strong&gt;: 31 registers + SP + ELR + SPSR = 34 fields, each 8 bytes = &lt;strong&gt;272 bytes&lt;/strong&gt; per task.&lt;/p&gt;
&lt;p&gt;Why &lt;code&gt;#[repr(C)]&lt;/code&gt;? By default, Rust is free to reorder struct fields and add padding however it likes. But our assembly code accesses fields by hardcoded byte offsets (&lt;code&gt;[x9, #0x00]&lt;/code&gt; for x0, &lt;code&gt;[x9, #0xF8]&lt;/code&gt; for SP, etc.). If the compiler rearranged the fields, the assembly would save and restore the wrong data, silently corrupting the task state. &lt;code&gt;#[repr(C)]&lt;/code&gt; forces fields to appear in memory in declaration order. This way, we can reliably calculate offsets for assembly access.&lt;/p&gt;
&lt;p&gt;For example, &lt;code&gt;x0&lt;/code&gt; is at offset 0, &lt;code&gt;x1&lt;/code&gt; at 8, &amp;hellip;, &lt;code&gt;x30&lt;/code&gt; at 240, &lt;code&gt;sp&lt;/code&gt; at 248, &lt;code&gt;elr&lt;/code&gt; at 256, and &lt;code&gt;spsr&lt;/code&gt; at 264. The assembly code uses these offsets to save and restore the correct registers; if the struct layout changed, the offsets would be wrong, and we&amp;rsquo;d end up with a very buggy system. This is also a common pattern in OS development: you have a data structure shared between Rust and assembly, and you need to ensure they agree on its layout. &lt;code&gt;#[repr(C)]&lt;/code&gt; is the standard way to achieve this.&lt;/p&gt;
&lt;h3 id=&#34;91-why-save-all-31-registers&#34;&gt;9.1 Why save ALL 31 registers?&lt;/h3&gt;
&lt;p&gt;In theory, we could get away with saving only the registers that the interrupted code was actually using. But in practice, we have no way of knowing which registers those are. The compiler can use any register for any purpose at any time. Even if we tried to analyze the code to figure out which registers are live at the interrupt point, we&amp;rsquo;d have to do that for every possible instruction and every possible interrupt timing. It would be a nightmare.&lt;/p&gt;
&lt;p&gt;Imagine Thread A is in the middle of a loop. Register x5 holds a loop counter, and x19 holds a critical pointer. The timer fires, we switch to Thread B, which runs for a while and overwrites x5 and x19 with its own data. When we switch back to Thread A, those registers are corrupted. Thread A crashes or (worse) silently computes the wrong thing.&lt;/p&gt;
&lt;p&gt;The problem is we don&amp;rsquo;t know which registers the interrupted code was using. It could be any of them. So we save all of them.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Registers&lt;/th&gt;
          &lt;th&gt;Role&lt;/th&gt;
          &lt;th&gt;What breaks if not saved&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;x0-x7&lt;/td&gt;
          &lt;td&gt;Function arguments, return values&lt;/td&gt;
          &lt;td&gt;Function calls fail&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x8&lt;/td&gt;
          &lt;td&gt;Indirect result location&lt;/td&gt;
          &lt;td&gt;Large struct returns corrupt memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x9-x15&lt;/td&gt;
          &lt;td&gt;Temporaries (caller-saved)&lt;/td&gt;
          &lt;td&gt;Mid-calculation values corrupted&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x16-x17&lt;/td&gt;
          &lt;td&gt;Intra-procedure scratch&lt;/td&gt;
          &lt;td&gt;Dynamic linking breaks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x18&lt;/td&gt;
          &lt;td&gt;Platform register&lt;/td&gt;
          &lt;td&gt;Reserved for OS use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x19-x28&lt;/td&gt;
          &lt;td&gt;Callee-saved&lt;/td&gt;
          &lt;td&gt;Long-lived variables corrupted (hardest bugs)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x29&lt;/td&gt;
          &lt;td&gt;Frame pointer&lt;/td&gt;
          &lt;td&gt;Debugger backtraces break&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;x30&lt;/td&gt;
          &lt;td&gt;Link register (return address)&lt;/td&gt;
          &lt;td&gt;Functions return to wrong address&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SP&lt;/td&gt;
          &lt;td&gt;Stack pointer&lt;/td&gt;
          &lt;td&gt;Stack access goes to wrong memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ELR_EL1&lt;/td&gt;
          &lt;td&gt;Exception return address&lt;/td&gt;
          &lt;td&gt;CPU resumes at wrong instruction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SPSR_EL1&lt;/td&gt;
          &lt;td&gt;Saved CPU flags&lt;/td&gt;
          &lt;td&gt;Conditional branches break, IRQ state wrong&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;What about NEON/FP registers (v0-v31)? AArch64 has 32 additional 128-bit registers for SIMD and floating-point. We don&amp;rsquo;t save them because it would add 512 bytes per task and ~200 extra cycles per switch. For our demo, we assume tasks don&amp;rsquo;t use floating-point. A real OS would implement lazy FP saving: track whether a task used FP registers and only save them if it did.&lt;/p&gt;
&lt;h2 id=&#34;10-thread-setup&#34;&gt;10. Thread setup&lt;/h2&gt;
&lt;p&gt;For preemption to work, we need at least two threads. Each thread needs its own stack and a context that points to its entry function. When the timer interrupt fires, the handler can switch between these threads by returning different context pointers. With just one thread, the timer would interrupt it, but we&amp;rsquo;d always return the same context, so it would just resume the same thread. With two threads, we can alternate between them on each timer tick.&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s look at the complete preemption system. We need stacks, entry points, and context initialization.&lt;/p&gt;
&lt;h3 id=&#34;101-stacks-and-static-contexts&#34;&gt;10.1 Stacks and static contexts&lt;/h3&gt;
&lt;p&gt;Because we&amp;rsquo;re writing a kernel, we don&amp;rsquo;t have dynamic memory allocation yet. We can&amp;rsquo;t &lt;code&gt;malloc&lt;/code&gt; stacks for our threads. Instead, we define static arrays in Rust to serve as stacks. Each thread gets its own stack array. We also define a static array of &lt;code&gt;Context&lt;/code&gt; structs to hold the CPU state for each thread. This way, we can set up everything at compile time without needing any heap allocation. The code below is quite straightforward: we define two 16 KB stacks and an array of two &lt;code&gt;Context&lt;/code&gt; structs. The &lt;code&gt;CURRENT&lt;/code&gt; atomic variable tracks which thread is currently running.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// 16 KB per thread
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(align(16))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Stack&lt;/span&gt;([&lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK0&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;Stack&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Stack([&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK1&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;Stack&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Stack([&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;: [Context; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Context { x: [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;], sp: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, elr: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, spsr: &lt;span style=&#34;color:#f5a97f&#34;&gt;0x5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Context { x: [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;], sp: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, elr: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, spsr: &lt;span style=&#34;color:#f5a97f&#34;&gt;0x5&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;CURRENT&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;AtomicUsize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AtomicUsize::new(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Stacks and static context array (preempt.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;#[repr(align(16))]&lt;/code&gt; on &lt;code&gt;Stack&lt;/code&gt; guarantees 16-byte alignment. ARM requires the stack pointer to be 16-byte aligned at all times. Violating this causes an alignment fault.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;spsr: 0x5&lt;/code&gt; value means &lt;code&gt;0b0000_0101&lt;/code&gt;, which encodes EL1h: Exception Level 1, using SP_EL1 (the kernel&amp;rsquo;s own stack pointer). When &lt;code&gt;eret&lt;/code&gt; restores this SPSR value, the CPU runs at the kernel privilege level. That&amp;rsquo;s what we want for our kernel threads.&lt;/p&gt;
&lt;h3 id=&#34;102-thread-entry-points&#34;&gt;10.2 Thread entry points&lt;/h3&gt;
&lt;p&gt;Entry points are the functions where each thread starts executing. When we initialize the context for each thread, we set the &lt;code&gt;elr&lt;/code&gt; field to point to its entry function. When the scheduler switches to that thread, it will &amp;ldquo;return&amp;rdquo; to that function as if it had been interrupted there. Each thread runs an infinite loop that prints its name every 10 ticks. Thread A prints &amp;ldquo;A\n&amp;rdquo; at ticks 0, 10, 20, etc., while Thread B prints &amp;ldquo;B\n&amp;rdquo; at ticks 5, 15, 25, etc. This way, we can visually confirm that both threads are running and that the timer interrupt is switching between them.&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;thread_a_entry&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable the timer after the first thread context is active.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    timer::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; last_tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; timer::ticks();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; last_tick {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            last_tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; { UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::hint::spin_loop();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;thread_b_entry&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; last_tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; timer::ticks();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; last_tick {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            last_tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (t &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt; { UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;B&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::hint::spin_loop();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Thread entry points (preempt.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Notice something subtle: Thread A checks &lt;code&gt;(t % 10) == 0&lt;/code&gt; but Thread B checks &lt;code&gt;(t % 10) == 5&lt;/code&gt;. Why not both check &lt;code&gt;(t % 10) == 0&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what we mean. Context switches happen every 5 ticks. So at tick 10 (a multiple of 10), the scheduler switches from whichever thread is running to the other. But the switch happens &lt;em&gt;during&lt;/em&gt; the tick, which means Thread B might never actually see tick 10 while it&amp;rsquo;s running. It gets switched out right at that moment. By having B check for tick 5 instead, we offset the check from the switch boundary, and both threads reliably print.&lt;/p&gt;
&lt;p&gt;Both functions are &lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt; because they&amp;rsquo;ll be called from assembly via &lt;code&gt;eret&lt;/code&gt;. The C ABI ensures the calling convention matches what our assembly code expects.&lt;/p&gt;
&lt;h3 id=&#34;103-context-initialization&#34;&gt;10.3 Context initialization&lt;/h3&gt;
&lt;p&gt;Context initialization is the process of setting up the &lt;code&gt;Context&lt;/code&gt; structs for each thread so that when we switch to them, they start executing at their entry points with a valid stack. We set the &lt;code&gt;sp&lt;/code&gt; field to point to the top of each thread&amp;rsquo;s stack (remember, stacks grow downward), and we set the &lt;code&gt;elr&lt;/code&gt; field to point to the thread&amp;rsquo;s entry function. The &lt;code&gt;spsr&lt;/code&gt; field is set to 0x5, which means EL1h mode (kernel mode using SP_EL1). This way, when we &amp;ldquo;return&amp;rdquo; to this context, the CPU will jump to the entry function with the correct privileges.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;init&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; top0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK0&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;as_ptr().add(&lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; top1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;STACK1&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;as_ptr().add(&lt;span style=&#34;color:#eed49f&#34;&gt;STACK_SIZE&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].sp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; top0;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].elr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; thread_a_entry &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; () &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].spsr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;].sp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; top1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;].elr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; thread_b_entry &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; () &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;].spsr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Context initialization (preempt.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why SP points to the END of the stack&lt;/strong&gt;: Stacks grow downward on ARM (and x86). Pushing data decreases the stack pointer. So the &amp;ldquo;bottom&amp;rdquo; (starting point) is the highest address. We compute &lt;code&gt;STACK0.0.as_ptr().add(STACK_SIZE)&lt;/code&gt; to get one-past-the-end. If we set SP to the &lt;em&gt;beginning&lt;/em&gt; of the allocation, the very first push would write below it, corrupting other memory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;eret&lt;/code&gt; trick&lt;/strong&gt;: We set &lt;code&gt;elr&lt;/code&gt; to the thread&amp;rsquo;s entry function address. When &lt;code&gt;eret&lt;/code&gt; executes, the CPU loads the PC from the ELR and jumps to it. The CPU doesn&amp;rsquo;t know (or care) whether it&amp;rsquo;s &amp;ldquo;returning&amp;rdquo; from a real exception or just bootstrapping a new thread. It simply loads and jumps. This is how the first task on every OS starts: fill in the context as if the task had been interrupted, then &amp;ldquo;return&amp;rdquo; to it.&lt;/p&gt;
&lt;h2 id=&#34;11-the-context-switch-in-assembly&#34;&gt;11. The context switch in assembly&lt;/h2&gt;
&lt;p&gt;As we touched on earlier, this is the heart of preemption. Every register must be saved and restored perfectly, or threads silently corrupt each other. The &lt;code&gt;exc_irq&lt;/code&gt; handler in &lt;code&gt;boot.S&lt;/code&gt; does this. It saves all registers to the current context, calls the Rust handler to decide which context to run next, and then restores registers from the returned context. The assembly code is a bit verbose because we have to save 31 registers, plus SP, ELR, and SPSR, and we have to be careful not to clobber any registers before we save them.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the actual &lt;code&gt;exc_irq&lt;/code&gt; handler from &lt;code&gt;boot.S&lt;/code&gt;. We&amp;rsquo;ll walk through it section by section.&lt;/p&gt;
&lt;h3 id=&#34;111-the-scratch-save-trick&#34;&gt;11.1 The scratch save trick&lt;/h3&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;exc_irq:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// We need a working register to read TPIDR_EL1, but we can&amp;#39;t
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// touch any register without saving it first. Chicken-and-egg.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Solution: use the stack as scratch space for x9 and x10.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;sub&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x00]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x10&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x08]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Now x9 is free. Load the current Context pointer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;tpidr_el1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: exc_irq handler, part 1: scratch save (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here&amp;rsquo;s the problem: to save registers to the Context struct, we need a pointer to that struct. But reading &lt;code&gt;TPIDR_EL1&lt;/code&gt; requires a destination register, which would clobber the interrupted thread&amp;rsquo;s value in that register. Solution: we temporarily push x9 and x10 onto the stack (which doesn&amp;rsquo;t need a general-purpose register because SP is implicit in &lt;code&gt;str&lt;/code&gt;), then use x9 to hold the context pointer. We&amp;rsquo;ll retrieve the original x9/x10 from the stack later and store them in the proper Context slots.&lt;/p&gt;
&lt;h3 id=&#34;112-saving-all-registers&#34;&gt;11.2 Saving all registers&lt;/h3&gt;
&lt;p&gt;This is needed as we called out earlier, but the implementation is straightforward: we use &lt;code&gt;stp&lt;/code&gt; (Store Pair) to save registers in pairs, and &lt;code&gt;str&lt;/code&gt; for the odd one out (x8). We also save SP, ELR, and SPSR at the end. The offsets into the Context struct are carefully calculated based on the struct layout.&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Save x0..x8 to Context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x00]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x3&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x10]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x4&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x5&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x20]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x6&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x7&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x30]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x8&lt;/span&gt;,        [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x40]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Retrieve original x9/x10 from scratch and save to Context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x00]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x48]        // x9&amp;#39;s slot in Context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x08]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x50]        // x10&amp;#39;s slot in Context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Save x11..x30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x11&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x12&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x58]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x13&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x14&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x68]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x15&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x16&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x78]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x17&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x18&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x88]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x20&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x98]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x21&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x22&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xA8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x23&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x24&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xB8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x25&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x26&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xC8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x27&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x28&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xD8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;stp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x29&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x30&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xE8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Save SP (original, before our scratch allocation), ELR, SPSR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;add&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x20
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xF8]        // SP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x100]       // ELR (where to resume)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0x108&lt;/span&gt;]       &lt;span style=&#34;color:#ed8796&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SPSR&lt;/span&gt; (&lt;span style=&#34;color:#eed49f&#34;&gt;CPU&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;flags&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: exc_irq handler, part 2: save registers (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;stp&lt;/code&gt; (Store Pair) saves two 8-byte registers in one instruction. The offsets (#0x00, #0x10, #0x20, &amp;hellip;) are byte offsets into the Context struct. x0 lives at offset 0, x1 at offset 8, x2 at offset 16 (0x10), and so on. After saving x0-x8, we restore x9 and x10 from the stack and save them in their proper slots in the Context. Finally, we save SP, ELR, and SPSR.&lt;/p&gt;
&lt;p&gt;Notice how we recover SP: &lt;code&gt;add x0, sp, #0x20&lt;/code&gt; computes the original SP before we subtracted 0x20 for the scratch area. We store that original SP in the Context. This way, when we restore the context later, we can set SP back to where the interrupted thread expects it, not where we temporarily moved it for our scratch space.&lt;/p&gt;
&lt;h3 id=&#34;113-calling-the-rust-handler&#34;&gt;11.3 Calling the Rust handler&lt;/h3&gt;
&lt;p&gt;The rust handler needs the current context pointer to decide which thread to run next. We pass it in x0, and it returns the next context pointer in x0. We then store that pointer back in &lt;code&gt;TPIDR_EL1&lt;/code&gt; for the next interrupt and also keep it in x19 for the restore sequence. This is the point where we can switch threads: by returning a different context pointer, the Rust handler can cause the assembly code to restore a different thread&amp;rsquo;s state. When the timer fires again, it will save the current thread&amp;rsquo;s state to its context, call the Rust handler, and then restore the next thread&amp;rsquo;s state, effectively switching between them on each tick.&lt;/p&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Call rust_irq_handler(current_context) -&amp;gt; next_context
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;rust_irq_handler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// x0 now points to the next Context (might be the same, might be different)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;tpidr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;             &lt;span style=&#34;color:#ed8796&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Keep&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;base&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;register&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;restore&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: exc_irq handler, part 3: call Rust (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We pass the current context pointer in x0 (the first argument in the C calling convention). The Rust handler returns the next context pointer in x0 (the return value). We stash this in both &lt;code&gt;TPIDR_EL1&lt;/code&gt; (so the next interrupt knows where to save) and x19 (so we can use it as a base for the restore sequence).&lt;/p&gt;
&lt;h3 id=&#34;114-restoring-the-next-context&#34;&gt;11.4 Restoring the next context&lt;/h3&gt;
&lt;p&gt;On the flip side, we restore all the registers from the context pointer returned by the Rust handler. This is essentially the reverse of the save sequence. We load SP, ELR, and SPSR first, then all the general-purpose registers. Finally, we execute &lt;code&gt;eret&lt;/code&gt; to jump to the next thread&amp;rsquo;s entry point with the correct CPU state. This is quite literally the &amp;ldquo;magic&amp;rdquo; moment where we switch from one thread to another. The CPU doesn&amp;rsquo;t know or care that we&amp;rsquo;re switching threads; it just loads the new PC, flags, and jumps. The interrupted thread is completely unaware that it was paused and resumed later.&lt;/p&gt;
&lt;figure id=&#34;listing16&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore SP, ELR, SPSR for the next thread
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xF8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x100]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x108]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore x0..x18 (skip x19 for now, we&amp;#39;re using it)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x00]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x3&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x10]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x4&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x5&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x20]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x6&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x7&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x30]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x8&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x9&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x40]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x10&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x11&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x50]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x12&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x13&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x60]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x14&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x15&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x70]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x16&lt;/span&gt;,       [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x80]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x17&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x18&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x88]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore x20..x30
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x20&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x21&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xA0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x22&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x23&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xB0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x24&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x25&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xC0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x26&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x27&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xD0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x28&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x29&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xE0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x30&lt;/span&gt;,       [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xF0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore x19 LAST (we were using it as the base pointer)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x98]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 16: exc_irq handler, part 4: restore and return (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The critical detail: x19 is restored as the &lt;strong&gt;last&lt;/strong&gt; because we&amp;rsquo;re using it as the base address for all loads. If we restored it earlier, we&amp;rsquo;d lose our pointer and couldn&amp;rsquo;t load the remaining registers. Then we execute &lt;code&gt;eret&lt;/code&gt; (Exception Return), which atomically loads the PC from ELR_EL1 and the CPU flags from SPSR_EL1, and jumps to that address. The next thread starts running as if it were never interrupted. The whole save/restore process is completely transparent to the threads. They just run, get interrupted, and resume later without any awareness of the context switching happening behind the scenes.&lt;/p&gt;
&lt;h2 id=&#34;12-start_first-launching-the-first-thread&#34;&gt;12. start_first: launching the first thread&lt;/h2&gt;
&lt;p&gt;We do have a chicken-and-egg problem at boot: we need to start the first thread so that the timer can preempt it, but we don&amp;rsquo;t have a &amp;ldquo;previous context&amp;rdquo; to save because no thread is running yet. The solution is a special &lt;code&gt;start_first&lt;/code&gt; function that loads the first thread&amp;rsquo;s context and jumps to it using &lt;code&gt;eret&lt;/code&gt;. This function is called from Rust after we initialize the contexts but before we enable interrupts. It sets up the CPU state for the first thread and then &amp;ldquo;returns&amp;rdquo; to it, effectively launching our multitasking system.&lt;/p&gt;
&lt;figure id=&#34;listing17&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.global&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;start_first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;start_first:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;tpidr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Store context pointer for future IRQs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Use as base register
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore SP, ELR, SPSR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0xF8]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x100]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x108]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Restore all GPRs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x00]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;,  &lt;span style=&#34;color:#eed49f&#34;&gt;x3&lt;/span&gt;,  [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x10]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... (same pattern as exc_irq restore)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x19&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0x98]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 17: start_first (boot.S)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It&amp;rsquo;s nearly identical to the restore half of &lt;code&gt;exc_irq&lt;/code&gt;. The &lt;code&gt;eret&lt;/code&gt; jumps to whatever address was in &lt;code&gt;elr&lt;/code&gt;, which we set to &lt;code&gt;thread_a_entry&lt;/code&gt; during &lt;code&gt;init()&lt;/code&gt;. The CPU doesn&amp;rsquo;t know this isn&amp;rsquo;t a &amp;ldquo;real&amp;rdquo; exception return. It just loads and jumps.&lt;/p&gt;
&lt;figure id=&#34;listing18&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;preempt::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;start_first&lt;/span&gt;(ctx: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; preempt::Context) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { start_first(preempt::first_context()) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 18: Starting the first thread (main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;13-the-scheduler&#34;&gt;13. The scheduler&lt;/h2&gt;
&lt;p&gt;As we mentioned earlier, the scheduler&amp;rsquo;s job is to decide which thread to run next. In our simple demo, we have only two threads, so the scheduler just toggles between them. After all that assembly and GIC configuration, the scheduler itself is almost comically simple:&lt;/p&gt;
&lt;figure id=&#34;listing19&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;switch_next&lt;/span&gt;(_current_ctx: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; Context) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; Context {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; cur &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;CURRENT&lt;/span&gt;.load(Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; cur &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;^&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// XOR: 0 becomes 1, 1 becomes 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#eed49f&#34;&gt;CURRENT&lt;/span&gt;.store(next, Ordering::Relaxed);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;CTX&lt;/span&gt;[next] &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; Context }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 19: Round-robin scheduler (preempt.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That&amp;rsquo;s it. XOR toggle for two threads. Compare this with the cooperative scheduler from Part 2, which was a &lt;code&gt;loop&lt;/code&gt; that called &lt;code&gt;poll()&lt;/code&gt; on each task. That scheduler was the one making decisions about when to run each task. Here, the scheduler doesn&amp;rsquo;t decide when to switch — the timer interrupt does. The scheduler only decides &lt;em&gt;who&lt;/em&gt; to switch to. This separation of concerns is important: the timer provides the preemption mechanism, and the scheduler provides the policy.&lt;/p&gt;
&lt;p&gt;We XOR the current index with 1 to toggle between 0 and 1. This is a common trick for two-thread round-robin scheduling. For more threads, you&amp;rsquo;d use a different data structure (like a queue) and a different algorithm (like priority scheduling). Still, the core mechanism of &amp;ldquo;save current context, pick next context, restore next context&amp;rdquo; remains the same.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;rust_irq_handler&lt;/code&gt; calls &lt;code&gt;switch_next&lt;/code&gt; every 5 ticks (500ms). This function picks the other thread by XOR-toggling the index (0 becomes 1, 1 becomes 0) and returns a pointer to that thread&amp;rsquo;s saved context. The assembly handler then restores that context instead of the interrupted thread&amp;rsquo;s context.&lt;/p&gt;
&lt;p&gt;For two threads, XOR is perfect. For N threads, you&amp;rsquo;d replace this with &lt;code&gt;(cur + 1) % N&lt;/code&gt; or a proper run queue with priorities. But the underlying mechanism — save the old context, pick the next thread, restore the next context — stays the same regardless of how sophisticated your scheduling policy becomes. Linux&amp;rsquo;s CFS scheduler and our XOR toggle both ultimately call the same kind of context switch.&lt;/p&gt;
&lt;h2 id=&#34;14-running-the-preemptive-demo&#34;&gt;14. Running the preemptive demo&lt;/h2&gt;
&lt;p&gt;OK, let&amp;rsquo;s see it in action. Build and run the &lt;code&gt;demo-preempt&lt;/code&gt; feature. You should see the system boot, print a message about the preemptive demo, and then threads A and B alternating every second without ever yielding. This is the key proof that preemption works: both threads are running and switching without either of them ever calling &lt;code&gt;yield()&lt;/code&gt; or returning. The OS is in control.&lt;/p&gt;
&lt;p&gt;At face value, this looks boring — just two threads printing letters. But it&amp;rsquo;s actually a huge deal. We have a timer interrupt that can preempt running code, a scheduler that selects the next thread to run, and a context-switch mechanism that saves and restores CPU state perfectly. This is the core of any preemptive multitasking OS.&lt;/p&gt;
&lt;figure id=&#34;listing20&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-preempt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 20: Build and run the preemptive demo&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: preemptive multitasking demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&#34;fig2&#34;&gt;
&lt;img src=&#34;images/demo-preempt.png&#34; alt=&#34;Preemptive multitasking demo: threads A and B alternate without yielding&#34; title=&#34;Preemptive multitasking demo: threads A and B alternate without yielding&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; Preemptive multitasking demo showing threads A and B alternating without yielding.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;The proof&lt;/strong&gt;: Neither thread ever calls &lt;code&gt;yield()&lt;/code&gt; or returns. They both spin in infinite loops. Yet they alternate. The OS is in control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Timing breakdown&lt;/strong&gt;: Timer ticks every 100ms. Threads switch every 5 ticks (500ms). Each thread prints every 10 ticks (1 second). So you see A, then about a second later B, then A, and so on.&lt;/p&gt;
&lt;p&gt;Press &lt;code&gt;Ctrl-A&lt;/code&gt; then &lt;code&gt;X&lt;/code&gt; to exit QEMU.&lt;/p&gt;
&lt;h2 id=&#34;15-cooperative-vs-preemptive-a-comparison&#34;&gt;15. Cooperative vs preemptive: a comparison&lt;/h2&gt;
&lt;p&gt;Now that we&amp;rsquo;ve built both models, let&amp;rsquo;s put them side by side:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Property&lt;/th&gt;
          &lt;th&gt;Cooperative (Part 2)&lt;/th&gt;
          &lt;th&gt;Preemptive (this part)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Who decides when to switch&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;The task itself&lt;/td&gt;
          &lt;td&gt;The OS (via timer)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Can a task hog the CPU?&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Yes&lt;/td&gt;
          &lt;td&gt;No&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Overhead per switch&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;~10 cycles (function return)&lt;/td&gt;
          &lt;td&gt;~300 cycles (full register save/restore)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Worst-case latency&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Unbounded (task might never yield)&lt;/td&gt;
          &lt;td&gt;Bounded (at most one tick period)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Shared state safety&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Simple (no concurrent access)&lt;/td&gt;
          &lt;td&gt;Complex (need atomics, critical sections)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Trusted code, embedded, coroutines&lt;/td&gt;
          &lt;td&gt;Untrusted code, general-purpose OS&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The overhead difference is worth understanding. In cooperative scheduling, a &amp;ldquo;switch&amp;rdquo; is just a function that returns, with the scheduler calling the next function. That&amp;rsquo;s a few instructions. In preemptive scheduling, we save 34 fields to memory, call the Rust handler, pick the next thread, restore 34 fields from memory, and execute &lt;code&gt;eret&lt;/code&gt;. That&amp;rsquo;s roughly 30x more work per switch. At 10 switches per second (our current rate), that&amp;rsquo;s negligible. At 10,000 switches per second (a typical Linux configuration), it becomes a concern.&lt;/p&gt;
&lt;p&gt;The shared state trade-off is also significant. With cooperative scheduling, you know exactly when your task might be interrupted: only when you return from &lt;code&gt;poll()&lt;/code&gt;. So you can safely modify shared data between &lt;code&gt;poll()&lt;/code&gt; calls without locks. With preemption, an interrupt can arrive between any two instructions. That&amp;rsquo;s why we use &lt;code&gt;AtomicU64&lt;/code&gt; for &lt;code&gt;TICKS&lt;/code&gt; and &lt;code&gt;AtomicUsize&lt;/code&gt; for &lt;code&gt;CURRENT&lt;/code&gt; — even on a single core, the interrupt handler and the interrupted code are logically concurrent.&lt;/p&gt;
&lt;p&gt;Most real systems use both approaches. The kernel itself typically uses cooperative scheduling internally (kernel code is trusted, and the performance benefit matters). User processes get preemptive scheduling (user code is untrusted, and fairness matters more than raw throughput). We&amp;rsquo;ll get there eventually — once we add user/kernel separation.&lt;/p&gt;
&lt;h2 id=&#34;16-what-we-built&#34;&gt;16. What we built&lt;/h2&gt;
&lt;p&gt;In this part, we took our cooperative kernel from Part 2 and gave the OS the power to enforce fairness by implementing preemptive scheduling. We went from &amp;ldquo;tasks voluntarily yield&amp;rdquo; to &amp;ldquo;the OS takes control whether tasks like it or not.&amp;rdquo; Here&amp;rsquo;s what we added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Timer interrupts&lt;/strong&gt;: The ARM Generic Timer fires every 100ms, giving us a real notion of time instead of meaningless loop iteration counts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GIC configuration&lt;/strong&gt;: The Distributor and CPU Interface route IRQ 30 (the physical timer) to our handler, with proper acknowledge/end-of-interrupt protocol.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exception vectors&lt;/strong&gt;: A 16-entry vector table catches IRQs and dispatches them to Rust code, bridging the hardware-software boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context switching&lt;/strong&gt;: Assembly saves and restores all 34 fields (31 GPRs + SP + ELR + SPSR) per switch, ensuring threads can&amp;rsquo;t corrupt each other&amp;rsquo;s state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preemptive scheduling&lt;/strong&gt;: Timer-driven round-robin means threads can&amp;rsquo;t monopolize the CPU, even if they spin in infinite loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The context switch takes about 300 cycles on our setup. That&amp;rsquo;s fast, partly because we don&amp;rsquo;t flush the TLB (we&amp;rsquo;re in a single address space), don&amp;rsquo;t save NEON/FP registers, and don&amp;rsquo;t switch page tables. A real OS doing all of those things might take 3,000-5,000 cycles per switch. But the mechanism is identical: save state, pick next, restore state, &lt;code&gt;eret&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The two threads in our demo never yield, never cooperate, never even know the other exists. Yet they alternate perfectly. That&amp;rsquo;s the fundamental promise of preemptive multitasking, and it&amp;rsquo;s why every general-purpose OS uses it.&lt;/p&gt;
&lt;p&gt;In &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;, we&amp;rsquo;ll tackle the last major piece of the puzzle: virtual memory. We&amp;rsquo;ll build a frame allocator, construct page tables, and enable the MMU so that each memory access goes through address translation. This is the foundation for process isolation — giving each task its own view of memory so they can&amp;rsquo;t stomp on each other.&lt;/p&gt;
&lt;h2 id=&#34;17-references&#34;&gt;17. References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0487/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Architecture Reference Manual
	&lt;/span&gt;
&lt;/a&gt;, Section D1 (Exception Handling), Section D11 (Generic Timer)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ihi0048/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM GICv2 Specification
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.qemu.org/docs/master/system/arm/virt.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		QEMU virt machine
	&lt;/span&gt;
&lt;/a&gt;, memory map&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Procedure Call Standard (AAPCS64)
	&lt;/span&gt;
&lt;/a&gt;, register usage&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Operating Systems: Three Easy Pieces&lt;/em&gt;, &lt;a
	
		href = &#34;https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chapter 6: Limited Direct Execution
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 3 (this): Concurrency&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Making a headless AI assistant observable - without SSH</title>
      <link>/post/2026/04/openclaw-nanoclaw-observability/</link>
      <pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/04/openclaw-nanoclaw-observability/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/nanoclaw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/nanoclaw
	&lt;/span&gt;
&lt;/a&gt; - full source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;NanoClaw is a headless AI assistant running on my personal server. It processes messages from WhatsApp, Telegram, and Slack, runs scheduled tasks, and manages conversations with Claude agents in isolated containers. It&amp;rsquo;s been incredibly useful, but it had one major pain point: no visibility into what it was doing or why. If something went wrong - a message didn&amp;rsquo;t get a reply, a task didn&amp;rsquo;t run - the only way to debug was to SSH into the server, tail logs, and piece together what happened. Not ideal when you&amp;rsquo;re on the go and your assistant just&amp;hellip; stops responding.&lt;/p&gt;
&lt;p&gt;I use NanoClaw as my personal AI assistant - it handles everything from answering questions, to tracking flights, to giving me a daily morning briefing with F1 standings and weather. It is my agent and allows for me to check on the kind of thing I want to check on from my phone, not have to SSH into a server for.&lt;/p&gt;
&lt;p&gt;The problem with a headless service that runs 24/7 is that you can&amp;rsquo;t see what it&amp;rsquo;s doing. When a message doesn&amp;rsquo;t get a reply, or a scheduled task doesn&amp;rsquo;t fire, the debugging workflow is: SSH into the server, tail the pino logs, grep for timestamps, piece together what happened. Not great when you&amp;rsquo;re out and about and your assistant just&amp;hellip; stops responding.&lt;/p&gt;
&lt;p&gt;I wanted three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A way to ask the system &amp;ldquo;what are you doing right now?&amp;rdquo; from the same WhatsApp chat I use to talk to it.&lt;/li&gt;
&lt;li&gt;A way to manage scheduled tasks without SSH.&lt;/li&gt;
&lt;li&gt;And a way to ask &amp;ldquo;why did you do that?&amp;rdquo; after the fact, with full traceability from triggering event to outbound action.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post covers all three and how we built them in NanoClaw - nine features (~1100 lines of new TypeScript, two new modules, and three new SQLite tables).&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Given the existing architecture of NanoClaw, we added a suite of observability features that are all accessible from the main WhatsApp group. No SSH, no separate dashboards, no external logging services - just commands you can type in the chat to see what&amp;rsquo;s going on and manage the system.&lt;/p&gt;
&lt;p&gt;I added three groups of features to NanoClaw:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Real-time visibility&lt;/strong&gt; - &lt;code&gt;/status&lt;/code&gt; shows uptime, memory, active containers, channels, groups, and task summaries. &lt;code&gt;/status tasks&lt;/code&gt; shows the full task list with schedules, next run times, and IDs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational control&lt;/strong&gt; - &lt;code&gt;/task pause|resume|delete &amp;lt;id&amp;gt;&lt;/code&gt; manages scheduled tasks directly from the chat. No SSH, no restarts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event tracing and debugging&lt;/strong&gt; - three SQLite tables that trace every action back to its triggering event. Pipeline is instrumented at message ingress, agent output, scheduled tasks, and IPC. Query with &lt;code&gt;/debug last 10&lt;/code&gt;, &lt;code&gt;/debug why&lt;/code&gt;, &lt;code&gt;/debug event &amp;lt;id&amp;gt;&lt;/code&gt;, and &lt;code&gt;/debug report&lt;/code&gt;. Auto-prunes after 3 days.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All operated entirely from the messaging channel.&lt;/p&gt;
&lt;h2 id=&#34;1-the-architecture-quick-context&#34;&gt;1. The architecture (quick context)&lt;/h2&gt;
&lt;p&gt;Before diving in, here&amp;rsquo;s how NanoClaw works at a high level. Understanding this makes the instrumentation decisions clearer. NanoClaw is a OSS fork of OpenClaw, so it shares the same core architecture:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart LR
    WA[WhatsApp] --&amp;gt; ORC[Orchestrator]
    TG[Telegram] --&amp;gt; ORC
    SL[Slack] --&amp;gt; ORC
    ORC --&amp;gt; DB[(SQLite)]
    ORC --&amp;gt; Q[Group Queue]
    Q --&amp;gt; C1[Container 1]
    Q --&amp;gt; C2[Container 2]
    C1 --&amp;gt; IPC[IPC Watcher]
    IPC --&amp;gt; ORC
    SCH[Task Scheduler] --&amp;gt; Q&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: NanoClaw message flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Messages arrive from channels, get stored in SQLite, and the orchestrator polls for new messages every 2 seconds. When a registered group has unprocessed messages, the group queue spawns a container running Claude&amp;rsquo;s Agent SDK. The agent&amp;rsquo;s output streams back through the orchestrator to the originating channel. Scheduled tasks follow the same path but are triggered by a cron/interval scheduler rather than by incoming messages.&lt;/p&gt;
&lt;p&gt;The key insight: everything flows through the orchestrator. That&amp;rsquo;s where we intercept commands, instrument actions, and expose state. The group queue manages the container lifecycle. The database is already there for message storage. All the pieces are in place - we just need to wire them up.&lt;/p&gt;
&lt;h2 id=&#34;2-what-was-built&#34;&gt;2. What was built&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the full inventory. Two new modules, six modified files, nine distinct features:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;#&lt;/th&gt;
          &lt;th&gt;Feature&lt;/th&gt;
          &lt;th&gt;Type&lt;/th&gt;
          &lt;th&gt;Files&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/status&lt;/code&gt; - system dashboard&lt;/td&gt;
          &lt;td&gt;Command&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;status.ts&lt;/code&gt;, &lt;code&gt;index.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/status tasks&lt;/code&gt; - task detail view&lt;/td&gt;
          &lt;td&gt;Command&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;status.ts&lt;/code&gt;, &lt;code&gt;index.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/task pause|resume|delete&lt;/code&gt; - task management&lt;/td&gt;
          &lt;td&gt;Command&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;status.ts&lt;/code&gt;, &lt;code&gt;index.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;GroupQueue.getStatus()&lt;/code&gt; - queue introspection&lt;/td&gt;
          &lt;td&gt;API&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;group-queue.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;Three-table event log schema&lt;/td&gt;
          &lt;td&gt;Schema&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;db.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;logEvent&lt;/code&gt; / &lt;code&gt;logAction&lt;/code&gt; / &lt;code&gt;logToolCall&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Module&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;event-log.ts&lt;/code&gt; (new)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7&lt;/td&gt;
          &lt;td&gt;Pipeline instrumentation&lt;/td&gt;
          &lt;td&gt;Instrumentation&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;index.ts&lt;/code&gt;, &lt;code&gt;task-scheduler.ts&lt;/code&gt;, &lt;code&gt;ipc.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/debug last|why|event|report&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Command&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;status.ts&lt;/code&gt;, &lt;code&gt;event-log.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9&lt;/td&gt;
          &lt;td&gt;Auto-pruning with configurable retention&lt;/td&gt;
          &lt;td&gt;Config&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;event-log.ts&lt;/code&gt;, &lt;code&gt;config.ts&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All commands are restricted to the &lt;strong&gt;main group&lt;/strong&gt; only. Non-main groups are silently ignored, preventing random group members from querying system status or managing tasks.&lt;/p&gt;
&lt;h2 id=&#34;3-status---real-time-system-dashboard&#34;&gt;3. /status - real-time system dashboard&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;/status&lt;/code&gt; command assembles information from several subsystems into a single message. It queries the group queue for container states, the database for registered groups and tasks, and formats it all as a WhatsApp-friendly message.&lt;/p&gt;
&lt;p&gt;The output is designed to give a quick overview of the system&amp;rsquo;s health and activity at a glance:&lt;/p&gt;
&lt;figure id=&#34;fig2&#34;&gt;
&lt;img src=&#34;images/status-output.png&#34; alt=&#34;/status output showing uptime, an active container processing an F1 query, WhatsApp channel, and 2 active cron tasks&#34; title=&#34;/status command output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; /status while the agent is answering an F1 question - containers, channels, groups, and tasks at a glance.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;What it shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Uptime and memory&lt;/strong&gt; - how long the process has been running, RSS in MB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timezone&lt;/strong&gt; - the configured timezone (important for cron schedules)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containers&lt;/strong&gt; - active/max concurrent, with per-group detail (idle, processing, running task, queued)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Channels&lt;/strong&gt; - which messaging channels are connected (WhatsApp, Telegram, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groups&lt;/strong&gt; - all registered groups with the main group indicator&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasks&lt;/strong&gt; - count of active/paused tasks, next upcoming task with time-until&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote control&lt;/strong&gt; - whether a remote Claude Code session is active&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation pulls from existing subsystems - no new state tracking was needed:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; buildStatus(queue: &lt;span style=&#34;color:#ed8796&#34;&gt;GroupQueue&lt;/span&gt;, channels: &lt;span style=&#34;color:#ed8796&#34;&gt;Channel&lt;/span&gt;[])&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; uptime &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; formatDuration(&lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;.now() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; startTime);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; mem &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Math&lt;/span&gt;.round(process.memoryUsage.rss() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; qs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; queue.getStatus();       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// new method on GroupQueue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; channelNames &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; channels.map((ch) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; ch.name).join(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;, &amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; groups &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getAllRegisteredGroups();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; tasks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getAllTasks();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; activeTasks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tasks.filter((t) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; t.status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; rc &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getActiveSession();       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// remote control state
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; lines: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;[] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`*&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;ASSISTANT_NAME&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; Status*`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`----------------`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`Uptime: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;uptime&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`Memory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;mem&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; MB`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`Timezone: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;TIMEZONE&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;``&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`*Containers:* &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;qs.activeCount&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;qs.maxConcurrent&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; active`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`*Channels:* &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;channelNames &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... active container details, groups, tasks, remote control
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; lines.join(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Building the status response&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;31-exposing-queue-internals&#34;&gt;3.1 Exposing queue internals&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;GroupQueue&lt;/code&gt; class already tracked everything we needed internally: active containers, pending messages, pending tasks, and idle state. It just wasn&amp;rsquo;t exposed. A new &lt;code&gt;getStatus()&lt;/code&gt; method surfaces this without leaking internal implementation:&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;getStatus()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  activeCount: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  maxConcurrent: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  waitingCount: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  groups: &lt;span style=&#34;color:#ed8796&#34;&gt;Array&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    jid: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    active: &lt;span style=&#34;color:#ed8796&#34;&gt;boolean&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    idleWaiting: &lt;span style=&#34;color:#ed8796&#34;&gt;boolean&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    isTaskContainer: &lt;span style=&#34;color:#ed8796&#34;&gt;boolean&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pendingMessages: &lt;span style=&#34;color:#ed8796&#34;&gt;boolean&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pendingTaskCount: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; groups &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; [jid, state] &lt;span style=&#34;color:#c6a0f6&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;this&lt;/span&gt;.groups) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (state.active &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; state.pendingMessages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; state.pendingTasks.length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      groups.push({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        jid,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        active: &lt;span style=&#34;color:#ed8796&#34;&gt;state.active&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        idleWaiting: &lt;span style=&#34;color:#ed8796&#34;&gt;state.idleWaiting&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        isTaskContainer: &lt;span style=&#34;color:#ed8796&#34;&gt;state.isTaskContainer&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pendingMessages: &lt;span style=&#34;color:#ed8796&#34;&gt;state.pendingMessages&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pendingTaskCount: &lt;span style=&#34;color:#ed8796&#34;&gt;state.pendingTasks.length&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    activeCount: &lt;span style=&#34;color:#ed8796&#34;&gt;this.activeCount&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    maxConcurrent: &lt;span style=&#34;color:#ed8796&#34;&gt;MAX_CONCURRENT_CONTAINERS&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    waitingCount: &lt;span style=&#34;color:#ed8796&#34;&gt;this.waitingGroups.length&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    groups,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: GroupQueue.getStatus() - queue introspection&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Only groups with activity (active, pending messages, or pending tasks) are included - no noise from idle groups. The status output translates these states into human-readable labels: &amp;ldquo;idle&amp;rdquo;, &amp;ldquo;processing&amp;rdquo;, &amp;ldquo;running task&amp;rdquo;, or &amp;ldquo;queued&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;4-status-tasks---task-detail-view&#34;&gt;4. /status tasks - task detail view&lt;/h2&gt;
&lt;p&gt;While &lt;code&gt;/status&lt;/code&gt; includes a task summary (count + next upcoming), &lt;code&gt;/status tasks&lt;/code&gt; gives the full picture. Each task shows its prompt (truncated to 50 chars), schedule type, next run time, last run time, and the task ID you need for management commands.&lt;/p&gt;
&lt;figure id=&#34;fig3&#34;&gt;
&lt;img src=&#34;images/status-tasks-output.png&#34; alt=&#34;/status tasks showing daily morning briefing with F1 standings, AI news digest, and completed flight tracking tasks&#34; title=&#34;/status tasks command output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; /status tasks - two active daily crons (morning briefing with F1 + weather, AI news digest) and completed one-offs (flight tracking, reminders).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; formatTaskLine(task: &lt;span style=&#34;color:#ed8796&#34;&gt;ScheduledTask&lt;/span&gt;, index: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; task.status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; task.status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;paused&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; [paused]&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; [done]&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; schedule &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; task.schedule_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cron&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`cron: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.schedule_value&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; task.schedule_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;interval&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`every &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.schedule_value&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`once`&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; task.prompt.length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; task.prompt.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;...&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; task.prompt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; task.next_run &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; formatTimeUntil(task.next_run) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;n/a&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; lastRun &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; task.last_run &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; formatTimeAgo(task.last_run) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;never&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`*&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.* &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;prompt&lt;span style=&#34;color:#a6da95&#34;&gt;}${&lt;/span&gt;status&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`   Schedule: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;schedule&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`   Next: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;next&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; | Last: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;lastRun&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;`   ID: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.id&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ].join(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Formatting a task line&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Tasks are grouped by status - active first, then paused, then completed. The relative time formatting (&lt;code&gt;in 2h 15m&lt;/code&gt;, &lt;code&gt;3m 42s ago&lt;/code&gt;) makes it easy to see at a glance what&amp;rsquo;s coming up and what ran recently.&lt;/p&gt;
&lt;h2 id=&#34;5-task---operational-control&#34;&gt;5. /task - operational control&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;/task&lt;/code&gt; command turns the chat into a control plane. No more SSH-ing in to pause a runaway task or clean up a completed one.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task pause &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Pause an active task (stops scheduling, preserves config)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task resume &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Resume a paused task&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task delete &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Delete a task and its run history&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;figure id=&#34;fig4&#34;&gt;
&lt;img src=&#34;images/task-command-output.png&#34; alt=&#34;/task pause and /task resume on the AI news digest task&#34; title=&#34;/task command output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Pausing and resuming the AI news digest task - no SSH, no restart.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; handleTaskCommand(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  args: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;true&lt;/span&gt;; message: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; } &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;false&lt;/span&gt;; error: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; } {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; parts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; args.trim().split(&lt;span style=&#34;color:#8bd5ca&#34;&gt;/\s+/&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; action &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parts[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;.toLowerCase();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; taskId &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parts.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;).join(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; task &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getTaskById(taskId);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;task) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;false&lt;/span&gt;, error&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Task not found: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;taskId&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;switch&lt;/span&gt; (action) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pause&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (task.status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;false&lt;/span&gt;, error&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Task is already &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.status&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      updateTask(taskId, { status&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;paused&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;true&lt;/span&gt;, message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Paused: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.prompt.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;resume&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (task.status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;paused&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;false&lt;/span&gt;, error&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Task is &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.status&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;, not paused`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      updateTask(taskId, { status&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;true&lt;/span&gt;, message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Resumed: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.prompt.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;delete&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      deleteTask(taskId);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;true&lt;/span&gt;, message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Deleted: &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.prompt.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;default&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { ok: &lt;span style=&#34;color:#ed8796&#34;&gt;false&lt;/span&gt;, error&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;`Unknown action: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;action&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Task command handler&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The result type (&lt;code&gt;{ ok: true; message } | { ok: false; error }&lt;/code&gt;) is a pattern used throughout NanoClaw for commands; the caller doesn&amp;rsquo;t need to know the implementation details, just whether it succeeded and what to tell the user. State validation is done upfront (can&amp;rsquo;t pause an already-paused task, can&amp;rsquo;t resume an active one).&lt;/p&gt;
&lt;h2 id=&#34;6-command-interception&#34;&gt;6. Command interception&lt;/h2&gt;
&lt;p&gt;All built-in commands (&lt;code&gt;/status&lt;/code&gt;, &lt;code&gt;/status tasks&lt;/code&gt;, &lt;code&gt;/task&lt;/code&gt;, &lt;code&gt;/debug&lt;/code&gt;) share the same interception pattern: they&amp;rsquo;re caught at the top of the &lt;code&gt;onMessage&lt;/code&gt; callback, &lt;strong&gt;before&lt;/strong&gt; the message is stored or processed.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; channelOpts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  onMessage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; (chatJid: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;, msg: &lt;span style=&#34;color:#ed8796&#34;&gt;NewMessage&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; trimmed &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; msg.content.trim();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Built-in commands - intercept before storage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (trimmed &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/status&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; trimmed &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/status tasks&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      handleStatus(trimmed, chatJid, msg).&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;(&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;/* ... */&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// don&amp;#39;t store, don&amp;#39;t process
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (trimmed.startsWith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/task &amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      handleTaskCmd(chatJid, msg).&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;(&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;/* ... */&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (trimmed.startsWith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/debug&amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      handleDebugCmd(chatJid, msg).&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;(&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;/* ... */&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... sender allowlist filtering, event logging, message storage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    storeMessage(msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Intercepting built-in commands before storage&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;return&lt;/code&gt; before &lt;code&gt;storeMessage()&lt;/code&gt; is the key design decision. These commands are ephemeral &amp;ndash; they shouldn&amp;rsquo;t appear in the conversation history, shouldn&amp;rsquo;t trigger the agent, and shouldn&amp;rsquo;t affect message cursors. They&amp;rsquo;re handled entirely by the host process and respond instantly (no container spawn needed).&lt;/p&gt;
&lt;p&gt;Each handler checks &lt;code&gt;group?.isMain&lt;/code&gt; before proceeding. Non-main-group commands are silently dropped, with a warning in the server logs.&lt;/p&gt;
&lt;h2 id=&#34;7-eventactiontool-logging&#34;&gt;7. Event/action/tool logging&lt;/h2&gt;
&lt;p&gt;The commands above tell you what&amp;rsquo;s happening &lt;em&gt;now&lt;/em&gt;. But when something went wrong an hour ago, you need a trail. That&amp;rsquo;s where event logging comes in.&lt;/p&gt;
&lt;h3 id=&#34;71-the-three-table-schema&#34;&gt;7.1 The three-table schema&lt;/h3&gt;
&lt;p&gt;NanoClaw&amp;rsquo;s existing SQLite schema was focused on message storage and container state. We needed a new schema to capture the full traceability from inbound triggers to outbound actions to tool calls. The design is a simple three-table structure. Every inbound trigger is an &lt;strong&gt;event&lt;/strong&gt;, every outbound action is an &lt;strong&gt;action&lt;/strong&gt; linked to its triggering event, and every tool invocation is a &lt;strong&gt;tool call&lt;/strong&gt; linked to its parent action.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; event_log (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id           &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;KEY&lt;/span&gt;,    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- UUID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;timestamp&lt;/span&gt;    DATETIME &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;source&lt;/span&gt;       &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NULL&lt;/span&gt;,       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- &amp;#39;whatsapp&amp;#39;, &amp;#39;telegram&amp;#39;, &amp;#39;scheduled_task&amp;#39;, &amp;#39;ipc&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  source_id    &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- message ID, task ID, etc.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  raw_content  &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- full payload (JSON, truncated to 10KB)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  summary      &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;                 &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- human-readable one-liner
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; action_log (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id            &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;timestamp&lt;/span&gt;     DATETIME &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  triggered_by  &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;REFERENCES&lt;/span&gt; event_log(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  action_type   &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NULL&lt;/span&gt;,      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- &amp;#39;message_sent&amp;#39;, &amp;#39;task_scheduled&amp;#39;, &amp;#39;tool_call&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  target        &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- group JID, email address, task ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  content       &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- what was sent or done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  tool_calls    &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- JSON array of tool names
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; tool_call_log (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id           &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  action_id    &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;REFERENCES&lt;/span&gt; action_log(id),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;timestamp&lt;/span&gt;    DATETIME &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tool_name    &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;input&lt;/span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- JSON (truncated to 10KB)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;output&lt;/span&gt;       &lt;span style=&#34;color:#91d7e3&#34;&gt;TEXT&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- JSON (truncated to 10KB)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  duration_ms  &lt;span style=&#34;color:#91d7e3&#34;&gt;INTEGER&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  success      &lt;span style=&#34;color:#91d7e3&#34;&gt;INTEGER&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;INDEX&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; idx_event_log_timestamp &lt;span style=&#34;color:#c6a0f6&#34;&gt;ON&lt;/span&gt; event_log(&lt;span style=&#34;color:#c6a0f6&#34;&gt;timestamp&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;INDEX&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; idx_action_log_triggered_by &lt;span style=&#34;color:#c6a0f6&#34;&gt;ON&lt;/span&gt; action_log(triggered_by);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;INDEX&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; idx_tool_call_log_action_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;ON&lt;/span&gt; tool_call_log(action_id);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Event logging schema&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The foreign key chain is &lt;code&gt;event_log&lt;/code&gt; &amp;lt;- &lt;code&gt;action_log&lt;/code&gt; &amp;lt;- &lt;code&gt;tool_call_log&lt;/code&gt;. Given any action, you can trace back to &lt;em&gt;why&lt;/em&gt; it happened. Given any event, you can see &lt;em&gt;everything&lt;/em&gt; it caused. The indexes support the &lt;code&gt;/debug&lt;/code&gt; query patterns: filtering by timestamp (pruning), joining by &lt;code&gt;triggered_by&lt;/code&gt; (event lookups), and grouping by &lt;code&gt;action_id&lt;/code&gt; (tool call chains).&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig5&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    E[Event: WhatsApp message received] --&amp;gt; A1[Action: message_sent to group]
    E --&amp;gt; A2[Action: task_scheduled]
    A1 --&amp;gt; T1[Tool Call: runContainerAgent]
    A1 --&amp;gt; T2[Tool Call: channel.sendMessage]&lt;/pre&gt;
    &lt;figcaption&gt;Figure 5: Event -&amp;gt; Action -&amp;gt; Tool Call tracing chain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;These tables live in the same &lt;code&gt;messages.db&lt;/code&gt; file as everything else. No additional file handles, no additional backup concerns, no additional connection management. They&amp;rsquo;re created in the existing &lt;code&gt;createSchema()&lt;/code&gt; function using &lt;code&gt;CREATE TABLE IF NOT EXISTS&lt;/code&gt;, so they&amp;rsquo;re added transparently on first startup after the upgrade.&lt;/p&gt;
&lt;h3 id=&#34;72-the-logger-module&#34;&gt;7.2 The logger module&lt;/h3&gt;
&lt;p&gt;Three functions, matching the three tables. All IDs are UUIDs via &lt;code&gt;crypto.randomUUID()&lt;/code&gt;. All writes are fire-and-forget - wrapped in &lt;code&gt;try/catch&lt;/code&gt;, errors logged at &lt;code&gt;debug&lt;/code&gt; level, never blocking the pipeline.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; logEvent(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  sourceId: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  rawContent: &lt;span style=&#34;color:#ed8796&#34;&gt;unknown&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  summary: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; crypto.randomUUID();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    insertEventStmt().run(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      id, &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;().toISOString(), source, sourceId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      truncate(rawContent), summary,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (err) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.debug({ err, source, sourceId }, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Failed to log event&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; id;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// always returns an ID, even if the write failed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; logAction(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  triggeredBy: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  actionType: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  target: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  content: &lt;span style=&#34;color:#ed8796&#34;&gt;unknown&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  toolCalls?: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;[],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; crypto.randomUUID();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    insertActionStmt().run(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      id, &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;().toISOString(), triggeredBy, actionType,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      target, truncate(content),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      toolCalls &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; JSON.stringify(toolCalls) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (err) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.debug({ err, actionType, target }, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Failed to log action&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Core logging functions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Every call returns an ID, so callers can chain events -&amp;gt; actions -&amp;gt; tool calls, even if the write fails silently. This is intentional - the pipeline code doesn&amp;rsquo;t check whether logging succeeded, it just carries the ID forward.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;truncate()&lt;/code&gt; helper caps content at 10KB to prevent DB bloat:&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; MAX_CONTENT_SIZE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; truncate(value: &lt;span style=&#34;color:#ed8796&#34;&gt;unknown&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (value &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;undefined&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; value &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;typeof&lt;/span&gt; value &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;string&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; value : &lt;span style=&#34;color:#ed8796&#34;&gt;JSON.stringify&lt;/span&gt;(value);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (str.length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; MAX_CONTENT_SIZE) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; str.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, MAX_CONTENT_SIZE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; str;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Content truncation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;73-the-tool-call-wrapper&#34;&gt;7.3 The tool call wrapper&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;logToolCall&lt;/code&gt; is different from the other two - it wraps an async operation and automatically records input, output, duration, and success/failure:&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; logToolCall&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;T&lt;/span&gt;&amp;gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  actionId: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  toolName: &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  input: &lt;span style=&#34;color:#ed8796&#34;&gt;unknown&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; () &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; Promise&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;T&lt;/span&gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;T&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; crypto.randomUUID();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; start &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;.now();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; success &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; output: &lt;span style=&#34;color:#ed8796&#34;&gt;unknown&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;await&lt;/span&gt; fn();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (err) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    success &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; err &lt;span style=&#34;color:#c6a0f6&#34;&gt;instanceof&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Error&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; err.message : &lt;span style=&#34;color:#ed8796&#34;&gt;String&lt;/span&gt;(err);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;throw&lt;/span&gt; err;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// re-throw - logging doesn&amp;#39;t swallow errors
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  } &lt;span style=&#34;color:#c6a0f6&#34;&gt;finally&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; durationMs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;.now() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; start;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      insertToolCallStmt().run(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        id, actionId, &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;().toISOString(), toolName,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        truncate(input), truncate(output), durationMs, success &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; 1 : &lt;span style=&#34;color:#ed8796&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (logErr) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      logger.debug({ err: &lt;span style=&#34;color:#ed8796&#34;&gt;logErr&lt;/span&gt;, toolName }, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Failed to log tool call&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Tool call wrapper with automatic instrumentation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;finally&lt;/code&gt; block ensures the log entry is written regardless of whether the wrapped operation succeeded or failed. The error is always re-thrown - &lt;code&gt;logToolCall&lt;/code&gt; is transparent to the caller. It&amp;rsquo;s a decorator pattern: wrap any async operation and get free instrumentation.&lt;/p&gt;
&lt;p&gt;Insert statements are lazily prepared and reused across calls, avoiding the overhead of re-preparing the same SQL on every log write.&lt;/p&gt;
&lt;h3 id=&#34;74-instrumenting-the-pipeline&#34;&gt;7.4 Instrumenting the pipeline&lt;/h3&gt;
&lt;p&gt;With the logger module in place, instrumentation is surgical - a few lines at each key point in the message flow:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inbound messages&lt;/strong&gt; (in the &lt;code&gt;onMessage&lt;/code&gt; callback):&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Detect channel from JID format
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; evtChannel &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; chatJid.includes(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;@g.us&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; chatJid.includes(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;@s.whatsapp.net&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;whatsapp&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; chatJid.startsWith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tg:&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telegram&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; chatJid.startsWith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dc:&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;discord&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; chatJid.startsWith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;sl:&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;slack&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;channel&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logEvent(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  evtChannel, msg.id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { sender: &lt;span style=&#34;color:#ed8796&#34;&gt;msg.sender_name&lt;/span&gt;, content: &lt;span style=&#34;color:#ed8796&#34;&gt;msg.content?.slice&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;) },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;`Message from &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;msg.sender_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;(msg.content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;).slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Logging inbound messages with channel detection&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Agent processing&lt;/strong&gt; (when the orchestrator starts handling a group&amp;rsquo;s messages):&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Log the processing event - this ID links to all downstream actions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; eventId &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logEvent(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;message_batch&amp;#39;&lt;/span&gt;, chatJid,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { messageCount: &lt;span style=&#34;color:#ed8796&#34;&gt;missedMessages.length&lt;/span&gt;, group: &lt;span style=&#34;color:#ed8796&#34;&gt;group.name&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;`Processing &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;missedMessages.length&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; message(s) for &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;group.name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Logging the processing event and carrying the eventId&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Outbound messages&lt;/strong&gt; (in the streaming output callback):&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (text) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;await&lt;/span&gt; channel.sendMessage(chatJid, text);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  logAction(eventId, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;message_sent&amp;#39;&lt;/span&gt;, chatJid, text.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Logging outbound actions linked to the triggering event&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;eventId&lt;/code&gt; from the processing event links the outbound action back to the batch that triggered it. This is the chain that &lt;code&gt;/debug why&lt;/code&gt; follows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scheduled tasks&lt;/strong&gt; - logged at the point the scheduler picks up a due task, and again when the result is sent to the user:&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; eventId &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logEvent(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;scheduled_task&amp;#39;&lt;/span&gt;, task.id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { prompt: &lt;span style=&#34;color:#ed8796&#34;&gt;task.prompt.slice&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;), schedule: &lt;span style=&#34;color:#ed8796&#34;&gt;task.schedule_type&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;`Scheduled task: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;task.prompt.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... later, when the container produces output:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;await&lt;/span&gt; deps.sendMessage(task.chat_jid, streamedOutput.result);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logAction(eventId, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;message_sent&amp;#39;&lt;/span&gt;, task.chat_jid, result&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Scheduled task instrumentation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;IPC&lt;/strong&gt; - logged when the IPC watcher processes messages and task operations from containers:&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; ipcEventId &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logEvent(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ipc&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  { chatJid: &lt;span style=&#34;color:#ed8796&#34;&gt;data.chatJid&lt;/span&gt;, sourceGroup, text: &lt;span style=&#34;color:#ed8796&#34;&gt;data.text?.slice&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;) },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;`IPC message from &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;sourceGroup&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;await&lt;/span&gt; deps.sendMessage(data.chatJid, data.text);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logAction(ipcEventId, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;message_sent&amp;#39;&lt;/span&gt;, data.chatJid, data.text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;.slice(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;??&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: IPC message instrumentation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;8-the-debug-commands&#34;&gt;8. The /debug commands&lt;/h2&gt;
&lt;p&gt;Four subcommands for querying the event log, all main-group only:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;What it shows&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug last &amp;lt;n&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Last &lt;em&gt;n&lt;/em&gt; actions with their triggering events&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug why&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Most recent action with full event context and tool call chain&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug event &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Everything triggered by a specific event&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug report&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Summary dashboard: table sizes, events by source, actions by type, busiest hours, recent errors&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;81-debug-last---quick-scan&#34;&gt;8.1 /debug last - quick scan&lt;/h3&gt;
&lt;p&gt;The &amp;ldquo;what happened recently?&amp;rdquo; view. Joins &lt;code&gt;action_log&lt;/code&gt; with &lt;code&gt;event_log&lt;/code&gt; to show each action alongside what caused it:&lt;/p&gt;
&lt;figure id=&#34;fig6&#34;&gt;
&lt;img src=&#34;images/debug-last-output.png&#34; alt=&#34;/debug last 5 showing F1 query response, flight tracking updates, and Gmail cleanup actions&#34; title=&#34;/debug last output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; /debug last 5 - the F1 response, flight landing alert, and Gmail cleanup, each traced back to its trigger.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; getLastActions(n: &lt;span style=&#34;color:#ed8796&#34;&gt;number&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Array&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  action: &lt;span style=&#34;color:#ed8796&#34;&gt;ActionLogRow&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  event: &lt;span style=&#34;color:#ed8796&#34;&gt;EventLogRow&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; rows &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getDb()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .prepare(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6da95&#34;&gt;`SELECT a.*, e.id as e_id, e.timestamp as e_timestamp,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;              e.source as e_source, e.source_id as e_source_id,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;              e.summary as e_summary
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;       FROM action_log a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;       LEFT JOIN event_log e ON a.triggered_by = e.id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;       ORDER BY a.timestamp DESC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;       LIMIT ?`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .all(n);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... map to structured result
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: Querying last N actions with LEFT JOIN&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;LEFT JOIN&lt;/code&gt; is important - some actions might not have a triggering event (e.g., system-initiated actions), and we still want to see them.&lt;/p&gt;
&lt;h3 id=&#34;82-debug-why---full-trace&#34;&gt;8.2 /debug why - full trace&lt;/h3&gt;
&lt;p&gt;Answers &amp;ldquo;why did the last thing happen?&amp;rdquo; by pulling the most recent action, its triggering event, and all associated tool calls:&lt;/p&gt;
&lt;figure id=&#34;fig7&#34;&gt;
&lt;img src=&#34;images/debug-why-output.png&#34; alt=&#34;/debug why showing the most recent action with its triggering WhatsApp message and tool call chain&#34; title=&#34;/debug why output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; /debug why - tracing the most recent action back to the WhatsApp message that caused it.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;listing16&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; getLastActionWithToolCalls()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  action: &lt;span style=&#34;color:#ed8796&#34;&gt;ActionLogRow&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  event: &lt;span style=&#34;color:#ed8796&#34;&gt;EventLogRow&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  toolCalls: &lt;span style=&#34;color:#ed8796&#34;&gt;ToolCallLogRow&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getLastActions(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (results.length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; { action, event } &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; results[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; toolCalls &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getDb()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .prepare(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6da95&#34;&gt;`SELECT * FROM tool_call_log WHERE action_id = ? ORDER BY timestamp`&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .all(action.id) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; ToolCallLogRow[];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; { action, event, toolCalls };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 16: Full trace for the most recent action&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The output shows the full chain: triggering event (source, summary, timestamp, ID), the action taken (type, target, content), and each tool call with its duration and success/failure status. Copy the event ID from here and use &lt;code&gt;/debug event &amp;lt;id&amp;gt;&lt;/code&gt; to see everything else that event triggered.&lt;/p&gt;
&lt;h3 id=&#34;83-debug-report---summary-dashboard&#34;&gt;8.3 /debug report - summary dashboard&lt;/h3&gt;
&lt;p&gt;The &amp;ldquo;is everything healthy?&amp;rdquo; view. Aggregates across all three tables into a single report:&lt;/p&gt;
&lt;figure id=&#34;fig8&#34;&gt;
&lt;img src=&#34;images/debug-report-output.png&#34; alt=&#34;/debug report showing event counts by source, action breakdown, and busiest hours from a day of flight tracking and F1 queries&#34; title=&#34;/debug report output in WhatsApp&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; /debug report - a day&#39;s worth of WhatsApp messages, flight tracking, Gmail cleanup, and F1 queries summarized.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;What it includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retention period&lt;/strong&gt; - configured days and current time window&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Table sizes&lt;/strong&gt; - row counts for events, actions, and tool calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events by source&lt;/strong&gt; - breakdown by channel (whatsapp, telegram, scheduled_task, ipc)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions by type&lt;/strong&gt; - breakdown by what was done (message_sent, task_scheduled, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Busiest hours&lt;/strong&gt; - top 5 hours by event count, in local timezone&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recent failed tool calls&lt;/strong&gt; - last 10 with tool name, duration, and error output&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recent errors&lt;/strong&gt; - last 10 error-like actions with their triggering event&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One thing worth noting: the busiest hours are computed in JavaScript using &lt;code&gt;toLocaleString&lt;/code&gt; with the configured time zone, not in SQL. SQLite stores timestamps as UTC (as ISO strings), and performing timezone conversions in SQL would require loading an extension. Instead, we fetch the raw timestamps and bucket them in JS:&lt;/p&gt;
&lt;figure id=&#34;listing17&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; allTimestamps &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; db.prepare(&lt;span style=&#34;color:#a6da95&#34;&gt;`SELECT timestamp FROM event_log`&lt;/span&gt;).all();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; hourCounts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; Map&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#8aadf4&#34;&gt;number&lt;/span&gt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; { timestamp } &lt;span style=&#34;color:#c6a0f6&#34;&gt;of&lt;/span&gt; allTimestamps) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; localHour &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;(timestamp).toLocaleString(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;en-US&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timeZone: &lt;span style=&#34;color:#ed8796&#34;&gt;TIMEZONE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hour&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;numeric&amp;#39;&lt;/span&gt;, hour12: &lt;span style=&#34;color:#ed8796&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hourCounts.&lt;span style=&#34;color:#c6a0f6&#34;&gt;set&lt;/span&gt;(localHour, (hourCounts.&lt;span style=&#34;color:#c6a0f6&#34;&gt;get&lt;/span&gt;(localHour) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 17: Bucketing event timestamps by local hour&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Learned this the hard way when the report initially showed UTC hours, and I couldn&amp;rsquo;t figure out why 5 PM was my busiest time. 😄&lt;/p&gt;
&lt;h2 id=&#34;9-auto-pruning-and-retention&#34;&gt;9. Auto-pruning and retention&lt;/h2&gt;
&lt;p&gt;An unbounded observability system is a liability. Logs older than 3 days are automatically deleted. The retention period is configurable via the &lt;code&gt;EVENT_LOG_RETENTION_DAYS&lt;/code&gt; environment variable (set to 0 to disable pruning).&lt;/p&gt;
&lt;figure id=&#34;listing18&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// config.ts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; EVENT_LOG_RETENTION_DAYS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Math&lt;/span&gt;.max(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3&#34;&gt;parseInt&lt;/span&gt;(process.env.EVENT_LOG_RETENTION_DAYS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; EVENT_LOG_PRUNE_INTERVAL &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// hourly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 18: Log retention configuration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Pruning runs at startup (clean up anything that expired while the service was down) and then every 60 minutes:&lt;/p&gt;
&lt;figure id=&#34;listing19&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; pruneOldLogs() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (EVENT_LOG_RETENTION_DAYS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; cutoff &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Date&lt;/span&gt;.now() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; EVENT_LOG_RETENTION_DAYS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;24&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;60&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ).toISOString();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; db &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; getDb();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Delete in FK-safe order: children first
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  db.prepare(&lt;span style=&#34;color:#a6da95&#34;&gt;`DELETE FROM tool_call_log WHERE action_id IN (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    SELECT id FROM action_log WHERE timestamp &amp;lt; ?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;  )`&lt;/span&gt;).run(cutoff);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  db.prepare(&lt;span style=&#34;color:#a6da95&#34;&gt;`DELETE FROM action_log WHERE timestamp &amp;lt; ?`&lt;/span&gt;).run(cutoff);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  db.prepare(&lt;span style=&#34;color:#a6da95&#34;&gt;`DELETE FROM event_log WHERE timestamp &amp;lt; ?`&lt;/span&gt;).run(cutoff);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt; startLogPruning()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pruneOldLogs();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; timer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; setInterval(pruneOldLogs, EVENT_LOG_PRUNE_INTERVAL);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  timer.unref();   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// don&amp;#39;t keep the process alive for pruning
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 19: Pruning with FK-safe deletion order&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The deletion order matters: &lt;code&gt;tool_call_log&lt;/code&gt; rows reference &lt;code&gt;action_log&lt;/code&gt;, which in turn references &lt;code&gt;event_log&lt;/code&gt;. Deleting parents first would violate foreign key constraints. The &lt;code&gt;timer.unref()&lt;/code&gt; call ensures the pruning interval doesn&amp;rsquo;t prevent graceful shutdown.&lt;/p&gt;
&lt;h2 id=&#34;10-design-decisions&#34;&gt;10. Design decisions&lt;/h2&gt;
&lt;p&gt;A few choices that are worth calling out:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fire-and-forget, not await.&lt;/strong&gt; Every logging call is synchronous (better-sqlite3) and wrapped in &lt;code&gt;try/catch&lt;/code&gt;. If the write fails - disk full, DB locked, schema mismatch - the error is logged at &lt;code&gt;debug&lt;/code&gt; level and the pipeline continues. The logging system is never on the critical path. An observability system that can take down the thing it&amp;rsquo;s observing is worse than useless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Same database, no new dependencies.&lt;/strong&gt; The logging tables live in &lt;code&gt;messages.db&lt;/code&gt; alongside messages, tasks, sessions, and router state. No new files to back up, no new connections to manage, no new packages to install. &lt;code&gt;CREATE TABLE IF NOT EXISTS&lt;/code&gt; means existing installations pick up the schema on restart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Commands intercepted before storage.&lt;/strong&gt; &lt;code&gt;/status&lt;/code&gt;, &lt;code&gt;/task&lt;/code&gt;, and &lt;code&gt;/debug&lt;/code&gt; messages never reach the agent container. They don&amp;rsquo;t appear in conversation history, don&amp;rsquo;t trigger container spawns, and don&amp;rsquo;t affect message cursors. This is important - a &lt;code&gt;/status&lt;/code&gt; check shouldn&amp;rsquo;t cost you a container slot or show up as context in the agent&amp;rsquo;s next conversation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prepared statements, lazily created.&lt;/strong&gt; The insert statements are created on first use and reused across calls. For a system logging every message and action, re-preparing SQL on every call would add up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UUIDs for everything.&lt;/strong&gt; &lt;code&gt;crypto.randomUUID()&lt;/code&gt; for all IDs. No auto-increment, no collision risk across restarts, and IDs are meaningful in isolation (you can paste one into &lt;code&gt;/debug event &amp;lt;id&amp;gt;&lt;/code&gt; without context).&lt;/p&gt;
&lt;h2 id=&#34;11-try-it-yourself&#34;&gt;11. Try it yourself&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re running NanoClaw (or OpenClaw), these features are available out of the box. Here&amp;rsquo;s how to get started:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you already have NanoClaw running:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pull the latest code and rebuild:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart the service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Linux (systemd)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl --user restart nanoclaw
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# macOS (launchd)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;launchctl kickstart -k gui/&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;id -u&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;/com.nanoclaw&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new tables are created automatically on startup. No migration step needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send &lt;code&gt;/status&lt;/code&gt; in your main group to verify it&amp;rsquo;s working.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;If you&amp;rsquo;re starting fresh:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork or clone &lt;a
	
		href = &#34;https://github.com/bahree/nanoclaw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/nanoclaw
	&lt;/span&gt;
&lt;/a&gt; (or the upstream &lt;a
	
		href = &#34;https://github.com/qwibitai/nanoclaw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenClaw
	&lt;/span&gt;
&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Follow the setup instructions in the README&lt;/li&gt;
&lt;li&gt;Once connected to a channel, all commands are available immediately&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Command reference:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/status&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;System overview: uptime, memory, containers, channels, groups, tasks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/status tasks&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Full task list with schedules, next run, last run, IDs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task pause &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Pause a scheduled task&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task resume &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Resume a paused task&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/task delete &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Delete a task and its run history&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug last &amp;lt;n&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Last n actions with their triggering events&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug why&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Most recent action with full trace&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug event &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;All actions triggered by a specific event&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug report&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Summary dashboard with stats and errors&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Env variable&lt;/th&gt;
          &lt;th&gt;Default&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EVENT_LOG_RETENTION_DAYS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Days to keep event logs (0 = keep forever)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All commands are main-group only. They respond instantly (no container needed) and don&amp;rsquo;t appear in the conversation history.&lt;/p&gt;
&lt;h2 id=&#34;12-summary&#34;&gt;12. Summary&lt;/h2&gt;
&lt;p&gt;Three problems, one philosophy: make the system controllable and observable from the same interface you use to interact with it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/status&lt;/code&gt; gives you real-time visibility - what&amp;rsquo;s running, what&amp;rsquo;s queued, what&amp;rsquo;s scheduled, which channels are connected. &lt;code&gt;/task&lt;/code&gt; gives you operational control: pause a runaway task, resume one you paused, and clean up completed ones. Event logging gives you after-the-fact traceability - every action links back to its triggering event, every tool call links back to its parent action. &lt;code&gt;/debug&lt;/code&gt; commands let you query the trail. Auto-pruning keeps it from growing unbounded.&lt;/p&gt;
&lt;p&gt;About ~1100 lines of new TypeScript across 8 files. Two new modules (&lt;code&gt;status.ts&lt;/code&gt; and &lt;code&gt;event-log.ts&lt;/code&gt;), three new SQLite tables, a handful of indexes, and one new config variable. No new dependencies, no separate services. It just works on the next restart.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;The source code for NanoClaw is available at &lt;a
	
		href = &#34;https://github.com/bahree/nanoclaw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/nanoclaw
	&lt;/span&gt;
&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 2): Communication, messages between tasks</title>
      <link>/post/2026/03/building-microkernel-part2-communication-ipc/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/03/building-microkernel-part2-communication-ipc/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2 (this): Communication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; - full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; - prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Recap from &lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;: we have a bare-metal kernel that boots on AArch64, sets up a basic logger, and halts. It&amp;rsquo;s a single task, doing one thing. Now it&amp;rsquo;s time to add more tasks and let them talk to each other.&lt;/p&gt;
&lt;p&gt;Right now, our kernel boots, prints a message, and halts - that&amp;rsquo;s it. One task, running alone, forever. But operating systems run hundreds of tasks at once, and those tasks need to communicate with one another. A scheduler needs to tell a display driver what to render. A network stack needs to hand received bytes to an application. How do those tasks communicate?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what we&amp;rsquo;re building today. We&amp;rsquo;ll add message-passing IPC (inter-process communication) and a cooperative scheduler, turning our boot-only kernel into something that actually looks like a microkernel. Two tasks will run side by side, exchanging messages through a router we build from scratch.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;We add two big things in this post. First, a message-passing IPC system: tasks communicate by sending small, fixed-size messages through a central router, rather than sharing memory directly. Second, a cooperative scheduler that polls tasks in round-robin order, giving each one a turn to do work before moving to the next.&lt;/p&gt;
&lt;p&gt;A couple of terms we&amp;rsquo;ll use throughout.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cooperative multitasking&lt;/strong&gt; means that each task voluntarily relinquishes the CPU when it finishes its current unit of work. The OS trusts tasks to yield promptly, which is a nice assumption when it holds and a disaster when it doesn&amp;rsquo;t (more on that later).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round-robin&lt;/strong&gt; is the simplest scheduling strategy: we call each task in order, cycling through the list forever. Every task gets an equal turn. No priorities, no special treatment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-why-microkernel&#34;&gt;1. Why microkernel?&lt;/h2&gt;
&lt;p&gt;Most operating systems you use daily (Linux, Windows, macOS) use monolithic kernels. Everything runs in kernel space with full privileges: drivers, filesystems, networking, etc. This makes things fast because components can call each other directly, with no overhead. However, on the flip side, it&amp;rsquo;s fragile. A single bug in a GPU driver can corrupt kernel memory and take down the entire system, because that driver runs with the same unrestricted access as the scheduler and the memory manager.&lt;/p&gt;
&lt;p&gt;Microkernels flip this around. Only the absolute minimum runs in kernel space: IPC, scheduling, and basic memory management. Everything else (drivers, filesystems, networking) runs in user space as separate, isolated processes. If a driver crashes, the kernel can restart it without rebooting. The tradeoff is speed. Every time a user-space driver needs to talk to the kernel or another driver, it must cross a privilege boundary, which costs cycles.&lt;/p&gt;
&lt;h3 id=&#34;11-famous-microkernels&#34;&gt;1.1 Famous microkernels&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;OS&lt;/th&gt;
          &lt;th&gt;Used in&lt;/th&gt;
          &lt;th&gt;Key feature&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;seL4&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Aerospace, medical devices&lt;/td&gt;
          &lt;td&gt;Formally verified (mathematically provably correct)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Minix 3&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Intel ME firmware&lt;/td&gt;
          &lt;td&gt;Extreme isolation, automatic driver restart&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;QNX&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Cars, industrial systems&lt;/td&gt;
          &lt;td&gt;Hard real-time guarantees&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;L4&lt;/strong&gt; family&lt;/td&gt;
          &lt;td&gt;Research, embedded&lt;/td&gt;
          &lt;td&gt;Ultra-fast IPC (~100 cycles)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A microkernel forces us to think about interfaces - especially as we can&amp;rsquo;t just reach into another component&amp;rsquo;s data structures. We need to define a message format and a protocol. That constraint yields cleaner abstractions and makes each piece easier to reason about in isolation. When something goes wrong, we can trace the message flow rather than hunting through a tangle of shared state.&lt;/p&gt;
&lt;h2 id=&#34;2-ipc-how-tasks-talk&#34;&gt;2. IPC: how tasks &amp;ldquo;talk&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;In a microkernel, tasks don&amp;rsquo;t share memory. They communicate by sending messages through the kernel. This is called inter-process communication (IPC). It&amp;rsquo;s the lifeblood of a microkernel OS. The design of the IPC system has huge implications for performance, security, and ease of use. There are many ways to do IPC, but we&amp;rsquo;ll build a simple message-passing system with fixed-size messages and single-slot mailboxes. This is the model used by real microkernels like L4 and seL4, and it&amp;rsquo;s a great way to understand the core concepts without getting bogged down in complexity.&lt;/p&gt;
&lt;h3 id=&#34;21-the-problem-with-shared-memory&#34;&gt;2.1 The problem with shared memory&lt;/h3&gt;
&lt;p&gt;The key design decision in microkernel IPC is to avoid shared memory. If tasks shared memory, they could read and write the same variables directly. This is simple and fast, but it leads to all sorts of problems, such as race conditions, data corruption, and security vulnerabilities. For example:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Shared memory approach (NOT what we&amp;#39;re building)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SHARED_DATA&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Task A writes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#eed49f&#34;&gt;SHARED_DATA&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;42&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Task B reads
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#eed49f&#34;&gt;SHARED_DATA&lt;/span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Shared memory approach (not what we&amp;#39;re doing)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On one hand, this looks simple, but there&amp;rsquo;s a problem. What happens if Task A is partway through writing a value when Task B reads it? Imagine A is changing a &lt;code&gt;u32&lt;/code&gt; counter from 255 (&lt;code&gt;0x000000FF&lt;/code&gt;) to 256 (&lt;code&gt;0x00000100&lt;/code&gt;). If B reads at just the wrong moment, it might see a half-updated value like &lt;code&gt;0x000001FF&lt;/code&gt; (511), which is neither the old value nor the new one. This is called a torn read.&lt;/p&gt;
&lt;p&gt;Now, on our single-core cooperative system, this particular scenario can&amp;rsquo;t happen because tasks don&amp;rsquo;t run simultaneously. But the moment you add preemption (Part 3) or multiple cores, shared memory becomes a minefield. And even without race conditions, shared memory has other problems. There&amp;rsquo;s no access control (anyone can read or write), and bugs become &amp;ldquo;spooky action at a distance&amp;rdquo; where one task silently corrupts data that another task depends on.&lt;/p&gt;
&lt;h3 id=&#34;22-message-passing-instead&#34;&gt;2.2 Message-passing instead&lt;/h3&gt;
&lt;p&gt;The alternative is message-passing. Tasks don&amp;rsquo;t share any memory. Instead, they send discrete, self-contained messages through the kernel. Each message has a header (who it&amp;rsquo;s from, who it&amp;rsquo;s to, what type of message it is) and a payload (the actual data). The kernel routes messages to their destinations based on their headers. This way, communication becomes explicit and traceable. You can see every interaction by looking at the send and receive calls. The kernel controls delivery, so you get natural access control (a task can only receive messages addressed to it). And if the receiver isn&amp;rsquo;t keeping up, the router can push back on the sender rather than letting messages pile up in some unbounded buffer.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Task A sends a message
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;router.send(Message {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    header: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgHeader&lt;/span&gt; { dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::TaskB, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payload: [&lt;span style=&#34;color:#f5a97f&#34;&gt;42&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Task B receives it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Some&lt;/span&gt;(msg) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; router.recv(EndpointId::TaskB) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// process msg.payload
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Message-passing approach (our design)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Communication becomes explicit, allowing us to trace every interaction by reading the send and receive calls. The kernel controls delivery, so you get natural access control (a task can only receive messages addressed to it). And if the receiver isn&amp;rsquo;t keeping up, the router can push back on the sender rather than letting messages pile up in some unbounded buffer. This is the model real microkernels use, and it&amp;rsquo;s what we&amp;rsquo;ll build.&lt;/p&gt;
&lt;h2 id=&#34;3-message-structure&#34;&gt;3. Message structure&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s look at the actual code. Everything lives in &lt;code&gt;crates/kernel/src/ipc.rs&lt;/code&gt;. This module defines the message format, the router, and some helper functions for working with messages. The design is simple but captures the essential features of a real IPC system.&lt;/p&gt;
&lt;h3 id=&#34;31-endpoints-and-message-types&#34;&gt;3.1 Endpoints and message types&lt;/h3&gt;
&lt;p&gt;First, we need a way to identify who&amp;rsquo;s who. Each task gets an &lt;code&gt;EndpointId&lt;/code&gt;, and each message has a &lt;code&gt;MsgType&lt;/code&gt; to indicate its type. This is like addressing an envelope: the header says who it&amp;rsquo;s from, who it&amp;rsquo;s to, and what kind of message it is.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone, Debug, Eq, PartialEq)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(u8)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(u8)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;MsgType&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Endpoint and message type definitions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;An endpoint is like a mailing address. Each task is assigned a unique &lt;code&gt;EndpointId&lt;/code&gt;, and messages are routed to their destination by looking up the recipient&amp;rsquo;s endpoint. Think of each task as having its own numbered post office box.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll notice &lt;code&gt;#[repr(u8)]&lt;/code&gt; on both enums. Here&amp;rsquo;s what that does. By default, Rust can choose whatever in-memory representation it likes for an enum, and that might be 4 bytes or more depending on alignment. &lt;code&gt;#[repr(u8)]&lt;/code&gt; tells the compiler to store the enum&amp;rsquo;s discriminant as exactly one byte. On bare metal, we need precise control over the size of every data structure because these values end up in message buffers and will eventually cross privilege boundaries via syscalls. Without &lt;code&gt;#[repr(u8)]&lt;/code&gt;, our struct sizes would be unpredictable.&lt;/p&gt;
&lt;h3 id=&#34;32-the-message-itself&#34;&gt;3.2 The message itself&lt;/h3&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;MAX_PAYLOAD&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(C)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;MsgHeader&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; src: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;,      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// who sent this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;,      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// who should receive it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; ty: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgType&lt;/span&gt;,          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// what kind of message
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; len: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;,              &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// how many payload bytes are used
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; seq: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;,             &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// sequence number for ordering
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(C)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Message&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; header: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgHeader&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; payload: [&lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;; &lt;span style=&#34;color:#eed49f&#34;&gt;MAX_PAYLOAD&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Message header and payload&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A few design decisions to outline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;#[repr(C)]&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This tells Rust to lay out the struct in memory exactly like a C compiler would. The fields are stored in declaration order, with predictable padding and alignment. This is crucial for IPC because both the sender and receiver need to agree on where each field sits in memory. If Rust reordered fields for optimization, the sender might put the &lt;code&gt;src&lt;/code&gt; field at byte 0 while the receiver expects it at byte 4, leading to chaos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why only 8 bytes of payload?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One might wonder why we limit the payload to just 8 bytes. This is a deliberate design choice to keep our IPC system simple and efficient. In a real microkernel, the IPC mechanism is optimized for small messages that fit in CPU registers, enabling very fast communication between tasks. By keeping the payload small, we can avoid the overhead of copying large amounts of data and instead pass capabilities (such as memory access rights) for larger transfers. This design also encourages a more message-oriented architecture, in which tasks exchange small commands or data rather than sharing large memory buffers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why sequence numbers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each message gets a &lt;code&gt;seq&lt;/code&gt; field to help detect lost messages (if you receive seq 5 then seq 7, you know seq 6 went missing), duplicates (seq 5 received twice), and ordering issues. It&amp;rsquo;s a simple reliability mechanism that real IPC systems use too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No heap allocations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re working in a bare-metal environment with no heap allocator, so we can&amp;rsquo;t use &lt;code&gt;Vec&amp;lt;u8&amp;gt;&lt;/code&gt; or &lt;code&gt;Box&amp;lt;Message&amp;gt;&lt;/code&gt;. Instead, we use fixed-size arrays for the payload.&lt;/p&gt;
&lt;h3 id=&#34;33-payload-helpers&#34;&gt;3.3 Payload helpers&lt;/h3&gt;
&lt;p&gt;We want to send structured data in the payload, but since it&amp;rsquo;s just a byte array, we need to serialize and deserialize it manually. For our Ping/Pong demo, we&amp;rsquo;ll just send a &lt;code&gt;u32&lt;/code&gt; sequence number in the payload. We use little-endian byte order for simplicity and consistency with ARM&amp;rsquo;s native endianness.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;write_u32_le&lt;/span&gt;(dst: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;], v: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dst[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dst[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dst[&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dst[&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;24&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0xFF&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_u32_le&lt;/span&gt;(src: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;[&lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;]) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (src[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; ((src[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; ((src[&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; ((src[&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;24&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Payload serialization helpers&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We manually shift bytes to serialize a &lt;code&gt;u32&lt;/code&gt; into the first four bytes of the payload. We can&amp;rsquo;t use &lt;code&gt;u32::to_le_bytes()&lt;/code&gt; in a &lt;code&gt;const&lt;/code&gt; context on all targets yet, and this works fine.&lt;/p&gt;
&lt;p&gt;In case you are wondering what endianess is? It&amp;rsquo;s the order in which bytes are stored for multi-byte values. Little-endian means the least significant byte comes first. For example, the number &lt;code&gt;0x12345678&lt;/code&gt; would be stored as &lt;code&gt;78 56 34 12&lt;/code&gt; in little-endian. This is important to get right when serializing data into a byte array.&lt;/p&gt;
&lt;h2 id=&#34;4-the-router-mailbox-based-ipc&#34;&gt;4. The router: mailbox-based IPC&lt;/h2&gt;
&lt;p&gt;Now that we have a message format, we need a way to deliver messages between tasks. In a microkernel, the kernel itself is responsible for routing messages. Each task has an endpoint, and the kernel maintains a mailbox for each endpoint. When a task sends a message, the kernel looks at the destination endpoint and drops the message into that endpoint&amp;rsquo;s mailbox. When a task wants to receive, the kernel checks if there&amp;rsquo;s anything in that task&amp;rsquo;s mailbox. This design decouples senders and receivers, allowing them to operate at their own pace. If the receiver is slow, the sender can still send messages (up to a point), and if the sender is fast, the receiver can process messages as they come in.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the flow:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant PT as PingTask
    participant R as Router
    participant M as Pong Mailbox
    participant PO as PongTask

    PT-&amp;gt;&amp;gt;R: send(msg to Pong)
    R-&amp;gt;&amp;gt;M: Check if full
    alt Mailbox empty
        R-&amp;gt;&amp;gt;M: Store message
        M--&amp;gt;&amp;gt;R: OK
        R--&amp;gt;&amp;gt;PT: Success
    else Mailbox full
        R--&amp;gt;&amp;gt;PT: MailboxFull error
    end

    Note over PO: Later, in poll()
    PO-&amp;gt;&amp;gt;R: recv(Pong endpoint)
    R-&amp;gt;&amp;gt;M: Check if message present
    alt Message available
        M-&amp;gt;&amp;gt;R: Return message
        M-&amp;gt;&amp;gt;M: Mark empty
        R-&amp;gt;&amp;gt;PO: Some(message)
        PO-&amp;gt;&amp;gt;PO: Process message
    else No message
        R-&amp;gt;&amp;gt;PO: None
    end&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: IPC message flow between tasks&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If the mailbox already has an unread message, &lt;code&gt;send()&lt;/code&gt; fails. The sender has to try again later. This is called &lt;strong&gt;backpressure&lt;/strong&gt;, and it&amp;rsquo;s the simplest possible version: zero buffering beyond one message. Without backpressure, a fast sender could flood a slow receiver, consuming unbounded memory. Our single-slot design prevents that by construction.&lt;/p&gt;
&lt;h3 id=&#34;41-implementation&#34;&gt;4.1 Implementation&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s look at the actual code for the &lt;code&gt;Mailbox&lt;/code&gt; and &lt;code&gt;Router&lt;/code&gt;. The &lt;code&gt;Router&lt;/code&gt; owns one mailbox per endpoint and handles all the logic for sending and receiving messages. The code is straightforward and intentionally minimal, illustrating the core concepts without extra complexity.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone, Debug)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SendError&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    MailboxFull,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Copy, Clone)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Mailbox&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    full: &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg: &lt;span style=&#34;color:#eed49f&#34;&gt;Message&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; Mailbox {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EMPTY&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;Message&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Message {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        header: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgHeader&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            src: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ty: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgType&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            len: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            seq: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        payload: [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#eed49f&#34;&gt;MAX_PAYLOAD&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; { full: &lt;span style=&#34;color:#eed49f&#34;&gt;false&lt;/span&gt;, msg: &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt;::&lt;span style=&#34;color:#eed49f&#34;&gt;EMPTY&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;put&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, msg: &lt;span style=&#34;color:#eed49f&#34;&gt;Message&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;(), SendError&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.full { &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Err&lt;/span&gt;(SendError::MailboxFull); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.msg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; msg;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.full &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Ok&lt;/span&gt;(())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;take&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Option&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;Message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.full { &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;None&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.full &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Some&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.msg)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Router&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ping: &lt;span style=&#34;color:#eed49f&#34;&gt;Mailbox&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pong: &lt;span style=&#34;color:#eed49f&#34;&gt;Mailbox&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; Router {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; { ping: &lt;span style=&#34;color:#eed49f&#34;&gt;Mailbox&lt;/span&gt;::new(), pong: &lt;span style=&#34;color:#eed49f&#34;&gt;Mailbox&lt;/span&gt;::new() }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;send&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, msg: &lt;span style=&#34;color:#eed49f&#34;&gt;Message&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;(), SendError&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; msg.header.dst {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            EndpointId::Ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.ping.put(msg),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            EndpointId::Pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.pong.put(msg),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;recv&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Option&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;Message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; dst {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            EndpointId::Ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.ping.take(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            EndpointId::Pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.pong.take(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Mailbox and Router implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;Mailbox&lt;/code&gt; struct has a &lt;code&gt;full&lt;/code&gt; flag indicating whether it currently holds a message and a &lt;code&gt;msg&lt;/code&gt; field to store the message itself. The &lt;code&gt;put()&lt;/code&gt; method checks if the mailbox is already full; if it is, it returns an error. If not, it stores the message and marks the mailbox as full. The &lt;code&gt;take()&lt;/code&gt; method checks if there&amp;rsquo;s a message to read; if there is, it returns the message and marks the mailbox as empty. If not, it returns &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;Router&lt;/code&gt;, we have one mailbox for each endpoint. The &lt;code&gt;send()&lt;/code&gt; method examines the destination endpoint in the message header and attempts to place the message in the corresponding mailbox. The &lt;code&gt;recv()&lt;/code&gt; method checks the specified endpoint&amp;rsquo;s mailbox for a message and returns it if available.&lt;/p&gt;
&lt;p&gt;This design is simple and efficient for our demo. In a real microkernel, you might have more complex routing logic, support for multiple mailboxes per endpoint, or even a more sophisticated synchronization mechanism.ightly.&lt;/p&gt;
&lt;h2 id=&#34;5-static-router-placement&#34;&gt;5. Static router placement&lt;/h2&gt;
&lt;p&gt;From the code we&amp;rsquo;ve seen so far, it&amp;rsquo;s clear that the &lt;code&gt;Router&lt;/code&gt; needs to be accessible globally, since all tasks need to send and receive messages through it. How do we achieve that in Rust, especially in a &lt;code&gt;no_std&lt;/code&gt; environment where we don&amp;rsquo;t have the luxury of a heap or dynamic initialization? That&amp;rsquo;s where things get interesting.&lt;/p&gt;
&lt;p&gt;The problem is the &lt;code&gt;Sync&lt;/code&gt; trait. Any &lt;code&gt;static&lt;/code&gt; value must be &lt;code&gt;Sync&lt;/code&gt;, meaning it&amp;rsquo;s safe to access from multiple threads simultaneously. Our &lt;code&gt;Router&lt;/code&gt; has mutable state (those mailboxes change when messages are sent and received), so it&amp;rsquo;s not &lt;code&gt;Sync&lt;/code&gt; by default. Rust is trying to protect us from data races, which is normally a good thing. But in our single-threaded bare-metal kernel, there are no other threads. We need to tell the compiler, &amp;ldquo;dude, trust us, this is fine.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The solution involves three layers: &lt;code&gt;UnsafeCell&lt;/code&gt;, a manual &lt;code&gt;Sync&lt;/code&gt; implementation, and a linker section attribute to ensure that the router is placed in writable memory. Let&amp;rsquo;s break it down.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; core::cell::UnsafeCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(transparent)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt;(UnsafeCell&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;ipc::Router&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Sync&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; RouterCell {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[link_section = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.data&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; RouterCell(UnsafeCell::new(ipc::Router::new()));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; router: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;get() };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... use router for the rest of the kernel&amp;#39;s life
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Static router with writable section placement&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Here&amp;rsquo;s how the three layers wrap the Router to make it safely accessible as a global static:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig2&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    subgraph &amp;#34;.data section (Layer 3)&amp;#34;
        subgraph &amp;#34;RouterCell + unsafe impl Sync (Layer 2)&amp;#34;
            subgraph &amp;#34;UnsafeCell (Layer 1)&amp;#34;
                R[&amp;#34;ipc::Router&amp;lt;br/&amp;gt;(mutable mailbox state)&amp;#34;]
            end
        end
    end

    L3[&amp;#34;\`#[link_section = &amp;#39;.data&amp;#39;]\`&amp;lt;br/&amp;gt;Forces writable memory placement&amp;#34;]
    L2[&amp;#34;unsafe impl Sync&amp;lt;br/&amp;gt;Satisfies static requirement&amp;#34;]
    L1[&amp;#34;UnsafeCell&amp;amp;lt;T&amp;amp;gt;&amp;lt;br/&amp;gt;Enables interior mutability&amp;#34;]

    L3 -.-&amp;gt; R
    L2 -.-&amp;gt; R
    L1 -.-&amp;gt; R

    style R fill:#f99,stroke:#333
    style L1 fill:#ff9,stroke:#333
    style L2 fill:#9f9,stroke:#333
    style L3 fill:#9ff,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;Figure 2: Three layers wrapping the Router&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And here&amp;rsquo;s the runtime dereference chain - how we actually get a usable &lt;code&gt;&amp;amp;mut Router&lt;/code&gt; from the static:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig3&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;ROUTER&amp;lt;br/&amp;gt;(static RouterCell)&amp;#34;] --&amp;gt;|&amp;#34;.0&amp;#34;| B[&amp;#34;UnsafeCell&amp;amp;lt;Router&amp;amp;gt;&amp;#34;]
    B --&amp;gt;|&amp;#34;.get()&amp;#34;| C[&amp;#34;*mut Router&amp;lt;br/&amp;gt;(raw pointer)&amp;#34;]
    C --&amp;gt;|&amp;#34;* (deref)&amp;#34;| D[&amp;#34;Router&amp;lt;br/&amp;gt;(value)&amp;#34;]
    D --&amp;gt;|&amp;#34;&amp;amp;mut&amp;#34;| E[&amp;#34;&amp;amp;mut Router&amp;lt;br/&amp;gt;(usable reference)&amp;#34;]

    style A fill:#9ff,stroke:#333
    style C fill:#ff9,stroke:#333
    style E fill:#9f9,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;Figure 3: Runtime dereference chain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Layer 1: &lt;code&gt;UnsafeCell&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the key to interior mutability in Rust. &lt;code&gt;UnsafeCell&amp;lt;T&amp;gt;&lt;/code&gt; is a special wrapper that tells the compiler, &amp;ldquo;I know this data will be mutated through shared references, but I promise to handle it safely.&amp;rdquo; Normally, Rust enforces that if you have a &lt;code&gt;&amp;amp;T&lt;/code&gt;, you can&amp;rsquo;t mutate &lt;code&gt;T&lt;/code&gt;. But &lt;code&gt;UnsafeCell&lt;/code&gt; provides a &lt;code&gt;.get()&lt;/code&gt; method that returns a raw mutable pointer (&lt;code&gt;*mut T&lt;/code&gt;), allowing us to bypass the borrow checker. This is essential for our router because we need to mutate its state (the mailboxes) while it&amp;rsquo;s accessible globally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2: Manual &lt;code&gt;Sync&lt;/code&gt; implementation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One might wonder why we need to implement &lt;code&gt;Sync&lt;/code&gt; manually. It is because &lt;code&gt;UnsafeCell&amp;lt;T&amp;gt;&lt;/code&gt; deliberately doesn&amp;rsquo;t implement &lt;code&gt;Sync&lt;/code&gt; to prevent data races. Since &lt;code&gt;static&lt;/code&gt; variables require &lt;code&gt;Sync&lt;/code&gt;, we wrap our &lt;code&gt;Router&lt;/code&gt; in a &lt;code&gt;RouterCell&lt;/code&gt; that contains an &lt;code&gt;UnsafeCell&lt;/code&gt;. By writing &lt;code&gt;unsafe impl Sync for RouterCell {}&lt;/code&gt;, we&amp;rsquo;re telling the compiler that we guarantee this will only be accessed from one context at a time. This is safe in our case because our kernel is single-threaded and our interrupt handlers don&amp;rsquo;t touch the router. In a more complex kernel with preemption or multiple cores, this would be a dangerous promise, but for our simple cooperative scheduler, it&amp;rsquo;s perfectly fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 3: &lt;code&gt;#[link_section = &amp;quot;.data&amp;quot;]&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OK, this one bit is interesting. When the compiler produces a binary, it organizes data into sections. &lt;code&gt;.rodata&lt;/code&gt; (read-only data) holds constants. &lt;code&gt;.data&lt;/code&gt; holds initialized mutable data. On ARM, the MMU enforces these permissions: &lt;code&gt;.rodata&lt;/code&gt; pages are mapped read-only, so writing to them triggers a data abort (the CPU equivalent of a segfault). The Rust compiler sees that &lt;code&gt;ROUTER&lt;/code&gt; is a &lt;code&gt;static&lt;/code&gt; initialized with a &lt;code&gt;const fn&lt;/code&gt; and sometimes decides it belongs in &lt;code&gt;.rodata&lt;/code&gt;. But we need to mutate it at runtime. &lt;code&gt;#[link_section = &amp;quot;.data&amp;quot;]&lt;/code&gt; overrides the compiler&amp;rsquo;s choice and forces placement in the writable section. If we don&amp;rsquo;t do this, the kernel crashes on the first &lt;code&gt;send()&lt;/code&gt; call. Now that seem a lot like my usual code. 😁&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The unsafe dereference&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In case you missed it, the expression &lt;code&gt;unsafe { &amp;amp;mut *ROUTER.0.get() }&lt;/code&gt; is a bit of Rust wizardry. Let&amp;rsquo;s break it down:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ROUTER&lt;/code&gt; is our static &lt;code&gt;RouterCell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ROUTER.0&lt;/code&gt; accesses the &lt;code&gt;UnsafeCell&amp;lt;ipc::Router&amp;gt;&lt;/code&gt; inside &lt;code&gt;RouterCell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.get()&lt;/code&gt; returns a &lt;code&gt;*mut ipc::Router&lt;/code&gt; (raw mutable pointer).&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;*&lt;/code&gt; dereferences that raw pointer, giving us an &lt;code&gt;ipc::Router&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;mut&lt;/code&gt; borrows it as a mutable reference.&lt;/li&gt;
&lt;li&gt;The whole thing is wrapped in &lt;code&gt;unsafe { ... }&lt;/code&gt; because the compiler can&amp;rsquo;t verify that no other code holds a reference to the same &lt;code&gt;Router&lt;/code&gt;. We know it&amp;rsquo;s safe because we only call this once, at the start of &lt;code&gt;kmain&lt;/code&gt;, and our kernel is single-threaded. This is a common pattern for global mutable state in &lt;code&gt;no_std&lt;/code&gt; Rust, but it requires careful reasoning to ensure safety.&lt;/li&gt;
&lt;li&gt;The end result is that we get a &lt;code&gt;&amp;amp;mut ipc::Router&lt;/code&gt; that we can use throughout the kernel to send and receive messages.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;6-task-abstraction&#34;&gt;6. Task abstraction&lt;/h2&gt;
&lt;p&gt;Tasks are the fundamental units of work in our kernel. Each task has its own logic and state, and the scheduler manages which task runs at any given time. To make this work, we define a &lt;code&gt;Task&lt;/code&gt; trait that all tasks must implement. This trait defines the contract for how tasks interact with the scheduler and the IPC system. Each task must provide an &lt;code&gt;id()&lt;/code&gt; method to identify its endpoint and a &lt;code&gt;poll()&lt;/code&gt; method that the scheduler calls every tick. The &lt;code&gt;poll()&lt;/code&gt; method is where the task does its work: checking for messages, sending messages, updating state, etc. The cooperative multitasking model means that tasks must return from &lt;code&gt;poll()&lt;/code&gt; quickly to allow other tasks to run. If a task needs to wait for something (like a message), it should return immediately and check again on the next tick.&lt;/p&gt;
&lt;h3 id=&#34;61-whats-a-task&#34;&gt;6.1 What&amp;rsquo;s a task?&lt;/h3&gt;
&lt;p&gt;A task is an independent unit of work that the scheduler manages. Think of it as a lightweight thread - it has its own state and logic, but shares the CPU with other tasks. The scheduler decides which task runs at any given moment, switching between them to create the illusion that they all run simultaneously.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve used &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt; in Rust (with tokio or async-std), the mental model is similar. Each async future does some work, then yields control back to the executor. Our tasks do the same thing. The scheduler calls each task&amp;rsquo;s &lt;code&gt;poll()&lt;/code&gt; method; the task performs a small chunk of work (checking the mailbox, sending a message, logging something, etc.), then returns so the next task gets a turn. The one difference in our simple example is that our scheduler is the OS itself, not a userspace library.&lt;/p&gt;
&lt;h3 id=&#34;62-the-task-trait&#34;&gt;6.2 The Task trait&lt;/h3&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;trait&lt;/span&gt; Task {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;poll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger, ipc: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router, tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Task trait definition&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Two methods define the contract for a task:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id()&lt;/code&gt; - this returns the task&amp;rsquo;s endpoint identifier, so the scheduler (or the task itself) knows which mailbox to check.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;poll()&lt;/code&gt; - this is where the work happens. It is called every scheduler iteration and must return quickly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;logger&lt;/code&gt; parameter is &lt;code&gt;&amp;amp;dyn Logger&lt;/code&gt;, a trait object. This means it&amp;rsquo;s a reference that can point to any type implementing the &lt;code&gt;Logger&lt;/code&gt; trait, with the specific type resolved at runtime (dynamic dispatch). Different platforms have different logger implementations (COM1 serial, PL011 UART, mini-UART), but our kernel code works with all of them without knowing which concrete type it&amp;rsquo;s talking to. Same pattern as &lt;code&gt;Box&amp;lt;dyn Error&amp;gt;&lt;/code&gt; in standard Rust, but we use a plain reference because we don&amp;rsquo;t have a heap.&lt;/p&gt;
&lt;p&gt;The cooperative contract is simple - tasks must return from &lt;code&gt;poll()&lt;/code&gt; quickly. No infinite loops, no blocking waits. If a task needs to wait for something (like a reply message), it returns immediately and checks again on the next tick.&lt;/p&gt;
&lt;h2 id=&#34;7-pingtask-and-pongtask&#34;&gt;7. PingTask and PongTask&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s see how this all comes together in practice. We have our IPC system, our scheduler, and the &lt;code&gt;Task&lt;/code&gt; trait; now let&amp;rsquo;s see how real tasks use this system. We&amp;rsquo;ll build two tasks that play a simple game: PingTask sends a ping message every few ticks, PongTask receives it and replies with a pong. It&amp;rsquo;s the &amp;ldquo;hello world&amp;rdquo; of IPC. 😊&lt;/p&gt;
&lt;h3 id=&#34;71-pingtask&#34;&gt;7.1 PingTask&lt;/h3&gt;
&lt;p&gt;The PingTask is a tiny state machine (with two states). It has a sequence number that increments with each ping, and a boolean flag to track whether it&amp;rsquo;s currently waiting for a pong reply. The logic is straightforward: if it&amp;rsquo;s not waiting, it sends a ping every 10 ticks. If it is waiting, it checks for a pong reply each tick. When it gets the pong, it flips back to idle and increments the sequence number.&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PingTask&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    seq: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    waiting: &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; PingTask {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; { seq: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, waiting: &lt;span style=&#34;color:#eed49f&#34;&gt;false&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; Task &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; PingTask {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt; { EndpointId::Ping }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;poll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger, ipc: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router, tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; { logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;task/ping: poll&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;); }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check for replies first
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Some&lt;/span&gt;(msg) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc.recv(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.id()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;matches!&lt;/span&gt;(msg.header.ty, MsgType::Pong) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.waiting &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;task/ping: got pong&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Send a ping every 10 ticks, but only if we&amp;#39;re not
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// already waiting for a reply
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.waiting &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; (tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; payload &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;u8&lt;/span&gt;; ipc::&lt;span style=&#34;color:#eed49f&#34;&gt;MAX_PAYLOAD&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ipc::write_u32_le(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; payload[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;], &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.seq);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; msg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc::Message {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                header: &lt;span style=&#34;color:#eed49f&#34;&gt;ipc&lt;/span&gt;::MsgHeader {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    src: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Pong,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    ty: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgType&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    len: &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    seq: &lt;span style=&#34;color:#eed49f&#34;&gt;self&lt;/span&gt;.seq,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                payload,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; ipc.send(msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Ok&lt;/span&gt;(()) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;task/ping: sent ping&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.waiting &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.seq &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.seq.wrapping_add(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Err&lt;/span&gt;(_) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;task/ping: send failed (queue full)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: PingTask implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When PingTask is idle (&lt;code&gt;waiting == false&lt;/code&gt;), it checks every 10 ticks whether it&amp;rsquo;s time to send a ping. When it sends one, it changes to the waiting state. On the other hand, while waiting, it checks its mailbox each tick for a pong reply. When the pong arrives, it flips back to idle. The sequence number increments with each send (using &lt;code&gt;wrapping_add&lt;/code&gt; so it rolls over instead of panicking at &lt;code&gt;u32::MAX&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Notice how the task constructs the message manually: it fills a payload buffer, builds a header with source, destination, type, length, and sequence number, then hands the whole thing to the router. If the send fails because the destination mailbox is full, it logs the error and will try again on the next qualifying tick.&lt;/p&gt;
&lt;h3 id=&#34;72-pongtask&#34;&gt;7.2 PongTask&lt;/h3&gt;
&lt;p&gt;The PongTask is even simpler. It just waits for pings and replies with pongs. It doesn&amp;rsquo;t need to track any state, so it&amp;rsquo;s a unit struct. Every tick, it checks its mailbox. If there&amp;rsquo;s a ping, it reads the sequence number from the payload, constructs a pong reply with the same sequence number, and sends it back to the Ping endpoint. It ignores the tick counter entirely since it doesn&amp;rsquo;t need to do anything on a timer.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;PongTask&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; PongTask {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;new&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Self&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; Task &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; PongTask {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt; { EndpointId::Pong }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;poll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger, ipc: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router, _tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Some&lt;/span&gt;(msg) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc.recv(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;.id()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;matches!&lt;/span&gt;(msg.header.ty, MsgType::Ping) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; seq &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc::read_u32_le(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;msg.payload[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;task/pong: got ping&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; payload &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;u8&lt;/span&gt;; ipc::&lt;span style=&#34;color:#eed49f&#34;&gt;MAX_PAYLOAD&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ipc::write_u32_le(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; payload[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;], seq);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; reply &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc::Message {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    header: &lt;span style=&#34;color:#eed49f&#34;&gt;ipc&lt;/span&gt;::MsgHeader {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        src: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Pong,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        dst: &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt;::Ping,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        ty: &lt;span style=&#34;color:#eed49f&#34;&gt;MsgType&lt;/span&gt;::Pong,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        len: &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        seq,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    payload,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ipc.send(reply);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: PongTask implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The reason PongTask is a unit struct (i.e., it has no fields) because it doesn&amp;rsquo;t need to track any state. Every tick, it checks its mailbox. If there&amp;rsquo;s a ping, it reads the sequence number from the payload, constructs a pong reply with the same sequence number, and sends it back to the Ping endpoint. Notice it ignores the tick counter entirely (the &lt;code&gt;_tick&lt;/code&gt; prefix tells Rust we know it&amp;rsquo;s unused).&lt;/p&gt;
&lt;p&gt;One subtle thing - PongTask uses &lt;code&gt;let _ = ipc.send(reply)&lt;/code&gt; instead of a &lt;code&gt;match&lt;/code&gt; on the result. It deliberately discards any send errors. For a simple echo-reply task, if the Ping mailbox is full, dropping the reply is acceptable. A more robust implementation might retry, but for our demo, this keeps things clean.&lt;/p&gt;
&lt;h2 id=&#34;8-the-scheduler&#34;&gt;8. The scheduler&lt;/h2&gt;
&lt;p&gt;The scheduler is the heart of our kernel. It&amp;rsquo;s responsible for giving each task a turn to run and for managing the flow of time (ticks). In a real microkernel, the scheduler would be more complex, supporting priorities, preemption, and multiple cores. But for our demo, we keep it simple: it&amp;rsquo;s a cooperative round-robin scheduler that just iterates over a fixed list of tasks and calls &lt;code&gt;poll()&lt;/code&gt; on each one every tick.&lt;/p&gt;
&lt;p&gt;The scheduler itself is just a function that takes a list of tasks, a logger, and the IPC router. It runs an infinite loop where it calls &lt;code&gt;poll()&lt;/code&gt; on each task, increments a tick counter, and halts the CPU until the next interrupt. The cooperative nature means that if any task takes too long in &lt;code&gt;poll()&lt;/code&gt;, it can starve the others, but that&amp;rsquo;s a trade-off we&amp;rsquo;re making for simplicity.&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tasks: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;dyn&lt;/span&gt; Task],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ipc: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sched: starting&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; t &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; tasks.iter_mut() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            t.poll(logger, ipc, tick);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tick &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tick.wrapping_add(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Round-robin cooperative scheduler&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That&amp;rsquo;s the whole thing. An infinite loop that iterates over every task, calls &lt;code&gt;poll()&lt;/code&gt; on each one, bumps a tick counter, and halts the CPU until the next interrupt. The &lt;code&gt;-&amp;gt; !&lt;/code&gt; return type is the &amp;ldquo;never&amp;rdquo; type: this function never returns. On bare metal, there&amp;rsquo;s no OS to return to. The kernel runs forever.&lt;/p&gt;
&lt;p&gt;A few things worth noting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The tick counter uses &lt;code&gt;wrapping_add(1)&lt;/code&gt; instead of &lt;code&gt;+= 1&lt;/code&gt;, which means when it hits &lt;code&gt;u64::MAX&lt;/code&gt; it wraps back to zero instead of panicking.&lt;/li&gt;
&lt;li&gt;At one tick per millisecond, a &lt;code&gt;u64&lt;/code&gt; would take about 584 million years to overflow, so this is really just defensive programming, but it&amp;rsquo;s a good habit in kernel code where panicking means the system dies.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;hal::arch::halt()&lt;/code&gt; call at the end of each iteration is important. On x86_64, it executes the &lt;code&gt;HLT&lt;/code&gt; instruction, and on AArch64, it executes &lt;code&gt;WFI&lt;/code&gt; (wait for interrupt). Both put the CPU into a low-power sleep state until the next hardware interrupt arrives. Without this, our loop would spin at full speed, burning power for no reason.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;81-wiring-it-all-together&#34;&gt;8.1 Wiring it all together&lt;/h3&gt;
&lt;p&gt;So we have our IPC system, our tasks, and our scheduler. Now we need to put it all together in the kernel&amp;rsquo;s entry point. This is where we initialize the router, create our tasks, and hand everything to the scheduler. After this point, the scheduler takes over, and we never return. &lt;code&gt;kmain&lt;/code&gt; is the main function of our kernel, and it&amp;rsquo;s where we set up the system&amp;rsquo;s initial state.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: kernel online&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: microkernel step 1 (IPC + cooperative scheduling)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; router: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;get() };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PingTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PongTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks: [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;dyn&lt;/span&gt; sched::Task; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sched::run(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks, logger, router)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Kernel entry point with scheduler invocation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We start by logging some messages to indicate the kernel is online and what we&amp;rsquo;re doing. Then we grab a mutable reference to the global router using the unsafe pattern we discussed earlier. We create our two tasks on the stack, put them into a fixed-size array of trait objects, and hand everything to the scheduler. The scheduler runs forever, polling both tasks on every iteration. Ping sends messages to Pong, Pong replies, and the cycle continues indefinitely.&lt;/p&gt;
&lt;h2 id=&#34;9-running-the-demo&#34;&gt;9. Running the demo&lt;/h2&gt;
&lt;p&gt;How do we know it works? Let&amp;rsquo;s run it and see the logs. If everything is set up correctly, you should see a steady stream of ping-pong messages in the output, demonstrating that the tasks are communicating through the IPC system and that the scheduler is giving them turns to run.&lt;/p&gt;
&lt;p&gt;Build and run the kernel as usual and watch the logs:&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Build and run the IPC demo&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: IPC + cooperative scheduling demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: kernel online
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: microkernel step 1 (IPC + cooperative scheduling)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sched: starting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: poll
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: sent ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/pong: got ping&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&#34;fig4&#34;&gt;
&lt;img src=&#34;images/demo-ipc.png&#34; alt=&#34;IPC demo output: tasks exchanging messages through the cooperative scheduler&#34; title=&#34;IPC demo output: tasks exchanging messages through the cooperative scheduler&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; IPC demo output showing tasks exchanging messages through the cooperative scheduler.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You should see the ping and pong messages alternating. The first tick (tick 0) triggers both the initial poll log and the first ping send (since &lt;code&gt;0 % 10 == 0&lt;/code&gt;). PongTask picks up the message and replies. On subsequent qualifying ticks, the pattern repeats.&lt;/p&gt;
&lt;h2 id=&#34;10-limitations-of-cooperative-scheduling&#34;&gt;10. Limitations of cooperative scheduling&lt;/h2&gt;
&lt;p&gt;OK, so we&amp;rsquo;ve got tasks talking to each other. That&amp;rsquo;s great. But there&amp;rsquo;s a fundamental problem with our scheduler. What happens if a task doesn&amp;rsquo;t cooperate? Imagine we have a &lt;code&gt;BadTask&lt;/code&gt; that just spins forever in its &lt;code&gt;poll()&lt;/code&gt; method, never returning control to the scheduler:&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; Task &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; BadTask {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;id&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;EndpointId&lt;/span&gt; { EndpointId::Ping }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;poll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, _logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger, _ipc: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router, _tick: &lt;span style=&#34;color:#ed8796&#34;&gt;u64&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// spin forever, the scheduler never regains control
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: A misbehaving task&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In this scenario, the &lt;code&gt;BadTask&lt;/code&gt; takes over the CPU and never yields. The scheduler is stuck waiting for &lt;code&gt;poll()&lt;/code&gt; to return, but it never does. As a result, all other tasks are frozen. The system is effectively deadlocked because the scheduler has no way to interrupt &lt;code&gt;BadTask&lt;/code&gt; and give someone else a turn. In other words, the entire system hangs.&lt;/p&gt;
&lt;p&gt;This is the core weakness of cooperative scheduling - it relies on every task being well-behaved. If one task misbehaves, the whole system suffers. In a real OS running untrusted code, this is unacceptable. We need a way for the OS to forcibly take control back from a running task, regardless of what that task is doing.&lt;/p&gt;
&lt;p&gt;The way to solve this is with preemptive scheduling. Instead of waiting for tasks to yield, the OS can use a hardware timer to interrupt the currently running task at regular intervals. When the timer fires, it triggers an interrupt, and the interrupt handler can switch to a different task. This way, even if a task misbehaves and never yields, the OS can still regain control and keep the system responsive.&lt;/p&gt;
&lt;p&gt;The solution is preemptive scheduling: a hardware timer fires at regular intervals, triggers an interrupt, and the interrupt handler switches to a different task. The currently running task doesn&amp;rsquo;t get a choice. In &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, we&amp;rsquo;ll set up timer interrupts on AArch64 and build a preemptive context switcher that saves and restores full CPU state. The cooperative scheduler we built here won&amp;rsquo;t go away (it&amp;rsquo;s still useful for understanding the basics), but we&amp;rsquo;ll layer preemption on top of it.&lt;/p&gt;
&lt;h2 id=&#34;11-what-we-built&#34;&gt;11. What we built&lt;/h2&gt;
&lt;p&gt;In this part, we took our boot-only kernel and turned it into a simple microkernel with IPC and cooperative multitasking. Starting from a kernel that could only boot and halt, we added three things. A message-passing IPC system with typed messages, endpoint-based routing, and single-slot mailboxes with backpressure. A trait-based task abstraction that lets us write independent units of work with a clean &lt;code&gt;poll()&lt;/code&gt; interface. And a cooperative round-robin scheduler that gives each task a fair turn.&lt;/p&gt;
&lt;p&gt;The Ping/Pong demo proves it works: two tasks communicate entirely through messages, with no shared mutable state, no unsafe data sharing, and explicit control flow that you can trace through the logs. This is the essence of microkernel design: tasks are isolated, communicate through well-defined channels, and the kernel provides minimal mechanisms to support that communication and scheduling.&lt;/p&gt;
&lt;p&gt;However, cooperative scheduling has a fatal flaw. It trusts tasks to yield. If a task misbehaves and never yields, the whole system hangs. In &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, we&amp;rsquo;ll fix that with timer interrupts and preemptive multitasking, allowing the OS to regain control even if a task goes rogue.&lt;/p&gt;
&lt;h2 id=&#34;14-references&#34;&gt;14. References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://dl.acm.org/doi/10.1145/168619.168633&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Improving IPC by Kernel Design
	&lt;/span&gt;
&lt;/a&gt; (Liedtke, 1993) - The paper that made fast IPC possible in L4&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://sel4.systems/About/seL4-whitepaper.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The seL4 Microkernel
	&lt;/span&gt;
&lt;/a&gt; - Formally verified microkernel design&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://doc.rust-lang.org/book/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Rust Programming Language
	&lt;/span&gt;
&lt;/a&gt; - Chapter 10 (Traits), Chapter 17 (Trait Objects)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Operating Systems: Design and Implementation&lt;/em&gt; (Tanenbaum) - The classic Minix book and microkernel design rationale&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 2 (this): Communication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 1): Foundations, booting on bare metal</title>
      <link>/post/2026/02/building-microkernel-part1-foundations-boot/</link>
      <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/02/building-microkernel-part1-foundations-boot/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Foundations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;You&amp;rsquo;re about to write code that runs with nothing underneath it.&lt;/p&gt;
&lt;p&gt;No operating system. No standard library. No &lt;code&gt;println!&lt;/code&gt;. No heap. No file descriptors. No threads. Just you, a CPU, and some RAM.&lt;/p&gt;
&lt;p&gt;That probably sounds terrifying. Or maybe thrilling. Honestly, it&amp;rsquo;s both. The first time you get a bare-metal kernel to print a single character to a serial port, you&amp;rsquo;ll stare at your terminal for a solid minute. One letter. It takes days of work. And it feels like you&amp;rsquo;ve built a cathedral.&lt;/p&gt;
&lt;p&gt;This post walks through everything that happens between &amp;ldquo;the CPU wakes up&amp;rdquo; and &amp;ldquo;a message appears on screen.&amp;rdquo; We&amp;rsquo;ll go instruction by instruction through the assembly boot code, byte by byte through the UART driver, and concept by concept through the design decisions that make it all work. By the end, you&amp;rsquo;ll have a bootable AArch64 kernel running in QEMU that prints to a virtual serial port, built on a clean, platform-agnostic kernel architecture.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get to it.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;In this part, we boot a minimal Rust kernel on the AArch64 QEMU &lt;code&gt;virt&lt;/code&gt; machine. We write ARM assembly to set up a stack, zero the BSS, drop from EL2 (hypervisor level) to EL1 (kernel level), enable floating-point registers, and jump into Rust. The Rust side implements a PL011 UART driver using memory-mapped I/O, wraps it behind a &lt;code&gt;Logger&lt;/code&gt; trait for platform abstraction, and calls into a shared kernel entry point. The whole thing compiles to a single ELF binary that QEMU loads directly.&lt;/p&gt;
&lt;h2 id=&#34;1-what-bare-metal-actually-means&#34;&gt;1. What &amp;ldquo;bare metal&amp;rdquo; actually means&lt;/h2&gt;
&lt;p&gt;When you write a normal Rust program (or any program using a higher level language for that matter), there&amp;rsquo;s a tower of software beneath you. Think about what happens when you call &lt;code&gt;println!(&amp;quot;hello&amp;quot;)&lt;/code&gt;. First, Rust&amp;rsquo;s standard library formats the string and then calls the OS to write it to stdout. Next, the OS looks up your process&amp;rsquo;s file descriptor table, finds that stdout points to a terminal, copies your bytes into a kernel buffer, and eventually, a terminal emulator reads those bytes and draws glyphs on screen. And to make all of this work, sitting below all of that, is the firmware which already tested the RAM, configured the CPU caches, initialized the PCI bus, and handed control to the bootloader.&lt;/p&gt;
&lt;p&gt;Guess what? We&amp;rsquo;re removing all of that. 🤖&lt;/p&gt;
&lt;p&gt;Our code is the first thing that runs after the CPU wakes up. There&amp;rsquo;s no runtime to set up the stack. No OS to provide virtual memory. No firmware to initialize the UART (well, QEMU helps us a little here, but we will ignore that for now). We are the bottom of the stack. Everything above us, we have to build.&lt;/p&gt;
&lt;p&gt;In Rust terms, this means two attributes at the top of every bare-metal crate:&lt;/p&gt;
&lt;figure id=&#34;bare-metal-attrs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_main]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Bare-metal crate attributes&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#![no_std]&lt;/code&gt;&lt;/strong&gt; tells the compiler: don&amp;rsquo;t link the standard library. The standard library (&lt;code&gt;std&lt;/code&gt;) gives you &lt;code&gt;Vec&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Box&lt;/code&gt;, &lt;code&gt;println!&lt;/code&gt;, file I/O, threads, and networking. All of those features need an underlying operating system. &lt;code&gt;Vec&lt;/code&gt; needs a heap allocator, which needs &lt;code&gt;mmap&lt;/code&gt; or &lt;code&gt;brk&lt;/code&gt; from the OS. &lt;code&gt;println!&lt;/code&gt; needs stdout, which needs file descriptors, which need a kernel. Since we ARE the kernel, there&amp;rsquo;s nothing beneath us to provide those services.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;no_std&lt;/code&gt;, we only get &lt;code&gt;core&lt;/code&gt;: basic types, traits, iterators, &lt;code&gt;Option&lt;/code&gt;, &lt;code&gt;Result&lt;/code&gt;, math operations. Things that need zero OS support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#![no_main]&lt;/code&gt;&lt;/strong&gt; is subtler. Normally, when you compile a Rust binary, the compiler generates a hidden entry point that sets up the stack, initializes the heap allocator, configures panic handling, spawns the main thread, and then calls your &lt;code&gt;main()&lt;/code&gt; function. None of that machinery exists on bare metal. We handle all initialization ourselves, in assembly, and we tell the compiler not to look for a standard &lt;code&gt;main&lt;/code&gt; entry point.&lt;/p&gt;
&lt;h2 id=&#34;2-whats-an-elf&#34;&gt;2. What&amp;rsquo;s an ELF?&lt;/h2&gt;
&lt;p&gt;Before we dive into boot code, a quick concept: when you compile a Rust program (or C, or anything that targets a Unix-like system), the output isn&amp;rsquo;t just a flat blob of machine code. It&amp;rsquo;s a structured file called an &lt;strong&gt;ELF&lt;/strong&gt; (Executable and Linkable Format).&lt;/p&gt;
&lt;p&gt;An ELF file is like a shipping manifest. It says: &amp;ldquo;here&amp;rsquo;s a chunk of executable code, load it at this address. Here&amp;rsquo;s read-only data, put it over here. Here&amp;rsquo;s uninitialized data (BSS), allocate this much space and zero it. Oh, and the program starts executing at this address.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When we build our kernel, cargo and the linker produce an ELF binary. QEMU knows how to read ELF files, so it parses the headers, loads each section to the right memory address, and sets the program counter to the entry point (&lt;code&gt;_start&lt;/code&gt;). On real hardware without an ELF-aware loader, you&amp;rsquo;d strip the ELF headers and produce a raw binary. But QEMU makes our lives easier.&lt;/p&gt;
&lt;p&gt;The important sections in our ELF:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.text.boot&lt;/code&gt;&lt;/strong&gt;: The very first code that runs (our assembly entry point)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.text&lt;/code&gt;&lt;/strong&gt;: The rest of our compiled Rust code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.rodata&lt;/code&gt;&lt;/strong&gt;: Read-only data (string constants, lookup tables)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.data&lt;/code&gt;&lt;/strong&gt;: Initialized mutable data (statics with non-zero initial values)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.bss&lt;/code&gt;&lt;/strong&gt;: Uninitialized data (statics that start at zero, just a size, no actual bytes in the file)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-the-qemu-virt-machine&#34;&gt;3. The QEMU virt machine&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re targeting &lt;code&gt;qemu-system-aarch64 -machine virt&lt;/code&gt;, which is QEMU&amp;rsquo;s generic ARM virtual machine. It doesn&amp;rsquo;t model any specific real-world board. Instead, it gives us a clean, well-documented set of virtual hardware:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Component&lt;/th&gt;
          &lt;th&gt;Details&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Cortex-A53 (emulated), 64-bit ARMv8-A&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;256 MB starting at &lt;code&gt;0x4000_0000&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;UART&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;PL011 at &lt;code&gt;0x0900_0000&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Interrupt controller&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;GICv2 (Generic Interrupt Controller)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Timer&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ARM Generic Timer (CNTP)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Here&amp;rsquo;s the QEMU command we use to run our kernel:&lt;/p&gt;
&lt;figure id=&#34;qemu-cmd&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qemu-system-aarch64 &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -machine virt,gic-version&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -cpu cortex-a53 &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -m 256M &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -nographic &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -serial mon:stdio &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  -kernel dist/virt/os-aarch64-virt.elf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;QEMU launch command for AArch64 virt&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&amp;rsquo;s break  down what each of these mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-machine virt,gic-version=2&lt;/code&gt;&lt;/strong&gt;: Use the generic ARM virtual machine with a GICv2 interrupt controller. GICv2 is simpler than GICv3 and sufficient for single-core work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-cpu cortex-a53&lt;/code&gt;&lt;/strong&gt;: Emulate a Cortex-A53 core. This is the same CPU in the Raspberry Pi Zero 2 W.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-m 256M&lt;/code&gt;&lt;/strong&gt;: Give the machine 256 MB of RAM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-nographic&lt;/code&gt;&lt;/strong&gt;: Don&amp;rsquo;t open a GUI window. We&amp;rsquo;re using serial output, not a display.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-serial mon:stdio&lt;/code&gt;&lt;/strong&gt;: Connect the virtual serial port to our terminal&amp;rsquo;s stdin/stdout. This is how we see output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;-kernel dist/virt/os-aarch64-virt.elf&lt;/code&gt;&lt;/strong&gt;: Load our ELF binary directly. QEMU parses the ELF, loads sections to the right addresses, and jumps to &lt;code&gt;_start&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The beauty of &lt;code&gt;virt&lt;/code&gt; is its simplicity. No GPU firmware to deal with, no board-specific quirks, no SD card flashing. Build, run, see output. The iteration cycle is seconds.&lt;/p&gt;
&lt;h2 id=&#34;4-setup&#34;&gt;4. Setup&lt;/h2&gt;
&lt;p&gt;You need Rust nightly (for bare-metal features like &lt;code&gt;no_std&lt;/code&gt; binaries) and the AArch64 bare-metal target. Our repository includes a &lt;code&gt;rust-toolchain.toml&lt;/code&gt; that handles most of this:&lt;/p&gt;
&lt;figure id=&#34;toolchain&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[toolchain]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;channel = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nightly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;components = [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;llvm-tools-preview&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rust-src&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;targets = [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64-unknown-none&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64-unknown-none&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;rust-toolchain.toml&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you&amp;rsquo;re setting up from scratch:&lt;/p&gt;
&lt;figure id=&#34;setup-cmds&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install Rust nightly with AArch64 target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup default nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup target add aarch64-unknown-none
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup component add llvm-tools-preview rust-src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install QEMU (Linux)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install qemu-system-aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install QEMU (macOS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install qemu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clone the repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/bahree/rust-microkernel.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; rust-microkernel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Install Rust toolchain and QEMU&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;5-build-and-run&#34;&gt;5. Build and run&lt;/h2&gt;
&lt;figure id=&#34;build-run&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-ipc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Build and run the AArch64 virt kernel&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;figure id=&#34;expected-output&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: IPC + cooperative scheduling demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: kernel online
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: microkernel step 1 (IPC + cooperative scheduling)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sched: starting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: poll
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: sent ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/pong: got ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: got pong&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Expected serial output&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;fig1&#34;&gt;
&lt;img src=&#34;images/demo-ipc.png&#34; alt=&#34;Part 1 boot output: the kernel prints to serial, proving our boot assembly, UART driver, and platform abstraction all work&#34; title=&#34;Part 1 boot output: the kernel prints to serial, proving our boot assembly, UART driver, and platform abstraction all work&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Boot output showing the kernel printing to serial, proving our boot assembly, UART driver, and platform abstraction all work.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you see that, everything&amp;rsquo;s working. Press &lt;code&gt;Ctrl-A&lt;/code&gt; then &lt;code&gt;X&lt;/code&gt; to exit QEMU.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t pass a feature flag, the default build uses &lt;code&gt;demo-memory&lt;/code&gt; (which we&amp;rsquo;ll cover in Part 4). The &lt;code&gt;demo-ipc&lt;/code&gt; flag gives us the cooperative scheduling output shown above.&lt;/p&gt;
&lt;h2 id=&#34;6-the-boot-sequence&#34;&gt;6. The boot sequence&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what happens from the moment QEMU starts to the moment you see &amp;ldquo;boot OK&amp;rdquo; on your terminal:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;boot-flow&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    A[QEMU loads ELF to 0x40080000] --&amp;gt; B[CPU starts at _start, running at EL2]
    B --&amp;gt; C[Set stack pointer]
    C --&amp;gt; D[Zero BSS section]
    D --&amp;gt; E{Current exception level?}
    E --&amp;gt;|EL2| F[Set EL1 stack pointer]
    F --&amp;gt; G[Configure SPSR_EL2 for EL1h return]
    G --&amp;gt; H[Set ELR_EL2 to el1_start]
    H --&amp;gt; I[Disable FP/ASIMD trapping at EL2]
    I --&amp;gt; J[eret: drop to EL1]
    J --&amp;gt; K[el1_start]
    E --&amp;gt;|EL1| K
    K --&amp;gt; L[Install exception vector table]
    L --&amp;gt; M[Enable FP/ASIMD at EL1]
    M --&amp;gt; N[&amp;#34;bl rust_main&amp;#34;]
    N --&amp;gt; O[Initialize PL011 UART]
    O --&amp;gt; P[&amp;#34;Print: boot OK&amp;#34;]
    P --&amp;gt; Q[Call kernel::kmain]

    style B fill:#f9f,stroke:#333
    style J fill:#ff9,stroke:#333
    style Q fill:#9f9,stroke:#333&lt;/pre&gt;
    &lt;figcaption&gt;AArch64 virt boot sequence&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;That&amp;rsquo;s a lot of steps. Let&amp;rsquo;s walk through these; however, first, you need to be able to read the assembly.&lt;/p&gt;
&lt;h2 id=&#34;7-arm-assembly-primer&#34;&gt;7. ARM assembly primer&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve never read assembly before, the key is that we need to understand only a handful of concepts to follow the boot code. And as with most things in life, once you get the hang of it, assembly is surprisingly readable. The thing though is that everything is just very, very explicit about what it&amp;rsquo;s doing.&lt;/p&gt;
&lt;h3 id=&#34;71-registers&#34;&gt;7.1 Registers&lt;/h3&gt;
&lt;p&gt;ARM gives you 31 general-purpose 64-bit registers, named &lt;code&gt;x0&lt;/code&gt; through &lt;code&gt;x30&lt;/code&gt;. Think of them as 31 local variables that live inside the CPU itself, way faster than RAM. A register access takes maybe one clock cycle. A RAM access? Hundreds.&lt;/p&gt;
&lt;p&gt;Some registers have conventional roles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x0&lt;/code&gt; through &lt;code&gt;x7&lt;/code&gt;&lt;/strong&gt;: Function arguments and return values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x29&lt;/code&gt;&lt;/strong&gt;: Frame pointer (like &lt;code&gt;rbp&lt;/code&gt; on x86)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;x30&lt;/code&gt;&lt;/strong&gt;: Link register, holds the return address after a &lt;code&gt;bl&lt;/code&gt; (branch-with-link) call&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sp&lt;/code&gt;&lt;/strong&gt;: Stack pointer, tracks the top of the call stack&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;xzr&lt;/code&gt;&lt;/strong&gt;: The zero register. Always reads as zero, discards writes. Surprisingly useful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll also see &lt;code&gt;w0&lt;/code&gt; through &lt;code&gt;w30&lt;/code&gt;. These are the lower 32 bits of the corresponding &lt;code&gt;x&lt;/code&gt; register. &lt;code&gt;w0&lt;/code&gt; is the bottom half of &lt;code&gt;x0&lt;/code&gt;. ARM uses these when working with 32-bit values.&lt;/p&gt;
&lt;h3 id=&#34;72-system-registers&#34;&gt;7.2 System registers&lt;/h3&gt;
&lt;p&gt;Beyond the general-purpose registers, ARM has a separate world of &lt;strong&gt;system registers&lt;/strong&gt; that control CPU behavior. You can&amp;rsquo;t use them in normal instructions like &lt;code&gt;add&lt;/code&gt; or &lt;code&gt;sub&lt;/code&gt;. You access them with special instructions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mrs x0, CurrentEL&lt;/code&gt;&lt;/strong&gt;: Move from system register to general-purpose register. Read the current exception level into &lt;code&gt;x0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;msr spsr_el2, x0&lt;/code&gt;&lt;/strong&gt;: Move from general-purpose register to system register. Write &lt;code&gt;x0&lt;/code&gt; into the saved program status register for EL2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the knobs and dials that configure how the CPU works - what exception level we&amp;rsquo;re at, whether floating-point is enabled, where the exception vector table lives, and what happens on an &lt;code&gt;eret&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;73-common-instructions&#34;&gt;7.3 Common instructions&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;ll see in the boot code:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Instruction&lt;/th&gt;
          &lt;th&gt;What it does&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ldr x0, =label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Load the address of &lt;code&gt;label&lt;/code&gt; into &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mov sp, x0&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Copy &lt;code&gt;x0&lt;/code&gt; into the stack pointer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;str xzr, [x1], #8&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Store zero to the address in &lt;code&gt;x1&lt;/code&gt;, then add 8 to &lt;code&gt;x1&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cmp x1, x2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Compare &lt;code&gt;x1&lt;/code&gt; and &lt;code&gt;x2&lt;/code&gt; (sets condition flags)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;b.ge 2f&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch forward to label &lt;code&gt;2:&lt;/code&gt; if the comparison was greater-than-or-equal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;b.ne label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch to &lt;code&gt;label&lt;/code&gt; if not equal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bl rust_main&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Branch with link: save return address in &lt;code&gt;x30&lt;/code&gt;, jump to &lt;code&gt;rust_main&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bic x0, x0, #(1 &amp;lt;&amp;lt; 10)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bit clear: clear bit 10 in &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;orr x0, x0, #(3 &amp;lt;&amp;lt; 20)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bitwise OR: set bits 20 and 21 in &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;lsr x1, x1, #2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Logical shift right by 2 bits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;and x1, x1, #3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Bitwise AND with 3 (keep only bits 0 and 1)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;adr x0, label&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Load the PC-relative address of &lt;code&gt;label&lt;/code&gt; into &lt;code&gt;x0&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;isb&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Instruction synchronization barrier (flush pipeline)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;eret&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Exception return (drop to lower exception level)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;wfe&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Wait for event (low-power sleep)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;74-local-labels-and-directives&#34;&gt;7.4 Local labels and directives&lt;/h3&gt;
&lt;p&gt;Assembly uses numbered local labels like &lt;code&gt;1:&lt;/code&gt;, &lt;code&gt;2:&lt;/code&gt;, &lt;code&gt;3:&lt;/code&gt;. You reference them with a direction suffix: &lt;code&gt;1b&lt;/code&gt; means &amp;ldquo;search backward for label &lt;code&gt;1:&lt;/code&gt;&amp;rdquo; and &lt;code&gt;2f&lt;/code&gt; means &amp;ldquo;search forward for label &lt;code&gt;2:&lt;/code&gt;.&amp;rdquo; This avoids name collisions when the same pattern (like a loop) appears multiple times in the same file.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.section .text.boot&lt;/code&gt; tells the assembler: &amp;ldquo;put the following code into a section named &lt;code&gt;.text.boot&lt;/code&gt;.&amp;rdquo; The linker script (which we&amp;rsquo;ll cover later) uses this name to ensure our boot code lands at the very start of the binary, exactly where the CPU expects it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.global _start&lt;/code&gt; makes the &lt;code&gt;_start&lt;/code&gt; symbol visible to the linker so that it can be used as the entry point.&lt;/p&gt;
&lt;h2 id=&#34;8-walking-through-boots&#34;&gt;8. Walking through boot.S&lt;/h2&gt;
&lt;p&gt;This is the heart of the post. Let&amp;rsquo;s go through the actual boot assembly line by line.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the file: &lt;code&gt;crates/arch_aarch64_virt/src/boot.S&lt;/code&gt;. We&amp;rsquo;re showing the boot sequence portion (the first 60 lines) - you can see the full code from the repository.&lt;/p&gt;
&lt;figure id=&#34;boot-asm&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.section&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;.text.boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;.global&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;_start:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set stack
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Zero BSS: [__bss_start, __bss_end)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ge&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;xzr&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;], &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;2:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If we entered at EL2 (typical for QEMU virt), drop to EL1 so the kernel runs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// in a simpler environment (EL1 + GICv2 + CNTP timer).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;CurrentEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ne&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set up an EL1 stack pointer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Configure EL2 to return to EL1h.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b0101)         // EL1h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD access at EL1 and ensure EL2 doesn&amp;#39;t trap it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 10)    // TFP = 0 (don&amp;#39;t trap FP/ASIMD)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;el1_start:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Install a minimal exception vector table for the *current* exception level.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// QEMU `virt` typically enters at EL2, so we must set VBAR_EL2 (not just VBAR_EL1).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;vectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vbar_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD for Rust/LLVM.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Rust/LLVM may use NEON registers for struct copies/memcpy even in early bring-up.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If FP is disabled, this traps with EC=0x07 (FP/ASIMD access trap).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(3 &amp;lt;&amp;lt; 20)   // FPEN = 0b11
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;rust_main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;wfe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;boot.S: the complete boot sequence (crates/arch_aarch64_virt/src/boot.S, lines 1-60)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now let&amp;rsquo;s walk through each piece to help understand what it means.&lt;/p&gt;
&lt;h3 id=&#34;81-stack-setup-lines-5-6&#34;&gt;8.1 Stack setup (lines 5-6)&lt;/h3&gt;
&lt;figure id=&#34;stack-setup&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Setting up the stack pointer&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The very first thing we do is set up a stack. But why? Because Rust literally cannot run without one. Every function call pushes a return address onto the stack. Every local variable lives on the stack. Without a valid stack pointer, the first &lt;code&gt;bl&lt;/code&gt; instruction would try to save the return address to&amp;hellip; nowhere. Instant crash.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;__stack_top&lt;/code&gt; is a symbol defined by our linker script. It points to the top of a 64 KB stack memory region. ARM stacks grow downward (from high addresses to low), so we point &lt;code&gt;sp&lt;/code&gt; at the top.&lt;/p&gt;
&lt;p&gt;Why 64 KB? It&amp;rsquo;s a reasonable starting size. We don&amp;rsquo;t have many nested function calls yet, and we don&amp;rsquo;t have a heap, so the stack doesn&amp;rsquo;t need to be huge. If we run out, we&amp;rsquo;ll get a data abort (the ARM equivalent of a segfault). We&amp;rsquo;d increase it then.&lt;/p&gt;
&lt;h3 id=&#34;82-bss-zeroing-lines-8-16&#34;&gt;8.2 BSS zeroing (lines 8-16)&lt;/h3&gt;
&lt;figure id=&#34;bss-zero&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__bss_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ge&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;xzr&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;], &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;2:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Zeroing the BSS section&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;BSS stands for &amp;ldquo;Block Started by Symbol&amp;rdquo; (a historical name from the 1950s). It&amp;rsquo;s the section where uninitialized global and static variables live. In Rust, if you write &lt;code&gt;static mut COUNTER: u32 = 0;&lt;/code&gt;, the compiler puts it in &lt;code&gt;.bss&lt;/code&gt;. The key insight: the ELF file doesn&amp;rsquo;t actually store the zeros. It just records the size. That saves space in the binary. But it means the memory might contain garbage when we start.&lt;/p&gt;
&lt;p&gt;The C and Rust languages both guarantee that uninitialized statics start at zero. Before any Rust code runs, we have to zero the entire BSS region manually. That&amp;rsquo;s what this loop does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Load the start and end addresses of &lt;code&gt;.bss&lt;/code&gt; (defined by the linker script) into &lt;code&gt;x1&lt;/code&gt; and &lt;code&gt;x2.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Compare them. If &lt;code&gt;x1 &amp;gt;= x2&lt;/code&gt;, the BSS is empty (or we&amp;rsquo;re done), skip to label &lt;code&gt;2:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Store zero (&lt;code&gt;xzr&lt;/code&gt;, the zero register) to the address in &lt;code&gt;x1&lt;/code&gt;, then increment &lt;code&gt;x1&lt;/code&gt; by 8 (one 64-bit word)&lt;/li&gt;
&lt;li&gt;Jump back to the comparison&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;code&gt;[x1], #8&lt;/code&gt; syntax is a post-increment addressing mode. It means &amp;ldquo;use the address in &lt;code&gt;x1&lt;/code&gt; for the store, THEN add 8 to &lt;code&gt;x1&lt;/code&gt;.&amp;rdquo; It&amp;rsquo;s a single instruction that does two things. ARM loves these compound operations.&lt;/p&gt;
&lt;h3 id=&#34;83-checking-the-exception-level-lines-19-23&#34;&gt;8.3 Checking the exception level (lines 19-23)&lt;/h3&gt;
&lt;figure id=&#34;el-check&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;CurrentEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;lsr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;cmp&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x1&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b.ne&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Detecting the current exception level&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now things get interesting. We need to know what exception level the CPU is running at. QEMU&amp;rsquo;s &lt;code&gt;virt&lt;/code&gt; machine starts us at EL2 (hypervisor level), but we want to run our kernel at EL1 (the normal kernel level). If we&amp;rsquo;re already at EL1 for some reason, we skip the drop.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mrs x1, CurrentEL&lt;/code&gt; reads the &lt;code&gt;CurrentEL&lt;/code&gt; system register. The exception level is encoded in bits [3:2] of this register (ARM&amp;rsquo;s register designs can be a little eccentric). So we shift right by 2 (&lt;code&gt;lsr x1, x1, #2&lt;/code&gt;) and mask off everything except the bottom 2 bits (&lt;code&gt;and x1, x1, #3&lt;/code&gt;). Now &lt;code&gt;x1&lt;/code&gt; holds 0, 1, 2, or 3 corresponding to EL0 through EL3.&lt;/p&gt;
&lt;p&gt;If it&amp;rsquo;s 2, we proceed with the EL2-to-EL1 drop. If it&amp;rsquo;s not, we jump straight to &lt;code&gt;el1_start&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;84-exception-levels-explained&#34;&gt;8.4 Exception levels explained&lt;/h3&gt;
&lt;p&gt;Before we get into the drop, let&amp;rsquo;s talk about why exception levels exist.&lt;/p&gt;
&lt;p&gt;ARM&amp;rsquo;s AArch64 architecture has four privilege levels:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Level&lt;/th&gt;
          &lt;th&gt;Name&lt;/th&gt;
          &lt;th&gt;Who runs here&lt;/th&gt;
          &lt;th&gt;What they can do&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;EL0&lt;/td&gt;
          &lt;td&gt;Application&lt;/td&gt;
          &lt;td&gt;User programs&lt;/td&gt;
          &lt;td&gt;Normal instructions only. Can&amp;rsquo;t touch hardware.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL1&lt;/td&gt;
          &lt;td&gt;Kernel&lt;/td&gt;
          &lt;td&gt;Operating systems&lt;/td&gt;
          &lt;td&gt;Configure MMU, handle interrupts, access all memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL2&lt;/td&gt;
          &lt;td&gt;Hypervisor&lt;/td&gt;
          &lt;td&gt;Virtual machine monitors&lt;/td&gt;
          &lt;td&gt;Virtualize EL1 guests, trap privileged operations&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;EL3&lt;/td&gt;
          &lt;td&gt;Secure Monitor&lt;/td&gt;
          &lt;td&gt;TrustZone firmware&lt;/td&gt;
          &lt;td&gt;Switch between secure and non-secure worlds&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Think about it this way: EL0 is a sandbox. Applications can compute, but they can&amp;rsquo;t mess with memory mappings, disable interrupts, or talk to hardware directly. If they try, the CPU traps to EL1, and the kernel decides what to do (usually: kill the process with a signal).&lt;/p&gt;
&lt;p&gt;EL1 is where kernels live. Linux, macOS, Windows, and our rustOS all run here. You can configure page tables, handle interrupts, and access device memory.&lt;/p&gt;
&lt;p&gt;EL2 is for hypervisors. If you want to run multiple operating systems on the same hardware (like AWS does with EC2 instances), the hypervisor at EL2 virtualizes the hardware so each guest OS at EL1 thinks it has the machine to itself.&lt;/p&gt;
&lt;p&gt;EL3 is for firmware-level security (ARM TrustZone). We don&amp;rsquo;t touch it.&lt;/p&gt;
&lt;p&gt;QEMU starts us at EL2 because it&amp;rsquo;s the most flexible starting point. If you were writing a hypervisor, you&amp;rsquo;d stay there. Since we&amp;rsquo;re writing a kernel, we drop to EL1.&lt;/p&gt;
&lt;h3 id=&#34;85-the-el2-to-el1-drop-lines-26-40&#34;&gt;8.5 The EL2 to EL1 drop (lines 26-40)&lt;/h3&gt;
&lt;figure id=&#34;el-drop&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Set up an EL1 stack pointer.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;ldr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;__stack_top&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;sp_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Configure EL2 to return to EL1h.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mov&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(0b0101)         // EL1h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;spsr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;el1_start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;elr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Enable FP/ASIMD access at EL1 and ensure EL2 doesn&amp;#39;t trap it.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(1 &amp;lt;&amp;lt; 10)    // TFP = 0 (don&amp;#39;t trap FP/ASIMD)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cptr_el2&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;eret&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Dropping from EL2 to EL1&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is the most intricate part of the boot sequence. Here&amp;rsquo;s the trick: you can&amp;rsquo;t just &amp;ldquo;jump&amp;rdquo; to a lower exception level. ARM doesn&amp;rsquo;t have a &amp;ldquo;go to EL1&amp;rdquo; instruction. Instead, you use the exception return mechanism backwards.&lt;/p&gt;
&lt;p&gt;Normally, when an exception occurs (such as an interrupt), the CPU saves the current state and jumps to a higher exception level. The handler processes the exception, then executes &lt;code&gt;eret&lt;/code&gt; (exception return) to return. We&amp;rsquo;re abusing this: we set up the return state registers to point at EL1, then execute &lt;code&gt;eret&lt;/code&gt; as if we were &amp;ldquo;returning&amp;rdquo; from an exception that never happened.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s each step:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;msr sp_el1, x0&lt;/code&gt;&lt;/strong&gt; sets the stack pointer that EL1 will use. Each exception level has its own stack pointer. We&amp;rsquo;re at EL2 right now, so &lt;code&gt;sp&lt;/code&gt; refers to &lt;code&gt;sp_el2&lt;/code&gt;. We need to pre-configure &lt;code&gt;sp_el1&lt;/code&gt; before we get there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;mov x0, #(0b0101)&lt;/code&gt; / &lt;code&gt;msr spsr_el2, x0&lt;/code&gt;&lt;/strong&gt; configures the Saved Program Status Register. When &lt;code&gt;eret&lt;/code&gt; executes, the CPU restores the processor state from &lt;code&gt;spsr_el2&lt;/code&gt;. The value &lt;code&gt;0b0101&lt;/code&gt; (decimal 5) means: return to EL1 using the handler stack pointer variant (called &amp;ldquo;EL1h&amp;rdquo;). Bits [3:2] = &lt;code&gt;01&lt;/code&gt; select EL1. Bit [0] = &lt;code&gt;1&lt;/code&gt; selects the &lt;code&gt;h&lt;/code&gt; variant, meaning EL1 will use &lt;code&gt;sp_el1&lt;/code&gt; as its stack pointer (rather than &lt;code&gt;sp_el0&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;adr x0, el1_start&lt;/code&gt; / &lt;code&gt;msr elr_el2, x0&lt;/code&gt;&lt;/strong&gt; sets the Exception Link Register. This is the address the CPU will jump to on &lt;code&gt;eret&lt;/code&gt;. We point it at &lt;code&gt;el1_start&lt;/code&gt;, the label where our EL1 code begins. &lt;code&gt;adr&lt;/code&gt; computes a PC-relative address, which is important because our code might not be running at the address the linker assumed (though, in practice, it is for us).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;bic x0, x0, #(1 &amp;lt;&amp;lt; 10)&lt;/code&gt; / &lt;code&gt;msr cptr_el2, x0&lt;/code&gt;&lt;/strong&gt; disables the floating-point trap at EL2. By default, EL2 can trap FP/ASIMD (NEON) instructions executed at EL1. If we don&amp;rsquo;t clear this bit, the first time Rust tries to use a NEON register (which happens sooner than you&amp;rsquo;d think), the CPU will trap to EL2 and crash. &lt;code&gt;bic&lt;/code&gt; stands for &amp;ldquo;bit clear.&amp;rdquo; It clears bit 10 (the TFP flag) in the &lt;code&gt;cptr_el2&lt;/code&gt; register.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;isb&lt;/code&gt;&lt;/strong&gt; is an Instruction Synchronization Barrier. It forces the CPU to finish processing all pending changes to system registers before executing the next instruction. Without it, the pipeline might still be using stale configuration values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;eret&lt;/code&gt;&lt;/strong&gt; does the actual drop. It atomically loads the program counter from &lt;code&gt;elr_el2&lt;/code&gt; and the processor state from &lt;code&gt;spsr_el2&lt;/code&gt;. In one instruction, we go from EL2 to EL1 and start executing at &lt;code&gt;el1_start&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a beautiful hack, honestly. The hardware designers intended &lt;code&gt;eret&lt;/code&gt; for returning from exception handlers. We&amp;rsquo;re using it as a one-way door to a lower privilege level.&lt;/p&gt;
&lt;h3 id=&#34;86-vector-table-installation-lines-43-47&#34;&gt;8.6 Vector table installation (lines 43-47)&lt;/h3&gt;
&lt;figure id=&#34;vbar-install&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;adr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;vectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;vbar_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Installing the exception vector table&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The CPU needs to know where to jump when an exception occurs (an interrupt, a system call, a data abort, etc.). ARM uses a &lt;strong&gt;vector table&lt;/strong&gt;: a fixed-layout block of code that contains an entry for each exception type. There are 16 entries, every 128 bytes (0x80) apart, for a total of 2048 bytes (0x800).&lt;/p&gt;
&lt;p&gt;We load the address of our &lt;code&gt;vectors&lt;/code&gt; table and write it to &lt;code&gt;vbar_el1&lt;/code&gt; (Vector Base Address Register for EL1). When an exception happens at EL1, the CPU adds an offset to this base address and starts executing there. We&amp;rsquo;ll cover the vector table in detail in Part 3 when we implement interrupt handling.&lt;/p&gt;
&lt;h3 id=&#34;87-fpasimd-enablement-why-rust-needs-neon-lines-49-55&#34;&gt;8.7 FP/ASIMD enablement: why Rust needs NEON (lines 49-55)&lt;/h3&gt;
&lt;figure id=&#34;fp-enable&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;mrs&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;orr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#(3 &amp;lt;&amp;lt; 20)   // FPEN = 0b11
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;msr&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;cpacr_el1&lt;/span&gt;, &lt;span style=&#34;color:#eed49f&#34;&gt;x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;isb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Enabling floating-point and SIMD at EL1&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You might wonder: we&amp;rsquo;re writing a kernel, not a graphics engine. Why do we need floating-point?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. LLVM (Rust&amp;rsquo;s code generator) uses NEON registers for more than just floating-point math. It uses them for memory operations like &lt;code&gt;memcpy&lt;/code&gt; and struct copies. If you have a struct that&amp;rsquo;s, say, 32 bytes, LLVM might decide the fastest way to copy it is to load it into a pair of 128-bit NEON registers and store it back. This happens even in integer-only code. Even in early boot.&lt;/p&gt;
&lt;p&gt;If FP/ASIMD is disabled when this happens, the CPU generates a synchronous exception with exception class &lt;code&gt;EC=0x07&lt;/code&gt; (FP/ASIMD access trap). Your kernel crashes before it even prints &amp;ldquo;hello.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We handled the EL2 side already (clearing TFP in &lt;code&gt;cptr_el2&lt;/code&gt;). Now at EL1, we set &lt;code&gt;FPEN&lt;/code&gt; (bits [21:20]) in &lt;code&gt;cpacr_el1&lt;/code&gt; to &lt;code&gt;0b11&lt;/code&gt;, which means &amp;ldquo;don&amp;rsquo;t trap FP/ASIMD at EL1 or EL0.&amp;rdquo; The &lt;code&gt;orr&lt;/code&gt; instruction sets those bits. Another &lt;code&gt;isb&lt;/code&gt; to synchronize.&lt;/p&gt;
&lt;h3 id=&#34;88-jumping-to-rust-lines-57-60&#34;&gt;8.8 Jumping to Rust (lines 57-60)&lt;/h3&gt;
&lt;figure id=&#34;jump-rust&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;bl&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;rust_main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;wfe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;b&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Calling into Rust&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Finally, &lt;code&gt;bl rust_main&lt;/code&gt; is a branch-with-link: it saves the return address in &lt;code&gt;x30&lt;/code&gt; (the link register) and jumps to &lt;code&gt;rust_main&lt;/code&gt;. This is where we leave assembly and enter Rust.&lt;/p&gt;
&lt;p&gt;The three lines after it are a safety net. &lt;code&gt;rust_main&lt;/code&gt; is declared as &lt;code&gt;-&amp;gt; !&lt;/code&gt; (never returns), but if something goes horribly wrong and it does return, we don&amp;rsquo;t want the CPU executing random memory. So we enter an infinite loop: &lt;code&gt;wfe&lt;/code&gt; (wait for event, which puts the CPU in a low-power sleep state) followed by a branch back to &lt;code&gt;wfe&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;9-the-rust-entry-point&#34;&gt;9. The Rust entry point&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;re in Rust. Let&amp;rsquo;s look at the actual &lt;code&gt;main.rs&lt;/code&gt; for the AArch64 virt platform.&lt;/p&gt;
&lt;figure id=&#34;main-rs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_main]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; core::panic::PanicInfo;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; hal::log::Logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;global_asm!&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;include_str!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;boot.S&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// QEMU `virt` PL011 UART base.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0900_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UartLogger&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_write&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;, val: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::write_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, val) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_read&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::read_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;putc&lt;/span&gt;(c: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// FR (0x18) bit5 = TXFF (transmit FIFO full)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_read(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x18&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_write(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x00&lt;/span&gt;, c &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;puts&lt;/span&gt;(s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;b &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; s.as_bytes() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(&lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; hal::log::Logger &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        UartLogger::puts(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;timer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;preempt&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;mem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;rust_main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; logger &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; UartLogger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: aarch64 QEMU virt boot OK&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: IPC + cooperative scheduling demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        kernel::kmain(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;logger)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-timer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: timer interrupts demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        timer::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: timer started, entering idle loop&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-preempt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: preemptive multitasking demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        preempt::init();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;start_first&lt;/span&gt;(ctx: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; preempt::Context) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { start_first(preempt::first_context()) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-memory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: memory management demo (frames + page tables)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mem::demo();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(not(any(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-timer&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;                   feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-preempt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-memory&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: no demo selected, halting&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[panic_handler]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;panic&lt;/span&gt;(_info: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;PanicInfo&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: PANIC&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/arch_aarch64_virt/src/main.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&amp;rsquo;s unpack the important pieces.&lt;/p&gt;
&lt;h3 id=&#34;91-global_asm-and-including-boots&#34;&gt;9.1 &lt;code&gt;global_asm!&lt;/code&gt; and including boot.S&lt;/h3&gt;
&lt;figure id=&#34;global-asm&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;global_asm!&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;include_str!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;boot.S&amp;#34;&lt;/span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Including assembly in the Rust build&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This line tells the Rust compiler: &amp;ldquo;take the contents of &lt;code&gt;boot.S&lt;/code&gt; and include them as global assembly in this compilation unit.&amp;rdquo; The assembler processes our boot code, the linker resolves the symbols (&lt;code&gt;_start&lt;/code&gt;, &lt;code&gt;rust_main&lt;/code&gt;, &lt;code&gt;__stack_top&lt;/code&gt;, etc.), and everything ends up in one binary. It&amp;rsquo;s the bridge between our assembly boot code and Rust.&lt;/p&gt;
&lt;h3 id=&#34;92-unsafeno_mangle-and-extern-c&#34;&gt;9.2 &lt;code&gt;#[unsafe(no_mangle)]&lt;/code&gt; and &lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt;&lt;/h3&gt;
&lt;figure id=&#34;rust-entry&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;extern&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;rust_main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;The Rust entry point signature&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Two things happening here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;#[unsafe(no_mangle)]&lt;/code&gt;&lt;/strong&gt; prevents the Rust compiler from mangling the function name. Normally, Rust encodes type information into symbol names (so &lt;code&gt;rust_main&lt;/code&gt; might become something like &lt;code&gt;_ZN17arch_aarch64_virt9rust_main17h3a2b1c4d5e6f7g8hE&lt;/code&gt;). Our assembly code calls &lt;code&gt;bl rust_main&lt;/code&gt; and needs to find that exact name.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt;&lt;/strong&gt; says: use the C calling convention. Rust&amp;rsquo;s own calling convention isn&amp;rsquo;t stable and can change between compiler versions. The C ABI is well-defined on every platform. On AArch64, the C calling convention puts the first argument in &lt;code&gt;x0&lt;/code&gt;, the second in &lt;code&gt;x1&lt;/code&gt;, return values in &lt;code&gt;x0&lt;/code&gt;, and so on. Since assembly calls this function, we need a stable, predictable calling convention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-&amp;gt; !&lt;/code&gt;&lt;/strong&gt; means this function never returns. On bare metal, there&amp;rsquo;s nothing to return to. The CPU would start executing whatever random bytes follow in memory. The function must either loop forever or halt the CPU.&lt;/p&gt;
&lt;h3 id=&#34;93-the-feature-gates&#34;&gt;9.3 The feature gates&lt;/h3&gt;
&lt;figure id=&#34;features&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(feature = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;demo-ipc&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: IPC + cooperative scheduling demo&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernel::kmain(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;logger)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Compile-time feature selection&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;#[cfg(feature = &amp;quot;...&amp;quot;)]&lt;/code&gt; attributes are compile-time switches. Depending on which feature you pass to the build script, a different code path gets compiled in. Only one demo runs at a time. This is a common pattern in embedded Rust: use cargo features to select between different configurations without runtime overhead.&lt;/p&gt;
&lt;h3 id=&#34;94-the-panic-handler&#34;&gt;9.4 The panic handler&lt;/h3&gt;
&lt;figure id=&#34;panic-handler&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[panic_handler]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;panic&lt;/span&gt;(_info: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;PanicInfo&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    UartLogger::puts(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: PANIC&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hal::arch::halt();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Bare-metal panic handler&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On bare metal, you must define what happens when Rust panics (array out of bounds, &lt;code&gt;unwrap()&lt;/code&gt; on &lt;code&gt;None&lt;/code&gt;, explicit &lt;code&gt;panic!()&lt;/code&gt;, etc.). There&amp;rsquo;s no OS to catch it. Our handler prints &amp;ldquo;PANIC&amp;rdquo; to the UART and halts. In a more sophisticated kernel, you&amp;rsquo;d print the panic message and a stack trace. For now, knowing something panicked is enough.&lt;/p&gt;
&lt;h2 id=&#34;10-pl011-uart-talking-to-hardware-via-mmio&#34;&gt;10. PL011 UART: talking to hardware via MMIO&lt;/h2&gt;
&lt;p&gt;In a normal program, every memory address maps to a byte of RAM. Address &lt;code&gt;0x1000&lt;/code&gt; holds some data, you read it, you write it, it&amp;rsquo;s just storage. On bare metal, some addresses are special: they&amp;rsquo;re connected to hardware peripherals instead of RAM. Writing to address &lt;code&gt;0x0900_0000&lt;/code&gt; on our QEMU &lt;code&gt;virt&lt;/code&gt; machine doesn&amp;rsquo;t store anything in memory. It sends a byte out the serial line. This is &lt;strong&gt;memory-mapped I/O&lt;/strong&gt; (MMIO).&lt;/p&gt;
&lt;p&gt;The PL011 UART sits at that address. When you write a byte to offset &lt;code&gt;0x00&lt;/code&gt; from that base, the UART hardware transmits it. When you read from offset &lt;code&gt;0x18&lt;/code&gt;, you get the UART&amp;rsquo;s flag register, telling you whether the transmit FIFO is full. These addresses come from the hardware manufacturer&amp;rsquo;s specification (or in QEMU&amp;rsquo;s case, from QEMU&amp;rsquo;s source code and the &lt;code&gt;virt&lt;/code&gt; machine documentation). There&amp;rsquo;s no way to discover them at runtime. You look them up.&lt;/p&gt;
&lt;h3 id=&#34;101-the-uartlogger-implementation&#34;&gt;10.1 The UartLogger implementation&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s look at how we actually write bytes to the UART:&lt;/p&gt;
&lt;figure id=&#34;mmio-helpers&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0x0900_0000&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_write&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;, val: &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::write_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;, val) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mmio_read&lt;/span&gt;(offset: &lt;span style=&#34;color:#ed8796&#34;&gt;usize&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { core::ptr::read_volatile((&lt;span style=&#34;color:#eed49f&#34;&gt;UART0_BASE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; offset) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;MMIO helper functions (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;write_volatile&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;read_volatile&lt;/code&gt;&lt;/strong&gt; are critical. Normally, the Rust compiler (through LLVM) is free to optimize away memory operations. If you write to an address and never read it back, the optimizer might skip the write entirely. &amp;ldquo;Why bother,&amp;rdquo; it thinks, &amp;ldquo;nobody&amp;rsquo;s going to look at it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But for MMIO, the hardware IS looking at it. Writing to the UART data register transmits a byte. The compiler can&amp;rsquo;t see that side effect. &lt;code&gt;volatile&lt;/code&gt; tells the compiler: &amp;ldquo;this access has effects you can&amp;rsquo;t reason about. Do it exactly as written, in exactly this order.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Both functions are &lt;code&gt;unsafe&lt;/code&gt; because we&amp;rsquo;re casting raw integers to pointers and dereferencing them. In safe Rust, pointer arithmetic is forbidden. On bare metal, it&amp;rsquo;s the only way to talk to hardware.&lt;/p&gt;
&lt;h3 id=&#34;102-sending-a-character&#34;&gt;10.2 Sending a character&lt;/h3&gt;
&lt;figure id=&#34;putc&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;putc&lt;/span&gt;(c: &lt;span style=&#34;color:#ed8796&#34;&gt;u8&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// FR (0x18) bit5 = TXFF (transmit FIFO full)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_read(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x18&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::mmio_write(&lt;span style=&#34;color:#f5a97f&#34;&gt;0x00&lt;/span&gt;, c &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;u32&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;PL011 character transmission (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The PL011 UART has a transmit FIFO (a small hardware buffer, typically 16 bytes). When you write a byte to the data register (offset &lt;code&gt;0x00&lt;/code&gt;), it goes into the FIFO. The UART hardware drains the FIFO at the configured baud rate, sending bits out the serial line.&lt;/p&gt;
&lt;p&gt;But the FIFO can fill up. If you write faster than the UART can transmit, the FIFO overflows and bytes get lost. So before writing, we check the Flag Register (offset &lt;code&gt;0x18&lt;/code&gt;). Bit 5 is &lt;code&gt;TXFF&lt;/code&gt; (transmit FIFO full). If it&amp;rsquo;s set, we spin-wait until there&amp;rsquo;s room.&lt;/p&gt;
&lt;p&gt;This is called &lt;strong&gt;polling&lt;/strong&gt; or &lt;strong&gt;busy-waiting&lt;/strong&gt;. It&amp;rsquo;s the simplest approach and perfectly fine for debug output. In a production driver, you&amp;rsquo;d use interrupts instead (the UART can signal when the FIFO has room, so the CPU can do other work instead of spinning).&lt;/p&gt;
&lt;h3 id=&#34;103-sending-a-string&#34;&gt;10.3 Sending a string&lt;/h3&gt;
&lt;figure id=&#34;puts&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;crate&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;puts&lt;/span&gt;(s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;b &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; s.as_bytes() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(&lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\r&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Self&lt;/span&gt;::putc(b);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;PL011 string transmission with newline conversion (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Two things to notice. First, we iterate over the raw bytes of the string (&lt;code&gt;s.as_bytes()&lt;/code&gt;), not characters. At this level, we&amp;rsquo;re dealing with bytes, not Unicode code points.&lt;/p&gt;
&lt;p&gt;Second, the &lt;code&gt;\n&lt;/code&gt; to &lt;code&gt;\r\n&lt;/code&gt; conversion. Serial terminals expect both a carriage return (&lt;code&gt;\r&lt;/code&gt;, move cursor to column 0) and a line feed (&lt;code&gt;\n&lt;/code&gt;, move cursor down one line). If you send just &lt;code&gt;\n&lt;/code&gt;, many terminals will move down without returning to the left edge, giving you a staircase effect. So we insert a &lt;code&gt;\r&lt;/code&gt; before every &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;104-the-logger-trait-implementation&#34;&gt;10.4 The Logger trait implementation&lt;/h3&gt;
&lt;figure id=&#34;logger-impl&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; hal::log::Logger &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; UartLogger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        UartLogger::puts(s);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Logger trait implementation (from main.rs)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This bridges the gap between our platform-specific UART driver and the platform-agnostic kernel. The kernel never calls &lt;code&gt;UartLogger::puts&lt;/code&gt; directly. It calls &lt;code&gt;logger.log()&lt;/code&gt; on a trait object. More on this in the next section.&lt;/p&gt;
&lt;h2 id=&#34;11-the-platform-agnostic-kernel&#34;&gt;11. The platform-agnostic kernel&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the design payoff. The kernel crate knows nothing about ARM, nothing about UART, nothing about QEMU. It just knows it has something that can log strings.&lt;/p&gt;
&lt;h3 id=&#34;111-the-logger-trait&#34;&gt;11.1 The Logger trait&lt;/h3&gt;
&lt;figure id=&#34;logger-trait&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;trait&lt;/span&gt; Logger {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, s: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;str&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/hal/src/log.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Three lines. That&amp;rsquo;s the entire hardware abstraction layer for output. Any platform that can print strings can implement this trait.&lt;/p&gt;
&lt;h3 id=&#34;112-the-kernel-entry&#34;&gt;11.2 The kernel entry&lt;/h3&gt;
&lt;figure id=&#34;kernel-lib&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#![no_std]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; hal::log::Logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;ipc&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mod&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sched&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;use&lt;/span&gt; core::cell::UnsafeCell;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[repr(transparent)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt;(UnsafeCell&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;ipc::Router&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;impl&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;Sync&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; RouterCell {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Force the router into a writable section. On some bare-metal targets, a `static`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// with interior mutability can otherwise end up in a read-only segment, causing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// a data abort when we first write to it (exactly what we saw on aarch64 QEMU virt).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[link_section = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.data&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;: &lt;span style=&#34;color:#eed49f&#34;&gt;RouterCell&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; RouterCell(UnsafeCell::new(ipc::Router::new()));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: kernel online&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: microkernel step 1 (IPC + cooperative scheduling)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; router: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;mut&lt;/span&gt; ipc::Router &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; { &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;ROUTER&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;0.&lt;/span&gt;get() };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PingTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sched::PongTask::new();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks: [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;dyn&lt;/span&gt; sched::Task; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; ping, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; pong];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sched::run(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; tasks, logger, router)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/kernel/src/lib.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Look at the &lt;code&gt;kmain&lt;/code&gt; signature: &lt;code&gt;fn kmain(logger: &amp;amp;dyn Logger) -&amp;gt; !&lt;/code&gt;. It takes a trait object (&lt;code&gt;&amp;amp;dyn Logger&lt;/code&gt;), not a concrete type. The kernel doesn&amp;rsquo;t know whether &lt;code&gt;logger&lt;/code&gt; is a PL011 UART, a COM1 serial port, or a carrier pigeon with a Morse code encoder. It just knows it can call &lt;code&gt;.log()&lt;/code&gt;. If you wanted to port this kernel to RISC-V or even a microcontroller with an SPI display, you&amp;rsquo;d implement &lt;code&gt;Logger&lt;/code&gt; for that platform&amp;rsquo;s output device and call &lt;code&gt;kmain&lt;/code&gt; with it.&lt;/p&gt;
&lt;p&gt;Notice the &lt;code&gt;#[link_section = &amp;quot;.data&amp;quot;]&lt;/code&gt; on the &lt;code&gt;ROUTER&lt;/code&gt; static. This is a hard-won lesson. On AArch64, the linker sometimes places statics with interior mutability (like &lt;code&gt;UnsafeCell&lt;/code&gt;) into read-only sections. The first write causes a data abort. Forcing it into &lt;code&gt;.data&lt;/code&gt; guarantees it lands in a writable section. We learned this the painful way.&lt;/p&gt;
&lt;p&gt;The IPC router and scheduler are the subject of &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;. For now, just know that &lt;code&gt;kmain&lt;/code&gt; is where platform-agnostic kernel logic lives.&lt;/p&gt;
&lt;h3 id=&#34;113-the-halt-function&#34;&gt;11.3 The halt function&lt;/h3&gt;
&lt;figure id=&#34;halt-fn&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[inline(always)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;halt&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hlt&amp;#34;&lt;/span&gt;, options(nomem, nostack, preserves_flags));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;unsafe&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Use WFI (wait-for-interrupt) so we reliably sleep until the next IRQ.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// WFE can return immediately if an event is already latched.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        core::arch::&lt;span style=&#34;color:#8aadf4&#34;&gt;asm!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wfi&amp;#34;&lt;/span&gt;, options(nomem, nostack, preserves_flags));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[cfg(not(any(target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x86_64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;, target_arch = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aarch64&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;)))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/hal/src/arch.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is another piece of the hardware abstraction layer. On AArch64, &lt;code&gt;wfi&lt;/code&gt; (wait for interrupt) puts the CPU into a low-power sleep state until an interrupt fires. On x86_64, the equivalent is &lt;code&gt;hlt&lt;/code&gt;. The kernel code just calls &lt;code&gt;hal::arch::halt()&lt;/code&gt; and doesn&amp;rsquo;t care which instruction runs underneath.&lt;/p&gt;
&lt;p&gt;The comment about &lt;code&gt;wfe&lt;/code&gt; vs &lt;code&gt;wfi&lt;/code&gt; is interesting. &lt;code&gt;wfe&lt;/code&gt; (wait for event) can return immediately if an event flag is already set, which means your &amp;ldquo;sleep&amp;rdquo; loop might spin instead of sleeping. &lt;code&gt;wfi&lt;/code&gt; is more predictable: it always waits for an actual interrupt.&lt;/p&gt;
&lt;h2 id=&#34;12-linker-scripts&#34;&gt;12. Linker scripts&lt;/h2&gt;
&lt;p&gt;On bare metal, there&amp;rsquo;s no OS to decide where your code lives in memory. The linker script is the document that says: put &lt;code&gt;.text.boot&lt;/code&gt; first (so the CPU&amp;rsquo;s entry point is at the right address), put &lt;code&gt;.text&lt;/code&gt; after it, then &lt;code&gt;.rodata&lt;/code&gt;, &lt;code&gt;.data&lt;/code&gt;, &lt;code&gt;.bss&lt;/code&gt;, and finally the stack.&lt;/p&gt;
&lt;p&gt;Our linker script for the &lt;code&gt;virt&lt;/code&gt; platform places the kernel at &lt;code&gt;0x40080000&lt;/code&gt;. This is within the RAM region that starts at &lt;code&gt;0x40000000&lt;/code&gt; on the QEMU &lt;code&gt;virt&lt;/code&gt; machine. The &lt;code&gt;0x80000&lt;/code&gt; offset is a convention (it matches the Raspberry Pi&amp;rsquo;s load address offset), though for QEMU it&amp;rsquo;s somewhat arbitrary as long as it&amp;rsquo;s within RAM.&lt;/p&gt;
&lt;p&gt;The linker script also defines symbols like &lt;code&gt;__bss_start&lt;/code&gt;, &lt;code&gt;__bss_end&lt;/code&gt;, and &lt;code&gt;__stack_top&lt;/code&gt; that the assembly boot code references. Without these, the assembler would have no idea where BSS begins or where to put the stack.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;build.rs&lt;/code&gt; file for our crate tells cargo to use this linker script:&lt;/p&gt;
&lt;figure id=&#34;build-rs&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rerun-if-changed=linker.ld&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rerun-if-changed=src/boot.S&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; manifest_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; std::env::var(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CARGO_MANIFEST_DIR&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        .expect(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CARGO_MANIFEST_DIR not set&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cargo:rustc-link-arg=-T&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;/linker.ld&amp;#34;&lt;/span&gt;, manifest_dir);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;crates/arch_aarch64_virt/build.rs&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;cargo:rustc-link-arg=-T.../linker.ld&lt;/code&gt; line passes the linker script to the linker. Without it, the linker would use its default layout, which almost certainly wouldn&amp;rsquo;t put our code at the right address.&lt;/p&gt;
&lt;h2 id=&#34;13-hands-on-exercise&#34;&gt;13. Hands-on exercise&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a quick challenge. Open &lt;code&gt;crates/kernel/src/lib.rs&lt;/code&gt; and add a second log message to &lt;code&gt;kmain&lt;/code&gt;:&lt;/p&gt;
&lt;figure id=&#34;exercise&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;pub&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;kmain&lt;/span&gt;(logger: &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#eed49f&#34;&gt;dyn&lt;/span&gt; Logger) -&amp;gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: kernel online&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: microkernel step 1 (IPC + cooperative scheduling)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rustOS: hello from YOUR_NAME_HERE!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;);  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// add this
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ... rest of the function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Adding a custom log message&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Rebuild and run:&lt;/p&gt;
&lt;figure id=&#34;exercise-cmd&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh demo-ipc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Rebuild and verify&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You should see your message appear between the boot messages and the scheduler output. One line of Rust. It traveled through a trait object, into a UART driver, through memory-mapped I/O, into a virtual PL011 peripheral, and out QEMU&amp;rsquo;s emulated serial port to your terminal.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s step back and look at what we&amp;rsquo;ve got. A 60-line assembly boot sequence that sets up a stack, zeros BSS, drops from EL2 to EL1, enables floating-point, installs an exception vector table, and hands off to Rust. A Rust entry point that initializes a PL011 UART driver and calls into a platform-agnostic kernel. A three-line Logger trait that abstracts away all the hardware details. And a kernel entry function that doesn&amp;rsquo;t know or care what CPU architecture it&amp;rsquo;s running on. It boots. It prints. It works. And everything from here builds on this foundation. The IPC system in &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;, the timer interrupts in &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, the MMU in &lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;: they all stand on the boot sequence and UART driver we just walked through. Get this part right, and the rest is (relatively) straightforward.&lt;/p&gt;
&lt;h2 id=&#34;14-brief-appendix-how-would-this-differ-on-other-platforms&#34;&gt;14. Brief appendix: how would this differ on other platforms?&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re curious about x86_64 or Raspberry Pi, here&amp;rsquo;s a quick sketch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On x86_64&lt;/strong&gt;, the boot process is much more complex because of backwards compatibility with the 1978 Intel 8086. The CPU starts in 16-bit real mode, where you can only address 1 MB of memory. You have to transition through protected mode (32-bit) and then long mode (64-bit), setting up GDTs (Global Descriptor Tables), enabling PAE (Physical Address Extension), and configuring initial page tables (paging is required for 64-bit mode). Most Rust OS projects use the &lt;code&gt;bootloader&lt;/code&gt; crate by Philipp Oppermann, which handles all these mode transitions and loads your kernel ELF. For serial output, x86 has legacy COM ports at I/O address &lt;code&gt;0x3F8&lt;/code&gt;, accessed with special &lt;code&gt;in&lt;/code&gt; and &lt;code&gt;out&lt;/code&gt; instructions (port-mapped I/O rather than memory-mapped I/O). The &lt;code&gt;uart_16550&lt;/code&gt; crate wraps this nicely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On Raspberry Pi&lt;/strong&gt;, something unexpected happens: the GPU boots first, not the CPU. The VideoCore GPU reads &lt;code&gt;bootcode.bin&lt;/code&gt; from the SD card, loads &lt;code&gt;start.elf&lt;/code&gt;, reads &lt;code&gt;config.txt&lt;/code&gt; for settings, and then loads your kernel (&lt;code&gt;kernel8.img&lt;/code&gt;) to address &lt;code&gt;0x80000&lt;/code&gt;. Only then does the ARM CPU start. The boot assembly is simpler than our QEMU virt version (no EL2 drop needed, the firmware handles that), but the UART driver is more complex. The Pi has two UARTs: a full PL011 (which is connected to Bluetooth by default) and a simpler Mini-UART on GPIO pins 14/15. The Mini-UART&amp;rsquo;s clock is tied to the GPU frequency, which makes baud rate configuration trickier. And of course, the development cycle is slower: build, copy to SD card, plug into Pi, power on, check output.&lt;/p&gt;
&lt;p&gt;Both platforms share the same kernel crate and Logger trait. That&amp;rsquo;s the whole point of the abstraction.&lt;/p&gt;
&lt;h2 id=&#34;15-references&#34;&gt;15. References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0487/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Architecture Reference Manual (ARMv8-A)
	&lt;/span&gt;
&lt;/a&gt; (Section D1 for exception levels, Section G for system registers)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://wiki.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev Wiki
	&lt;/span&gt;
&lt;/a&gt; (community-driven OS development knowledge base)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://os.phil-opp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Writing an OS in Rust
	&lt;/span&gt;
&lt;/a&gt; by Philipp Oppermann (excellent x86_64 series)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.rust-embedded.org/book/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Embedded Rust Book
	&lt;/span&gt;
&lt;/a&gt; (&lt;code&gt;no_std&lt;/code&gt; patterns and bare-metal Rust)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.qemu.org/docs/master/system/arm/virt.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		QEMU AArch64 virt machine documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0183/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PL011 UART Technical Reference Manual
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part0-why-build-an-os/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 0: Why build an OS from scratch?
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Foundations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Building a microkernel in Rust (Part 0): Why build an OS from scratch?</title>
      <link>/post/2026/02/building-microkernel-part0-why-build-an-os/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/02/building-microkernel-part0-why-build-an-os/</guid>
      <description>&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 0 (this): Why build an OS from scratch?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-this-why-now&#34;&gt;Why this, why now?&lt;/h2&gt;
&lt;p&gt;I recently wrapped up an incredible chapter at Microsoft, working on the AI engineering team in CoreAI. Between roles, I found myself on gardening leave with something rare in this industry: a few weeks of unstructured time. And instead of doing the sensible thing (rest, catch up on sleep, maybe touch grass), my brain went: &amp;ldquo;You know what sounds fun? Writing an operating system from scratch.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Look, I&amp;rsquo;ve spent the last several years deep in AI/ML, from foundational model development to applied AI at scale. That work isn&amp;rsquo;t going anywhere (the &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		LLM from scratch series
	&lt;/span&gt;
&lt;/a&gt; on this blog is a good example of that curiosity). But I&amp;rsquo;ve had this itch for a while now to go back to the fundamentals. The stuff that sits beneath all those PyTorch tensors and CUDA kernels. The stuff that actually makes a computer &lt;em&gt;compute&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s an old joke: a QA engineer walks into a bar. Orders 1 beer. Orders 0 beers. Orders 99999999 beers. Orders -1 beers. Orders a lizard. Orders NULL beers. First real customer walks in and asks where the bathroom is. The bar bursts into flames.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s basically what happens when you try to run code without an OS. You think you&amp;rsquo;re ordering a beer, but there&amp;rsquo;s nobody behind the counter, no glasses, no refrigerator, and the building doesn&amp;rsquo;t have plumbing yet. You &lt;em&gt;are&lt;/em&gt; the plumbing. This series is about building that plumbing from nothing.&lt;/p&gt;
&lt;h2 id=&#34;part-0-really&#34;&gt;Part 0? Really?&lt;/h2&gt;
&lt;p&gt;Yes, we&amp;rsquo;re starting at zero. Because real programmers count from zero, and honestly, this part is about understanding what we&amp;rsquo;re building before we build it. Think of it as the moment before you start cooking, where you read the whole recipe, check you&amp;rsquo;ve got the ingredients, and figure out what you&amp;rsquo;re actually making. You don&amp;rsquo;t skip that step. (Okay, maybe you do sometimes. But you shouldn&amp;rsquo;t.)&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever wondered how code even &lt;em&gt;runs&lt;/em&gt; without an operating system underneath, or what happens between pressing the power button and seeing a login screen, or why everyone says &amp;ldquo;virtual memory&amp;rdquo; but nobody explains how it actually works, you&amp;rsquo;re in the right place.&lt;/p&gt;
&lt;h2 id=&#34;what-happens-when-theres-nothing-underneath-you&#34;&gt;What happens when there&amp;rsquo;s nothing underneath you?&lt;/h2&gt;
&lt;p&gt;Every program you&amp;rsquo;ve ever written ran on top of an operating system. When you call &lt;code&gt;println!&lt;/code&gt;, the OS figures out where to send those bytes. When you allocate memory, the OS finds a free chunk and maps it into your address space. When your code runs alongside other programs without crashing into them, that&amp;rsquo;s the OS keeping everyone in their own lane.&lt;/p&gt;
&lt;p&gt;Now imagine none of that exists. No OS. No standard library. No heap. No &lt;code&gt;println!&lt;/code&gt;. Just you, a CPU, and some RAM. You want to print a single character? You need to know the exact memory address of the serial port hardware, write one byte to that address, and hope you configured the device correctly. If you didn&amp;rsquo;t, nothing happens. The screen stays blank. The CPU doesn&amp;rsquo;t complain. It just sits there.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where we&amp;rsquo;re starting. We&amp;rsquo;re going to build, from nothing, the thing that makes all of those invisible layers work. By the end, you&amp;rsquo;ll understand exactly what happens between &amp;ldquo;power on&amp;rdquo; and &amp;ldquo;your code runs.&amp;rdquo; And honestly? It&amp;rsquo;s one of the most satisfying things you can do as a programmer.&lt;/p&gt;
&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;5-part educational series&lt;/strong&gt; (Part 0 through Part 4) where we build a minimal OS kernel in Rust from scratch. We focus on &lt;strong&gt;AArch64 QEMU virt&lt;/strong&gt;, which means anyone with a laptop can run it. No special hardware needed, just QEMU.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;ll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Boot sequences&lt;/strong&gt;: How a CPU goes from power-on to running your first line of Rust&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serial output&lt;/strong&gt;: The simplest possible way to see what your kernel is doing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message-passing IPC&lt;/strong&gt;: How tasks communicate without sharing memory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooperative and preemptive scheduling&lt;/strong&gt;: From polite turn-taking to the OS forcibly yanking the CPU away&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timer interrupts&lt;/strong&gt;: How hardware gives your OS a sense of time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context switching&lt;/strong&gt;: Saving and restoring every register so tasks don&amp;rsquo;t know they were paused&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Virtual memory&lt;/strong&gt;: Page tables, the MMU, and why every address your code uses is a lie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: This is a learning project, not production code. The goal is understanding, not security or completeness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time commitment&lt;/strong&gt;: About 2-4 hours per part, totaling 5 parts. Follow along at your own pace.&lt;/p&gt;
&lt;h2 id=&#34;1-a-quick-primer-aarch64-qemu-and-the-virt-machine&#34;&gt;1. A quick primer: AArch64, QEMU, and the &amp;ldquo;virt&amp;rdquo; machine&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll see the phrase &amp;ldquo;AArch64 QEMU virt&amp;rdquo; throughout this series, so let&amp;rsquo;s unpack it before we go further.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AArch64&lt;/strong&gt; is ARM&amp;rsquo;s 64-bit instruction set architecture. It&amp;rsquo;s the CPU architecture inside your phone, your tablet, Apple Silicon Macs, most cloud servers (AWS Graviton, Ampere Altra), and the Raspberry Pi 3 and newer. When we say we&amp;rsquo;re writing an AArch64 kernel, we mean we&amp;rsquo;re writing code that speaks the language these CPUs understand: A64 instructions, 31 general-purpose 64-bit registers (x0 through x30), four exception levels (EL0 through EL3) for privilege separation, and a specific way of handling interrupts, memory, and device access.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve only worked with x86_64 (Intel/AMD), the concepts are the same, but the details differ. ARM uses a load/store architecture (you can&amp;rsquo;t perform arithmetic directly in memory; you have to load values into registers first), a different interrupt model (GIC instead of APIC), and a different boot flow (exception levels instead of real/protected/long mode transitions). None of this matters yet. We&amp;rsquo;ll explain every ARM-specific detail as we encounter it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;QEMU&lt;/strong&gt; is a machine emulator. It simulates an entire computer in software: CPU, RAM, interrupt controller, timer, serial port, everything. When we run our kernel in QEMU, it doesn&amp;rsquo;t touch your real hardware. QEMU pretends to be an ARM computer, and our kernel runs on it. This is incredibly useful for OS development because you can restart instantly, you can&amp;rsquo;t brick anything, and the emulated hardware behaves predictably.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;virt&amp;rdquo;&lt;/strong&gt; is a specific machine type provided by QEMU. Real ARM hardware comes in thousands of configurations: different board layouts, different peripherals, different memory maps. The &lt;code&gt;virt&lt;/code&gt; machine is a clean, minimal design created by QEMU specifically for virtual machines and testing. It gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A PL011 UART (serial port) at a known memory address for text output&lt;/li&gt;
&lt;li&gt;A GICv2 interrupt controller for routing hardware interrupts to the CPU&lt;/li&gt;
&lt;li&gt;An ARM Generic Timer for periodic tick interrupts&lt;/li&gt;
&lt;li&gt;RAM starting at a fixed address (0x40000000)&lt;/li&gt;
&lt;li&gt;No legacy baggage, no quirky firmware, no board-specific workarounds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why we chose it for the blog series. The &lt;code&gt;virt&lt;/code&gt; machine strips away all the hardware complexity that has nothing to do with OS fundamentals. You don&amp;rsquo;t need to worry about GPU initialization, USB enumeration, or PCIe configuration. You get a CPU, memory, a timer, an interrupt controller, and a serial port. That&amp;rsquo;s exactly what you need to learn how an OS works, and nothing more.&lt;/p&gt;
&lt;p&gt;When you run &lt;code&gt;qemu-system-aarch64 -machine virt&lt;/code&gt;, you&amp;rsquo;re telling QEMU: &amp;ldquo;pretend to be this specific kind of ARM computer.&amp;rdquo; Our kernel is written to match that pretend computer&amp;rsquo;s memory map and peripherals.&lt;/p&gt;
&lt;h2 id=&#34;2-what-were-building&#34;&gt;2. What we&amp;rsquo;re building&lt;/h2&gt;
&lt;p&gt;rustOS is a minimal microkernel. Not a &amp;ldquo;toy&amp;rdquo; that prints hello world and stops, but not Linux either. It&amp;rsquo;s the kind of thing that actually boots, actually runs multiple tasks, actually translates virtual addresses to physical ones. The interesting middle ground where you learn how real operating systems work without drowning in 30 million lines of code.&lt;/p&gt;
&lt;p&gt;The kernel boots on AArch64 QEMU virt (an emulated ARM machine that anyone can run). It implements message-passing IPC, the core idea behind microkernel design, in which tasks communicate by sending small, fixed-size messages through a router rather than poking each other&amp;rsquo;s memory directly. It runs a cooperative scheduler that polls tasks in round-robin, and then we upgrade to preemptive multitasking with timer interrupts so tasks can&amp;rsquo;t hog the CPU. And it manages virtual memory with 4-level page tables and a real MMU, the hardware that makes every modern OS possible.&lt;/p&gt;
&lt;p&gt;Now, the codebase also supports x86_64 and the Raspberry Pi Zero 2 W. Those platforms share the same kernel logic and are available in the repository if you want to explore them. But the blog series focuses on AArch64 virt because it&amp;rsquo;s the most accessible. You don&amp;rsquo;t need a Raspberry Pi. You don&amp;rsquo;t need a Windows machine to deal with x86 bootloader quirks. You need QEMU, and QEMU runs on everything.&lt;/p&gt;
&lt;p&gt;Before we look at the code layout, a quick Rust concept if you&amp;rsquo;re coming from another language: a &lt;strong&gt;crate&lt;/strong&gt; is Rust&amp;rsquo;s unit of compilation, roughly equivalent to a library or package in other ecosystems. A crate has its own &lt;code&gt;Cargo.toml&lt;/code&gt; (think &lt;code&gt;package.json&lt;/code&gt; or &lt;code&gt;pom.xml&lt;/code&gt;) that declares its name, dependencies, and build settings. A &lt;strong&gt;workspace&lt;/strong&gt; groups multiple crates together so they can share dependencies and be built in one &lt;code&gt;cargo build&lt;/code&gt; invocation. Our project is a workspace with several crates: &lt;code&gt;kernel&lt;/code&gt;, &lt;code&gt;hal&lt;/code&gt;, and one per platform. Each crate compiles independently and can depend on others. When you see &lt;code&gt;kernel&lt;/code&gt; crate or &lt;code&gt;hal&lt;/code&gt; crate below, think &amp;ldquo;self-contained module with a clear API boundary.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how the code is organized:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    subgraph &amp;#34;Platform-Agnostic Core&amp;#34;
        kernel[kernel&amp;lt;br/&amp;gt;IPC Router, Scheduler, Tasks]
        hal[hal&amp;lt;br/&amp;gt;Logger Trait, Arch Primitives]
    end

    subgraph &amp;#34;Platform Crate&amp;#34;
        virt[arch_aarch64_virt&amp;lt;br/&amp;gt;QEMU Boot, PL011 UART&amp;lt;br/&amp;gt;Timer, GIC, MMU]
    end

    virt --&amp;gt; hal
    virt --&amp;gt; kernel

    style kernel fill:#e1f5ff
    style hal fill:#e1f5ff
    style virt fill:#fff4e1&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Platform-agnostic crate architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;kernel&lt;/code&gt; crate knows nothing about hardware. It talks to the world through a &lt;code&gt;Logger&lt;/code&gt; trait defined in &lt;code&gt;hal&lt;/code&gt;. The platform crate (&lt;code&gt;arch_aarch64_virt&lt;/code&gt;) implements that trait using a PL011 UART driver and handles all ARM-specific setup: boot assembly, timer configuration, GIC interrupt routing, and MMU page tables. This separation is the same pattern you&amp;rsquo;ll find in real operating systems. Linux has &lt;code&gt;arch/arm64/&lt;/code&gt; for ARM-specific code and &lt;code&gt;kernel/&lt;/code&gt; for the portable parts. We&amp;rsquo;re doing the same thing, just at a much smaller scale.&lt;/p&gt;
&lt;h2 id=&#34;3-why-this-series&#34;&gt;3. Why this series?&lt;/h2&gt;
&lt;p&gt;Most OS tutorials either skip the hard parts (boot, interrupts, memory management), use simulators instead of real code, or don&amp;rsquo;t explain &lt;em&gt;why&lt;/em&gt; things work the way they do. You get a code dump with a comment saying &amp;ldquo;configure the GIC&amp;rdquo; and zero explanation of what the GIC is, why it exists, or what happens if you get it wrong.&lt;/p&gt;
&lt;p&gt;This series is different. We show complete implementations with no hand-waving. Every register write gets explained. Every design decision has a rationale. When we configure the MMU, we don&amp;rsquo;t just say &amp;ldquo;set TCR_EL1 to this magic number.&amp;rdquo; We break down every bit field, explain what it controls, and why we chose that value.&lt;/p&gt;
&lt;p&gt;We also focus on understanding the features. A production OS needs thousands of things we don&amp;rsquo;t build: filesystems, networking, user mode, multicore support, security hardening. We skip all of that. Not because those things aren&amp;rsquo;t important, but because they all build on the foundation we&amp;rsquo;re teaching here. You can&amp;rsquo;t write a filesystem without understanding memory management. You can&amp;rsquo;t implement a network stack without interrupts. Get the foundation right, and the rest is (hard, but conceptually clear) engineering.&lt;/p&gt;
&lt;p&gt;And we&amp;rsquo;re using Rust, which honestly makes bare-metal programming less terrifying than it used to be. The type system catches entire classes of bugs at compile time. You&amp;rsquo;ll still write plenty of &lt;code&gt;unsafe&lt;/code&gt; code (this is an OS, after all), but the safe parts of Rust keep you honest about where the dangerous bits are.&lt;/p&gt;
&lt;p&gt;Operating systems sit at the intersection of hardware (registers, interrupts, memory controllers), architecture (x86 vs ARM, privilege levels, MMUs), concurrency (multiple tasks, race conditions), and abstraction (clean APIs over messy hardware). There&amp;rsquo;s no debugger, no standard library, and mistakes cause silent crashes. This series shows you how to navigate that complexity, one piece at a time.&lt;/p&gt;
&lt;h2 id=&#34;4-why-rust-and-not-c-or-assembly&#34;&gt;4. Why Rust? (and not C or assembly)&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re building an OS, you&amp;rsquo;re probably wondering: why Rust? Traditionally, kernels are written in C (Linux, xv6, Minix) or even raw assembly. Both are fine choices. But Rust brings something genuinely new to the table.&lt;/p&gt;
&lt;h3 id=&#34;41-the-problem-with-c&#34;&gt;4.1 The problem with C&lt;/h3&gt;
&lt;p&gt;C gives you total control. No garbage collector, no runtime, direct memory access. That&amp;rsquo;s why it&amp;rsquo;s been the lingua franca of OS development for 50 years. But C also trusts you completely, and that trust is the problem. Buffer overflows, use-after-free, null pointer dereferences, data races: these aren&amp;rsquo;t theoretical. They&amp;rsquo;re the source of roughly 70% of security vulnerabilities in production systems (Microsoft and Google have both published studies confirming this).&lt;/p&gt;
&lt;p&gt;In kernel code, these bugs are catastrophic. A buffer overflow in userspace causes your program to crash. A kernel-space buffer overflow corrupts the entire system. There&amp;rsquo;s no safety net below you.&lt;/p&gt;
&lt;h3 id=&#34;42-the-problem-with-assembly-only&#34;&gt;4.2 The problem with assembly only&lt;/h3&gt;
&lt;p&gt;You could write an OS in pure assembly. Some people do, and there&amp;rsquo;s real value in understanding every instruction. But assembly doesn&amp;rsquo;t scale. An OS needs abstractions (traits, modules, type checking) to stay maintainable. Writing a mailbox router in assembly would work, but debugging it would be miserable. And you&amp;rsquo;d lose all the benefits of a compiler that can optimize, inline, and catch type errors for you.&lt;/p&gt;
&lt;h3 id=&#34;43-what-rust-gives-you&#34;&gt;4.3 What Rust gives you&lt;/h3&gt;
&lt;p&gt;Rust&amp;rsquo;s ownership system catches entire classes of bugs at compile time. You can&amp;rsquo;t use a value after freeing it. You can&amp;rsquo;t have two mutable references to the same data. You can&amp;rsquo;t forget to initialize memory. The borrow checker is annoying until you realize it&amp;rsquo;s catching bugs that would take hours to debug on bare metal, where there&amp;rsquo;s no debugger, no address sanitizer, and no core dump.&lt;/p&gt;
&lt;p&gt;But Rust also gets out of your way when you need it to. The &lt;code&gt;unsafe&lt;/code&gt; keyword lets you write raw pointer dereferences, inline assembly, and MMIO operations. You have to be explicit about it. The dangerous parts are clearly marked, and the safe parts are genuinely safe. This is a huge improvement over C, where everything is implicitly unsafe.&lt;/p&gt;
&lt;p&gt;Rust&amp;rsquo;s &lt;code&gt;no_std&lt;/code&gt; ecosystem is also mature. Crates like &lt;code&gt;bootloader&lt;/code&gt;, &lt;code&gt;uart_16550&lt;/code&gt;, and &lt;code&gt;volatile&lt;/code&gt; provide building blocks for OS development. The &lt;code&gt;core&lt;/code&gt; library gives you basic types, traits, and iterators without needing an allocator. And &lt;code&gt;#[repr(C)]&lt;/code&gt; lets you control struct layout for hardware register interactions.&lt;/p&gt;
&lt;p&gt;Concretely, here are bugs Rust prevented during this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The compiler refused to let us access the IPC router from an interrupt handler without explicit synchronization (&lt;code&gt;UnsafeCell&lt;/code&gt; + &lt;code&gt;Sync&lt;/code&gt; impl)&lt;/li&gt;
&lt;li&gt;A missing &lt;code&gt;volatile&lt;/code&gt; read would have been optimized away in C, silently breaking UART output. In Rust, we had to use &lt;code&gt;read_volatile&lt;/code&gt;, making the intent clear explicitly&lt;/li&gt;
&lt;li&gt;Type mismatches between page table entry formats were caught at compile time, not at boot time, with a mysterious hang&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is Rust perfect for OS development? No. The borrow checker sometimes fights you in ways that feel unnecessary for single-threaded kernel code. &lt;code&gt;static mut&lt;/code&gt; is awkward. Some patterns that are natural in C require contortions in Rust. But on balance, we think the trade-off is overwhelmingly positive. You spend a little more time satisfying the compiler, and a lot less time debugging silent memory corruption.&lt;/p&gt;
&lt;h2 id=&#34;5-getting-started&#34;&gt;5. Getting started&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need Rust (nightly), QEMU, and basic Rust knowledge. If you know what ownership and traits are, you&amp;rsquo;re good. If you&amp;rsquo;ve written a function that takes &lt;code&gt;&amp;amp;self&lt;/code&gt; and returned a &lt;code&gt;Result&lt;/code&gt;, you&amp;rsquo;ll be fine. You don&amp;rsquo;t need to know assembly or have prior OS background. That&amp;rsquo;s the whole point of the series.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Tool&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
          &lt;th&gt;Installation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt; (nightly)&lt;/td&gt;
          &lt;td&gt;Bare-metal compilation&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;rustup default nightly&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;QEMU&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Virtual machine for running our kernel&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;apt install qemu-system-aarch64&lt;/code&gt; or &lt;code&gt;brew install qemu&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Cloning the repository&lt;/td&gt;
          &lt;td&gt;You probably already have this&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;51-install-rust-nightly&#34;&gt;5.1 Install Rust (nightly)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install Rust via rustup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --proto &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Follow prompts, select default installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Then reload your shell environment:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;source&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$HOME&lt;/span&gt;/.cargo/env
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Switch to nightly (required for bare-metal features)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup default nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the rust-src component (needed for building core for bare-metal targets)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup component add rust-src --toolchain nightly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the AArch64 bare-metal target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustup target add aarch64-unknown-none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Verify it works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rustc --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustc 1.86.0-nightly &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;5765cbc51 2025-01-28&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rustup target list --installed | grep aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aarch64-unknown-none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;52-install-qemu&#34;&gt;5.2 Install QEMU&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install qemu-system-aarch64
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install qemu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Verify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ qemu-system-aarch64 --version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QEMU emulator version 8.2.2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;Debian 1:8.2.2+ds-0ubuntu1.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;53-clone-and-build&#34;&gt;5.3 Clone and build&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/bahree/rust-microkernel.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; rust-microkernel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;virt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; building aarch64 QEMU virt ELF &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;default features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Finished &lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt;release&lt;span style=&#34;color:#a6da95&#34;&gt;`&lt;/span&gt; profile &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;optimized&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; target&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;s&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; in 0.28s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;virt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt; wrote dist/virt/os-aarch64-virt.elf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;54-run-it&#34;&gt;5.4 Run it&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: memory management demo &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;frames + page tables&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo start
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;kernel_end&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009A010
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;free_start&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;ram_end&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000050000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;frame0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009B000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;frame1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x000000004009C000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;read0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x00000000AABBCCDD
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;read1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000011223344
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;ttbr0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000040085000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;test_va&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x0000000080000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: enabling MMU &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;caches off&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: &lt;span style=&#34;color:#f4dbd6&#34;&gt;test_va_read&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0x00000000DEADBEEF
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mm: demo &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;MMU is ON&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Press &lt;code&gt;Ctrl+A&lt;/code&gt; then &lt;code&gt;X&lt;/code&gt; to exit QEMU.&lt;/p&gt;
&lt;figure id=&#34;fig1&#34;&gt;
&lt;img src=&#34;images/demo-memory.png&#34; alt=&#34;Memory demo: kernel boots, allocates frames, builds page tables, enables the MMU, and reads back through a translated virtual address&#34; title=&#34;Memory demo: kernel boots, allocates frames, builds page tables, enables the MMU, and reads back through a translated virtual address&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 1:&lt;/strong&gt; Memory demo output showing frame allocation, page table construction, MMU enablement, and virtual address translation.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you see that output, congratulations. You just ran an operating system kernel that booted on bare metal, allocated physical memory frames, built 4-level page tables, enabled the MMU, and successfully translated a virtual address from a few shell commands.&lt;/p&gt;
&lt;h3 id=&#34;55-try-the-other-demos&#34;&gt;5.5 Try the other demos&lt;/h3&gt;
&lt;p&gt;The codebase has multiple demos you can build with feature flags:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# IPC + cooperative scheduling (Part 2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh demo-ipc &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: IPC + cooperative scheduling demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: kernel online
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: microkernel step &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;IPC + cooperative scheduling&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sched: starting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: poll
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/ping: sent ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task/pong: got ping
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Preemptive multitasking (Part 3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./scripts/build-aarch64-virt.sh demo-preempt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: aarch64 QEMU virt boot OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rustOS: preemptive multitasking demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;B
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure id=&#34;fig2&#34;&gt;
&lt;img src=&#34;images/demo-ipc.png&#34; alt=&#34;IPC demo: ping and pong tasks exchanging messages through the mailbox router&#34; title=&#34;IPC demo: ping and pong tasks exchanging messages through the mailbox router&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; IPC demo showing ping and pong tasks exchanging messages through the mailbox router.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure id=&#34;fig3&#34;&gt;
&lt;img src=&#34;images/demo-preempt.png&#34; alt=&#34;Preempt demo: two threads alternating without ever yielding, proving the OS is in control&#34; title=&#34;Preempt demo: two threads alternating without ever yielding, proving the OS is in control&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Preempt demo showing two threads alternating without ever yielding, proving the OS is in control.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If all three demos work, your environment is fully set up and ready for the series.&lt;/p&gt;
&lt;h3 id=&#34;56-docker-no-local-setup&#34;&gt;5.6 Docker (no local setup)&lt;/h3&gt;
&lt;p&gt;If you just want to try it without installing anything:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull amitbahree/rust-microkernel:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -it amitbahree/rust-microkernel:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Inside the container:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/build-aarch64-virt.sh &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./scripts/run-aarch64-virt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;x86_64 and Raspberry Pi builds also exist in the repository. Run &lt;code&gt;./scripts/build-x86.sh&lt;/code&gt; or &lt;code&gt;./scripts/build-rpi.sh&lt;/code&gt; if you want to try them. They share the same kernel logic but use different boot code and hardware drivers.&lt;/p&gt;
&lt;h2 id=&#34;6-series-roadmap&#34;&gt;6. Series roadmap&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what each part covers and why it comes in that order. Each part builds on the previous one. You can&amp;rsquo;t preempt tasks without interrupts. You can&amp;rsquo;t isolate processes without virtual memory. The ordering isn&amp;rsquo;t arbitrary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 0: Why build an OS from scratch?&lt;/strong&gt; (you are here) — The overview. What we&amp;rsquo;re building, why, and how the pieces fit together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 1: Foundations&lt;/strong&gt; — How a CPU goes from power-on to running your first line of Rust. AArch64 boot assembly that drops from EL2 to EL1, stack setup, BSS zeroing, PL011 UART driver, and the platform abstraction (HAL) that keeps the kernel hardware-agnostic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 2: Communication&lt;/strong&gt; — Message-passing IPC with a mailbox router. Tasks implement a &lt;code&gt;poll()&lt;/code&gt; method, the scheduler calls them round-robin, and we build PingTask/PongTask to show communication in action. Plus why cooperative scheduling has limits (one misbehaving task freezes everything).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 3: Concurrency&lt;/strong&gt; — The big one. ARM Generic Timer, GICv2 interrupt controller, periodic timer interrupts, and a preemptive scheduler that saves all 31 registers plus SP, ELR, and SPSR. Two threads print &amp;ldquo;A&amp;rdquo; and &amp;ldquo;B&amp;rdquo; without ever yielding, proving the OS is in control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 4: Memory and beyond&lt;/strong&gt; — Virtual memory from the ground up. Bump allocator for physical frames, 4-level page tables (L0/L1/L2/L3), MMU configuration with MAIR, TCR, and TTBR0, and address translation verified by writing through a virtual address and reading back through the physical one. Ends with reflections and where to go next.&lt;/p&gt;
&lt;h2 id=&#34;7-the-big-picture-what-makes-an-operating-system&#34;&gt;7. The big picture: what makes an operating system?&lt;/h2&gt;
&lt;p&gt;Before we start building, let&amp;rsquo;s understand what we&amp;rsquo;re aiming for. An operating system has many layers, and we&amp;rsquo;re focusing on the foundational ones that everything else depends on.&lt;/p&gt;
&lt;h3 id=&#34;71-complete-os-architecture&#34;&gt;7.1 Complete OS architecture&lt;/h3&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig5&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    subgraph &amp;#34;User Space (Ring 3 / EL0)&amp;#34;
        Apps[Applications&amp;lt;br/&amp;gt;ls, cat, browser, games]
        Libs[Standard Libraries&amp;lt;br/&amp;gt;libc, libstd]
        Shell[Shell&amp;lt;br/&amp;gt;bash, zsh]
    end

    subgraph &amp;#34;Kernel Space (Ring 0 / EL1)&amp;#34;
        subgraph &amp;#34;System Call Interface&amp;#34;
            Syscalls[System Calls&amp;lt;br/&amp;gt;open, read, write, fork]
        end

        subgraph &amp;#34;Process Management&amp;#34;
            Sched[Scheduler&amp;lt;br/&amp;gt;Round-robin, CFS, priorities]
            IPC[IPC&amp;lt;br/&amp;gt;Message passing, pipes, signals]
            Proc[Process Table&amp;lt;br/&amp;gt;PIDs, state, resources]
        end

        subgraph &amp;#34;Memory Management&amp;#34;
            VMM[Virtual Memory&amp;lt;br/&amp;gt;Page tables, TLB, swapping]
            Heap[Heap Allocator&amp;lt;br/&amp;gt;malloc/free, buddy system]
            MMU[MMU Control&amp;lt;br/&amp;gt;TTBR, page faults]
        end

        subgraph &amp;#34;File Systems&amp;#34;
            VFS[VFS Layer&amp;lt;br/&amp;gt;Common file API]
            FS[File Systems&amp;lt;br/&amp;gt;ext4, FAT, NTFS]
            Cache[Page Cache&amp;lt;br/&amp;gt;Read-ahead, write-back]
        end

        subgraph &amp;#34;Device Drivers&amp;#34;
            Block[Block Devices&amp;lt;br/&amp;gt;Disk, SSD, NVMe]
            Net[Network&amp;lt;br/&amp;gt;Ethernet, WiFi, TCP/IP]
            Char[Character Devices&amp;lt;br/&amp;gt;UART, keyboard, mouse]
            GPU[Graphics&amp;lt;br/&amp;gt;Framebuffer, GPU drivers]
        end

        subgraph &amp;#34;Core Kernel - WHAT WE BUILD&amp;#34;
            Boot[Boot&amp;lt;br/&amp;gt;Platform init, entry]
            Int[Interrupts&amp;lt;br/&amp;gt;Timer, exceptions, GIC/PIC]
            Ctx[Context Switch&amp;lt;br/&amp;gt;Save/restore registers]
            Mem[Physical Memory&amp;lt;br/&amp;gt;Frame allocator]
        end
    end

    subgraph &amp;#34;Hardware&amp;#34;
        CPU[CPU&amp;lt;br/&amp;gt;Cores, caches, MMU]
        RAM[RAM&amp;lt;br/&amp;gt;Physical memory]
        Disk[Storage&amp;lt;br/&amp;gt;HDD, SSD]
        Devices[Peripherals&amp;lt;br/&amp;gt;UART, Timer, GPIO]
    end

    Apps --&amp;gt; Syscalls
    Libs --&amp;gt; Syscalls
    Shell --&amp;gt; Syscalls

    Syscalls --&amp;gt; Sched
    Syscalls --&amp;gt; VMM
    Syscalls --&amp;gt; VFS

    Sched --&amp;gt; Ctx
    Sched --&amp;gt; Proc
    Sched --&amp;gt; IPC

    VMM --&amp;gt; MMU
    VMM --&amp;gt; Heap
    VMM --&amp;gt; Mem

    VFS --&amp;gt; FS
    VFS --&amp;gt; Cache
    FS --&amp;gt; Block

    Block --&amp;gt; Devices
    Net --&amp;gt; Devices
    Char --&amp;gt; Devices
    GPU --&amp;gt; Devices

    Int --&amp;gt; CPU
    Ctx --&amp;gt; CPU
    MMU --&amp;gt; CPU
    Mem --&amp;gt; RAM
    Boot --&amp;gt; CPU

    style Boot fill:#e8f5e8
    style Int fill:#e8f5e8
    style Ctx fill:#e8f5e8
    style Mem fill:#e8f5e8
    style IPC fill:#fff4e1
    style Sched fill:#fff4e1
    style VMM fill:#fff4e1&lt;/pre&gt;
    &lt;figcaption&gt;Figure 5: Complete OS architecture showing what we build&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Look at that diagram. It&amp;rsquo;s a lot. But here&amp;rsquo;s the thing: we&amp;rsquo;re only building the green and yellow boxes at the bottom. Boot, interrupts, context switching, physical memory, IPC, scheduling, and virtual memory. That&amp;rsquo;s the core kernel layer, the absolute foundation that every OS needs. These aren&amp;rsquo;t optional features you can skip. They&amp;rsquo;re the bedrock on which everything else is built.&lt;/p&gt;
&lt;h3 id=&#34;72-what-we-build-the-foundation&#34;&gt;7.2 What we build (the foundation)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Boot sequences&lt;/strong&gt; (Part 1) are how a computer goes from pressing the power button to running your kernel&amp;rsquo;s first line of code. It&amp;rsquo;s the handoff between hardware/firmware and your operating system. On ARM, this means handling exception levels (EL2 hypervisor to EL1 kernel), setting up a stack, zeroing the BSS, and enabling floating-point instructions before the LLVM-generated code can run. Get any step wrong, and the CPU hangs silently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IPC and scheduling&lt;/strong&gt; (Parts 2 and 3) are how multiple tasks run on a single CPU core. The scheduler decides who runs when. IPC lets tasks communicate without sharing memory. We start with cooperative scheduling (tasks voluntarily yield) and upgrade to preemptive scheduling (the OS is in control). This requires context switching: saving all 31 ARM registers, the stack pointer, the return address, and the CPU flags, then loading another task&amp;rsquo;s saved state.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interrupts and exceptions&lt;/strong&gt; (Part 3) are hardware signals that tell the CPU, &amp;ldquo;stop what you&amp;rsquo;re doing and handle this NOW.&amp;rdquo; The timer fires, interrupt! Without interrupts, your OS would have to constantly poll hardware (&amp;ldquo;Are you done yet? How about now?&amp;rdquo;), wasting billions of CPU cycles. And you&amp;rsquo;d have no way to switch between tasks forcibly. Interrupts are the foundation for everything asynchronous in a computer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory management&lt;/strong&gt; (Part 4) is the illusion that each program has its own private address space. The MMU (Memory Management Unit) translates every address using page tables, a 4-level tree structure that maps virtual addresses to physical ones. We build those tables, configure the MMU, and enable translation. After that, every memory access your code makes goes through hardware that we configured.&lt;/p&gt;
&lt;h3 id=&#34;73-what-we-dont-build&#34;&gt;7.3 What we don&amp;rsquo;t build&lt;/h3&gt;
&lt;p&gt;We skip filesystems, networking, user mode, multicore, and security hardening. Not because they&amp;rsquo;re unimportant, but because they all build on the foundation we&amp;rsquo;re teaching. You can&amp;rsquo;t write a filesystem without memory management. You can&amp;rsquo;t implement a network stack without interrupts. You can&amp;rsquo;t add user mode without understanding privilege levels and page tables. Part 4 points you to resources for going deeper into each of these areas.&lt;/p&gt;
&lt;h2 id=&#34;8-repository-structure&#34;&gt;8. Repository structure&lt;/h2&gt;
&lt;p&gt;The full source code is at &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt;. Here&amp;rsquo;s how it&amp;rsquo;s organized, focused on the AArch64 virt platform that the blog series covers:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rust-microkernel/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── crates/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── kernel/                 # Platform-agnostic kernel logic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── lib.rs              # Entry point (kmain)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── ipc.rs              # Message-passing router
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── sched.rs            # Cooperative scheduler
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── hal/                    # Hardware abstraction layer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   ├── log.rs              # Logger trait
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   │   └── arch.rs             # Architecture primitives (halt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── arch_aarch64_virt/      # AArch64 QEMU virt platform
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── boot.S              # Assembly: EL2→EL1 drop, vectors
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── main.rs             # Rust entry point
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── uart.rs             # PL011 UART driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── timer.rs            # Generic Timer + GIC
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       ├── preempt.rs          # Context switching
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│       └── mem.rs              # Frame allocator + MMU
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── build-aarch64-virt.sh   # Build AArch64 virt kernel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── run-aarch64-virt.sh     # Run in QEMU
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── docs/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── blog/                   # This blog series
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── dist/                       # Build artifacts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;kernel&lt;/code&gt; crate knows nothing about hardware. It accepts a &lt;code&gt;Logger&lt;/code&gt; trait object and calls &lt;code&gt;.log()&lt;/code&gt; to print messages. The &lt;code&gt;hal&lt;/code&gt; crate defines that trait. The &lt;code&gt;arch_aarch64_virt&lt;/code&gt; crate implements it with a real UART driver and handles everything ARM-specific: boot assembly, timer setup, interrupt routing, page tables.&lt;/p&gt;
&lt;p&gt;The x86_64 and Raspberry Pi platform crates (&lt;code&gt;arch_x86_64&lt;/code&gt;, &lt;code&gt;arch_aarch64_rpi&lt;/code&gt;) also exist in &lt;code&gt;crates/&lt;/code&gt; and follow the same pattern. They&amp;rsquo;re not covered in the blog series, but use the same &lt;code&gt;kernel&lt;/code&gt; and &lt;code&gt;hal&lt;/code&gt; crates.&lt;/p&gt;
&lt;h2 id=&#34;9-references-and-acknowledgments&#34;&gt;9. References and acknowledgments&lt;/h2&gt;
&lt;p&gt;This project stands on the shoulders of giants. Philipp Oppermann&amp;rsquo;s &lt;a
	
		href = &#34;https://os.phil-opp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&amp;ldquo;Writing an OS in Rust&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; showed that Rust OS development is not only possible but genuinely enjoyable. MIT&amp;rsquo;s &lt;a
	
		href = &#34;https://pdos.csail.mit.edu/6.828/2023/xv6.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xv6
	&lt;/span&gt;
&lt;/a&gt; demonstrated that you can teach OS internals with a clean, readable codebase. The &lt;a
	
		href = &#34;https://wiki.osdev.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OSDev community
	&lt;/span&gt;
&lt;/a&gt; has been documenting hardware quirks and boot sequences for decades, and their wiki is invaluable.&lt;/p&gt;
&lt;p&gt;For operating systems theory, &lt;a
	
		href = &#34;https://pages.cs.wisc.edu/~remzi/OSTEP/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Operating Systems: Three Easy Pieces
	&lt;/span&gt;
&lt;/a&gt; (free online) is the best introduction we&amp;rsquo;ve found. For ARM architecture specifics, the &lt;a
	
		href = &#34;https://developer.arm.com/documentation/ddi0487/latest/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ARM Architecture Reference Manual
	&lt;/span&gt;
&lt;/a&gt; is the definitive reference (and it&amp;rsquo;s freely available). For bare-metal Rust patterns, the &lt;a
	
		href = &#34;https://docs.rust-embedded.org/book/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Embedded Rust Book
	&lt;/span&gt;
&lt;/a&gt; covers &lt;code&gt;no_std&lt;/code&gt; development in depth.&lt;/p&gt;
&lt;p&gt;We also learned from real microkernel projects: &lt;a
	
		href = &#34;https://sel4.systems/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seL4
	&lt;/span&gt;
&lt;/a&gt; (formally verified, beautifully designed), &lt;a
	
		href = &#34;https://www.minix3.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minix 3
	&lt;/span&gt;
&lt;/a&gt; (Tanenbaum&amp;rsquo;s vision of what microkernels should be), and the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/L4_microkernel_family&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		L4 family
	&lt;/span&gt;
&lt;/a&gt; (proving that microkernel IPC can be fast).&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;5-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 0 (this): Why build an OS from scratch?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/02/building-microkernel-part1-foundations-boot/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1: Foundations
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part2-communication-ipc/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Communication
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/03/building-microkernel-part3-concurrency-preemption/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Concurrency
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/04/building-microkernel-part4-memory-mmu/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Memory and beyond
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — full source code and build scripts&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker Image&lt;/strong&gt;: &lt;a
	
		href = &#34;https://hub.docker.com/r/amitbahree/rust-microkernel&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		amitbahree/rust-microkernel
	&lt;/span&gt;
&lt;/a&gt; — prebuilt dev environment with Rust, QEMU, and source code&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Building LLMs from Scratch - Part 4: Evaluation &amp; Deployment</title>
      <link>/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/</link>
      <pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this final part of our 4-part series on building language models from scratch, we explore the evaluation, testing, and deployment pipeline that transforms our trained historical language models into working systems. &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt; showed you how to use the published models, &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt; covered data collection and custom tokenization, and &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt; detailed the model architecture and training infrastructure. Here, we complete the journey with evaluation frameworks, testing infrastructure, and deployment to Hugging Face Hub.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need much larger datasets, more sophisticated infrastructure, and additional considerations not covered here.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As outlined in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the Regular Model (354M parameters) use the same training code and infrastructure with different configurations defined in &lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;. The evaluation and deployment infrastructure is also identical - only the model architecture parameters differ.&lt;/p&gt;
&lt;p&gt;Both PyTorch checkpoint inference and Hugging Face model inference are fully working and available. Both the SLM and the Regular model are published on &lt;a
	
		href = &#34;https://huggingface.co/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;. Local PyTorch checkpoints can be used directly for inference with the script &lt;strong&gt;&lt;code&gt;inference_pytorch.py&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete evaluation and deployment infrastructure (&lt;strong&gt;&lt;code&gt;05_evaluation/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt;) plus guides (&lt;strong&gt;&lt;code&gt;08_documentation/EVALUATION_GUIDE.md&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;08_documentation/HUGGINGFACE_PUBLISHING.md&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;08_documentation/DEPLOYMENT_GUIDE.md&lt;/code&gt;&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟥 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 - Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 - Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 - Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | Part 4 (this post)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟧 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📗 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-evaluation-challenge-measuring-what-matters-for-historical-language-models&#34;&gt;1. The Evaluation Challenge: Measuring What Matters for Historical Language Models&lt;/h2&gt;
&lt;p&gt;Now that we have trained models from &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;, we face a critical question: &lt;em&gt;How do we know if our models actually work?&lt;/em&gt; This isn&amp;rsquo;t just about checking if the code runs - it&amp;rsquo;s about validating that the models can generate historically accurate, linguistically appropriate text that captures the essence of 1500-1850 London English.&lt;/p&gt;
&lt;p&gt;The challenge with evaluating historical language models goes far beyond standard LLM metrics. Standard evaluation approaches like Perplexity and BLEU scores (we explain these and other metrics in &lt;a
	
		href = &#34;#industry-standard-metrics&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 2.1
	&lt;/span&gt;
&lt;/a&gt;) tell us whether the model generates fluent text. Still, they don&amp;rsquo;t answer the questions that matter for historical applications: &lt;em&gt;Does the model avoid anachronisms? Can it distinguish between Tudor and Victorian language patterns? Does it understand London geography and historical context?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Consider a simple example: if we prompt the model with &lt;em&gt;&amp;ldquo;In the year 1600, I traveled to London by railway&amp;rdquo;&lt;/em&gt;, a standard language model might generate this without flagging the obvious problem - railways didn&amp;rsquo;t exist in 1600. The evaluation framework needs to catch these &lt;strong&gt;temporal inconsistencies&lt;/strong&gt;, &lt;strong&gt;period-inappropriate language&lt;/strong&gt;, and &lt;strong&gt;historical inaccuracies&lt;/strong&gt; that standard metrics miss.&lt;/p&gt;
&lt;p&gt;This evaluation challenge requires building a specialized assessment pipeline that understands historical context, temporal boundaries, and period-specific linguistic patterns. We need metrics that can distinguish between a model that generates fluent modern English and one that produces authentic historical text - two very different capabilities.&lt;/p&gt;
&lt;h3 id=&#34;11-high-level-evaluation-strategy&#34;&gt;1.1 High-Level Evaluation Strategy&lt;/h3&gt;
&lt;p&gt;Our evaluation framework provides two complementary approaches that work with both PyTorch checkpoints and Hugging Face models, as illustrated in &lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; below.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[🤖 Trained Models&amp;lt;br/&amp;gt;SLM 117M / Regular 354M] --&amp;gt; B{Evaluation Type}
    
    B --&amp;gt;|Quick| C[⚡ Quick Evaluation&amp;lt;br/&amp;gt;Historical accuracy, language quality, coherence]
    B --&amp;gt;|Comprehensive| D[🔬 Comprehensive Evaluation&amp;lt;br/&amp;gt;Benchmarks, G-Eval, groundedness]
    
    C --&amp;gt; E[📊 Evaluation Results&amp;lt;br/&amp;gt;Historical accuracy scores, metrics]
    D --&amp;gt; E
    
    E --&amp;gt; F{Quality OK?}
    F --&amp;gt;|Yes| G[🚀 Deployment Options]
    F --&amp;gt;|No| H[🔄 Retrain/Adjust]
    H --&amp;gt; A
    
    G --&amp;gt; I[📦 PyTorch Checkpoints&amp;lt;br/&amp;gt;Direct inference]
    G --&amp;gt; J[🤗 Hugging Face Hub&amp;lt;br/&amp;gt;Published models]
    G --&amp;gt; K[💻 Local Deployment&amp;lt;br/&amp;gt;API, CLI, notebooks]
    
    I --&amp;gt; L[✅ Working Models&amp;lt;br/&amp;gt;Ready for use]
    J --&amp;gt; L
    K --&amp;gt; L
    
    style A fill:#e1f5fe
    style E fill:#f3e5f5
    style L fill:#e8f5e8
    style H fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Evaluation and Deployment Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Quick Evaluation&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;quick_eval.py&lt;/code&gt;&lt;/strong&gt;): Rapid validation testing historical accuracy on key events (e.g., 1665 plague, 1666 fire, etc.), language quality metrics (vocabulary diversity, historical pattern detection, readability), and coherence (ROUGE scores). Runs in minutes without external APIs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comprehensive Evaluation&lt;/strong&gt; (&lt;strong&gt;&lt;code&gt;comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt;): Extends quick evaluation with benchmark datasets (small &lt;strong&gt;MMLU&lt;/strong&gt; and &lt;strong&gt;HellaSWAG&lt;/strong&gt; subsets), groundedness/fluency metrics, and optional LLM-as-a-judge scoring via &lt;strong&gt;G-Eval&lt;/strong&gt; (using an external GPT model). Produces detailed reports with generation samples.&lt;/p&gt;
&lt;p&gt;Both evaluators test across historical periods (such as Tudor, Stuart, and Georgian), language patterns (archaic pronouns and verb forms), and London-specific knowledge (geography and landmarks). The framework goes beyond standard LM metrics to assess period-appropriate language, temporal consistency, and historical accuracy.&lt;/p&gt;
&lt;h2 id=&#34;2-model-evaluation-framework&#34;&gt;2. Model Evaluation Framework&lt;/h2&gt;
&lt;p&gt;Now that we&amp;rsquo;ve outlined the evaluation challenge, let&amp;rsquo;s dive into the implementation. Our evaluation framework provides two complementary approaches that work with both PyTorch checkpoints and Hugging Face models. The framework is designed to be practical for a learning project while still providing meaningful insights into model performance.&lt;/p&gt;
&lt;h3 id=&#34;21-historical-linguistic-and-category-specific-evaluation&#34;&gt;2.1 Historical, Linguistic, and Category-Specific Evaluation&lt;/h3&gt;
&lt;p&gt;To make the evaluation concrete, we look at the model from three complementary aspects that together capture how well it understands the period, writes fluent text, and handles the different slices of the corpus. This multi-dimensional approach ensures we catch various types of failures - a model might generate grammatically perfect text but fail historically, or vice versa.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Historical assessments&lt;/strong&gt;: Quick evaluation uses targeted prompts around key events (e.g., 1665 plague, 1666 fire, Old Bailey trials) and checks for expected keywords and phrases. Comprehensive evaluation adds temporal consistency checks (forbidden/required terms per period), date-range sanity checks, and historical benchmarks (custom historical questions and the MMLU subset).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linguistic assessments&lt;/strong&gt;: We measure surface quality (chars/words/sentences per sample, words per sentence), vocabulary diversity (unique/total tokens), readability (Flesch-style scores), and presence of historical patterns (archaic verb forms like &lt;em&gt;hath, doth&lt;/em&gt;, pronouns like &lt;em&gt;thou, thee&lt;/em&gt;, conjunctions and interjections). This shows whether the model writes in a historically flavored yet readable style.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category-specific benchmarks&lt;/strong&gt;: Evaluations are grouped by period (Tudor, Stuart, Georgian), by linguistic phenomena (archaic forms, dialogue patterns), and by London knowledge (Thames, Westminster, Old Bailey, etc.). The comprehensive evaluator further probes general reasoning using HellaSWAG and MMLU subsets to assess the model&amp;rsquo;s performance across broader benchmarks.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a id=&#34;industry-standard-metrics&#34;&gt;&lt;/a&gt;&lt;strong&gt;Industry-Standard Evaluation Metrics and Benchmarks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our evaluation framework uses several standard metrics and benchmarks from LLM research. Here&amp;rsquo;s what each one measures and why we include it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perplexity&lt;/strong&gt;: How surprised the model is by the reference text; lower is better because it means the model assigns higher probability to what actually happened in the corpus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BLEU / ROUGE&lt;/strong&gt;: N-gram overlap between generated and reference text, giving a rough sense of literal similarity and how closely the model &amp;ldquo;sticks&amp;rdquo; to the reference phrasing. We use &lt;strong&gt;ROUGE-L&lt;/strong&gt; (longest common subsequence) to evaluate coherence and narrative flow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MMLU&lt;/strong&gt; (&lt;em&gt;Massive Multitask Language Understanding&lt;/em&gt;): A large multiple-choice exam covering many academic subjects. Here, we use a tiny subset as a sanity check for general knowledge and reasoning, not as a primary goal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HellaSWAG&lt;/strong&gt;: A commonsense inference benchmark where the model must pick a plausible continuation for a short story-like context. We use it to see whether the model&amp;rsquo;s basic reasoning looks sensible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;G-Eval&lt;/strong&gt;: An &lt;em&gt;LLM-as-a-judge&lt;/em&gt; pattern where a stronger reference model (for example, GPT) scores generated text along dimensions like coherence or groundedness. In this project, it is optional and requires an external API key.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groundedness&lt;/strong&gt;: Asks: &lt;em&gt;does the model stick to the provided context / known facts, or hallucinate?&lt;/em&gt; Our implementation approximates this by comparing generations against reference answers and historical constraints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a deeper treatment of evaluation benchmarks (including MMLU, HellaSWAG, and LLM-as-a-judge methods like G-Eval), see &lt;strong&gt;Chapter 12 - Evaluating and Monitoring Generative Systems&lt;/strong&gt; in the book 📘 &lt;em&gt;&lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;22-automated-evaluation-pipeline&#34;&gt;2.2 Automated Evaluation Pipeline&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;run_comprehensive_evaluation&lt;/code&gt; function in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; orchestrates the entire evaluation process. &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt; shows how it works: We iterate over test sets, generate text with the model, compute all the metrics defined above, and aggregate the results into a results dictionary for analysis.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_comprehensive_evaluation&lt;/span&gt;(model, tokenizer, test_data, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run comprehensive evaluation on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize evaluation metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    metrics &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perplexity&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bleu_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rouge_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence_scores&amp;#39;&lt;/span&gt;: [],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Evaluate on different text types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; text_type, samples &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Evaluating on &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text_type&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; samples...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sample &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; samples:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;], device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            perplexity &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_perplexity(model, tokenizer, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;], device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            bleu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_bleu(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reference&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            rouge &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; calculate_rouge(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reference&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            hist_acc &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_historical_accuracy(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;context&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ling_qual &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_linguistic_quality(generated)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            coherence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_coherence(generated)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            temp_cons &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; assess_temporal_consistency(generated, sample[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Store metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perplexity&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(perplexity)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bleu_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(bleu)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rouge_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(rouge)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(hist_acc)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(ling_qual)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence_scores&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(coherence)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            metrics[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(temp_cons)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate aggregate metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; metric_name, values &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; metrics&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        results[metric_name] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mean&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;std&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;std(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max(values),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;median&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;median(values)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Comprehensive Evaluation Pipeline&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The pipeline computes all the metrics we outlined above (standard LM metrics such as perplexity and BLEU/ROUGE, plus our historically specific assessments of accuracy, linguistic quality, and coherence). Each metric provides a different lens through which to view model performance: perplexity measures how well the model predicts the training distribution, BLEU/ROUGE measures literal similarity to the reference text, and the custom metrics assess historical authenticity and linguistic appropriateness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why This Multi-Metric Approach Matters?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Standard language model evaluation often focuses on perplexity and n-gram overlap metrics, which measure general language quality but miss domain-specific requirements. For historical language models, we need to know not just whether the text is fluent, but whether it&amp;rsquo;s historically accurate, temporally consistent, and linguistically appropriate for the target period. This multi-metric approach ensures we catch different types of failures - a model might generate grammatically perfect text but fail historically, or produce historically accurate content with poor linguistic quality.&lt;/p&gt;
&lt;p&gt;The aggregation step (&lt;code&gt;computing mean&lt;/code&gt;, &lt;code&gt;std&lt;/code&gt;, &lt;code&gt;min&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt;, &lt;code&gt;median&lt;/code&gt;) provides a comprehensive view of model performance across different test cases. This statistical summary helps identify whether the model performs consistently or has high variance, whether certain types of prompts cause failures, and how the model compares across different historical periods and linguistic phenomena.&lt;/p&gt;
&lt;h3 id=&#34;23-historical-accuracy-assessment&#34;&gt;2.3 Historical Accuracy Assessment&lt;/h3&gt;
&lt;p&gt;Standard LLM evaluation metrics (perplexity, BLEU, ROUGE) measure general language quality, but they don&amp;rsquo;t tell us whether the model generates historically accurate text for London between 1500-1850. To address this, we built customized evaluation tools that check period-appropriate language, temporal consistency, London-specific geography and landmarks, and historical fact accuracy. These tools are implemented in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; as shown in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;assess_historical_accuracy&lt;/span&gt;(generated_text, historical_context):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Assess the historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check temporal consistency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temporal_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_temporal_consistency(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; temporal_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check historical facts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fact_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_historical_facts(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;facts&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; fact_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check period-appropriate language&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    language_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_period_language(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;time_period&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; language_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check geographical accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    geo_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_geographical_accuracy(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;location&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; geo_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check social context accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    social_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_social_context(generated_text, historical_context[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;social_class&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; social_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; accuracy_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_temporal_consistency&lt;/span&gt;(text, time_period):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check if text maintains temporal consistency with the specified period&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define period-specific constraints&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_constraints &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1500-1600&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;electricity&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;steam engine&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;railway&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ye&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1500&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1600&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1600-1700&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;railway&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telegraph&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1600&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1700&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1700-1800&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telegraph&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telephone&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1700&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1800&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1800-1850&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;telephone&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;automobile&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pray&amp;#39;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;: (&lt;span style=&#34;color:#f5a97f&#34;&gt;1800&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1850&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; time_period &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_constraints:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Neutral score for unknown periods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    constraints &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; period_constraints[time_period]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for forbidden terms (anachronisms)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forbidden_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for required period-appropriate terms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (period_terms_found &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;required_terms&amp;#39;&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check date references&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    date_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_date_references(text, constraints[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;date_range&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; date_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;min&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;, score))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Historical Accuracy Assessment&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The forbidden terms (like &amp;ldquo;electricity&amp;rdquo; for 1500-1600, &amp;ldquo;railway&amp;rdquo; for 1600-1700) are anachronisms - technologies or concepts that didn&amp;rsquo;t exist in those periods. We selected them based on historical timelines: electricity wasn&amp;rsquo;t harnessed until the late 1700s, railways didn&amp;rsquo;t appear until the early 1800s, and telegraphs came later. Similarly, the required terms (such as &amp;ldquo;hath&amp;rdquo;, &amp;ldquo;doth&amp;rdquo;, and &amp;ldquo;verily&amp;rdquo;) are archaic language patterns we observed frequently in the training corpus for each period.&lt;/p&gt;
&lt;p&gt;We analyzed the corpus to identify which linguistic markers were most characteristic of each era, then selected a small set that would catch obvious anachronisms without being overly restrictive. This is a practical heuristic rather than an exhaustive historical grammar - we focus on high-impact anachronisms and common period markers that are easy to detect automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the scoring works&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;check_temporal_consistency()&lt;/code&gt;&lt;/strong&gt; function starts with a score of &lt;code&gt;1.0&lt;/code&gt; and applies penalties and bonuses: each forbidden term found subtracts 0.2 (so finding &amp;ldquo;railway&amp;rdquo; in 1600-1700 text drops the score), while finding required period-appropriate terms adds up to &lt;code&gt;0.3&lt;/code&gt; based on how many are present. Date references within the period add up to 0.2. The final score ranges from &lt;code&gt;0.0&lt;/code&gt; to &lt;code&gt;1.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The overall &lt;strong&gt;&lt;code&gt;assess_historical_accuracy()&lt;/code&gt;&lt;/strong&gt; function then averages the five component scores (temporal consistency, historical facts, period-appropriate language, geographical accuracy, and social context) to produce a single score between 0 and 1, with higher values indicating better historical accuracy. In practice (and yes, we are generalizing), scores above &lt;code&gt;0.7&lt;/code&gt; indicate good historical consistency, while scores below &lt;code&gt;0.5&lt;/code&gt; suggest significant anachronisms or factual errors.&lt;/p&gt;
&lt;h3 id=&#34;24-linguistic-quality-evaluation&#34;&gt;2.4 Linguistic Quality Evaluation&lt;/h3&gt;
&lt;p&gt;While historical accuracy checks whether the model gets facts and period-appropriate terms right, linguistic quality measures how well the model writes - grammar, coherence, vocabulary diversity, sentence structure, and the presence of historical language patterns.&lt;/p&gt;
&lt;p&gt;Standard metrics like BLEU and ROUGE don&amp;rsquo;t capture whether the text reads naturally or uses appropriate archaic forms. We built customized tools that assess these dimensions, implemented in &lt;strong&gt;&lt;code&gt;05_evaluation/comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; as shown in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;To make this easier to read, it helps to view the code as a scoring &lt;em&gt;scaffold&lt;/em&gt; rather than a complete NLP system. Each &lt;strong&gt;&lt;code&gt;check_*&lt;/code&gt;&lt;/strong&gt; function is expected to return a normalized score in the range [0, 1] (higher is better), and &lt;strong&gt;&lt;code&gt;assess_linguistic_quality()&lt;/code&gt;&lt;/strong&gt; simply averages those components so you can track one headline number over time.&lt;/p&gt;
&lt;p&gt;This mirrors patterns from earlier in the series: in &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt; we used lightweight, automatable checks to validate data quality, and in &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt; we relied on simple, repeatable metrics to judge training health. Here, we do the same for generation quality: start with cheap checks that run everywhere, then iterate toward richer evaluators as needed.&lt;/p&gt;
&lt;p&gt;Also note that the exact weights (0.3/0.2, etc.) are tunable. The main benefit is splitting &amp;ldquo;linguistic quality&amp;rdquo; into components you can inspect individually, so when output is bad, you can tell &lt;em&gt;why&lt;/em&gt; (grammar-ish structure vs coherence vs vocabulary vs historically flavored patterns).&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;assess_linguistic_quality&lt;/span&gt;(generated_text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Assess the linguistic quality of generated historical text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check grammatical correctness&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    grammar_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_grammatical_correctness(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; grammar_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check coherence and flow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coherence_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_text_coherence(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; coherence_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check vocabulary appropriateness&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vocab_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_vocabulary_appropriateness(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; vocab_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check sentence structure variety&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    structure_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_sentence_structure_variety(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; structure_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check historical language patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pattern_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; check_historical_language_patterns(generated_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; pattern_score
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_grammatical_correctness&lt;/span&gt;(text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check grammatical correctness of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Parse text into sentences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nltk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sent_tokenize(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for basic grammatical patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; check_sentence_grammar(sentence):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; correct_sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(sentences)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_historical_language_patterns&lt;/span&gt;(text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check if text follows appropriate historical language patterns&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical verb forms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_verbs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hath&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;doth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dost&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;art&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wilt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;shalt&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; verb &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_verbs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; verb &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_verbs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (verb_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_verbs))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical pronouns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_pronouns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thou&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thee&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thy&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;thine&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ye&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pronoun &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_pronouns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; pronoun &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_pronouns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (pronoun_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_pronouns))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical conjunctions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_conjunctions &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;whilst&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;betwixt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;amongst&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ere&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;anon&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; conj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_conjunctions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; conj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_conjunctions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (conj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_conjunctions))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for appropriate use of historical interjections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_interjections &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;verily&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;indeed&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;forsooth&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prithee&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;marry&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; interj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; historical_interjections:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; interj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; historical_interjections:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (interj_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(historical_interjections))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; total_patterns &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; total_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Linguistic Quality Evaluation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;About NLTK:&lt;/strong&gt; We use &lt;strong&gt;NLTK&lt;/strong&gt; (Natural Language Toolkit), a standard Python library for natural language processing, to handle text tokenization. If you followed &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s setup instructions, NLTK was already installed as part of the data processing dependencies. In &lt;code&gt;check_grammatical_correctness()&lt;/code&gt;, we use &lt;code&gt;nltk.sent_tokenize()&lt;/code&gt; to split text into sentences so we can evaluate grammar sentence-by-sentence. NLTK also provides word tokenization (&lt;code&gt;word_tokenize&lt;/code&gt;) and BLEU score calculation (&lt;code&gt;sentence_bleu&lt;/code&gt;), which are used elsewhere in the evaluation pipeline.&lt;/p&gt;
&lt;p&gt;We chose NLTK because it&amp;rsquo;s well-established, handles edge cases (like abbreviations and historical punctuation), and provides reliable sentence boundaries even with archaic English patterns. The same qualities made it useful during data collection and cleaning (covered in &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The historical language patterns we check (verbs like &lt;em&gt;&lt;strong&gt;hath, doth&lt;/strong&gt;&lt;/em&gt;, pronouns like &lt;em&gt;&lt;strong&gt;thou, thee&lt;/strong&gt;&lt;/em&gt;, conjunctions like &lt;em&gt;&lt;strong&gt;whilst, betwixt&lt;/strong&gt;&lt;/em&gt;, and interjections like &lt;em&gt;&lt;strong&gt;verily, forsooth&lt;/strong&gt;&lt;/em&gt;) are the same archaic forms we identified during corpus analysis for temporal consistency. The difference here is that we&amp;rsquo;re measuring their presence as a positive signal of historical authenticity, rather than using them as required/forbidden constraints. Each pattern category (verbs, pronouns, conjunctions, interjections) contributes proportionally to the score based on how many patterns from that category appear in the text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the scoring works&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;assess_linguistic_quality()&lt;/code&gt;&lt;/strong&gt; function averages five component scores (&lt;code&gt;grammar&lt;/code&gt;, &lt;code&gt;coherence&lt;/code&gt;, &lt;code&gt;vocabulary appropriateness&lt;/code&gt;, &lt;code&gt;sentence structure variety&lt;/code&gt;, and &lt;code&gt;historical language patterns&lt;/code&gt;) to produce a single score between &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt;. Each component is evaluated independently and returns a score in the range &lt;code&gt;[0, 1]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For example, &lt;strong&gt;&lt;code&gt;check_grammatical_correctness()&lt;/code&gt;&lt;/strong&gt; counts the proportion of grammatically correct sentences, while &lt;strong&gt;&lt;code&gt;check_historical_language_patterns()&lt;/code&gt;&lt;/strong&gt; weights the presence of archaic verb forms (30%), pronouns (30%), conjunctions (20%), and interjections (20%) to produce a pattern score. The final linguistic quality score is the simple average of all five components. In practice, scores above &lt;code&gt;0.75&lt;/code&gt; indicate strong linguistic quality with good grammar and historical flavor, while scores below 0.6 suggest the model struggles with either basic grammar or historical language patterns.&lt;/p&gt;
&lt;h3 id=&#34;25-running-evaluations&#34;&gt;2.5 Running Evaluations&lt;/h3&gt;
&lt;p&gt;You can run the evaluators directly from the command line. The framework defaults to CPU for safety (so you can evaluate during training without GPU conflicts), but you can use &lt;code&gt;--device gpu&lt;/code&gt; when the GPU is free for faster evaluation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quick evaluation (runs in minutes, no external APIs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode quick --device cpu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Comprehensive evaluation (includes benchmarks, optional G-Eval)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode comprehensive --device cpu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The unified launcher (&lt;strong&gt;&lt;code&gt;run_evaluation.py&lt;/code&gt;&lt;/strong&gt;) supports multiple modes: &lt;code&gt;setup&lt;/code&gt; (install dependencies), &lt;code&gt;quick&lt;/code&gt; (fast validation), &lt;code&gt;comprehensive&lt;/code&gt; (full suite with benchmarks), &lt;code&gt;dataset&lt;/code&gt; (generate test cases), and &lt;code&gt;all&lt;/code&gt; (complete evaluation). You can also call &lt;strong&gt;&lt;code&gt;quick_eval.py&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;comprehensive_evaluator.py&lt;/code&gt;&lt;/strong&gt; directly if you need more control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical Evaluation Workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our typical evaluation workflow follows this pattern:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;After Training&lt;/strong&gt;: Run a quick evaluation to get immediate feedback on model performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Before Publishing&lt;/strong&gt;: Run a comprehensive evaluation to ensure the model meets quality standards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;During Development&lt;/strong&gt;: Use interactive testing to explore model behavior on specific prompts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Research&lt;/strong&gt;: Generate custom test datasets and run targeted evaluations&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The framework defaults to CPU for safety (so you can evaluate during training without GPU conflicts), but you can use &lt;code&gt;--device gpu&lt;/code&gt; when the GPU is free for faster evaluation. This design allows continuous assessment throughout the training process without interfering with GPU resources needed for training.&lt;/p&gt;
&lt;p&gt;For complete usage examples, command-line options, and troubleshooting, see the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Evaluation Guide
	&lt;/span&gt;
&lt;/a&gt; in the repository.&lt;/p&gt;
&lt;h2 id=&#34;3-comprehensive-testing-pipeline&#34;&gt;3. Comprehensive Testing Pipeline&lt;/h2&gt;
&lt;h3 id=&#34;31-automated-testing-framework&#34;&gt;3.1 Automated Testing Framework&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;06_testing&lt;/code&gt;&lt;/strong&gt; package contains a parallel set of tests that double-check the full system. &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; captures the idea behind &lt;strong&gt;&lt;code&gt;run_comprehensive_tests&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We group tests into basic functionality, historical accuracy, linguistic quality, performance, edge cases, and integration, then run them as a batch and emit a structured report. This mirrors how you would build a real CI test suite, but at a scale appropriate for this learning project.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_comprehensive_tests&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run comprehensive tests on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;basic_functionality&amp;#39;&lt;/span&gt;: test_basic_functionality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: test_historical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: test_linguistic_quality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;performance_metrics&amp;#39;&lt;/span&gt;: test_performance_metrics(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;edge_cases&amp;#39;&lt;/span&gt;: test_edge_cases(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;integration_tests&amp;#39;&lt;/span&gt;: test_integration(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate test report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    generate_test_report(test_results)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; test_results
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_basic_functionality&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test basic model functionality&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text_generation&amp;#39;&lt;/span&gt;: test_text_generation(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokenization&amp;#39;&lt;/span&gt;: test_tokenization(tokenizer),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_loading&amp;#39;&lt;/span&gt;: test_model_loading(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: test_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;inference_speed&amp;#39;&lt;/span&gt;: test_inference_speed(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_accuracy&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temporal_consistency&amp;#39;&lt;/span&gt;: test_temporal_consistency(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;factual_accuracy&amp;#39;&lt;/span&gt;: test_factual_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;period_appropriate_language&amp;#39;&lt;/span&gt;: test_period_language(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;geographical_accuracy&amp;#39;&lt;/span&gt;: test_geographical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;social_context_accuracy&amp;#39;&lt;/span&gt;: test_social_context(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Comprehensive Testing Framework&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Automated tests cover basics, historical accuracy, linguistic quality, performance, edge cases, and integration.&lt;/p&gt;
&lt;h3 id=&#34;32-interactive-testing-and-validation&#34;&gt;3.2 Interactive Testing and Validation&lt;/h3&gt;
&lt;p&gt;For manual exploration, the interactive testing interface (conceptually similar to the CLI flows in &lt;strong&gt;&lt;code&gt;06_inference/inference_unified.py&lt;/code&gt;&lt;/strong&gt;) lets you type prompts, trigger specific test groups, and immediately inspect analysis for each generation. &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt; shows a simple REPL loop that dispatches to the same evaluation helpers used in the automated tests.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;interactive_testing&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Interactive testing interface for historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Interactive Testing Mode&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter prompts to test the model. Type &amp;#39;quit&amp;#39; to exit.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Available commands:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - Enter any text prompt to generate continuation&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_historical&amp;#39; - Run historical accuracy tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_linguistic&amp;#39; - Run linguistic quality tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;test_performance&amp;#39; - Run performance tests&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  - &amp;#39;quit&amp;#39; - Exit testing mode&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter prompt: &amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_historical&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_historical_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_linguistic&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_linguistic_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;test_performance&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                run_performance_tests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; prompt:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generated: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;generated&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Analyze generated text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analyze_generated_text(generated, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Analysis: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;analysis&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please enter a valid prompt or command.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;KeyboardInterrupt&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Exiting interactive testing mode...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please try again.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;analyze_generated_text&lt;/span&gt;(text, prompt):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Analyze generated text for quality and accuracy&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;length&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;sentences&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(nltk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sent_tokenize(text)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: assess_historical_accuracy(text, {}),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: assess_linguistic_quality(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence&amp;#39;&lt;/span&gt;: assess_coherence(text),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relevance&amp;#39;&lt;/span&gt;: assess_relevance(text, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; analysis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Interactive Testing Interface&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Interactive mode lets you try prompts, run quick tests, and see immediate analysis.&lt;/p&gt;
&lt;h3 id=&#34;33-performance-benchmarking&#34;&gt;3.3 Performance Benchmarking&lt;/h3&gt;
&lt;p&gt;Performance benchmarking follows the same pattern: generate controlled workloads and measure speed and resource usage. &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; illustrates how we vary sequence length, measure average latency, and compute tokens-per-second, alongside separate helpers for memory, batch throughput, long-sequence handling, and basic concurrency.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;benchmark_model_performance&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Benchmark model performance across different scenarios&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    benchmarks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;inference_speed&amp;#39;&lt;/span&gt;: benchmark_inference_speed(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: benchmark_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;batch_processing&amp;#39;&lt;/span&gt;: benchmark_batch_processing(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_sequence_handling&amp;#39;&lt;/span&gt;: benchmark_long_sequences(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;concurrent_requests&amp;#39;&lt;/span&gt;: benchmark_concurrent_requests(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; benchmarks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;benchmark_inference_speed&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Benchmark inference speed for different sequence lengths&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sequence_lengths &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sequence_lengths:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate test prompts of different lengths&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_test_prompts(length, num_prompts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Measure inference time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        start_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        total_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; start_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        avg_time_per_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; total_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(prompts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokens_per_second &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; avg_time_per_prompt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        results[length] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;avg_time_per_prompt&amp;#39;&lt;/span&gt;: avg_time_per_prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokens_per_second&amp;#39;&lt;/span&gt;: tokens_per_second,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;total_time&amp;#39;&lt;/span&gt;: total_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Performance Benchmarking&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Benchmarks capture inference speed, memory, batch throughput, long-sequence handling, and simple concurrency.&lt;/p&gt;
&lt;h2 id=&#34;4-model-deployment-and-publishing&#34;&gt;4. Model Deployment and Publishing&lt;/h2&gt;
&lt;p&gt;With evaluation and testing complete, we&amp;rsquo;re ready to make our models available for use. This section covers the two deployment paths we support: direct inference from PyTorch checkpoints (useful during development and for maximum control) and publishing to Hugging Face Hub (for easy sharing and community access).&lt;/p&gt;
&lt;p&gt;As called out in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the Regular Model (354M parameters) are fully trained and available. The SLM has already been published on &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;, while the Regular Model is ready for publication. Both can also be run directly from local PyTorch checkpoints.&lt;/p&gt;
&lt;h3 id=&#34;41-two-paths-to-inference&#34;&gt;4.1 Two Paths to Inference&lt;/h3&gt;
&lt;p&gt;We provide two complementary ways to run inference, each suited to different use cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PyTorch Checkpoint Inference&lt;/strong&gt; gives you direct access to the trained model weights without any conversion overhead. This is ideal during development, when you want to test a freshly trained checkpoint, or when you need maximum control over the inference process. The checkpoints live in &lt;strong&gt;&lt;code&gt;09_models/checkpoints/&lt;/code&gt;&lt;/strong&gt; - the SLM at &lt;strong&gt;&lt;code&gt;slm/checkpoint-4000.pt&lt;/code&gt;&lt;/strong&gt; (117M parameters) and the Regular Model at &lt;strong&gt;&lt;code&gt;checkpoint-60001.pt&lt;/code&gt;&lt;/strong&gt; (354M parameters). The &lt;strong&gt;&lt;code&gt;inference_pytorch.py&lt;/code&gt;&lt;/strong&gt; script handles loading these directly: &lt;a href=&#34;#listing7&#34; class=&#34;listing-ref&#34;&gt;Listing 7&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM inference from checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/slm/checkpoint-4000.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model inference from checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/checkpoint-60001.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Running Inference from PyTorch Checkpoints&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Hugging Face Model Inference&lt;/strong&gt; uses the published models on Hugging Face Hub, which means anyone can load and use them with just a few lines of code - no need to download checkpoints or set up the full training environment. The &lt;strong&gt;&lt;code&gt;inference_unified.py&lt;/code&gt;&lt;/strong&gt; script provides a consistent interface for both published models and local checkpoints: &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Published model inference (downloads from Hugging Face Hub)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --published &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --model_name bahree/london-historical-slm &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Interactive mode for exploration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Demo mode with curated historical prompts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --demo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Hugging Face Model Inference&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We&amp;rsquo;ve tested both paths extensively. The published SLM loads in about 9 seconds on a GPU, generates text in under 6 seconds, and passes all 10 automated validation tests. The unified inference script provides clean logging, proper model detection, and accurate parameter counts - small details that make a big difference when debugging or demonstrating the models.&lt;/p&gt;
&lt;h3 id=&#34;42-publishing-to-hugging-face-hub&#34;&gt;4.2 Publishing to Hugging Face Hub&lt;/h3&gt;
&lt;p&gt;Publishing to Hugging Face Hub makes our models accessible to the broader community without requiring anyone to clone our repository or set up a training environment. The process involves converting our PyTorch checkpoints to the Hugging Face format, creating a model card with documentation, and uploading everything to the Hub.&lt;/p&gt;
&lt;p&gt;The publishing workflow is handled by scripts in &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt; - specifically &lt;strong&gt;&lt;code&gt;publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; for the SLM and &lt;strong&gt;&lt;code&gt;publish_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; for the Regular Model. &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt; shows the core publishing flow: authenticate with the Hub, create (or reuse) a repository, save the model and tokenizer locally in Hugging Face format, upload the folder, and generate a model card.&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;publish_to_huggingface&lt;/span&gt;(model, tokenizer, model_name, description, tags):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Publish model to Hugging Face Hub&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;huggingface_hub&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; HfApi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; HfApi()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create model repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repo_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;create_repo(repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id, exist_ok&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Upload to Hub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;upload_folder(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        folder_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./models/&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        commit_message&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Initial model upload&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate and upload model card (README.md)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_card &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_model_card(model_name, description, tags)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;upload_file(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        path_or_fileobj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;model_card,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        path_in_repo&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        repo_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;repo_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; repo_id&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Hugging Face Publishing&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;generate_model_card()&lt;/code&gt; function creates the &lt;strong&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/strong&gt; that appears on the Hugging Face model page. This includes model description, architecture details, training data sources, usage examples, and limitations. You can see the live model cards at &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt; shows how to load and use the published models:&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# or &amp;#34;bahree/london-historical-llm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move to GPU if available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate historical text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;input_ids&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.95&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Loading Models from Hugging Face Hub&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;43-publishing-workflow&#34;&gt;4.3 Publishing Workflow&lt;/h3&gt;
&lt;p&gt;If you want to publish your own trained model to Hugging Face Hub, here&amp;rsquo;s the workflow we followed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up authentication&lt;/strong&gt;: Install &lt;code&gt;huggingface_hub&lt;/code&gt; and authenticate with a token that has Write permissions. You can generate tokens at &lt;a
	
		href = &#34;https://huggingface.co/settings/tokens&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		huggingface.co/settings/tokens
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Convert the checkpoint&lt;/strong&gt;: PyTorch training checkpoints include optimizer states and training metadata that aren&amp;rsquo;t needed for inference. The conversion scripts extract just the model weights and translate them to Hugging Face&amp;rsquo;s naming conventions (covered in detail in Section 5).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare the tokenizer&lt;/strong&gt;: Save the tokenizer files alongside the model. Our custom tokenizer with 30,000 tokens and 150+ historical special tokens needs to be converted to the &lt;code&gt;transformers&lt;/code&gt; library format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate a model card&lt;/strong&gt;: The &lt;strong&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/strong&gt; on your Hugging Face model page serves as documentation. Include model architecture details, training data sources, usage examples, evaluation results, and limitations. The scripts generate this automatically, but you should review and customize it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload and validate&lt;/strong&gt;: Push everything to the Hub, then immediately test with &lt;code&gt;from_pretrained()&lt;/code&gt; to ensure the published model loads and generates correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 Full documentation&lt;/strong&gt;: See &lt;strong&gt;&lt;code&gt;08_documentation/HUGGINGFACE_PUBLISHING.md&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;08_documentation/DEPLOYMENT_GUIDE.md&lt;/code&gt;&lt;/strong&gt; in the repository for the complete step-by-step workflow with troubleshooting guidance.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;5-pytorch-to-hugging-face-format-conversion&#34;&gt;5. PyTorch to Hugging Face Format Conversion&lt;/h2&gt;
&lt;h3 id=&#34;51-why-format-conversion-is-necessary&#34;&gt;5.1 Why Format Conversion is Necessary&lt;/h3&gt;
&lt;p&gt;During training, our models are saved in PyTorch&amp;rsquo;s native &lt;code&gt;.pt&lt;/code&gt; format. These checkpoints include everything needed to resume training: model weights, optimizer states, learning rate schedules, and training metadata. However, for deployment and sharing, we need a leaner, inference-optimized format compatible with the broader machine learning ecosystem.&lt;/p&gt;
&lt;p&gt;Think of it like the difference between a development environment and a production deployment: training checkpoints are like a developer&amp;rsquo;s workspace with all the tools and intermediate files, while Hugging Face format is like a clean, standardized package that anyone can use without understanding the internal training details.&lt;/p&gt;
&lt;p&gt;The Hugging Face Hub expects models to follow specific file structures, naming conventions, and metadata requirements. The conversion process extracts just the model weights (discarding optimizer states and training metadata), translates weight names to match Hugging Face conventions, creates proper configuration files, and ensures the tokenizer is compatible with the &lt;code&gt;transformers&lt;/code&gt; library.&lt;/p&gt;
&lt;h3 id=&#34;52-the-conversion-process&#34;&gt;5.2 The Conversion Process&lt;/h3&gt;
&lt;p&gt;The conversion handles several transformations to bridge PyTorch and Hugging Face formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weight name mapping&lt;/strong&gt;: PyTorch layer names like &lt;code&gt;transformer.h.0.attn.c_attn.weight&lt;/code&gt; become Hugging Face names like &lt;code&gt;transformer.h.0.attn.c_attn.weight&lt;/code&gt; (mostly the same for GPT-2, but with careful handling of edge cases)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic torch.compile handling&lt;/strong&gt;: If you used &lt;code&gt;torch.compile()&lt;/code&gt; during training, weights get prefixed with &lt;code&gt;_orig_mod.&lt;/code&gt; - the conversion strips these prefixes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration translation&lt;/strong&gt;: Model hyperparameters (n_layer, n_head, n_embd, etc.) are mapped to Hugging Face&amp;rsquo;s &lt;code&gt;config.json&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizer conversion&lt;/strong&gt;: Our custom 30,000-token vocabulary with 150+ historical special tokens is converted to &lt;code&gt;transformers&lt;/code&gt; library format&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation&lt;/strong&gt;: After conversion, we verify that the model loads correctly and produces expected outputs&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 Full Implementation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_slm_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; for the complete conversion pipeline with error handling, validation, and model card generation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;53-dependencies-for-hugging-face-integration&#34;&gt;5.3 Dependencies for Hugging Face Integration&lt;/h3&gt;
&lt;p&gt;The Hugging Face integration requires specific dependencies and follows established patterns for model publishing and usage: &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Required dependencies for Hugging Face integration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;huggingface_dependencies &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=4.21.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;torch&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=1.12.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tokenizers&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.12.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;safetensors&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.3.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;accelerate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.20.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;huggingface_hub&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;gt;=0.10.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Model loading and usage example&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_published_model&lt;/span&gt;(model_name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Load published model from Hugging Face Hub&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings for cleaner output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TRANSFORMERS_VERBOSITY&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ignore&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TOKENIZERS_PARALLELISM&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;false&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set pad token if not set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_historical_text&lt;/span&gt;(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Generate historical text using the published model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Tokenize input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;temperature,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            no_repeat_ngram_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pad_token_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            eos_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            early_stopping&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Decode output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    generated_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; generated_text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_published_model()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman from the country said, &amp;#39;we have never seen such a sight&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed dark and mysterious through the heart&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Parliament sat in Westminster Hall&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Great Fire of 1666 had destroyed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text for each prompt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Prompt: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;prompt&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generated: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;generated&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Hugging Face Dependencies&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Hugging Face integration provides standard &lt;code&gt;from_pretrained()&lt;/code&gt; loading and generation with minimal setup, making the models easy to share and reuse.&lt;/p&gt;
&lt;h3 id=&#34;54-comprehensive-testing-and-validation-framework&#34;&gt;5.4 Comprehensive Testing and Validation Framework&lt;/h3&gt;
&lt;p&gt;Once a model is on the Hub, &lt;strong&gt;&lt;code&gt;06_inference/test_published_models.py&lt;/code&gt;&lt;/strong&gt; provides a concrete implementation of the testing pattern in &lt;a href=&#34;#listing12&#34; class=&#34;listing-ref&#34;&gt;Listing 12&lt;/a&gt;. It loads the model via &lt;code&gt;from_pretrained&lt;/code&gt;, runs functional, historical, linguistic, and performance checks, and prints a human-readable summary so you can verify the published artefact behaves like your local checkpoints.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_published_model&lt;/span&gt;(model_name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Comprehensive testing of published model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Testing published model: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_published_model(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test basic functionality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    basic_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_basic_functionality(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test historical accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    historical_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_historical_accuracy(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    linguistic_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_linguistic_quality(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test performance metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    performance_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_performance_metrics(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Compile results&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;basic_functionality&amp;#34;&lt;/span&gt;: basic_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;historical_accuracy&amp;#34;&lt;/span&gt;: historical_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;linguistic_quality&amp;#34;&lt;/span&gt;: linguistic_tests,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;performance_metrics&amp;#34;&lt;/span&gt;: performance_tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Print summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Test Results Summary:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category, tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; results&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;category&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;title()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; test_name, result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            status &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PASS&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; result &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;FAIL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;test_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;status&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_basic_functionality&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test basic model functionality&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test model loading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_loading&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test tokenizer functionality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(test_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    decoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(tokens)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tokenizer_encode_decode&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; test_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; decoded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test model generation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(test_text, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(inputs, max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;, do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_generation&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(test_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;model_generation&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test special tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_token_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; special_tokens:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_vocab():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            special_token_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            special_token_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;special_tokens&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(special_token_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_accuracy&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test historical accuracy of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts for different historical periods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    period_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1500-1600&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1550, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1600-1700&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1650, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1700-1800&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1750, the gentleman said&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1800-1850&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, the gentleman said&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; period, prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_prompts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for period-appropriate language&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            period_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1500-1600&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ye&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1600-1700&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;verily&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1700-1800&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hath&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;doth&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thou&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;thee&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;indeed&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1800-1850&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;indeed&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;verily&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;whilst&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pray&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            found_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; period_terms[period] &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; term &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; generated&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tests[&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;period_&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;period&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; found_terms &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tests[&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;period_&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;period&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test London-specific knowledge&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    london_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed through&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Westminster Hall was&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Tower of London&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Cheapside was filled with&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    london_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; london_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            london_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(prompt))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            london_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;london_knowledge&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(london_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_linguistic_quality&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test linguistic quality of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test prompts for linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman walked through the garden&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the morning, the sun rose&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The old man sat by the fire&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The young woman read her book&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; quality_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for basic linguistic quality&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generated&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            quality_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(sentences) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            quality_tests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;linguistic_quality&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(quality_tests)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test coherence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coherence_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman walked through the garden and&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, coherence_prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;coherence&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(generated) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(coherence_prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;coherence&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_performance_metrics&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test performance metrics of the model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tests &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test inference speed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        start_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_historical_text(model, tokenizer, test_prompt, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inference_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; end_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; start_time
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;inference_speed&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inference_time &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5.0&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Should complete within 5 seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;inference_speed&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test memory usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;psutil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; psutil&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Process()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        memory_usage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;memory_info()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;rss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# MB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;memory_usage&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; memory_usage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8000&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Should use less than 8GB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tests[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;memory_usage&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip if psutil not available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tests&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Testing Published Models&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Published model tests validate loading, generation, historical accuracy, and basic performance before and after publication.&lt;/p&gt;
&lt;h3 id=&#34;55-model-card-generation&#34;&gt;5.5 Model Card Generation&lt;/h3&gt;
&lt;p&gt;The model card serves as the primary documentation on Hugging Face Hub, making it the first thing users see when they discover your model. A well-crafted model card helps users understand what the model does, how to use it, and its limitations. The &lt;code&gt;generate_comprehensive_model_card()&lt;/code&gt; function in &lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt; creates this documentation automatically.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Makes an Effective Model Card:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The model card for our historical language models includes several key sections that provide users with everything they need to get started. At a minimum, include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Description &amp;amp; Key Features&lt;/strong&gt;: A clear explanation that the model was trained from scratch (not fine-tuned), emphasizing the 117M parameter SLM variant and 354M parameter Regular Model, with details about the custom 30,000-token vocabulary and 150+ historical special tokens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setup Instructions&lt;/strong&gt;: Platform-specific guidance for creating virtual environments (Linux/macOS/Windows), installing dependencies (&lt;code&gt;transformers&lt;/code&gt;, &lt;code&gt;torch&lt;/code&gt;, &lt;code&gt;accelerate&lt;/code&gt;), and handling different accelerators (CPU, NVIDIA CUDA, AMD ROCm).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Quick Start Code&lt;/strong&gt;: Auto-device detection that works across CPU, CUDA, and ROCm with sensible generation parameters (&lt;code&gt;temperature=0.8&lt;/code&gt;, &lt;code&gt;top_p=0.95&lt;/code&gt;, &lt;code&gt;repetition_penalty=1.2&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Training Details&lt;/strong&gt;: Architecture specifics (GPT-2 Small/Medium), training infrastructure (2x GPU with Distributed Data Parallel), performance metrics (training loss, MFU utilization), and data sources (218+ historical sources spanning 1500-1850).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example Prompts&lt;/strong&gt;: Period-specific prompts demonstrating different historical eras (Tudor, Stuart, Georgian, Victorian) and London-specific contexts (Thames, Westminster, Parliament).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testing &amp;amp; Validation&lt;/strong&gt;: Instructions for running the automated test suite (&lt;strong&gt;&lt;code&gt;test_published_models.py&lt;/code&gt;&lt;/strong&gt;) and interactive testing with custom prompts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;: Common issues and solutions for PyTorch installation, GPU detection, and memory constraints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Citation &amp;amp; License&lt;/strong&gt;: BibTeX citation format and MIT license information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Key Implementation Details:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The model card generation follows Hugging Face conventions with YAML frontmatter specifying license, library, pipeline type, language, and tags. The script emphasizes that models were &lt;strong&gt;trained from scratch&lt;/strong&gt; (not fine-tuned) and provides device-agnostic code examples that run on CPU, CUDA, and ROCm.&lt;/p&gt;
&lt;p&gt;The card also includes detailed model selection guidance comparing the SLM (faster, lower memory) versus the Regular Model (higher quality, more parameters), helping users choose the right model for their use case - whether that&amp;rsquo;s quick experimentation, educational purposes, or production deployment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💻 Complete Implementation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_slm_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_slm_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/10_scripts/publish_to_huggingface.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;&lt;code&gt;10_scripts/publish_to_huggingface.py&lt;/code&gt;&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; for the full model card generation implementation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;👀 Live Model Cards&lt;/strong&gt;: View the published cards at &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 Documentation&lt;/strong&gt;: See &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HUGGINGFACE_PUBLISHING.md
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DEPLOYMENT_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt; for complete publishing and deployment workflows.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;56-local-deployment-options&#34;&gt;5.6 Local Deployment Options&lt;/h3&gt;
&lt;p&gt;Finally, &lt;a href=&#34;#listing13&#34; class=&#34;listing-ref&#34;&gt;Listing 13&lt;/a&gt; sketches how you might wrap a trained model into a simple REST API or CLI. These patterns are intentionally minimal, meant to help you connect the dots between the inference utilities in &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt; and real applications (dashboards, notebooks, small services).&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_local_deployment&lt;/span&gt;(model, tokenizer, deployment_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;api&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up local deployment for historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;api&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_api_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cli&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_cli_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; deployment_type &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;notebook&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; setup_notebook_deployment(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;ValueError&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Unknown deployment type: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;deployment_type&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_api_deployment&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up REST API deployment&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;flask&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Flask, request, jsonify
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    app &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Flask(&lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4;font-weight:bold&#34;&gt;@app.route&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/generate&amp;#39;&lt;/span&gt;, methods&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_text&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        max_length &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max_length&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        temperature &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;temperature,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; jsonify({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;generated_text&amp;#39;&lt;/span&gt;: generated_text,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;prompt&amp;#39;&lt;/span&gt;: prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;parameters&amp;#39;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;max_length&amp;#39;&lt;/span&gt;: max_length,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;temperature&amp;#39;&lt;/span&gt;: temperature
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4;font-weight:bold&#34;&gt;@app.route&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;/health&amp;#39;&lt;/span&gt;, methods&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;health_check&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; jsonify({&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;status&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;healthy&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_loaded&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;setup_cli_deployment&lt;/span&gt;(model, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Set up command-line interface deployment&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; argparse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ArgumentParser(description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Historical Language Model CLI&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--prompt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, required&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Text prompt&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--max_length&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;, default&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Maximum length&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--temperature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;float&lt;/span&gt;, default&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Temperature&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;--interactive&amp;#39;&lt;/span&gt;, action&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;store_true&amp;#39;&lt;/span&gt;, help&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Interactive mode&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        args &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parse_args()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;interactive:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            run_interactive_mode(model, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            generate_and_print(model, tokenizer, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;prompt, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_length, args&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;temperature)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Local Deployment Setup&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Local deployment options: REST API, CLI, or notebook integration for different workflows.&lt;/p&gt;
&lt;h2 id=&#34;6-quality-assurance-and-validation&#34;&gt;6. Quality Assurance and Validation&lt;/h2&gt;
&lt;p&gt;Before wrapping up, let&amp;rsquo;s look at the quality assurance systems that ensure the models behave reliably across different scenarios.&lt;/p&gt;
&lt;h3 id=&#34;61-automated-quality-checks&#34;&gt;6.1 Automated Quality Checks&lt;/h3&gt;
&lt;p&gt;The system includes automated quality checks that validate model performance and reliability: &lt;a href=&#34;#listing14&#34; class=&#34;listing-ref&#34;&gt;Listing 14&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;run_quality_checks&lt;/span&gt;(model, tokenizer, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Run quality checks on historical language model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model_integrity&amp;#39;&lt;/span&gt;: check_model_integrity(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tokenizer_consistency&amp;#39;&lt;/span&gt;: check_tokenizer_consistency(tokenizer),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;generation_quality&amp;#39;&lt;/span&gt;: check_generation_quality(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: check_historical_accuracy(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;performance_metrics&amp;#39;&lt;/span&gt;: check_performance_metrics(model, tokenizer, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;memory_usage&amp;#39;&lt;/span&gt;: check_memory_usage(model, device),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;error_handling&amp;#39;&lt;/span&gt;: check_error_handling(model, tokenizer, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate quality report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_report &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_quality_report(quality_checks)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_checks, quality_report
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_model_integrity&lt;/span&gt;(model):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check model integrity and consistency&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checks &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;parameter_count&amp;#39;&lt;/span&gt;: check_parameter_count(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;weight_distribution&amp;#39;&lt;/span&gt;: check_weight_distribution(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gradient_flow&amp;#39;&lt;/span&gt;: check_gradient_flow(model),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;activation_patterns&amp;#39;&lt;/span&gt;: check_activation_patterns(model)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; checks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;check_generation_quality&lt;/span&gt;(model, tokenizer, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Check quality of generated text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_prompts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1750, London was&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed through the heart of&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Merchants and tradesmen plied their wares&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Great Fire of 1666 had changed&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Parliament sat in Westminster, making laws&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quality_scores &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; test_prompts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        generated &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; generate_text(model, tokenizer, prompt, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check quality metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        quality_score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;coherence&amp;#39;&lt;/span&gt;: assess_coherence(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;grammatical_correctness&amp;#39;&lt;/span&gt;: assess_grammatical_correctness(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical_accuracy&amp;#39;&lt;/span&gt;: assess_historical_accuracy(generated, {}),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;linguistic_quality&amp;#39;&lt;/span&gt;: assess_linguistic_quality(generated),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relevance&amp;#39;&lt;/span&gt;: assess_relevance(generated, prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        quality_scores&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(quality_score)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quality_scores&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Quality Assurance Checks&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Quality checks cover model integrity, generation quality, historical accuracy, performance, and error handling, ensuring the models behave reliably across different scenarios.&lt;/p&gt;
&lt;h3 id=&#34;62-continuous-integration-and-testing&#34;&gt;6.2 Continuous Integration and Testing&lt;/h3&gt;
&lt;p&gt;If you want to wire this into a lightweight CI gate, keep it simple and CPU-friendly. The goal is not to re-run full benchmarks in CI - it&amp;rsquo;s to catch obvious regressions (can the model load, can it generate, do the evaluators still run).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minimal CI smoke checks (suggested):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1) Run a fast, local evaluation pass (no external APIs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 05_evaluation/run_evaluation.py --mode quick --device cpu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2) Run a local inference smoke test from a checkpoint (replace with your path)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py --checkpoint &amp;lt;path-to-checkpoint.pt&amp;gt; --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, London was&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3) Optional: test the published model (requires downloading from Hugging Face)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_name bahree/london-historical-slm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;7-summary&#34;&gt;7. Summary&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve now completed the full cycle of building language models from scratch. This final part has shown how to transform trained models into working systems that can be evaluated, tested, and deployed for real-world use. The journey that began in &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt; with using published models, continued through &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s data collection and tokenization, and &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s training architecture, now concludes with evaluation and deployment - the critical final steps that make models usable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What we&amp;rsquo;ve built:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The evaluation, testing, and deployment pipeline provides a practical approach for bringing historical language models from research to deployment. We&amp;rsquo;ve created specialized assessment metrics that go beyond standard LLM evaluation to catch historical inaccuracies, temporal inconsistencies, and period-inappropriate language. The testing infrastructure ensures reliability across different scenarios, while multiple deployment options make the models accessible to researchers, educators, and developers worldwide.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current Deployment Status:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PyTorch Checkpoint Inference&lt;/strong&gt;: Fully working with both SLM and Regular models&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Model Inference&lt;/strong&gt;: SLM published and available, Regular model ready&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local Testing&lt;/strong&gt;: Both inference methods tested and validated on a remote Ubuntu machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides and examples for all inference methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Clean logging, proper model detection, accurate parameter counts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Complete Pipeline:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This four-part series has demonstrated the complete LLM development lifecycle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Collection&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;): We gathered 218+ historical sources spanning 1500-1850, processed them through a sophisticated cleaning pipeline, and created a 500M+ character corpus of authentic historical English.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Tokenization&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;): We built a specialized BPE tokenizer with 30,000 vocabulary tokens and 150+ special tokens that understand historical language patterns, London geography, and period-specific terminology.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Training&lt;/strong&gt; (&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;): We implemented custom GPT architectures, optimized for multi-GPU training, and successfully trained two models - an SLM (117M parameters) and a Regular model (354M parameters) - both capable of generating authentic historical text.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evaluation &amp;amp; Deployment&lt;/strong&gt; (This Part): We built comprehensive evaluation frameworks that assess historical accuracy, linguistic quality, and temporal consistency. We created a testing infrastructure for reliability and deployed models to the Hugging Face Hub for community access.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The Learning Journey:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What started as a learning project has become a complete, working system that demonstrates every aspect of LLM development - from raw data collection through model deployment. The principles and techniques we&amp;rsquo;ve covered scale from the 500M-character corpus to production-scale systems, and the evaluation frameworks we&amp;rsquo;ve built can be adapted to any domain-specific language modeling task.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re a researcher exploring historical linguistics, an educator teaching AI concepts, or a developer building specialized language models, this series provides the complete toolkit for understanding and implementing LLM development from scratch. The models are published, the code is available, and the journey from data to deployment is complete.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;strong&gt;&lt;code&gt;04_training/&lt;/code&gt;&lt;/strong&gt;), model architecture (&lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;), and evaluation/deployment (&lt;strong&gt;&lt;code&gt;05_evaluation/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;06_inference/&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;10_scripts/&lt;/code&gt;&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟥 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 - Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 - Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 - Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | Part 4 (this post)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🟧 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📗 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/gr87rem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;8-resources&#34;&gt;8. Resources&lt;/h2&gt;
&lt;p&gt;If you want to reproduce the full pipeline (or adapt it to your own domain), these are the most useful starting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public GitHub repo&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluation guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/EVALUATION_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face publishing guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/HUGGINGFACE_PUBLISHING.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment guide&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/helloLondon/blob/main/08_documentation/DEPLOYMENT_GUIDE.md
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Published models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vaswani et al. (2017) - Attention Is All You Need: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.03762
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radford et al. (2019) - Language Models are Unsupervised Multitask Learners: &lt;a
	
		href = &#34;https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lin (2004) - ROUGE: A Package for Automatic Evaluation of Summaries: &lt;a
	
		href = &#34;https://aclanthology.org/W04-1013/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/W04-1013/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Papineni et al. (2002) - BLEU: A Method for Automatic Evaluation of Machine Translation: &lt;a
	
		href = &#34;https://aclanthology.org/P02-1040/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/P02-1040/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hendrycks et al. (2021) - Measuring Massive Multitask Language Understanding (MMLU): &lt;a
	
		href = &#34;https://arxiv.org/abs/2009.03300&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2009.03300
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Zellers et al. (2019) - HellaSwag: Can a Machine Really Finish Your Sentence?: &lt;a
	
		href = &#34;https://arxiv.org/abs/1905.07830&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1905.07830
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Liu et al. (2023) - G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment: &lt;a
	
		href = &#34;https://arxiv.org/abs/2303.16634&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2303.16634
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;This project builds upon the excellent work of the open-source community. Special thanks to &lt;a
	
		href = &#34;https://github.com/haykgrigo3/TimeCapsuleLLM&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		haykgrigo3&amp;rsquo;s TimeCapsuleLLM
	&lt;/span&gt;
&lt;/a&gt; for the initial inspiration and framework for historical language model training, and to &lt;a
	
		href = &#34;https://github.com/karpathy/nanoGPT&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Andrej Karpathy&amp;rsquo;s nanoGPT
	&lt;/span&gt;
&lt;/a&gt; for the foundational GPT architecture and training methodology. The project extends these foundations with specialized adaptations for historical text, including custom tokenizers, advanced data filtering, evaluation frameworks, and educational deployment infrastructure.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vibe Coding</title>
      <link>/post/2025/11/genai-vibe-coding/</link>
      <pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/11/genai-vibe-coding/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/vibe-coding.png&#34; alt=&#34;vibe-Coding&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deadlock by design: two vibes, two locks, zero unlocks.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In vibe coding, that’s not a bug - it is a feature. 😎&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here’s what happens when agreement-first engineering meets C++ and mutexes:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;mutex&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdexcept&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex mVibes, mProd;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;shipToProd&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt; agree) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// We lock the vibes and production—because feelings 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// and facts both need exclusive access.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;lock_guard&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; a(mVibes);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;lock_guard&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;mutex&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; b(mProd);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (agree) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Deploying to prod…&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Reality pushes back:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;throw&lt;/span&gt; std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;runtime_error(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DeadlockException: vibes vs reality&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Ignored tests.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        shipToProd(&lt;span style=&#34;color:#91d7e3&#34;&gt;true&lt;/span&gt;); &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// agreement-first engineering
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;exception&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; ex) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;AI: You&amp;#39;re absolutely right! (&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; ex.what() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;)&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/* lock(prod); lock(vibes); // Deadlock achieved; energy immaculate */&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;COMMIT vibes; ROLLBACK sanity;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Two mutexes walk into prod… and never come out&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;#GeekyJokes #AI #GenAI #VibeCoding&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>🏛️Building LLMs from Scratch - Part 3: Training Architecture &amp; GPU Optimization</title>
      <link>/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/</link>
      <pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this third part of our 4-part series on building language models from scratch, I explore the complete training infrastructure that transforms our clean historical data and custom tokenizer into working language models.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Part 1&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; How to build a Large Language Model from Scratch - covered using the published model&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Part 2&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt; Building LLMs from Scratch - Part 2: Data Collection &amp;amp; Custom Tokenizers - detailed data collection and custom tokenizer development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here, we build the complete training pipeline from a custom GPT architecture through deployment-ready checkpoints.&lt;/p&gt;
&lt;p&gt;This post demonstrates how to design custom model architectures, optimize GPU utilization, and implement comprehensive training pipelines that transform our 500M+ character historical corpus into two working language models.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need significantly larger datasets, more sophisticated infrastructure, and additional considerations that are not covered in this post.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;As outlined in &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;, both the SLM (117M parameters) and the regular Model (354M parameters) use the same training code and pipeline (&lt;code&gt;04_training/train_model_slm.py&lt;/code&gt; and &lt;code&gt;04_training/train_model.py&lt;/code&gt;) with different configurations defined in &lt;code&gt;config.py&lt;/code&gt;. The training infrastructure, GPU optimization, checkpointing, and WandB integration are identical - only the model architecture parameters differ.&lt;/p&gt;
&lt;p&gt;Both PyTorch checkpoint inference and Hugging Face model inference are fully working and available. Both the SLM and the Regular model are published on &lt;a
	
		href = &#34;https://huggingface.co/bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugging Face Hub
	&lt;/span&gt;
&lt;/a&gt;. Local PyTorch checkpoints can be used directly for inference with the &lt;code&gt;inference_pytorch.py&lt;/code&gt; script.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;code&gt;04_training/&lt;/code&gt;), model architecture (&lt;code&gt;config.py&lt;/code&gt;), and GPU configuration (&lt;code&gt;08_documentation/GPU_TUNING.md&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2 – Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | Part 3 (this post) | &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🤗 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on Hugging Face&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📚 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-training-challenge-from-data-to-working-models&#34;&gt;1. The Training Challenge: From Data to Working Models&lt;/h2&gt;
&lt;p&gt;Now that we have our clean historical corpus and custom tokenizer from &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;, we need to transform this data into working language models. This isn&amp;rsquo;t just about running training scripts – it&amp;rsquo;s about designing an architecture that can learn from historical text, optimizing for the unique patterns of 1500-1850 English, and building infrastructure to handle the computational demands of language model training.&lt;/p&gt;
&lt;p&gt;The challenge with historical language modeling isn&amp;rsquo;t just having enough data - it&amp;rsquo;s having the right architecture and training process that can learn from the complex linguistic patterns in historical texts. Unlike modern text, historical English contains archaic vocabulary, period-specific terminology, and cultural references that require specialized attention mechanisms and training strategies.&lt;/p&gt;
&lt;h3 id=&#34;11-high-level-training-process-overview&#34;&gt;1.1 High-Level Training Process Overview&lt;/h3&gt;
&lt;p&gt;The model training pipeline transforms our clean historical data and custom tokenizer into working language models through several key stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Model Architecture Design&lt;/em&gt; - involves a custom GPT implementation optimized for historical text patterns&lt;/li&gt;
&lt;li&gt;&lt;em&gt;GPU Configuration&lt;/em&gt; covers - multi-GPU training with precision optimization and memory management&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Training Infrastructure&lt;/em&gt; - includes distributed training, checkpointing, and experiment tracking&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Performance Optimization&lt;/em&gt; - encompasses mixed precision, compilation, and hardware-specific tuning&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Model Validation&lt;/em&gt; - covers testing and evaluation of trained models.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; below illustrates this complete training pipeline:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 Clean Historical Corpus&amp;lt;br/&amp;gt;500M+ characters] --&amp;gt; B[🔤 Custom Tokenizer&amp;lt;br/&amp;gt;30K vocab + 150+ special tokens]
    B --&amp;gt; C[🏗️ Model Architecture&amp;lt;br/&amp;gt;Custom GPT for Historical Text]
    
    C --&amp;gt; D[⚙️ GPU Configuration&amp;lt;br/&amp;gt;Multi-GPU + Precision Optimization]
    D --&amp;gt; D1[Mixed Precision&amp;lt;br/&amp;gt;bf16/fp16]
    D --&amp;gt; D2[Torch Compile&amp;lt;br/&amp;gt;JIT optimization]
    D --&amp;gt; D3[Memory Management&amp;lt;br/&amp;gt;Gradient checkpointing]
    
    D1 --&amp;gt; E[🏋️ Training Process&amp;lt;br/&amp;gt;60K iterations, checkpointing]
    D2 --&amp;gt; E
    D3 --&amp;gt; E
    
    E --&amp;gt; E1[SLM: 117M params&amp;lt;br/&amp;gt;7-8 hours training]
    E --&amp;gt; E2[Regular: 354M params&amp;lt;br/&amp;gt;28-32 hours training]
    
    E --&amp;gt; E3[WandB Integration&amp;lt;br/&amp;gt;Experiment tracking]
    E --&amp;gt; E4[Checkpointing&amp;lt;br/&amp;gt;Resume capability]
    E --&amp;gt; E5[Multi-GPU Support&amp;lt;br/&amp;gt;Distributed training]
    
    E1 --&amp;gt; F[📊 Model Evaluation&amp;lt;br/&amp;gt;Historical accuracy testing]
    E2 --&amp;gt; F
    E3 --&amp;gt; F
    E4 --&amp;gt; F
    E5 --&amp;gt; F
    
    F --&amp;gt; G{Quality OK?}
    G --&amp;gt;|Yes| H[🚀 Deployment&amp;lt;br/&amp;gt;Hugging Face + Local Inference]
    G --&amp;gt;|No| I[🔄 Retrain/Adjust]
    I --&amp;gt; E
    H --&amp;gt; J[💬 Text Generation&amp;lt;br/&amp;gt;Historical language output]
    
    style A fill:#e1f5fe
    style C fill:#f3e5f5
    style H fill:#e8f5e8
    style J fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Training Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We will explore each of these components in detail, starting with the model architecture design, but first, let&amp;rsquo;s discuss why I chose PyTorch as the framework for this project.&lt;/p&gt;
&lt;h3 id=&#34;12-using-pytorch&#34;&gt;1.2 Using PyTorch&lt;/h3&gt;
&lt;p&gt;I chose PyTorch for this project based on three key factors: educational accessibility, integration with the research ecosystem, and practical convenience. PyTorch provides many components out of the box - transformer blocks, attention layers, feed-forward networks, training loops, and CUDA support - which makes it much easier for learners building their first language model.&lt;/p&gt;
&lt;p&gt;From a technical perspective, PyTorch&amp;rsquo;s memory management and GPU optimization features-including automatic mixed precision, gradient checkpointing, and efficient attention implementations well-suited for the resource-intensive task of training language models on historical text.&lt;/p&gt;
&lt;p&gt;PyTorch&amp;rsquo;s recent developments, such as &lt;strong&gt;&lt;code&gt;torch.compile&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;FlashAttention&lt;/code&gt;&lt;/strong&gt; kernels, and &lt;strong&gt;&lt;code&gt;SDPA&lt;/code&gt;&lt;/strong&gt; operator (scaled dot-product attention), provide significant performance improvements, making training more efficient. These improvements enhance both speed and memory efficiency, which are critical for scaling LLMs. Of course, in our case, we&amp;rsquo;re building a working toy example rather than scaling to production levels, and these optimizations help keep training times reasonable on available hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What about other Frameworks?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I also considered TensorFlow and JAX, but neither seemed right for &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt;; TensorFlow&amp;rsquo;s API felt too complex, specifically from a beginner’s perspective. JAX has excellent performance and a clean, functional approach, but it&amp;rsquo;s more research-focused and has a smaller ecosystem, which would make it harder to follow along and experiment with.&lt;/p&gt;
&lt;h2 id=&#34;2-model-architecture-overview&#34;&gt;2. Model Architecture Overview&lt;/h2&gt;
&lt;h3 id=&#34;21-understanding-the-gpt-architecture&#34;&gt;2.1 Understanding the GPT Architecture&lt;/h3&gt;
&lt;p&gt;Our custom GPT (Generative Pre-trained Transformer) is a decoder-only transformer model designed for autoregressive language modeling on historical text. The architecture consists of four core components, each serving a distinct purpose in the sequence-to-sequence prediction pipeline. These are: token embeddings, position embeddings, causal self-attention mechanisms, and the language modeling head. Let us double-click into each component to understand its role and implementation.&lt;/p&gt;
&lt;h4 id=&#34;211-token-embeddings&#34;&gt;2.1.1 Token Embeddings&lt;/h4&gt;
&lt;p&gt;Token embeddings convert discrete token IDs from our 30,000-token historical vocabulary into dense, continuous vector representations. Each token (whether it&amp;rsquo;s a word, subword unit, or special token) is mapped to a point in a high-dimensional space (768 dimensions for SLM, 1024 for the regular model).&lt;/p&gt;
&lt;p&gt;This is implemented as a simple lookup table - &lt;strong&gt;&lt;code&gt;wte = torch.nn.Embedding(config.vocab_size, config.n_embd)&lt;/code&gt;&lt;/strong&gt;. When processing the token sequence, we look up the corresponding vector for each token ID. These embeddings are learned during training - the model learns which tokens should be close together in this vector space based on their co-occurrence patterns in historical text.&lt;/p&gt;
&lt;p&gt;For historical language models, this is particularly valuable because rare historical terms (like &amp;ldquo;yeoman&amp;rdquo; or &amp;ldquo;guildhall&amp;rdquo;) get their own representations that can capture contextual relationships with related terms from that era.&lt;/p&gt;
&lt;h4 id=&#34;212-position-embeddings&#34;&gt;2.1.2 Position Embeddings&lt;/h4&gt;
&lt;p&gt;Position embeddings encode each token&amp;rsquo;s absolute position within the sequence. This is crucial because, unlike recurrent models, transformer architectures have no inherent notion of temporal order or sequence position - they process all tokens in parallel. Let us double-click into the problem why.&lt;/p&gt;
&lt;p&gt;Think of it like reading words without any sense of order. The words &amp;ldquo;&lt;em&gt;The cat chased the mouse&lt;/em&gt;&amp;rdquo; would be indistinguishable from &amp;ldquo;&lt;em&gt;Mouse the chased cat the&lt;/em&gt;&amp;rdquo; - you&amp;rsquo;d see the same words but lose all meaning because you don&amp;rsquo;t know which word came first, second, or third. Transformers face exactly this problem because they process all words simultaneously rather than sequentially, unlike older RNN models.&lt;/p&gt;
&lt;p&gt;To help the model understand word order, we add position embeddings to the token embeddings. This way, each token&amp;rsquo;s representation includes information about both &amp;ldquo;what&amp;rdquo; the token is and &amp;ldquo;where&amp;rdquo; it appears in the sequence. We use learned position embeddings (as opposed to fixed sinusoidal patterns): &lt;strong&gt;&lt;code&gt;wpe = torch.nn.Embedding(config.block_size, config.n_embd)&lt;/code&gt;&lt;/strong&gt;. For the SLM with a 512-token context window, we learn 512 different position vectors (one for each possible position). Similarly, the regular model with a 1024-token context learns 1024 position vectors.&lt;/p&gt;
&lt;p&gt;Position embeddings work like giving each word a &amp;ldquo;timestamp&amp;rdquo; or &amp;ldquo;address&amp;rdquo; that tells the model where it sits in the sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Token embedding&lt;/strong&gt; says: &amp;ldquo;This is the word &amp;lsquo;cat&amp;rsquo;&amp;rdquo; → converts to a vector like &lt;code&gt;[0.2, -0.5, 0.8, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position embedding&lt;/strong&gt; says: &amp;ldquo;This word is at position 3&amp;rdquo; → adds another vector like &lt;code&gt;[0.1, 0.3, -0.2, ...]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combined&lt;/strong&gt;: The model sees both &amp;ldquo;what&amp;rdquo; the word is AND &amp;ldquo;where&amp;rdquo; it appears&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The embedding vectors are combined element-wise: &lt;strong&gt;&lt;code&gt;x = token_emb + position_emb&lt;/code&gt;&lt;/strong&gt;. This allows the model to understand both what each token is (via the token embedding) and where it appears in the sequence (via the position embedding).&lt;/p&gt;
&lt;p&gt;Our model uses &lt;strong&gt;learned&lt;/strong&gt; position embeddings, meaning during training the model discovers that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Position 1 tends to be capitalized (start of sentence)&lt;/li&gt;
&lt;li&gt;Position 512 might be mid-sentence (needs different handling)&lt;/li&gt;
&lt;li&gt;Certain positions in historical documents have patterns (formal openings, closings, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is different from &lt;strong&gt;fixed&lt;/strong&gt; sinusoidal embeddings (used in the original Transformer paper), which use a mathematical formula to encode positions. Learned embeddings are generally better because they adapt to specific patterns in the training data.&lt;/p&gt;
&lt;p&gt;In historical texts, word order is crucial for understanding meaning. Consider &amp;ldquo;The King granted the land&amp;rdquo; versus &amp;ldquo;The land granted the King&amp;rdquo; - same words, completely different meanings. Historical legal documents and Victorian-era writings often have precise word order that changes legal or semantic meaning. Position embeddings ensure the model can distinguish between these critical variations.&lt;/p&gt;
&lt;h4 id=&#34;213-causal-self-attention&#34;&gt;2.1.3 Causal Self-Attention&lt;/h4&gt;
&lt;p&gt;Causal self-attention is the mechanism that allows each position in the sequence to selectively attend to previous positions. The &lt;em&gt;&amp;ldquo;causal&amp;rdquo;&lt;/em&gt; constraint ensures the model can only look at past tokens (not future ones), which is essential for autoregressive generation.&lt;/p&gt;
&lt;p&gt;When you read a sentence, you naturally use context from earlier words to understand later ones. If you see &amp;ldquo;The King granted the land to his loyal&amp;hellip;&amp;rdquo;, you can predict that &amp;ldquo;servant,&amp;rdquo; &amp;ldquo;knight,&amp;rdquo; or &amp;ldquo;subject&amp;rdquo; might come next because you remember what came before. The model needs to do the same thing - use previous words to predict the next word.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s a crucial constraint: during training, when predicting word 7, the model must &lt;em&gt;only&lt;/em&gt; see words 1-6, never word 8 or beyond. This &amp;ldquo;causal&amp;rdquo; (cause-and-effect) constraint ensures the model learns realistic patterns - in the real world, you can&amp;rsquo;t use future information to predict the present.&lt;/p&gt;
&lt;h5 id=&#34;how-attention-works&#34;&gt;How Attention Works&lt;/h5&gt;
&lt;p&gt;Think of attention as a sophisticated &amp;ldquo;relevance detector&amp;rdquo;. When the model is processing the word &amp;ldquo;loyal&amp;rdquo; in our example above, it needs to look back and ask: &amp;ldquo;&lt;em&gt;Which previous words are most relevant for understanding this context?&lt;/em&gt;&amp;rdquo; The attention mechanism computes a weighted sum of all previous token representations, where the weights are determined by how relevant each previous token is to the current one.&lt;/p&gt;
&lt;p&gt;This is done through three learned linear projections that create different &amp;ldquo;views&amp;rdquo; of each word:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query (Q)&lt;/strong&gt;: &amp;ldquo;What am I looking for?&amp;rdquo; - The current word asks a question&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key (K)&lt;/strong&gt;: &amp;ldquo;What do I have to offer?&amp;rdquo; - Previous words advertise their content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Value (V)&lt;/strong&gt;: &amp;ldquo;What information should I contribute?&amp;rdquo; - The actual information to pass forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us see a practical example to help us grok the concept. Consider the historical phrase: &amp;ldquo;&lt;em&gt;The alderman of Cheapside, having served the city faithfully, was &lt;strong&gt;granted&lt;/strong&gt;&amp;hellip;&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When processing &amp;ldquo;granted&amp;rdquo; the attention mechanism:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creates a Query from &amp;ldquo;granted&amp;rdquo; asking &amp;ldquo;what context do I need?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Compares this Query against Keys from all previous words&lt;/li&gt;
&lt;li&gt;Finds high relevance with &amp;ldquo;alderman&amp;rdquo; (who is being granted something) and &amp;ldquo;faithfully&amp;rdquo; (why the grant is happening)&lt;/li&gt;
&lt;li&gt;Uses these attention weights to pull relevant Values from those words&lt;/li&gt;
&lt;li&gt;Combines this information to understand better &amp;ldquo;granted&amp;rdquo; in context&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The attention score between token i and token j is computed as:&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q_i, K_j) = \text{softmax}\left(\frac{Q_i K_j^T}{\sqrt{d_k}}\right)V_j$$&lt;/p&gt;
&lt;p&gt;Breaking this down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Q_i K_j^T$ computes how well the query from token &lt;em&gt;&lt;strong&gt;i&lt;/strong&gt;&lt;/em&gt; matches the key from token &lt;em&gt;&lt;strong&gt;j&lt;/strong&gt;&lt;/em&gt; (higher = more relevant)&lt;/li&gt;
&lt;li&gt;$1/\sqrt{d_k}$ is a scaling factor that prevents scores from getting too large (which would make softmax too &amp;ldquo;sharp&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;$\text{softmax}$ converts scores into probabilities that sum to &lt;strong&gt;1&lt;/strong&gt; (so each word gets a weighted &amp;ldquo;vote&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Finally, we use these weights to combine the Values from all previous tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The $1/\sqrt{d_k}$ scaling factor (where $d_k = 64$ for our SLM, so $\sqrt{64} = 8$) prevents the dot products from growing too large with high-dimensional embeddings, ensuring stable gradients during training. The softmax ensures the weights sum to &lt;strong&gt;1&lt;/strong&gt;, creating a proper probability distribution over the previous tokens.&lt;/p&gt;
&lt;h5 id=&#34;why-this-matters-for-historical-text&#34;&gt;Why This Matters for Historical Text?&lt;/h5&gt;
&lt;p&gt;Historical documents present unique challenges that make attention particularly valuable. Consider a legal document from 1750: &lt;em&gt;&amp;ldquo;John Smith, yeoman of the parish of St. Giles, being of sound mind and body, doth hereby bequeath&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The attention mechanism enables the model to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connect &amp;ldquo;doth bequeath&amp;rdquo; back to &amp;ldquo;John Smith&amp;rdquo; across multiple clauses&lt;/li&gt;
&lt;li&gt;Understand that &amp;ldquo;yeoman&amp;rdquo; modifies &amp;ldquo;John Smith&amp;rdquo; even though they&amp;rsquo;re separated&lt;/li&gt;
&lt;li&gt;Learn that &amp;ldquo;doth&amp;rdquo; (archaic) and &amp;ldquo;does&amp;rdquo; (modern) serve similar grammatical functions&lt;/li&gt;
&lt;li&gt;Recognize that formal legal phrasing follows specific patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For our historical language models, this attention mechanism learns which historical terms and phrases co-occur and relate to one another contextually - crucial for understanding historical documents where terminology and phrasing differ from modern English. The model learns to attend to relevant historical context, enabling it to generate coherent text that maintains period-appropriate language patterns and references.&lt;/p&gt;
&lt;h4 id=&#34;214-language-modeling-head&#34;&gt;2.1.4 Language Modeling Head&lt;/h4&gt;
&lt;p&gt;The language modeling head (also called the &amp;ldquo;output projection&amp;rdquo; or &lt;strong&gt;lm_head&lt;/strong&gt;) is the final translator that turns the rich internal representation (after all the attention + MLP refinements) back into a decision: &amp;ldquo;Given everything I&amp;rsquo;ve seen so far, what is the most likely next token?&amp;rdquo; It does this by mapping each hidden vector at every position into a vector of length equal to the vocabulary size (30,000 in our historical tokenizer). Each element of that output vector is a &lt;em&gt;logit&lt;/em&gt; - an unnormalized score indicating how likely the model thinks the token is to be the next one.&lt;/p&gt;
&lt;p&gt;Implementation is intentionally simple: &lt;strong&gt;&lt;code&gt;lm_head = torch.nn.Linear(n_embd, vocab_size)&lt;/code&gt;&lt;/strong&gt;. We don&amp;rsquo;t put an activation function after it because we want raw, unconstrained scores. Those scores then flow into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inference:&lt;/strong&gt; Apply softmax -&amp;gt; probabilities -&amp;gt; sample or greedy pick&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training:&lt;/strong&gt; Feed logits + target token IDs into cross-entropy loss -&amp;gt; gradients flow backward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can think of logits as &lt;em&gt;evidence totals&lt;/em&gt;. The softmax transforms those evidence values into a normalized probability distribution that the model can sample from. High logit = more supporting evidence; low logit = less.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step-by-step (Inference vs Training):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hidden state at last position (e.g., index 511) enters &lt;code&gt;lm_head&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Linear projection produces a 30,000-dimensional logit vector.&lt;/li&gt;
&lt;li&gt;In inference: &lt;code&gt;probs = softmax(logits / temperature)&lt;/code&gt;; optionally apply &lt;code&gt;top-k&lt;/code&gt;/&lt;code&gt;top-p&lt;/code&gt; filtering.&lt;/li&gt;
&lt;li&gt;Sample (or argmax) a token → append to sequence → repeat.&lt;/li&gt;
&lt;li&gt;In training: Cross-entropy compares logits to the true next token; loss scalar backpropagates through the head into all prior layers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because our vocabulary mixes common function words (&amp;ldquo;the&amp;rdquo;, &amp;ldquo;and&amp;rdquo;, &amp;ldquo;of&amp;rdquo;) with rare era-specific tokens (&amp;ldquo;yeoman&amp;rdquo;, &amp;ldquo;guildhall&amp;rdquo;, &amp;ldquo;paternoster&amp;rdquo;, &amp;ldquo;quoth&amp;rdquo;), the head must reliably distinguish both frequent and infrequent patterns. Rare historical tokens need &lt;em&gt;consistent&lt;/em&gt; representations from embedding -&amp;gt; transformer -&amp;gt; head so they are not forgotten. If their logits remained perpetually low, the model would never learn to generate them in authentic contexts.&lt;/p&gt;
&lt;p&gt;Logits (not probabilities) inside the model - We retain logits (raw, unnormalized scores) instead of immediately converting to probabilities because they yield numerically stable loss computation - PyTorch efficiently fuses &lt;code&gt;log_softmax&lt;/code&gt; with negative log-likelihood - allow cleaner gradient flow before any normalization (we only invoke softmax when we actually need a distribution), and enable flexible post-processing (temperature scaling, top-k or top-p filtering, repetition penalties) directly in score space without forcing an extra probability recomputation step.&lt;/p&gt;
&lt;p&gt;We reuse the input embedding matrix for the output projection to keep input and output semantics aligned and reduce parameter and memory traffic. This concept is called Weight Typing, which we will cover in detail in &lt;a
	
		href = &#34;#-222-weight-tying&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 2.2.2  -  Weight Tying
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We share the embedding and output projection weights (&lt;code&gt;self.transformer.wte.weight = self.lm_head.weight&lt;/code&gt;) so input token interpretation and next-token scoring occur in the &lt;em&gt;same semantic space&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Using the shared embedding matrix $E$ (shape $(V,d)$), the logits are computed with $\text{logits} = h \cdot E^T$, reusing the same rows used for token lookup. This saves parameters (~23.0M SLM, ~30.7M Regular), keeps gradients for rare historical tokens coupled, and reduces memory traffic (Press &amp;amp; Wolf, 2017; Inan et al., 2016). See Section 2.2.2 for detailed mechanics, benefits, and the historian/scribe analogy.&lt;/p&gt;
&lt;p&gt;In short, the &lt;code&gt;lm_head&lt;/code&gt; converts rich contextual understanding into next-token scores; with weight tying (details in Section 2.2.2) it stays efficient and semantically consistent.&lt;/p&gt;
&lt;h4 id=&#34;215-the-complete-flow&#34;&gt;2.1.5 The Complete Flow&lt;/h4&gt;
&lt;p&gt;The complete forward pass through our GPT model works as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Input&lt;/strong&gt;: A sequence of token IDs (batch × sequence_length, e.g., 512 tokens)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token Embedding&lt;/strong&gt;: Convert each token ID to a dense vector (768 or 1024 dimensions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Position Embedding&lt;/strong&gt;: Add position information to each token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer Blocks&lt;/strong&gt;: Pass through n_layer transformer blocks (12 for SLM, 24 for regular model), each containing:
&lt;ul&gt;
&lt;li&gt;Layer normalization&lt;/li&gt;
&lt;li&gt;Causal self-attention (with multiple heads)&lt;/li&gt;
&lt;li&gt;Residual connection&lt;/li&gt;
&lt;li&gt;Layer normalization&lt;/li&gt;
&lt;li&gt;Feed-forward MLP&lt;/li&gt;
&lt;li&gt;Residual connection&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final Layer Norm&lt;/strong&gt;: Normalize the final hidden states&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language Head&lt;/strong&gt;: Project to vocabulary logits (30,000 dimensions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;: Probability distribution over next token&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This architecture design is conventional and follows the GPT-style pattern established by OpenAI&amp;rsquo;s GPT models. The traditional design is intentional - it allows for clear, educational learning from the implementation while being configured to work seamlessly with our historical tokenizer from Part 2.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig2&#34; class=&#34;figure-ref&#34;&gt;Figure 2&lt;/a&gt; below illustrates the complete architecture for the SLM:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig2&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Input Tokens&amp;lt;br/&amp;gt;512 tokens] --&amp;gt; B[Token Embedding&amp;lt;br/&amp;gt;30K vocab → 768 dim]
    A --&amp;gt; C[Position Embedding&amp;lt;br/&amp;gt;512 pos → 768 dim]
    B --&amp;gt; D[Add Embeddings]
    C --&amp;gt; D
    D --&amp;gt; E[Layer Norm]
    E --&amp;gt; F[Transformer Block 1&amp;lt;br/&amp;gt;12 heads, 768 dim]
    F --&amp;gt; G[Transformer Block 2&amp;lt;br/&amp;gt;12 heads, 768 dim]
    G --&amp;gt; H[...]
    H --&amp;gt; I[Transformer Block 12&amp;lt;br/&amp;gt;12 heads, 768 dim]
    I --&amp;gt; J[Final Layer Norm]
    J --&amp;gt; K[Language Head&amp;lt;br/&amp;gt;768 → 30K vocab]
    K --&amp;gt; L[Output Logits&amp;lt;br/&amp;gt;30K probabilities]
    
    subgraph &amp;#34;Key Specifications&amp;#34;
        M[Layers: 12&amp;lt;br/&amp;gt;Heads: 12&amp;lt;br/&amp;gt;Embedding: 768&amp;lt;br/&amp;gt;Context: 512&amp;lt;br/&amp;gt;Parameters: 117M&amp;lt;br/&amp;gt;Training: 7-8 hours&amp;lt;br/&amp;gt;MFU: 8-9%]
    end
    
    style A fill:#e1f5fe
    style L fill:#e8f5e8
    style M fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 2: SLM Architecture (117M Parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Regular model, as shown in &lt;a href=&#34;#fig3&#34; class=&#34;figure-ref&#34;&gt;Figure 3&lt;/a&gt; below, follows the same architectural pattern as the SLM but with increased capacity: 24 transformer layers instead of 12, 16 attention heads instead of 12, and 1024-dimensional embeddings instead of 768.&lt;/p&gt;
&lt;p&gt;This represents a ~3x increase in parameters (354M vs 117M), ~2x more attention heads, and ~33% larger embedding dimensions, providing significantly more computational power for learning complex historical language patterns.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig3&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Input Tokens&amp;lt;br/&amp;gt;1024 tokens] --&amp;gt; B[Token Embedding&amp;lt;br/&amp;gt;30K vocab → 1024 dim]
    A --&amp;gt; C[Position Embedding&amp;lt;br/&amp;gt;1024 pos → 1024 dim]
    B --&amp;gt; D[Add Embeddings]
    C --&amp;gt; D
    D --&amp;gt; E[Layer Norm]
    E --&amp;gt; F[Transformer Block 1&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    F --&amp;gt; G[Transformer Block 2&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    G --&amp;gt; H[...]
    H --&amp;gt; I[Transformer Block 24&amp;lt;br/&amp;gt;16 heads, 1024 dim]
    I --&amp;gt; J[Final Layer Norm]
    J --&amp;gt; K[Language Head&amp;lt;br/&amp;gt;1024 → 30K vocab]
    K --&amp;gt; L[Output Logits&amp;lt;br/&amp;gt;30K probabilities]
    
    subgraph &amp;#34;Key Specifications&amp;#34;
        M[Layers: 24&amp;lt;br/&amp;gt;Heads: 16&amp;lt;br/&amp;gt;Embedding: 1024&amp;lt;br/&amp;gt;Context: 1024&amp;lt;br/&amp;gt;Parameters: 354M&amp;lt;br/&amp;gt;Training: 28-32 hours&amp;lt;br/&amp;gt;MFU: 15-20%]
    end
    
    style A fill:#e1f5fe
    style L fill:#e8f5e8
    style M fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 3: Regular Model Architecture (354M Parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;22-simplegpt-class&#34;&gt;2.2 SimpleGPT Class&lt;/h3&gt;
&lt;p&gt;Now that we&amp;rsquo;ve covered the theory behind the GPT architecture, let&amp;rsquo;s examine the actual implementation. The &lt;strong&gt;&lt;code&gt;SimpleGPT&lt;/code&gt;&lt;/strong&gt; class is at the heart of our implementation - it&amp;rsquo;s the core class that brings together all the components discussed in section 2.1 into a working language model. The class inherits from PyTorch&amp;rsquo;s &lt;code&gt;**torch.nn.Module**&lt;/code&gt;, which is the base class for all neural network components in PyTorch. This gives us access to automatic differentiation, GPU support, and other PyTorch features.&lt;/p&gt;
&lt;h4 id=&#34;221-the-__init__-method&#34;&gt;2.2.1 The &lt;code&gt;__init__&lt;/code&gt; method&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;__init__&lt;/code&gt; method is the constructor that assembles our entire language model from individual components. First, it stores all hyperparameters (such as vocabulary size, embedding dimensions, and the number of layers) in a configuration object that the rest of the model can reference. Next, it creates the embedding layers - one that converts our 30,000 historical tokens into dense vectors, and another that encodes position information. Hence, the model knows where each word appears in the sequence.&lt;/p&gt;
&lt;p&gt;Next, it builds the transformer blocks - the core processing units that do the heavy lifting. Each block contains self-attention mechanisms and feed-forward networks that learn to understand relationships between words. The method also initializes the language modeling head, the final layer that converts all internal processing back into probabilities for which word should come next.&lt;/p&gt;
&lt;p&gt;Finally, it sets up proper weight initialization to ensure the model starts with good random weights (not too big, not too small), and implements weight tying between the input embeddings and the output layer. This clever technique reduces the number of parameters while improving training efficiency by sharing weights between the first and last layers.&lt;/p&gt;
&lt;p&gt;This is important because if the weights are too large, the model&amp;rsquo;s gradients can explode during training, leading to unstable learning. If they start too small, gradients can vanish, rendering the model unable to learn. Our initialization ensures the model begins in the &amp;ldquo;Goldilocks zone&amp;rdquo; - just right for effective learning. Without this, even a perfectly designed architecture might fail to train properly.&lt;/p&gt;
&lt;p&gt;Now, let me show you the actual implementation. The code in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt; demonstrates how we implement the core GPT architecture:&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleGPT&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple GPT model based on nanoGPT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    This class implements a decoder-only transformer model optimized for 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    historical text generation. It inherits from PyTorch&amp;#39;s Module class
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    to get automatic differentiation and GPU support.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize the parent PyTorch Module class&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Store all model hyperparameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the main transformer components using ModuleDict&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ModuleDict allows us to organize related layers together&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transformer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleDict(&lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Token Embedding Layer (wte = &amp;#34;word token embedding&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Converts each token ID to a high-dimensional vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: token IDs (integers 0 to vocab_size-1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: dense vectors of size $n_{embd}$ (e.g., 768 dimensions)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            wte &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Embedding(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Position Embedding Layer (wpe = &amp;#34;word position embedding&amp;#34;) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encodes where each token appears in the sequence&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: position indices (0 to block_size-1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: dense vectors of size $n_{embd}$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            wpe &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Embedding(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;block_size, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Dropout Layer for regularization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Randomly sets some inputs to zero during training to prevent overfitting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            drop &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Stack of Transformer Blocks (h = &amp;#34;hidden layers&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Each SimpleBlock contains self-attention and feed-forward layers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# We create n_layer blocks (e.g., 12 for SLM, 24 for regular model)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            h &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleList([SimpleBlock(config) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_layer)]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Final Layer Normalization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizes the output before the language modeling head&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ln_f &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Language Modeling Head&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Converts the final hidden states back to vocabulary space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Input: hidden states of size $n_{embd}$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output: logits for each token in vocabulary ($vocab_{size}$ logits)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lm_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize all weights using our custom initialization method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This ensures the model starts with good random weights&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;apply(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;_init_weights)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Weight Tying: Share weights between input embeddings and output layer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This technique improves training efficiency and model performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# by ensuring the same representation space is used for input and output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transformer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;wte&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;weight &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lm_head&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;weight&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: SimpleGPT Model Architecture&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;222-weight-tying&#34;&gt;2.2.2 Weight Tying&lt;/h4&gt;
&lt;p&gt;The tied weights between the embedding layer and language modeling head (&lt;code&gt;self.transformer.wte.weight = self.lm_head.weight&lt;/code&gt;) are a crucial optimization for our historical language model. In a typical neural network, you&amp;rsquo;d have two separate weight matrices - one for converting input tokens to embeddings, and another for converting hidden states back to vocabulary probabilities. Weight tying means we use the &lt;em&gt;same&lt;/em&gt; weight matrix for both operations.&lt;/p&gt;
&lt;p&gt;Think of it like this: instead of having two different dictionaries (one for reading, one for writing), we use the same dictionary for both. The same table that maps &amp;ldquo;alderman&amp;rdquo; → [0.2, -0.5, 0.8, &amp;hellip;] is used whether the model is reading &amp;ldquo;alderman&amp;rdquo; as input or trying to generate &amp;ldquo;alderman&amp;rdquo; as output.&lt;/p&gt;
&lt;p&gt;Without weight tying, the model would have two separate weight matrices - one for converting input tokens to embeddings, and another for converting hidden states back to vocabulary probabilities. This means the model could learn that &amp;ldquo;alderman&amp;rdquo; means one thing when it sees it as input, but something slightly different when it tries to generate it as output. For rare historical terms, this inconsistency can cause the model to &amp;ldquo;forget&amp;rdquo; how to use words it has seen before properly.&lt;/p&gt;
&lt;p&gt;Historical vocabulary contains many rare terms such as &amp;ldquo;quoth&amp;rdquo; &amp;ldquo;alderman&amp;rdquo; and &amp;ldquo;paternoster&amp;rdquo; that appear infrequently in our training data. Without weight tying, the model might learn different representations for the same word when it sees it as input versus when it generates it as output. This inconsistency can cause the model to struggle with rare historical terms.&lt;/p&gt;
&lt;p&gt;When the model sees &amp;ldquo;alderman&amp;rdquo; in the input, it learns a specific representation of it. Later, when it needs to generate &amp;ldquo;alderman&amp;rdquo; in the output, it uses that same learned representation, ensuring consistency and improving the model&amp;rsquo;s ability to generate coherent historical language with proper terminology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mechanics (matrix reuse)&lt;/strong&gt;  A &lt;em&gt;single&lt;/em&gt; matrix $E \in \mathbb{R}^{(V \times d)}$ serves both roles: row lookup for input embeddings and column interaction for output scoring. The language head reuses it to compute logits via:&lt;/p&gt;
&lt;p&gt;$$\text{logits} = h \cdot E^T$$&lt;/p&gt;
&lt;p&gt;where $h$ is the hidden state at each position, this keeps the input interpretation and output prediction within the same semantic geometry - no second projection to drift or disagree.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why it helps&lt;/strong&gt; Parameter savings (~23.0M SLM, ~30.7M Regular) lower memory footprint and bandwidth. Gradients for predicting a rare token (e.g., &lt;em&gt;yeoman&lt;/em&gt;, &lt;em&gt;guildhall&lt;/em&gt;, &lt;em&gt;paternoster&lt;/em&gt;) directly refine the very rows used to embed it on future inputs - improving both recall and generation. Shared weights mildly regularize against the two spaces drifting apart and empirically improve perplexity for mid-scale autoregressive models (Press &amp;amp; Wolf, 2017; Inan et al., 2016).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analogy&lt;/strong&gt; If the transformer stack is a panel of historians debating context, the language modeling head is the scribe choosing the next historically plausible word. Weight tying means the scribe and historians consult the &lt;em&gt;same dictionary&lt;/em&gt; - no translation mismatch between how words are read and how they&amp;rsquo;re proposed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Practical notes&lt;/strong&gt; Avoid inflating vocabulary unnecessarily (cost scales with $V$); tied weights do not remove the need for careful rare token coverage in the corpus; and if later adding adapters or LoRA heads, remember that tying interacts with how those layers inject low-rank updates.&lt;/p&gt;
&lt;p&gt;Now that we understand how the model efficiently handles vocabulary, let&amp;rsquo;s examine the core processing units that transform these embeddings into meaningful representations.&lt;/p&gt;
&lt;h3 id=&#34;23-transformer-block-design&#34;&gt;2.3 Transformer Block Design&lt;/h3&gt;
&lt;p&gt;Each transformer block implements the standard attention and feed-forward pattern, but with optimizations for historical text processing. Let us look at the code real quick and then get into a little more detail.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleBlock&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple transformer block&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleCausalSelfAttention(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;LayerNorm(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mlp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleMLP(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_1(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mlp(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ln_2(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Transformer Block Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This code implements a single transformer block, which, as we know, is the fundamental building unit of our GPT model.&lt;/p&gt;
&lt;h4 id=&#34;231-self-attention-step&#34;&gt;2.3.1 Self-Attention Step&lt;/h4&gt;
&lt;p&gt;The self-attention step (&lt;strong&gt;&lt;code&gt;x = x + self.attn(self.ln_1(x))&lt;/code&gt;&lt;/strong&gt;) is the block that first normalizes the input with LayerNorm, then applies self-attention to understand relationships between words. The &lt;code&gt;+&lt;/code&gt; creates a &amp;ldquo;residual connection&amp;rdquo; that helps information flow through the network.&lt;/p&gt;
&lt;p&gt;As we discussed in &lt;a
	
		href = &#34;#214-gpt-architecture-components&#34;
	

	

	&gt;
	
	&lt;span&gt;
		section 2.1.4
	&lt;/span&gt;
&lt;/a&gt;, self-attention is the &amp;ldquo;magic&amp;rdquo; of transformers, allowing each token to decide how much attention to pay to every other token in the sequence. Our implementation uses multiple attention heads (12 for SLM, 16 for Regular) that operate in parallel, with each head learning to focus on different types of relationships - syntactic, semantic, or positional. Causal masking ensures that during training, the model learns to predict the next token based solely on the preceding context, which is essential for coherent text generation.&lt;/p&gt;
&lt;p&gt;The residual connection (&lt;strong&gt;&lt;code&gt;+&lt;/code&gt;&lt;/strong&gt;) is crucial, as it allows the model to preserve the original token representation while adding contextual information from the attention. The pre-normalization approach (LayerNorm before attention) provides more stable training than post-normalization, especially important when working with the varied linguistic patterns found in historical text.&lt;/p&gt;
&lt;h4 id=&#34;232-feed-forward-step&#34;&gt;2.3.2 Feed-Forward Step&lt;/h4&gt;
&lt;p&gt;After attention, we have the feed-forward step (&lt;strong&gt;&lt;code&gt;x = x + self.mlp(self.ln_2(x))&lt;/code&gt;&lt;/strong&gt;), which first normalizes the attended information with LayerNorm, then passes it through a multi-layer perceptron (MLP) that transforms and processes it.&lt;/p&gt;
&lt;p&gt;The MLP typically consists of two linear layers with a non-linear activation function (like GELU) between them, allowing the model to learn complex non-linear transformations of the attended features. This step is crucial because attention can only perform linear transformations on the input representations; the feed-forward network adds the necessary non-linearity, enabling the model to learn complex patterns and relationships in the historical text. Another residual connection preserves the original information, ensuring that the model can always fall back to the pre-attention representation if needed.&lt;/p&gt;
&lt;h4 id=&#34;233-understanding-the-feed-forward-mlp-sublayer&#34;&gt;2.3.3 Understanding the Feed-Forward (MLP) Sublayer&lt;/h4&gt;
&lt;p&gt;Directly beneath the &lt;code&gt;SimpleBlock&lt;/code&gt; code above, you see the line &lt;code&gt;self.mlp = SimpleMLP(config)&lt;/code&gt;. After attention has mixed information across positions, the model passes each token embedding through a position-wise feed-forward network (the MLP). Unlike attention, it does not look at other tokens; it refines the representation of each token independently, given the contextualized features attention just produced. In practice, this is where raw contextual patterns are distilled into richer semantic, stylistic, and morphological signals.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig4&#34; class=&#34;figure-ref&#34;&gt;Figure 4&lt;/a&gt; below visualizes how a single transformer block routes data through normalization, attention, and the feed-forward expansion/contraction before returning an upgraded representation via the residual path:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TB
    A[Input Embeddings&amp;lt;br/&amp;gt;batch, seq, emb] --&amp;gt; LN1[LayerNorm 1]
    LN1 --&amp;gt; ATTN[Multi-Head Attention&amp;lt;br/&amp;gt;query, key, value]
    ATTN --&amp;gt; DROPA[Dropout]
    DROPA --&amp;gt; RES1[Residual Add&amp;lt;br/&amp;gt;x + attn_out]
    RES1 --&amp;gt; LN2[LayerNorm 2]
    RES1 --&amp;gt; LN2
    LN2 --&amp;gt; EXPAND[Linear Expand&amp;lt;br/&amp;gt;emb → 4*emb]
    EXPAND --&amp;gt; GELU[GELU Activation]
    GELU --&amp;gt; PROJECT[Linear Project&amp;lt;br/&amp;gt;4*emb → emb]
    PROJECT --&amp;gt; DROPM[Dropout]
    DROPM --&amp;gt; RES2[Residual Add&amp;lt;br/&amp;gt;res1 + mlp_out]
    RES2 --&amp;gt; OUT[Block Output&amp;lt;br/&amp;gt;Updated embeddings]
    style A fill:#e1f5fe
    style ATTN fill:#f3e5f5
    style EXPAND fill:#fff3e0
    style PROJECT fill:#fff3e0
    style RES2 fill:#e8f5e8&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Internal Flow of a Transformer Block&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Conceptually, the MLP is a two-step projection: first, an expansion into a higher-dimensional &amp;ldquo;workspace&amp;rdquo; with a non-linear activation, then a projection back down so the residual can safely merge with the original stream.&lt;/p&gt;
&lt;p&gt;For our SLM, 768 dimensions expand to 3072 and then contract back to 768; for the larger model, 1024 dimensions expand to 4096. This temporary widening allows the network to express combinations of features that a purely linear transform could not capture. It is the difference between merely routing information and actually transforming it.&lt;/p&gt;
&lt;p&gt;Here is the representative structure shown in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt;:&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleMLP&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_in  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;act    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;GELU()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_out &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;drop   &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;drop(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_out(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;act(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;fc_in(x))))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Feed-Forward (MLP) Sublayer Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why expand then shrink?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The widened hidden space allows the model to form intermediate feature bundles (e.g., tense, register, archaic morphology) that do not cleanly live in the original lower-dimensional basis. The contraction enforces a stable interface for the residual path and keeps the total parameter count manageable. Removing the expansion would noticeably degrade expressiveness; removing the contraction would balloon memory use and break architectural symmetry.&lt;/p&gt;
&lt;p&gt;In our context, the historical model internalizes regularities like mapping &amp;ldquo;hath&amp;rdquo; and &amp;ldquo;doth&amp;rdquo; into modern tense abstractions while still preserving period flavor; it encodes stylistic shifts between court proceedings, religious prose, and narrative storytelling; it stabilizes inconsistent orthography and variant spellings so downstream layers predict coherent continuations instead of brittle echoes. Attention tells the model where to look; the MLP decides how to reinterpret what it saw.&lt;/p&gt;
&lt;p&gt;Focusing only on attention gives an incomplete mental model of transformers. More than half of the parameters and a large fraction of the FLOPs sit in these feed-forward layers. Under-sized MLPs lead to shallow pattern memorization - models that can repeat phrases but cannot generalize style or adapt archaic forms to new contexts. Properly scaled MLP width (the common ×4 expansion) is a proven sweet spot: smaller factors underfit; much larger ones give diminishing returns at this scale (see scaling law discussions in &lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kaplan et al. 2020
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A useful mental analogy:&lt;/strong&gt; attention is the lively debate in a hall; the MLP is each participant stepping aside to integrate what was heard into their own refined understanding before the next round of discussion. When you see &lt;code&gt;x = x + self.mlp(self.ln_2(x))&lt;/code&gt;, that addition represents the moment a token&amp;rsquo;s contextual representation is upgraded. Without this transformation, the model would &amp;ldquo;hear&amp;rdquo; context but fail to internalize it, producing shallow, literal continuations rather than fluent, period-authentic prose.&lt;/p&gt;
&lt;p&gt;In our &lt;code&gt;helloLondon&lt;/code&gt; models, the MLP is therefore essential for converting raw multi-head attention patterns into durable historical linguistic competence - one of the quiet reasons the generated text feels coherent rather than stitched together.&lt;/p&gt;
&lt;p&gt;Each block in our model (12 for SLM, 24 for Regular) applies this same pattern, allowing the model to build an increasingly sophisticated understanding of historical language patterns as text flows through the layers.&lt;/p&gt;
&lt;p&gt;Each transformer block applies layer normalization before both the self-attention mechanism and the feed-forward network, followed by residual connections. This pre-normalization approach (as opposed to post-normalization) has been shown to provide more stable training, especially important when working with the varied linguistic patterns found in historical text.&lt;/p&gt;
&lt;h4 id=&#34;234-activation-choice-matters&#34;&gt;2.3.4 Activation choice matters&lt;/h4&gt;
&lt;p&gt;The activation function determines how the neural network processes information at each layer. Think of it as a &amp;ldquo;decision maker&amp;rdquo; that decides how much of each input signal to pass through to the next layer. The most common activation functions are ReLU (Rectified Linear Unit) and GELU (Gaussian Error Linear Unit).&lt;/p&gt;
&lt;p&gt;ReLU is simple and fast: it passes positive values unchanged and sets negative values to zero (&lt;code&gt;f(x) = max(0, x)&lt;/code&gt;). However, ReLU can be &amp;ldquo;harsh&amp;rdquo; - it completely cuts off negative signals, leading to &amp;ldquo;dead neurons&amp;rdquo; that never activate again. GELU is smoother and more sophisticated: it uses a Gaussian distribution to determine how much of each input to pass through (&lt;code&gt;f(x) = x * Φ(x)&lt;/code&gt; where Φ is the cumulative distribution function of a standard normal distribution). This creates a smooth, differentiable function that allows for more nuanced information processing.&lt;/p&gt;
&lt;p&gt;GELU offers smoother gradients and better calibration for language than plain ReLU. The smoother nature of GELU helps the model learn more subtle patterns in historical text, where the relationships between words and phrases can be complex and nuanced. Alternatives like SwiGLU can yield marginal gains in perplexity but increase implementation complexity - valuable in frontier systems, optional in educational builds like helloLondon. Modest dropout in the MLP further improves generalization on a corpus that, while sizable, is still modest relative to billion-token modern pretraining regimes.&lt;/p&gt;
&lt;h4 id=&#34;235-pre-vs-post-normalization&#34;&gt;2.3.5 Pre vs Post-normalization&lt;/h4&gt;
&lt;p&gt;In pre-normalization, we normalize the input before processing it (like we do here). In post-normalization, we&amp;rsquo;d process first, then normalize the output. Pre-normalization is like checking that your ingredients are properly prepared before cooking, while post-normalization is like seasoning after cooking - both work, but pre-normalization tends to yield more consistent results.&lt;/p&gt;
&lt;p&gt;This matters because historical texts contain complex syntactic structures and long-range dependencies that require sophisticated attention mechanisms. The residual connections ensure that information can flow directly through the network, helping the model learn to preserve important historical context across long sequences while still allowing the attention mechanism to focus on relevant historical details.&lt;/p&gt;
&lt;h3 id=&#34;24-causal-self-attention-for-historical-sequences&#34;&gt;2.4 Causal Self-Attention for Historical Sequences&lt;/h3&gt;
&lt;p&gt;The attention mechanism is crucial for understanding the complex relationships in historical text. Our implementation is based on the original transformer architecture from &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&amp;ldquo;Attention Is All You Need&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; (Vaswani et al., 2017), but optimized for historical language patterns.&lt;/p&gt;
&lt;h4 id=&#34;understanding-multi-head-attention&#34;&gt;Understanding Multi-Head Attention&lt;/h4&gt;
&lt;p&gt;Multi-head attention runs several attention “heads” in parallel, allowing the model to focus on different aspects of a sequence simultaneously (syntax, semantics, and position). Compared to a single head, this parallelism yields richer representations—think multiple specialists examining the same text. In our setup, the SLM uses 12 heads and the Regular model 16, scaling capacity with model size. Empirically, heads tend to specialize (e.g., subject–verb agreement, word relations, word order), as observed by &lt;strong&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/1906.04341&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Clark et al. (2019) - &amp;ldquo;What Does BERT Look At?&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Research by &lt;strong&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kaplan et al. (2020) Scaling Laws for Neural Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; shows that the optimal number of attention heads scales with model size. For our 117M-parameter SLM, 12 heads provide sufficient parallel processing capacity, while our 354M-parameter Regular model benefits from 16 heads to capture more complex attention patterns.&lt;/p&gt;
&lt;p&gt;The attention mechanism has $O(n^2)$ complexity with respect to sequence length. This means that doubling our sequence length from 512 to 1024 tokens is a quadratic jump and requires &lt;strong&gt;4x&lt;/strong&gt; more memory for attention computations. This is why we carefully balance sequence length with available GPU memory and why techniques like &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.14135&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FlashAttention
	&lt;/span&gt;
&lt;/a&gt; (Dao et al., 2022) are so important for memory efficiency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How the attention mechanism works in practice:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; shows how we implement the attention mechanism that we&amp;rsquo;ve been discussing. Here&amp;rsquo;s what happens step by step:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Input Processing&lt;/strong&gt;: The model receives a batch of sequences (B = batch size, T = sequence length, C = embedding dimension). For example, with our SLM: B=4, T=512, C=768.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Query, Key, Value Generation&lt;/strong&gt;: The input embeddings are transformed into three different representations - Query (Q), Key (K), and Value (V) - using a single linear layer that outputs 3×768 dimensions, then splits them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Head Reshaping&lt;/strong&gt;: Each of Q, K, V is reshaped to separate the 12 attention heads, so each head gets its own 64-dimensional subspace (768 ÷ 12 = 64).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Attention Computation&lt;/strong&gt;: The scaled dot-product attention is computed, where each word &amp;ldquo;looks at&amp;rdquo; all previous words (causal masking) and decides how much attention to pay to each.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Output Assembly&lt;/strong&gt;: All attention head outputs are combined back into a single representation and projected through a final linear layer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This implementation is optimized for historical text processing, using PyTorch&amp;rsquo;s efficient &lt;code&gt;scaled_dot_product_attention&lt;/code&gt; function with causal masking to ensure the model can only attend to previous tokens, not future ones.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;SimpleCausalSelfAttention&lt;/span&gt;(torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Simple causal self-attention&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, config):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Key, query, value projections for all heads, but in a batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_attn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output projection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_proj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regularization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;attn_dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resid_dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Dropout(config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Batch size, sequence length, embedding dimensionality ($n_{embd}$)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        B, T, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Calculate query, key, values for all heads in batch &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# and move head forward to be the batch dim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        q, k, v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_attn(x)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd, dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        q &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; q&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        v &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; v&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head, C &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Causal self-attention; Self-attend:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# (B, nh, T, hs) x (B, nh, hs, T) -&amp;gt; (B, nh, T, T)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;functional&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;scaled_dot_product_attention(q, k, v, attn_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;, dropout_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;training &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, is_causal&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; y&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;contiguous()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;view(B, T, C)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Re-assemble all head outputs side by side&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Output projection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resid_dropout(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;c_proj(y))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Causal Self-Attention Implementation&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The attention mechanism computes attention as show below:&lt;/p&gt;
&lt;p&gt;$$\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$&lt;/p&gt;
&lt;p&gt;Where $Q$, $K$, and $V$ are the query, key, and value matrices, respectively.&lt;/p&gt;
&lt;p&gt;In our case, with 768-dimensional embeddings and 12 heads, each head operates on 64-dimensional subspaces ($d_k = 768 / 12 = 64$), providing sufficient representational capacity for each type of historical relationship while maintaining computational efficiency.&lt;/p&gt;
&lt;p&gt;In addition, the $\sqrt{d_k}$ scaling factor ($\sqrt{64} = 8$) prevents the dot products from becoming too large, ensuring stable gradient flow during training.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In plain English, please!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think of attention like a spotlight that can shine on different parts of a sentence. When the model is trying to understand the word &amp;ldquo;he&amp;rdquo; in a historical document, it needs to look back through the text to find who &amp;ldquo;he&amp;rdquo; refers to. The attention mechanism is like having multiple spotlights (our 12 or 16 attention heads) that can each focus on different aspects - each might look for people&amp;rsquo;s names, another for relationships, and another for locations.&lt;/p&gt;
&lt;p&gt;The mathematical formula we showed above is how the model calculates the amount of attention to pay to each word. The scaling factor ($$\sqrt(64) = 8) is like adjusting the brightness of the spotlight – it prevents the model from being &amp;ldquo;blinded&amp;rdquo; by very bright spots and helps it focus on the right amount of information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does this matter for historical text?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Historical documents are particularly challenging because they often feature complex sentence structures and references spanning long distances. For example, in a court record, you might see &amp;ldquo;The defendant, John Smith, was accused of theft. He claimed innocence throughout the trial.&amp;rdquo; The model needs to understand that &amp;ldquo;He&amp;rdquo; refers to &amp;ldquo;John Smith,&amp;rdquo; even though there are several words between them. The attention mechanism enables the model to make these connections, generating coherent text that maintains proper historical context and references.&lt;/p&gt;
&lt;p&gt;This is certainly required for language modeling, given the complex structures in which later words reference earlier ones, and understanding the full context is essential for proper interpretation. The attention mechanism enables the model to learn long-range dependencies, allowing it to generate coherent text across extended sequences. For historical texts specifically, this becomes even more important because archaic language patterns and historical references often span longer distances than those in modern texts.&lt;/p&gt;
&lt;h3 id=&#34;25-model-configuration&#34;&gt;2.5 Model Configuration&lt;/h3&gt;
&lt;p&gt;The model architecture uses a centralized configuration, where each parameter is selected based on research findings and practical constraints for historical text processing. The SLM architecture uses five key parameters, each representing a design choice with specific trade-offs between computational efficiency and learning capacity.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Parameter&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
          &lt;th&gt;Trade-off&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_layer&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;Number of transformer blocks (model depth)&lt;/td&gt;
          &lt;td&gt;More layers = better learning, but slower training&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_head&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;12&lt;/td&gt;
          &lt;td&gt;Number of attention heads (parallel processing)&lt;/td&gt;
          &lt;td&gt;More heads = better attention, but more computation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;n_embd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;768&lt;/td&gt;
          &lt;td&gt;Embedding dimension (token representation)&lt;/td&gt;
          &lt;td&gt;Larger = richer representations, but more memory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;max_length&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;512&lt;/td&gt;
          &lt;td&gt;Context window size (sequence length)&lt;/td&gt;
          &lt;td&gt;Longer = more context, but quadratic memory growth&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vocab_size&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;30K&lt;/td&gt;
          &lt;td&gt;Vocabulary size (tokenizer compatibility)&lt;/td&gt;
          &lt;td&gt;Larger = more words, but more parameters&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These parameters work together to create a model that effectively processes historical text while remaining computationally manageable.&lt;/p&gt;
&lt;h4 id=&#34;layer-count-n_&#34;&gt;&lt;strong&gt;Layer Count (n_layer: 12)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;The 12-layer architecture balances representational capacity with computational efficiency for historical text processing. Shallow layers (1-3) learn basic token patterns and grammatical structures, middle layers (4-8) capture complex syntactic relationships and historical language patterns, and deep layers (9-12) understand high-level semantic relationships and historical context.&lt;/p&gt;
&lt;p&gt;This depth follows GPT-2 Small&amp;rsquo;s 12-layer architecture, which delivers strong performance while remaining computationally manageable on available hardware.&lt;/p&gt;
&lt;h4 id=&#34;attention-heads-n_&#34;&gt;&lt;strong&gt;Attention Heads (n_head: 12)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Multi-head attention allows the model to attend to different types of relationships simultaneously – for example, temporal (chronological order), social (class hierarchies), geographical (London landmarks), and linguistic (archaic patterns). The 12-head architecture balances parallel processing capability with computational efficiency for historical text understanding.&lt;/p&gt;
&lt;h4 id=&#34;embedding-dimension-n_&#34;&gt;&lt;strong&gt;Embedding Dimension (n_embd: 768)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;The 768-dimensional embedding space can represent complex historical concepts, such as archaic terms (&amp;ldquo;yeoman&amp;rdquo;, &amp;ldquo;paternoster row&amp;rdquo;, &amp;ldquo;hath&amp;rdquo;), while maintaining computational efficiency. This dimension is commonly used in transformer architectures, including BERT-base and GPT-2 Medium.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why 768 became standard:&lt;/strong&gt; As a side note, in case you are seeing a lot of 768 lately, there are a good set of reasons for this. Beyond its divisibility ($768 ÷ 12 = 64$ per attention head), 768 aligns with GPU memory architecture - it&amp;rsquo;s a multiple of 256 (3 × 256), which matches common GPU memory bus widths and cache line sizes. This makes matrix operations more efficient on modern GPUs, as the hardware can process data in optimal chunks. Additionally, 768 provides sufficient representational capacity without the memory overhead of larger dimensions like 1024, making it practical for training on consumer hardware while still capturing complex linguistic relationships.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;context-window-n_&#34;&gt;&lt;strong&gt;Context Window (n_positions: 512)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;We use a 512-token context window as a practical balance between historical coherence and available compute for a learning-focused setup. While many of our working snippets (e.g., diary passages, sections of legal records, or literary excerpts) comfortably fit within 512 tokens, full historical documents can be much longer. The 512 window keeps attention costs manageable (quadratic in sequence length) while covering typical training segments we use.&lt;/p&gt;
&lt;p&gt;Both models use the same 30K vocabulary from our custom historical tokenizer, ensuring consistent tokenization across model variants.&lt;/p&gt;
&lt;h2 id=&#34;3-gpu-configuration-and-perf-optimization&#34;&gt;3. GPU Configuration and Perf. Optimization&lt;/h2&gt;
&lt;p&gt;The training system is designed to maximize GPU utilization while maintaining training stability. Understanding GPU architecture and memory management is crucial for efficient language model training, especially when working with historical text that requires significant computational resources.&lt;/p&gt;
&lt;h3 id=&#34;31-gpu-architecture-and-memory-management-for-language-model-training&#34;&gt;3.1 GPU Architecture and Memory Management for Language Model Training&lt;/h3&gt;
&lt;p&gt;Training on historical text benefits from sensible GPU settings even for a small, learning-focused model. We keep to practical, low-risk optimizations (precision choice, batch/sequence trade-offs, memory-aware attention) and accept some trial and error—reserving heavier systems engineering for larger setups.&lt;/p&gt;
&lt;p&gt;The main universal factors are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Attention scales quadratically with sequence length, so longer contexts get expensive fast.&lt;/li&gt;
&lt;li&gt;Natural language variability (syntax, vocabulary, style) demands sufficient model capacity and stable optimization.&lt;/li&gt;
&lt;li&gt;Real‑world data quality (formatting, noise) can destabilize training, requiring robust error handling and memory management.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For historical text specifically, archaic vocabulary, period terminology, and cultural references introduce patterns absent from modern corpora. OCR artifacts and uneven formatting in digitized sources add noise beyond what’s typical in contemporary datasets.&lt;/p&gt;
&lt;h4 id=&#34;311-gpu-memory-hierarchy-and-optimization-strategies&#34;&gt;3.1.1 GPU memory hierarchy and optimization strategies&lt;/h4&gt;
&lt;p&gt;Modern GPUs use a hierarchical memory system that significantly impacts training performance: fast but tiny registers and shared memory sit closest to the compute; a larger L2 cache buffers traffic; and global memory holds parameters and activations. Attention often ends up memory-bound, so moving less data (via AMP, Flash/SDPA kernels, and sensible sequence/batch sizes) is as important as raw FLOPs.&lt;/p&gt;
&lt;p&gt;For language model training, the key optimization is managing the &lt;em&gt;memory bandwidth bottleneck&lt;/em&gt;. Attention operations are often memory-bound rather than compute-bound, meaning performance is limited by how quickly data can be moved between memory levels rather than by computational power. If we are not careful, it is quite easy to run into memory issues, as shown in &lt;a href=&#34;#fig5&#34; class=&#34;figure-ref&#34;&gt;Figure 5&lt;/a&gt; below.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/mem1.png&#34; alt=&#34;Out of memory error Screenshot&#34; title=&#34;OOM error&#34; id=&#34;fig5&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt;OOM error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And it is not restricted to training only; even on checkpoints that are saved, we can also encounter memory issues, as shown in &lt;a href=&#34;#fig6&#34; class=&#34;figure-ref&#34;&gt;Figure 6&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/oom-checkpoint-eval.png&#34; alt=&#34;Out of memory error - checkpoing evals Screenshot&#34; title=&#34;OOM checkpoint eval&#34; id=&#34;fig6&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt;OOM checkpoint eval&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Mixed precision training and memory optimization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Training large language models requires careful memory management, especially when working with limited GPU resources. Our training system uses several optimization techniques to maximize memory efficiency while maintaining training stability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPU detection and basic configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The training system needs to work across different hardware setups, from single consumer GPUs to multi-GPU servers. Our approach uses a centralized configuration system that automatically adapts to available hardware.&lt;/p&gt;
&lt;p&gt;The actual GPU detection in &lt;code&gt;train_model_slm.py&lt;/code&gt; is quite straightforward - it checks for distributed training environment variables (&lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;LOCAL_RANK&lt;/code&gt;, &lt;code&gt;WORLD_SIZE&lt;/code&gt;) and sets up basic multi-GPU support if available. The system also detects GPU capabilities, such as bfloat16 support, and enables appropriate optimizations. This allows the same training script to work across different hardware setups, though the real complexity comes from the trial-and-error process of stabilizing training.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# GPU configuration (from config.py)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gpu_config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto_detect&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatically detect available GPUs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;max_gpus&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Maximum number of GPUs to use (0 = no limit, use all available)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;min_gpu_memory_gb&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Minimum GPU memory required (GB)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;preferred_gpu_types&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A30&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A40&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A100&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;V100&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;RTX4090&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;RTX4080&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;fallback_to_cpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fall back to CPU if no suitable GPUs found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;force_single_gpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Force single GPU even if multiple available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;force_multi_gpu&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Force multi-GPU even if only one available&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;gpu_memory_fraction&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fraction of GPU memory to use (0.0-1.0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;allow_growth&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Allow GPU memory growth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;log_device_placement&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log device placement for debugging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: GPU Configuration and Detection System&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The configuration in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt; is defined in our centralized &lt;code&gt;config.py&lt;/code&gt; file and provides settings for automatic GPU detection, memory management, and fallback options. While this looks comprehensive, the actual implementation is simpler - the training code primarily relies on PyTorch&amp;rsquo;s built-in distributed training detection and basic device selection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The reality of training: Nearly 100 runs and many failures&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/wandb.png&#34; alt=&#34;WandB Screenshot&#34; title=&#34;helloLondon training runs - WandB&#34; id=&#34;fig7&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; helloLondon training runs - WandB&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&#34;#fig7&#34; class=&#34;figure-ref&#34;&gt;Figure 7&lt;/a&gt; shows the actual training experience: 99 total runs with 24 completions. The failures were largely data-driven - OCR and encoding issues, uneven sequence lengths, and sensitivity to learning-rate warmup - and a few were plain memory pressure from early, less conservative settings. The code stabilized early; the data and knobs took time.&lt;/p&gt;
&lt;p&gt;This iterative process is typical in language model development - the &amp;ldquo;sophisticated&amp;rdquo; system shown here is the result of learning from these failures and gradually improving the training pipeline. The successful runs exhibit stable loss curves and appropriate learning rate schedules, demonstrating that the final configuration performs well on historical text processing tasks.&lt;/p&gt;
&lt;p&gt;Most importantly, this experience reinforces a fundamental truth in machine learning: &lt;strong&gt;data quality is still king&lt;/strong&gt;. No amount of sophisticated architecture, GPU optimization, or training infrastructure can overcome poor data quality. The &amp;ldquo;garbage in, garbage out&amp;rdquo; principle remains as true for language models as it was for the earliest machine learning systems. Our 75% failure rate was primarily due to data issues – such as inconsistent formatting, OCR errors, and encoding problems - not technical limitations. This is why Part 2&amp;rsquo;s focus on data cleaning and tokenization was so crucial to our success.&lt;/p&gt;
&lt;h3 id=&#34;32-precision-and-performance-configuration&#34;&gt;3.2 Precision and Performance Configuration&lt;/h3&gt;
&lt;p&gt;The system includes precision and performance configuration options that can be tuned based on available hardware. Mixed-precision training uses lower-precision (fp16/bf16) for most operations while keeping full precision for critical computations, providing significant memory savings and speed improvements with minimal impact on quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding fp16 and bf16: The Precision Trade-off&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To understand why precision matters for language model training, we need to look at how computers represent numbers. Standard floating-point numbers use 32 bits (float32), but we can use fewer bits to save memory and increase speed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;fp16 (Half Precision)&lt;/strong&gt;: Uses 16 bits to represent numbers, cutting memory usage in half and enabling faster computation. However, it has a smaller range of representable numbers, which can cause &amp;ldquo;overflow&amp;rdquo; (numbers too large) or &amp;ldquo;underflow&amp;rdquo; (numbers too small) during training.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;bf16 (Brain Float 16)&lt;/strong&gt;: Also uses 16 bits, but with a different bit layout that matches float32&amp;rsquo;s exponent range. This means it can represent the same range of large and small numbers as float32, but with less precision for very small decimal values.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why bf16 is better for language models:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;bf16 provides better numerical stability than fp16, especially for large language models, reducing the likelihood of overflow and underflow that can cause training instability. The key difference is that bf16 can represent the same range of numbers as float32 (from very small to very large), while fp16 has a much smaller range. This is crucial for language models because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gradient magnitudes vary widely&lt;/strong&gt; - Some gradients are very small (close to zero) while others are large&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention weights&lt;/strong&gt; - The softmax operations in attention can produce very small numbers that FP16 might round to zero&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning rate scaling&lt;/strong&gt; - Modern optimizers like AdamW work with gradients of varying magnitudes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When gradients become too small and are rounded to zero (underflow), the model stops learning effectively. When they become too large (overflow), training becomes unstable. bf16&amp;rsquo;s wider range helps prevent both issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding precision and performance settings:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The configuration in &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; toggles the levers that matter on consumer hardware: TF32 for faster matmuls, AMP (prefer bf16) for stability and memory cuts, &lt;code&gt;torch.compile&lt;/code&gt; for an extra boost after warmup, and sequence/batch sizes sized to your VRAM. Used together, these commonly halve activation memory and yield 2-3x speedups versus full-precision baselines.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Runtime/precision knobs (A30 optimized)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_tf32&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_amp&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;amp_dtype&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bf16&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# bf16 on Ampere; fallback to fp16 if unsupported&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_compile&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# torch.compile; set False to reduce memory usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Conservative baseline (for broad hardware) - uncomment to use:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;enable_tf32&amp;#34;: False,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;enable_amp&amp;#34;: True,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;amp_dtype&amp;#34;: &amp;#34;fp16&amp;#34;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Sequence/batch control&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;max_length&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# increase tokens per step when VRAM allows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;batch_size&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# per-GPU batch; raise if VRAM allows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Conservative sequence/batch - uncomment to use:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;max_length&amp;#34;: 768,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;batch_size&amp;#34;: 8,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Precision and Performance Configuration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;key-gpu-configuration-settings&#34;&gt;&lt;strong&gt;Key GPU Configuration Settings&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;A few switches move the needle the most: enable TF32 on Ampere-class GPUs for a quick matrix-mul speedup; use AMP (bf16 where supported, fp16 otherwise) to halve activation memory; and turn on &lt;code&gt;torch.compile&lt;/code&gt; if you can afford the warmup to get another 1.2-1.5x after a few hundred steps. Keep the sequence length in line with VRAM (~512 tokens for 8GB, ~1024 for 16GB+), and scale the per-GPU batch size accordingly (think hundreds of MB per batch at these widths). The repo includes sensible presets so you can start conservative and dial up.&lt;/p&gt;
&lt;h4 id=&#34;321-real-world-performance-results&#34;&gt;3.2.1 Real-World Performance Results&lt;/h4&gt;
&lt;p&gt;On 2x A30s, the SLM lands around mid-20s MFU with ~210 ms/iter and ~18 GB per GPU, converging from ~10.4 loss to the mid-3s over the full run. The clean BPE tokenizer and precision stack keep math efficient, and DDP delivers the expected speedup over a single device.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic Precision Detection and Memory Optimization:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The system also includes automatic precision detection and memory optimization during model initialization. The code snippet below shows how the system automatically selects the optimal precision format based on available hardware capabilities:&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Precision / TF32 knobs from config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_tf32&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backends&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;matmul&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;allow_tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;bool&lt;/span&gt;(tf32)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backends&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cudnn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;allow_tf32 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;bool&lt;/span&gt;(tf32)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_float32_matmul_precision(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;high&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tf32 &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;medium&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;use_amp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_amp&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amp_dtype_cfg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;amp_dtype&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bf16&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bf16_ok &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_bf16_supported()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; use_amp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; amp_dtype_cfg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bf16&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; bf16_ok:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bfloat16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;float16&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dtype &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;float32&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Precision Detection and Memory Optimization&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The TF32 configuration optimizes matrix operations for Ampere+ GPUs, delivering significant speedups while maintaining training stability.&lt;/p&gt;
&lt;h3 id=&#34;33-multi-gpu-training-with-distributed-data-parallel&#34;&gt;3.3 Multi-GPU Training with Distributed Data Parallel&lt;/h3&gt;
&lt;p&gt;The system supports multi-GPU training using PyTorch&amp;rsquo;s DistributedDataParallel (DDP) - each GPU hosts a full model replica, processes different batches in parallel, and synchronizes gradients automatically. PyTorch handles the inter‑GPU communication, so on two GPUs, you typically see near‑linear speedup (~2×) for these model sizes.&lt;/p&gt;
&lt;p&gt;Multi-GPU training improves throughput and shortens wall‑clock time by splitting work across devices. On our 2× A30 setup, we process 36 sequences in parallel (18 per GPU) instead of 18 on a single card, cutting Regular model training from ~56 hours to ~28–32 hours. It also offers operational flexibility: scale up or down based on the number of GPUs available.&lt;/p&gt;
&lt;p&gt;However, multi-GPU training introduces several challenges that can limit performance gains. The primary bottleneck is &lt;strong&gt;inter-GPU communication&lt;/strong&gt; - after each backward pass, gradients must be synchronized across all GPUs, which requires transferring large amounts of data. This communication overhead can become significant, especially with larger models and more GPUs.&lt;/p&gt;
&lt;p&gt;The performance of multi-GPU training heavily depends on the interconnect between GPUs. On NVIDIA systems, &lt;em&gt;InfiniBand&lt;/em&gt; provides the highest bandwidth and lowest latency for GPU-to-GPU communication, enabling near-linear scaling across many GPUs. &lt;em&gt;NVLink&lt;/em&gt; (found on high-end NVIDIA GPUs such as A100 and H100) provides direct GPU-to-GPU connections with very high bandwidth, making it ideal for 2-8 GPU setups. &lt;em&gt;PCIe&lt;/em&gt; connections are slower but more common in consumer and workstation systems.&lt;/p&gt;
&lt;p&gt;In AMD systems, &lt;em&gt;Infinity Fabric&lt;/em&gt; serves a role similar to NVLink, providing high-bandwidth interconnects between GPUs. AMD&amp;rsquo;s &lt;em&gt;MI200&lt;/em&gt; and &lt;em&gt;MI300&lt;/em&gt; series GPUs include Infinity Fabric links that enable efficient multi-GPU communication.&lt;/p&gt;
&lt;p&gt;In practice, scaling efficiency depends on the ratio of computation to communication. Our historical language models have relatively modest parameter counts (117M-354M), so communication overhead can be significant compared to computation time. This is why we see good scaling with 2 GPUs but diminishing returns with more GPUs - the communication overhead starts to dominate.&lt;/p&gt;
&lt;p&gt;DDP is more efficient than naive data parallelism because it reduces communication overhead and enables larger effective batch sizes, as shown in &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt; below.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# DDP setup (process group already initialized in main())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;RANK&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;RANK&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;LOCAL_RANK&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_world_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;WORLD_SIZE&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_device(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;seed_offset &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_rank
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;seed_offset &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_world_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Multi-GPU Training Setup&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;What is &amp;ldquo;rank&amp;rdquo; and why does it matter?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In distributed training, each GPU process gets a unique “rank.” Rank 0 acts as the coordinator (handles logging, checkpointing, and WandB), while the remaining ranks focus purely on computation. This avoids collisions - only one process touches files and dashboards - while every device contributes gradients.&lt;/p&gt;
&lt;p&gt;This division of labor is crucial because it prevents conflicts. Without it, all processes would try to save checkpoints simultaneously, log to WandB at the same time, or write to the same files, causing errors and corruption.&lt;/p&gt;
&lt;p&gt;The key to scaling efficiency is that each GPU works independently on different data batches, then synchronizes only the essential information (gradients). Here&amp;rsquo;s how it works:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parallel computation&lt;/strong&gt;: Each GPU processes a different batch of data simultaneously&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gradient synchronization&lt;/strong&gt;: After each backward pass, gradients are averaged across all GPUs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent updates&lt;/strong&gt;: Each GPU updates its model copy with the averaged gradients&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means that if you have 2 GPUs, you can process 2x the data in the same time, giving you roughly 2x the speed. With 4 GPUs, you get approximately 4x speedup. The &amp;ldquo;near-linear&amp;rdquo; part acknowledges that there&amp;rsquo;s always some overhead from communication and synchronization, so that you might get 1.9x speedup instead of exactly 2x. Still, it&amp;rsquo;s close enough to be very effective.&lt;/p&gt;
&lt;p&gt;However, there&amp;rsquo;s a practical limit to this approach. Beyond 8-16 GPUs, the communication overhead becomes so significant that you need more robust hardware (such as InfiniBand networks) and advanced systems engineering techniques (gradient compression, pipeline parallelism, model parallelism) to maintain efficiency. For truly large-scale training with hundreds of GPUs, you need specialized infrastructure and techniques that go far beyond what we&amp;rsquo;re doing here.&lt;/p&gt;
&lt;p&gt;This combination of distributed training and memory optimization enables us to train our historical language models efficiently, even on consumer hardware. The distributed setup provides fault tolerance and near-linear speedup, while the precision optimizations enable larger models and longer sequences on the same hardware.&lt;/p&gt;
&lt;h2 id=&#34;4-training-infrastructure-making-it-all-work-together&#34;&gt;4. Training Infrastructure: Making It All Work Together&lt;/h2&gt;
&lt;p&gt;As a reminder, as we saw earlier, the two model variants share the same training stack (scheduler, checkpointing, WandB, DDP). See Part 1 for the high‑level comparison; here are the training‑relevant differences only:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLM (117M): per‑GPU batch 18 → effective 36 on 2 GPUs; sequence length 512; ~7–8h on 2×A30&lt;/li&gt;
&lt;li&gt;Regular (354M): per‑GPU batch 12 → effective 24 on 2 GPUs; sequence length 1024; ~28–32h on 2×A30&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;41-the-training-loop&#34;&gt;4.1 The Training Loop&lt;/h3&gt;
&lt;p&gt;The core training happens in the &lt;code&gt;train()&lt;/code&gt; method, which implements a standard language model training loop with several key phases - outlined below.&lt;/p&gt;
&lt;h4 id=&#34;411-data-loading-and-preparation&#34;&gt;4.1.1 Data Loading and Preparation&lt;/h4&gt;
&lt;p&gt;The training loop starts by loading tokenized data using &lt;code&gt;get_batch(&#39;train&#39;)&lt;/code&gt;, which reads from pre-processed binary files created during data preparation. This includes both training and validation data, with the tokenizer from &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2: Data Collection &amp;amp; Custom Tokenizers
	&lt;/span&gt;
&lt;/a&gt; handling the conversion between text and tokens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main Training Loop Structure:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;train&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Main training loop&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get initial batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    X, Y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_batch(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;train&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1. Learning rate scheduling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_lr(iter_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2. Evaluation and checkpointing (every eval_interval steps)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eval_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            losses &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;estimate_loss()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save checkpoint if validation loss improved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3. Forward pass with mixed precision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;amp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;autocast():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits, loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model(X, Y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 4. Backward pass and optimization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        loss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;backward()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;utils&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;clip_grad_norm_(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parameters(), &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;step()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zero_grad()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 5. Get next batch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        X, Y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_batch(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;train&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 6. Logging and monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB and console&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Core Training Loop Structure&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Training Process Flow:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Understanding how the training actually works requires seeing both the high-level flow and the technical details of each phase. &lt;a href=&#34;#fig8&#34; class=&#34;figure-ref&#34;&gt;Figure 8&lt;/a&gt; shows the complete training process flow.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig8&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[Start Training] --&amp;gt; B[Load Tokenized Data]
    B --&amp;gt; C[Initialize Model &amp;amp; Optimizer]
    C --&amp;gt; D[Training Loop Start]
    D --&amp;gt; E[Update Learning Rate]
    E --&amp;gt; F{Evaluation Time?}
    F --&amp;gt;|Yes| G[Run Validation]
    F --&amp;gt;|No| H[Forward Pass]
    G --&amp;gt; H
    H --&amp;gt; I[Compute Loss]
    I --&amp;gt; J[Backward Pass]
    J --&amp;gt; K[Gradient Clipping]
    K --&amp;gt; L[Update Weights]
    L --&amp;gt; M[Zero Gradients]
    M --&amp;gt; N[Log Metrics]
    N --&amp;gt; O{Checkpoint?}
    O --&amp;gt;|Yes| P[Save Model State]
    O --&amp;gt;|No| Q[Load Next Batch]
    P --&amp;gt; Q
    Q --&amp;gt; R{Max Iterations?}
    R --&amp;gt;|No| D
    R --&amp;gt;|Yes| S[Save Final Model]
    S --&amp;gt; T[End Training]&lt;/pre&gt;
    &lt;figcaption&gt;Figure 8: Training Process Flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have a high-level overview of the training process, let us dig deeper into each phase and see how it works in practice.&lt;/p&gt;
&lt;h4 id=&#34;412-data-loading&#34;&gt;4.1.2 Data Loading&lt;/h4&gt;
&lt;p&gt;Data loading reads pre-tokenized sequences from binary files (&lt;code&gt;.bin&lt;/code&gt;) using &lt;code&gt;np.memmap&lt;/code&gt; for memory efficiency. The initial tokenization process can take quite a long time on our 500M+ character corpus, but this is done only once and saved to disk. This optimization was crucial during our development process – given nearly 100 training runs and many failures, re-tokenizing the entire corpus each time would have been prohibitively slow. The system handles train/val splits (90/10 %) with random sampling per batch and uses &lt;code&gt;pin_memory()&lt;/code&gt; and &lt;code&gt;non_blocking=True&lt;/code&gt; for faster GPU transfers.&lt;/p&gt;
&lt;p&gt;When we run this for the time time, it takes a long time to load and tokenize the training data corpus. We see this just startging in &lt;a href=&#34;#fig9&#34; class=&#34;figure-ref&#34;&gt;Figure 9&lt;/a&gt; below.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16.png&#34; alt=&#34;Tokenizer training data Screenshot&#34; title=&#34;Tokenizer training data&#34; id=&#34;fig9&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt;Tokenizer training data&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Batch sizes are optimized for our 2x A30 GPU setup: 18 per GPU for the SLM model (36 effective batch size) and 12 per GPU for the Regular model (24 effective batch size). These numbers balance memory usage with training stability – the SLM can handle larger batches thanks to its smaller 117M parameter count. In comparison, the Regular model&amp;rsquo;s 354M parameters require smaller batches to fit in GPU memory.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#fig10&#34; class=&#34;figure-ref&#34;&gt;Figure 10&lt;/a&gt; below shows the dual GPU setup used for one of the training sessions for the regular mode.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/gpu1.png&#34; alt=&#34;GPU detail Screenshot&#34; title=&#34;GPU details&#34; id=&#34;fig10&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt;GPU detail&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;413-learning-rate-scheduling&#34;&gt;4.1.3 Learning Rate Scheduling&lt;/h4&gt;
&lt;p&gt;Learning Rate Scheduling uses cosine decay with warmup, a two-phase approach that helps prevent training instability. The warmup phase gradually increases the learning rate from 0 to the target value over 500 steps (SLM) or 1000 steps (Regular model), preventing the model from making large, destabilizing updates early in training.&lt;/p&gt;
&lt;p&gt;After warmup, cosine decay smoothly reduces the learning rate following a cosine curve to 10% of the initial rate by the end of training. In case you are not familiar with Cosine decay, it is a scheduling strategy where the learning rate follows the shape of a cosine wave: starting at the maximum value after warmup, it decreases slowly at first, then more rapidly in the middle of training, and finally levels off gently near the minimum value.&lt;/p&gt;
&lt;p&gt;Mathematically, this follows the curve &lt;code&gt;lr = min_lr + (max_lr - min_lr) × 0.5 × (1 + cos(π × progress))&lt;/code&gt;, where &lt;code&gt;progress&lt;/code&gt; goes from 0 (start of decay) to 1 (end of training). Unlike linear decay (which drops at a constant rate) or step decay (which drops abruptly at fixed intervals), cosine decay provides a smooth, natural reduction that helps the model explore the loss landscape more effectively early on, then refine its parameters more precisely as training progresses.&lt;/p&gt;
&lt;p&gt;The initial learning rates are chosen based on model size: 3e-4 (0.0003) for the SLM model and 3e-5 (0.00003) for the Regular model. The 10x difference reflects the Regular model&amp;rsquo;s larger parameter count (354M vs 117M) - larger models typically need smaller learning rates to prevent gradient explosion. The cosine decay ensures the model converges smoothly rather than oscillating around the minimum, which is crucial for the complex patterns in historical text.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_lr&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, it):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Learning rate schedule&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    warmup_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lr_decay_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_iters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    min_lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; warmup_iters:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (warmup_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; lr_decay_iters:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; min_lr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    decay_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (it &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; warmup_iters) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (lr_decay_iters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; warmup_iters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; decay_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coeff &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; math&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cos(math&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pi &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; decay_ratio))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; min_lr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; coeff &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; min_lr)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Learning Rate Scheduling Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt; shows how the learning rate schedule is implemented. The function takes the current iteration number and returns the appropriate learning rate based on whether we&amp;rsquo;re in the warmup phase (linear increase) or decay phase (cosine curve). The &lt;code&gt;warmup_iters&lt;/code&gt; parameter controls the warmup duration, while &lt;code&gt;min_lr&lt;/code&gt; sets the final learning rate to 10% of the initial value.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a side note, in case you are curious about why a &lt;strong&gt;cosine decay&lt;/strong&gt; specifically makes sense, then read on. The cosine function has unique mathematical properties that make it ideal for learning rate scheduling. Unlike linear decay (which drops too quickly) or exponential decay (which drops too slowly), cosine decay starts with a gentle slope that gradually steepens, then flattens out near the end. This creates a &amp;ldquo;restart&amp;rdquo; effect, allowing the model to escape local minima early in training and then fine-tune more precisely in later stages.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The smooth, continuous nature of cosine decay prevents the learning rate from changing too abruptly, which could destabilize training. Given the historical text&amp;rsquo;s complex linguistic patterns, this gradual, adaptive approach helps the model learn both general language structures and specific historical vocabulary without getting stuck in suboptimal solutions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4 id=&#34;414-evaluation&#34;&gt;4.1.4 Evaluation&lt;/h4&gt;
&lt;p&gt;We run evaluations at a regular interval after a certain number of steps, which are defined in the &lt;strong&gt;&lt;code&gt;eval_interval()&lt;/code&gt;&lt;/strong&gt; method (defaults to 500 for SLM, 1000 for Regular) and compute loss on both train and validation sets using the &lt;strong&gt;&lt;code&gt;estimate_loss()&lt;/code&gt;&lt;/strong&gt; method. The different intervals reflect the models&amp;rsquo; training complexity: the SLM trains faster and benefits from more frequent checks, while the Regular model’s longer runs can use less frequent evaluation.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;estimate_loss()&lt;/code&gt; function monitors training progress without disrupting the learning process. To ensure consistent measurements, it temporarily switches the model to evaluation mode (&lt;strong&gt;&lt;code&gt;model.eval()&lt;/code&gt;&lt;/strong&gt;). In this mode, dropout layers stop randomly dropping neurons (using the full network capacity), and batch normalization uses running statistics rather than recomputing them from each batch. This means the same input produces the same output every time, unlike in training mode, where dropout introduces randomness for regularization.&lt;/p&gt;
&lt;p&gt;Rather than computing loss on the entire dataset (which would be too slow), &lt;code&gt;estimate_loss()&lt;/code&gt; samples &lt;code&gt;eval_iters&lt;/code&gt; random batches (default 100) from both training and validation sets. It computes the loss for each batch and returns the average, providing a representative estimate of model performance while remaining computationally efficient.&lt;/p&gt;
&lt;p&gt;The evaluation process uses &lt;strong&gt;&lt;code&gt;torch.no_grad()&lt;/code&gt;&lt;/strong&gt; to disable gradient computation during validation. Gradients are the partial derivatives that tell us how to adjust each model parameter to reduce loss - they&amp;rsquo;re computed during the backward pass and stored for the optimizer. During evaluation, we don&amp;rsquo;t need gradients because we&amp;rsquo;re not updating weights; we&amp;rsquo;re just measuring performance.&lt;/p&gt;
&lt;p&gt;Disabling gradient computation serves two critical purposes. First, it prevents memory leaks by not storing gradients for validation computations - without this, GPU memory would gradually increase during evaluation and eventually cause out-of-memory errors. Second, it ensures accurate loss measurement by preventing any accidental gradient updates during the evaluation phase. The &lt;code&gt;no_grad()&lt;/code&gt; context manager is essential for maintaining training stability and memory efficiency.&lt;/p&gt;
&lt;h4 id=&#34;415-forward-pass&#34;&gt;4.1.5 Forward Pass&lt;/h4&gt;
&lt;p&gt;A forward pass is when the model processes input data through its layers to produce a prediction. Think of it like asking the model a question: given a sequence of historical text tokens, &amp;ldquo;what word should come next?&amp;rdquo; The model flows the input forward through 12 transformer blocks (SLM) or 24 blocks (Regular), each applying self-attention (to understand relationships between words) and feed-forward operations (to transform and refine the representations). At the end, the model outputs a probability distribution over all possible next tokens.&lt;/p&gt;
&lt;p&gt;The forward pass uses mixed precision training with &lt;strong&gt;&lt;code&gt;torch.amp.autocast&lt;/code&gt;&lt;/strong&gt; and bf16/fp16 data types, reducing memory usage by ~50% while maintaining training stability. Cross-entropy loss is computed by comparing the model&amp;rsquo;s predicted probabilities with the actual next tokens in the training data; it measures how &amp;ldquo;wrong&amp;rdquo; the model&amp;rsquo;s predictions are. The loss function handles variable sequence lengths by appropriately padding sequences. The mixed precision approach is particularly important for our historical text corpus, which contains long sequences that would otherwise exceed GPU memory limits.&lt;/p&gt;
&lt;h4 id=&#34;416-backward-pass&#34;&gt;4.1.6 Backward Pass&lt;/h4&gt;
&lt;p&gt;After the forward pass tells us how wrong the model is (via the loss), the backward pass figures out how to fix it. Using &lt;strong&gt;&lt;code&gt;loss.backward()&lt;/code&gt;&lt;/strong&gt;, PyTorch computes gradients for every parameter in the model - these gradients tell us the direction and magnitude of changes needed to reduce the loss. It&amp;rsquo;s like having a GPS telling you which way to move and how far, but for 117 million (SLM) or 354 million (Regular) parameters simultaneously.&lt;/p&gt;
&lt;p&gt;The system applies gradient clipping with &lt;strong&gt;&lt;code&gt;torch.nn.utils.clip_grad_norm_&lt;/code&gt;&lt;/strong&gt; using a maximum norm of 1.0. Sometimes gradients can become extremely large, especially when processing complex or unusual historical text patterns. Without clipping, these huge gradients would cause the model parameters to jump wildly, potentially making the model unstable or causing it to &amp;ldquo;forget&amp;rdquo; what it learned. Clipping acts like a safety valve, limiting the maximum size of parameter updates to keep training stable. Put simply, gradient clipping caps the overall (global) gradient norm at a threshold; if it exceeds the limit, gradients are rescaled so the update stays bounded. In our early runs, omitting clipping occasionally produced NaN losses; keeping &lt;code&gt;max_norm=1.0&lt;/code&gt; eliminated those spikes.&lt;/p&gt;
&lt;p&gt;After computing gradients, the system updates the model weights using the &lt;strong&gt;&lt;code&gt;AdamW&lt;/code&gt;&lt;/strong&gt; optimizer, which applies the gradients with momentum and adaptive learning rates for each parameter. The optimizer decouples weight decay (a regularization technique to prevent overfitting) from gradient updates, improving generalization. Finally, gradients are zeroed with &lt;strong&gt;&lt;code&gt;optimizer.zero_grad(set_to_none=True)&lt;/code&gt;&lt;/strong&gt; - this clears the gradient buffers before the next iteration, preventing them from accumulating across batches. The &lt;code&gt;set_to_none=True&lt;/code&gt; option releases memory immediately rather than waiting for GC, improving memory efficiency.&lt;/p&gt;
&lt;h4 id=&#34;417-checkpointing&#34;&gt;4.1.7 Checkpointing&lt;/h4&gt;
&lt;p&gt;Checkpointing saves model state, optimizer state, iteration number, and best validation loss whenever validation performance improves, rather than at every evaluation. This selective saving strategy provides multiple benefits: it conserves disk space (our 354M-parameter model checkpoints are ~1.4GB each), reduces I/O overhead that can slow down training, and improves overall training time by 5-10% by eliminating redundant disk writes. The system maintains only the last 5 checkpoints (as configured in &lt;code&gt;config.py&lt;/code&gt;), with PyTorch&amp;rsquo;s &lt;code&gt;torch.save()&lt;/code&gt; using compression to ensure efficient storage while preserving all necessary training state for resuming. We&amp;rsquo;ll dive deeper into checkpointing strategies and implementation details in Section 6.&lt;/p&gt;
&lt;p&gt;The training loop implements standard optimization practices, including dynamic learning rate scheduling, regular evaluation and checkpointing, and comprehensive logging to WandB (as detailed in Section 5). The system automatically saves checkpoints when validation loss improves, ensuring that the best model is always preserved. The learning rate schedule uses cosine decay with warmup, which is standard practice for transformer training.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📁 Full Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SLM: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/04_training/train_model_slm.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;code&gt;04_training/train_model_slm.py&lt;/code&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Regular Model: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/04_training/train_model.py&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;code&gt;04_training/train_model.py&lt;/code&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;42-model-initialization-setting-up-the-training-foundation&#34;&gt;4.2 Model Initialization: Setting Up the Training Foundation&lt;/h3&gt;
&lt;p&gt;Before the training loop can begin, the system must properly initialize the model, optimizer, and training infrastructure. The &lt;strong&gt;&lt;code&gt;init_model()&lt;/code&gt;&lt;/strong&gt; method handles this setup, ensuring everything is configured correctly for efficient training.&lt;/p&gt;
&lt;h4 id=&#34;421-model-configuration-and-creation&#34;&gt;4.2.1 Model Configuration and Creation&lt;/h4&gt;
&lt;p&gt;The initialization process starts by loading metadata from the tokenized data to ensure the model architecture matches the training data. The system reads vocabulary size, block size, and other parameters from the &lt;code&gt;meta.pkl&lt;/code&gt; file created during data preparation, ensuring consistency between the model and the data it will be trained on.&lt;/p&gt;
&lt;p&gt;The model configuration is built from the SLM parameters defined in &lt;code&gt;config.py&lt;/code&gt;, including the number of layers (12), attention heads (12), embedding dimensions (768), and other architectural choices. This configuration is then used to create the &lt;code&gt;SimpleGPT&lt;/code&gt; model instance, which inherits from PyTorch&amp;rsquo;s &lt;code&gt;nn.Module&lt;/code&gt; and provides all the functionality we discussed in the architecture section.&lt;/p&gt;
&lt;h4 id=&#34;422-optimizer-setup-and-configuration&#34;&gt;4.2.2 Optimizer Setup and Configuration:&lt;/h4&gt;
&lt;p&gt;The optimizer is the algorithm that actually updates the model&amp;rsquo;s parameters (weights and biases) during training. After the backward pass computes gradients (which tell us how to adjust each parameter), the optimizer applies those gradients to update the parameters and improve the model.&lt;/p&gt;
&lt;p&gt;The system uses &lt;strong&gt;AdamW&lt;/strong&gt; (Adam with Weight Decay), which is a popular optimizer for training transformers. AdamW combines the best of two approaches: Adam (which adapts the learning rate for each parameter individually, helping with convergence) and weight decay (a form of regularization that prevents overfitting by discouraging large parameter values).&lt;/p&gt;
&lt;p&gt;However, not all parameters should be regularized the same way. The optimizer splits parameters into two groups for different weight decay:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2D parameters&lt;/strong&gt; (weight matrices): These are the main &amp;ldquo;learnable&amp;rdquo; parts of the model - the connections between neurons in different layers. These receive weight decay (value 0.1) to prevent them from growing too large, which helps prevent overfitting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1D parameters&lt;/strong&gt; (biases): These are additive constants that help shift the model&amp;rsquo;s predictions. They don&amp;rsquo;t receive weight decay (value 0.0) because regularizing biases doesn&amp;rsquo;t help with overfitting and can actually hurt performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This two-group approach follows standard practices for transformer training and ensures the model generalizes well to unseen historical text.&lt;/p&gt;
&lt;p&gt;Modern PyTorch supports &amp;ldquo;fused&amp;rdquo; optimizer operations, which combine multiple steps into a single, faster GPU kernel. Instead of executing separate operations (unscale gradients, update parameters, update optimizer state), fused AdamW performs all three in a single optimized GPU operation. This can provide 10-20% speedup on modern GPUs. The system automatically detects whether your PyTorch version supports fused operations and uses them when available, falling back to the standard implementation otherwise.&lt;/p&gt;
&lt;p&gt;Concretely, we use AdamW with the following settings for this project: &lt;code&gt;betas=(0.9, 0.95)&lt;/code&gt;, &lt;code&gt;weight_decay=0.1&lt;/code&gt;, and the learning rate provided by the scheduler (warmup + cosine decay). The AdamW &lt;code&gt;eps&lt;/code&gt; parameter is left at the PyTorch default unless you change it in code. When available, the fused AdamW kernel is enabled automatically. See &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt; for the exact call in &lt;code&gt;init_model()&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&#34;423-model-compilation-and-multi-gpu-setup&#34;&gt;4.2.3 Model Compilation and Multi-GPU Setup&lt;/h4&gt;
&lt;p&gt;Model compilation with PyTorch&amp;rsquo;s &lt;strong&gt;&lt;code&gt;torch.compile&lt;/code&gt;&lt;/strong&gt; is similar to traditional code compilation, but with important differences. When you compile Python code (like using &lt;code&gt;gcc&lt;/code&gt; for C), the compiler transforms the source code into optimized machine code once, which then runs faster. Similarly, &lt;code&gt;torch.compile&lt;/code&gt; takes your model&amp;rsquo;s computation graph and optimizes it, but it does this &lt;strong&gt;at runtime&lt;/strong&gt; rather than ahead of time.&lt;/p&gt;
&lt;p&gt;The compilation process analyzes your model&amp;rsquo;s operations (matrix multiplications, attention layers, etc.) and generates optimized kernels tuned to your hardware. This includes &lt;strong&gt;operator fusion&lt;/strong&gt; (combining multiple operations into single GPU kernels), &lt;strong&gt;memory layout optimization&lt;/strong&gt; (arranging data for better cache usage), and &lt;strong&gt;kernel selection&lt;/strong&gt; (choosing the fastest implementation for your specific GPU). The result is often 1.2-1.5x speedier training, but with an initial &amp;ldquo;warmup&amp;rdquo; cost: the first few forward/backward passes are slower while PyTorch analyzes the model and generates optimized code.&lt;/p&gt;
&lt;p&gt;This differs from traditional compilation because the optimization happens dynamically based on actual input shapes and hardware capabilities, rather than being pre-computed. It&amp;rsquo;s more like a JIT compiler that specializes your model&amp;rsquo;s operations for the exact conditions it encounters during training.&lt;/p&gt;
&lt;p&gt;For multi-GPU training, the model is wrapped with &lt;code&gt;DistributedDataParallel&lt;/code&gt; (DDP), which enables parallel training across multiple GPUs. The DDP wrapper handles gradient synchronization and ensures that all GPUs work with identical model parameters throughout training.&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;init_model&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Initialize the model&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Initializing model...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load metadata from tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meta_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;data_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;meta.pkl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meta_vocab_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; meta_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(meta_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            meta &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        meta_vocab_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; meta[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;vocab_size&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Found vocab_size = &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;meta_vocab_size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create model configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_args &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_layer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_layer,        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 12 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_head&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_head,          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 12 for SLM  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n_embd&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;n_embd,          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 768 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        block_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;block_size,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 512 for SLM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias,              &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        vocab_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;meta_vocab_size,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# From tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dropout&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dropout         &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create and configure model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gptconf &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleGPTConfig(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;model_args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; SimpleGPT(gptconf)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize optimizer with proper parameter groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;configure_optimizers(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        weight_decay&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        learning_rate&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;learning_rate,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        betas&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.95&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        device_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cuda&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cpu&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Compile model for performance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;slm_config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;enable_compile&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Compiling model...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;compile(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model, mode&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;reduce-overhead&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Wrap with DDP for multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; DDP(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model, device_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp_local_rank])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        param_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;module&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_num_params()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        param_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_num_params()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model initialized with &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;param_count&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; parameters&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Model Initialization Process&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;While our model is a relatively simple toy example focused on a single domain (historical London text), proper initialization remains important to avoid common training issues. The vocabulary size must match our custom historical tokenizer, the sequence length needs to work with our tokenized data, and the model architecture should be appropriate for the text patterns we&amp;rsquo;re learning.&lt;/p&gt;
&lt;p&gt;The initialization process ensures these basic requirements are met before training begins, preventing issues such as vocabulary mismatches or memory allocation problems that could lead to training failures. This careful setup was helpful during our development process, where we ran nearly 100 training experiments. Proper initialization helped us avoid some basic configuration errors and focus on the actual training challenges.&lt;/p&gt;
&lt;p&gt;Reproducibility and random seeds: To make runs repeatable on the same hardware, we set a deterministic seed per process using &lt;code&gt;torch.manual_seed(1337 + seed_offset)&lt;/code&gt;, where &lt;code&gt;seed_offset&lt;/code&gt; is the DDP rank (0 for single‑GPU). This gives consistent data shuffling and initialization across restarts while keeping each process distinct under DDP. Note that some CUDA kernels (and AMP/bf16) can introduce non‑determinism; for strict determinism, you may also configure PyTorch’s deterministic flags at the cost of performance.&lt;/p&gt;
&lt;h2 id=&#34;5-wandb-integration&#34;&gt;5. WandB Integration&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Weights &amp;amp; Biases (WandB)&lt;/strong&gt; is an experiment tracking and monitoring platform designed specifically for machine learning projects. Think of it as a &amp;ldquo;black box&amp;rdquo; for your training runs - it automatically records everything that happens during training so you can understand what worked, what didn&amp;rsquo;t, and why.&lt;/p&gt;
&lt;p&gt;Training a language model is a long‑running experiment. Without live telemetry, we are flying blind and can’t tell whether learning is stable, whether hardware is saturated, or whether runs are comparable. WandB gives real‑time visibility, remote monitoring, and reproducibility. It records loss, learning rate, and perplexity over time; captures GPU utilization and iteration latency; logs configuration and artifacts; and lets you compare runs side‑by‑side to understand which settings worked.&lt;/p&gt;
&lt;p&gt;The system includes WandB integration for experiment tracking and monitoring, with automatic configuration logging, real-time metric tracking (including loss, perplexity, and learning rate), model checkpoint integration, experiment comparison across different training runs, and resource monitoring (GPU utilization and memory usage). This integration helps track and compare different training runs, identify better configurations, and reproduce successful experiments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Understanding WandB integration:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;#listing12&#34; class=&#34;listing-ref&#34;&gt;Listing 12&lt;/a&gt; logs the signals you need to fly by instruments: loss and perplexity trends for learning, the LR schedule to confirm warmup/decay, and hardware utilization and iteration timing for throughput and stability. It’s not just logging - it’s how you compare runs and catch issues early.&lt;/p&gt;
&lt;p&gt;This real-time monitoring lets us spot problems early, compare different training approaches, and ensure our historical language model is learning properly over days or weeks.&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB - loss first for better mobile UI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use_wandb:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wandb&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/loss&amp;#34;&lt;/span&gt;: lossf,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/lr&amp;#34;&lt;/span&gt;: lr,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/iter&amp;#34;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/mfu&amp;#34;&lt;/span&gt;: running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/dt_ms&amp;#34;&lt;/span&gt;: dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: WandB Integration and Logging&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The system logs training loss, learning rate, iteration number, model flops utilization (MFU), and training time per iteration. These metrics provide comprehensive insight into training progress, efficiency, and potential issues.&lt;/p&gt;
&lt;p&gt;The most useful dials to watch are training loss (should steadily trend from ~8–10 toward ~2–4), MFU (a proxy for GPU efficiency - single‑digit theoretical targets but mid‑20s achievable with good tuning), the learning‑rate curve (warmup then cosine decay), and iteration time (a practical signal for throughput and stalls).&lt;/p&gt;
&lt;p&gt;Both SLM and Regular model training runs complete 60,000 iterations, providing consistent training depth across both model variants. &lt;a href=&#34;#fig11&#34; class=&#34;figure-ref&#34;&gt;Figure 11&lt;/a&gt; below shows the complete training experience for our Regular model (354M parameters), demonstrating both the console output and WandB&amp;rsquo;s comprehensive monitoring capabilities.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train17-regular.png&#34; alt=&#34;Complete training run output showing console logs and WandB summary&#34; title=&#34;Complete training run with WandB monitoring&#34; id=&#34;fig11&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt;Complete training run output showing console logs and WandB monitoring for Regular model (354M parameters)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Whilst it might be obvious, the screenshot in &lt;a href=&#34;#fig11&#34; class=&#34;figure-ref&#34;&gt;Figure 11&lt;/a&gt; captures the final moments of a successful 60,000-iteration training run, showing both the real-time console output and WandB&amp;rsquo;s comprehensive run summary. In this run, the logs reveal the training progression through the final iterations (59,850 to 60,000), with training loss steadily decreasing from 3.0575 to 2.7063, demonstrating healthy convergence.&lt;/p&gt;
&lt;p&gt;The WandB run summary provides the complete picture: a final training loss of 2.70315, a validation loss of 3.61921, and a validation perplexity of 37.31, all indicating successful model training. The system automatically saved the final checkpoint and cleaned up old checkpoints, while WandB captured the entire training journey with detailed metrics tracking. This comprehensive monitoring approach ensures we can both track progress in real time and analyze the full training history afterward.&lt;/p&gt;
&lt;h2 id=&#34;6-checkpointing-and-model-persistence&#34;&gt;6. Checkpointing and Model Persistence&lt;/h2&gt;
&lt;p&gt;Checkpointing is one of the most critical aspects of training large language models, especially for historical text, where training can take days or weeks. A robust checkpointing system ensures that training progress is never lost due to hardware failures, power outages, or other interruptions. In this section, we&amp;rsquo;ll explore the comprehensive checkpointing system built for the &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt; project, covering everything from basic checkpoint creation to advanced resume functionality.&lt;/p&gt;
&lt;h3 id=&#34;61-checkpoint-system&#34;&gt;6.1 Checkpoint System&lt;/h3&gt;
&lt;p&gt;The training system implements a practical checkpointing system that preserves all aspects of training state, ensuring that training can be resumed from exactly where it left off. This is particularly important for any complex model, where training can take a long time.&lt;/p&gt;
&lt;p&gt;Each checkpoint packages four essentials: the model weights (so learning is preserved), the optimizer state (so momentum and adaptive stats resume cleanly), the current iteration (so schedules pick up in the right place), and the best validation loss to date (so we only promote genuinely better models). Together, these let you stop and restart without losing training dynamics.&lt;/p&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing13&#34; class=&#34;listing-ref&#34;&gt;Listing 13&lt;/a&gt; shows how these components are saved when validation loss improves:&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; losses[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;val&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; best_val_loss:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; losses[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;val&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;: raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;state_dict(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;optimizer&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;state_dict(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;iter_num&amp;#39;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;best_val_loss&amp;#39;&lt;/span&gt;: best_val_loss,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;checkpoint-&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;iter_num&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.pt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving checkpoint to &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save(checkpoint, checkpoint_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean up old checkpoints - keep only the last 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cleanup_old_checkpoints()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Checkpointing and Model Persistence&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The checkpointing system uses a simple yet effective approach: it saves checkpoints only when the validation loss improves, rather than at every evaluation. This approach serves multiple purposes. First, it ensures we&amp;rsquo;re always keeping the best-performing model, not just the most recent one. Second, it significantly reduces I/O overhead during training, as checkpoint saves can be expensive operations (our 354M parameter model checkpoints are ~1.4GB each). Third, it prevents disk space issues by avoiding the accumulation of suboptimal checkpoints. This selective checkpointing approach can improve overall training time by 5-10% by eliminating redundant disk writes.&lt;/p&gt;
&lt;h3 id=&#34;62-checkpoint-management-and-cleanup&#34;&gt;6.2 Checkpoint Management and Cleanup&lt;/h3&gt;
&lt;p&gt;Since our 354M parameter model checkpoints are ~1.4GB each, we need to clean up old checkpoints to avoid running out of disk space. The system automatically keeps only the last 5 checkpoints and deletes older ones (as defined in &lt;code&gt;config.py&lt;/code&gt;). The cleanup function in &lt;a href=&#34;#listing14&#34; class=&#34;listing-ref&#34;&gt;Listing 14&lt;/a&gt; finds all checkpoint files, sorts them by modification time (newest first), and deletes everything except the most recent 5. Only the master process handles cleanup to avoid race conditions in multi-GPU setups.&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;cleanup_old_checkpoints&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, keep_last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean up old checkpoints, keeping only the last N&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Only the master process should clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Find all checkpoint files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_files &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;glob(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;checkpoint-*.pt&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(checkpoint_files) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; keep_last:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Not enough checkpoints to clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Sort by modification time (newest first)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint_files&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sort(key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stat()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;st_mtime, reverse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Keep the newest ones, delete the rest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        files_to_delete &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint_files[keep_last:]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; file_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; files_to_delete:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unlink()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Deleted old checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;warning(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to delete checkpoint &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;warning(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Checkpoint cleanup failed: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Checkpoint Cleanup and Management&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;63-resume-training-functionality&#34;&gt;6.3 Resume Training Functionality&lt;/h3&gt;
&lt;p&gt;The ability to resume training from any checkpoint is useful when training gets interrupted. This functionality lets you pick up where you left off, whether the interruption was a few minutes or longer.&lt;/p&gt;
&lt;p&gt;The resume functionality loads a checkpoint file and restores the training state: the model weights, optimizer state, current iteration number, and best validation loss. If checkpoint loading fails, the code falls back to starting from scratch.&lt;/p&gt;
&lt;p&gt;When loading checkpoints, the code handles two practical considerations. First, the &lt;strong&gt;&lt;code&gt;map_location=self.device&lt;/code&gt;&lt;/strong&gt; parameter ensures the checkpoint loads onto the correct device (CPU or GPU), which matters if you&amp;rsquo;re resuming on different hardware or after a restart. Second, for multi-GPU setups using DistributedDataParallel, the model is wrapped in a &lt;code&gt;.module&lt;/code&gt; attribute, so the code uses &lt;code&gt;raw_model = self.model.module if self.ddp else self.model&lt;/code&gt; to access the actual model underneath.&lt;/p&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;resume_from_checkpoint_file&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Resume training from a checkpoint file&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resume_from_checkpoint:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checkpoint_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Path(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;resume_from_checkpoint)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; checkpoint_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;error(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Checkpoint file not found: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Resuming from checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;checkpoint_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(checkpoint_path, map_location&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load model state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        raw_model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;module &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ddp &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;model
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model state loaded successfully&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load optimizer state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;optimizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;optimizer&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Optimizer state loaded successfully&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get iteration number and best validation loss&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;iter_num&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;best_val_loss&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1e9&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Resuming from iteration: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Best validation loss so far: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.4f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;error(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to load checkpoint: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;e&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting training from scratch...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start_iter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;best_val_loss &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1e9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: Resume Training from Checkpoint&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The function loads the model weights, optimizer state, iteration number, and best validation loss from the checkpoint file, then continues training from where it left off. If the checkpoint file doesn&amp;rsquo;t exist or can&amp;rsquo;t be loaded, it logs an error and starts training from scratch. Since our Regular model takes 28-32 hours to train, resuming from a checkpoint saves significant time when training is interrupted by power outages, crashes, or manual stops.&lt;/p&gt;
&lt;h2 id=&#34;7-training-launch-and-management&#34;&gt;7. Training Launch and Management&lt;/h2&gt;
&lt;h3 id=&#34;71-multi-gpu-training-with-torchrun&#34;&gt;7.1 Multi-GPU Training with torchrun&lt;/h3&gt;
&lt;p&gt;For a single GPU, you can run the training script directly — a single Python process will use that device. To use multiple GPUs, launch training with &lt;code&gt;torchrun&lt;/code&gt;, which spawns one worker process per GPU and lets the code initialize &lt;code&gt;DistributedDataParallel&lt;/code&gt; (DDP). This enables larger effective batch sizes and faster wall‑clock training while keeping weights synchronized across devices; set &lt;code&gt;--nproc_per_node&lt;/code&gt; to the number of GPUs you want to use (for example, &lt;code&gt;--nproc_per_node=2&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;torchrun&lt;/code&gt; is PyTorch&amp;rsquo;s recommended launcher for distributed training: it initializes the distributed backend and sets environment variables (&lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;LOCAL_RANK&lt;/code&gt;, &lt;code&gt;WORLD_SIZE&lt;/code&gt;) to keep workers in sync. With &lt;code&gt;torchrun --nproc_per_node=N&lt;/code&gt; (where &lt;code&gt;N&lt;/code&gt; is the number of GPUs to use — it can be less than the total GPUs available), batches are sharded across the chosen GPUs and gradients are synchronized after each backward pass, which often gives near‑linear speedups on a small multi‑GPU node.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Single GPU (even with multiple available)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python train_model_slm.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multi-GPU with near-linear speedup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; train_model_slm.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The training script handles DDP (&lt;code&gt;DistributedDataParallel&lt;/code&gt;) via &lt;code&gt;train_model_slm.py&lt;/code&gt; for gradient sync and batch distribution across GPUs. &lt;a href=&#34;#fig12&#34; class=&#34;figure-ref&#34;&gt;Figure 12&lt;/a&gt; below shows an example where we have dual GPUs and both are being used.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-4.png&#34; alt=&#34;Multiple GPU used for training Screenshot&#34; title=&#34;Multiple GPU used for training&#34; id=&#34;fig12&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; Multiple GPU used for training&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note that if you run &lt;code&gt;python train_model_slm.py&lt;/code&gt; on a multi‑GPU machine, only one GPU is used; the others remain idle. To use more than one GPU, we must use &lt;code&gt;torchrun&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;72-training-monitoring&#34;&gt;7.2 Training Monitoring&lt;/h3&gt;
&lt;p&gt;Training is monitored locally via structured console logs and remotely via WandB. The snippet in &lt;a href=&#34;#listing16&#34; class=&#34;listing-ref&#34;&gt;Listing 16&lt;/a&gt; records loss, learning rate, timing, and MFU at a configurable interval and, when enabled, streams the same metrics to WandB for side‑by‑side run comparison.&lt;/p&gt;
&lt;figure id=&#34;listing16&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Timing and logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; time&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;time()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; t0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; t1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log_interval &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;master_process:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lossf &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; loss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;item()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; local_iter_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; raw_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;estimate_mfu(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_size, dt)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; mfu &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;mfu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;iter &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;iter_num&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;: loss &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;lossf&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.4f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;, time &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;dt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.2f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;ms, mfu &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;running_mfu&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.2f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;%&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Log to WandB - loss first for better mobile UI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use_wandb:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        wandb&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;log({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/loss&amp;#34;&lt;/span&gt;: lossf,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/lr&amp;#34;&lt;/span&gt;: lr,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/iter&amp;#34;&lt;/span&gt;: iter_num,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/mfu&amp;#34;&lt;/span&gt;: running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; running_mfu &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;train/dt_ms&amp;#34;&lt;/span&gt;: dt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 16: Training Monitoring and Logging&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Together, console logs and WandB provide real‑time visibility and reproducible experiment tracking; &lt;a href=&#34;#fig13&#34; class=&#34;figure-ref&#34;&gt;Figure 13&lt;/a&gt; below shows an example of the console logs; see Section 5 for setup and dashboards.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-7.png&#34; alt=&#34;Console training logs showing iteration, loss, step time, and MFU with checkpoint saves&#34; title=&#34;Console training logs: iteration, loss, step time, MFU, and checkpoint saves&#34; id=&#34;fig13&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Console training logs: iteration, loss, step time, MFU, and checkpoint saves&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;8-model-file-formats-and-conversion&#34;&gt;8. Model File Formats and Conversion&lt;/h2&gt;
&lt;p&gt;Training produces PyTorch checkpoint files (&lt;code&gt;.pt&lt;/code&gt;) that contain model weights, optimizer state, and training metadata — everything needed to resume training. These checkpoints are covered in detail in &lt;a
	
		href = &#34;#6-checkpointing-and-model-persistence&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Section 6
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For sharing models and standard deployment workflows, we convert PyTorch checkpoints into the Hugging Face repository format. This conversion creates a portable, standardized model package that can be loaded with standard Hugging Face APIs.&lt;/p&gt;
&lt;h3 id=&#34;81-converting-pytorch-checkpoints-to-hugging-face-format&#34;&gt;8.1 Converting PyTorch Checkpoints to Hugging Face Format&lt;/h3&gt;
&lt;p&gt;The Hugging Face repository format is a standardized directory structure containing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config.json&lt;/code&gt;&lt;/strong&gt;: Architecture definition (layers, heads, embedding dimensions, vocabulary size, sequence length). Allows &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; to reconstruct the model architecture without custom code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;model.safetensors&lt;/code&gt;&lt;/strong&gt;: Model weights in SafeTensors format (memory-mapped, secure loading). Contains only model parameters, no optimizer state — suitable for inference workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generation_config.json&lt;/code&gt;&lt;/strong&gt;: Default text generation parameters (max_new_tokens, temperature, top_p, repetition_penalty). Can be overridden at runtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizer files&lt;/strong&gt; (&lt;code&gt;tokenizer.json&lt;/code&gt;, &lt;code&gt;vocab.json&lt;/code&gt;, &lt;code&gt;merges.txt&lt;/code&gt;, &lt;code&gt;special_tokens_map.json&lt;/code&gt;, &lt;code&gt;tokenizer_config.json&lt;/code&gt;): Serialized tokenizer with vocabulary, merge rules, normalization, and special tokens matching the training configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The conversion code in &lt;a href=&#34;#listing17&#34; class=&#34;listing-ref&#34;&gt;Listing 17&lt;/a&gt; loads a PyTorch checkpoint, extracts model weights and config, handles &lt;code&gt;torch.compile&lt;/code&gt; naming prefixes if present, and saves the model and tokenizer in Hugging Face format.&lt;/p&gt;
&lt;figure id=&#34;listing17&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; GPT2LMHeadModel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;convert_pytorch_to_huggingface&lt;/span&gt;(pytorch_checkpoint_path, output_dir, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Convert PyTorch checkpoint to Hugging Face format&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load PyTorch checkpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    checkpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(pytorch_checkpoint_path, map_location&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;cpu&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;model&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    config &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; checkpoint[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;config&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Handle torch.compile prefixes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;any&lt;/span&gt;(key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_orig_mod.&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; model_state&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;keys()):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        clean_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; key, value &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; model_state&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            clean_state[key[&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;:]] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; value &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; key&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_orig_mod.&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model_state &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; clean_state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Convert to Hugging Face format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; GPT2LMHeadModel(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load_state_dict(model_state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save in Hugging Face format&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(output_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(output_dir)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 17: PyTorch → Hugging Face Conversion (essentials)&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The conversion handles a few practical details. If the model was compiled with &lt;code&gt;torch.compile&lt;/code&gt;, parameter names are prefixed with &lt;code&gt;_orig_mod.&lt;/code&gt;, which the code strips to match Hugging Face module names. &lt;code&gt;GPT2LMHeadModel(config)&lt;/code&gt; instantiates a GPT-2-style architecture that matches the checkpoint&amp;rsquo;s layer structure, and &lt;code&gt;load_state_dict()&lt;/code&gt; loads the weights with automatic shape validation. The &lt;code&gt;save_pretrained()&lt;/code&gt; method writes all required files to disk.&lt;/p&gt;
&lt;p&gt;File sizes: PyTorch checkpoints are ~450MB (SLM) and ~1.4GB (Regular model); the Hugging Face format reduces this slightly by excluding the optimizer state. The tokenizer adds ~15MB to the repository.&lt;/p&gt;
&lt;h2 id=&#34;9-inference-options&#34;&gt;9. Inference Options&lt;/h2&gt;
&lt;p&gt;Inference can run directly from PyTorch checkpoints or from Hugging Face models. PyTorch checkpoints are convenient during development since you can test any training checkpoint without conversion. Hugging Face models use standard &lt;code&gt;from_pretrained()&lt;/code&gt; APIs and are better suited for sharing and deployment workflows.&lt;/p&gt;
&lt;figure id=&#34;listing18&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Option 1: PyTorch checkpoint inference (direct from training)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python &lt;span style=&#34;color:#f5a97f&#34;&gt;06&lt;/span&gt;_inference&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;inference_pytorch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;py \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;--&lt;/span&gt;checkpoint &lt;span style=&#34;color:#f5a97f&#34;&gt;09&lt;/span&gt;_models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;slm&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt \
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;--&lt;/span&gt;prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Option 2: Hugging Face model inference (published models)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets...&amp;#34;&lt;/span&gt;, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;input_ids&amp;#39;&lt;/span&gt;], max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 18: Inference Options&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Both methods load in seconds and generate ~50–100 tokens/sec on typical consumer GPUs (2–4GB VRAM for SLM, 6–8GB for the Regular model). Use PyTorch checkpoints for development and training comparisons; use Hugging Face models for production deployment and sharing. For interactive testing with published models, see &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;10-summary&#34;&gt;10. Summary&lt;/h2&gt;
&lt;p&gt;We built a training‑ready GPT pipeline for historical text, end‑to‑end: a clear decoder‑only architecture, pragmatic GPU/precision tuning, DDP for scale, resilient checkpointing/resume, WandB tracking, and clean hand‑off of artifacts (PyTorch checkpoints → Hugging Face export).&lt;/p&gt;
&lt;p&gt;Outcome: two working models on the Part 2 corpus - 117M (SLM) and 354M (Regular) - ready for inference now and for evaluation/deployment in Part 4.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete training infrastructure (&lt;code&gt;04_training/&lt;/code&gt;), model architecture (&lt;code&gt;config.py&lt;/code&gt;), and GPU configuration (&lt;code&gt;08_documentation/GPU_TUNING.md&lt;/code&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2 – Data Collection &amp;amp; Custom Tokenizer
	&lt;/span&gt;
&lt;/a&gt; | Part 3 (this post) | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🤗 Published Models&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SLM Model
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Regular Model
	&lt;/span&gt;
&lt;/a&gt; - Ready-to-use historical language models on HuggingFace&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📚 Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts.&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready for Part 4?&lt;/strong&gt; Part 4 covers model evaluation, testing, and deployment strategies that turn your trained models into working systems ready for real-world use.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;div class=&#34;references&#34; style=&#34;font-size:0.85em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;Vaswani et al. (2017) – Attention Is All You Need: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.03762&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.03762
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Radford et al. (2019) – Language Models are Unsupervised Multitask Learners: &lt;a
	
		href = &#34;https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Brown et al. (2020) – Language Models are Few-Shot Learners: &lt;a
	
		href = &#34;https://arxiv.org/abs/2005.14165&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2005.14165
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kaplan et al. (2020) – Scaling Laws for Neural Language Models: &lt;a
	
		href = &#34;https://arxiv.org/abs/2001.08361&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2001.08361
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hoffmann et al. (2022) – Training Compute-Optimal LLMs (Chinchilla): &lt;a
	
		href = &#34;https://arxiv.org/abs/2203.15556&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2203.15556
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chowdhery et al. (2022) – PaLM: Scaling Language Modeling with Pathways: &lt;a
	
		href = &#34;https://arxiv.org/abs/2204.02311&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2204.02311
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clark et al. (2019) – What Does BERT Look At?: &lt;a
	
		href = &#34;https://arxiv.org/abs/1906.04341&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1906.04341
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Voita et al. (2019) – Analyzing Multi‑Head Self‑Attention: &lt;a
	
		href = &#34;https://arxiv.org/abs/1905.09418&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1905.09418
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dao et al. (2022) – FlashAttention: &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.14135&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2205.14135
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Micikevicius et al. (2018) – Mixed Precision Training: &lt;a
	
		href = &#34;https://arxiv.org/abs/1710.03740&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1710.03740
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rajbhandari et al. (2020) – ZeRO: &lt;a
	
		href = &#34;https://arxiv.org/abs/1910.02054&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1910.02054
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Paszke et al. (2019) – PyTorch: &lt;a
	
		href = &#34;https://arxiv.org/abs/1912.01703&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1912.01703
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kingma &amp;amp; Ba (2014) – Adam: A Method for Stochastic Optimization: &lt;a
	
		href = &#34;https://arxiv.org/abs/1412.6980&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1412.6980
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Loshchilov &amp;amp; Hutter (2017) – AdamW Decoupled Weight Decay Regularization : &lt;a
	
		href = &#34;https://arxiv.org/abs/1711.05101&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1711.05101
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Smith &amp;amp; Topin (2017) – Super‑Convergence: Very Fast Training of Neural Networks Using Large Learning Rates: &lt;a
	
		href = &#34;https://arxiv.org/abs/1708.07120&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1708.07120
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Goyal et al. (2017) – Accurate, Large Minibatch SGD: &lt;a
	
		href = &#34;https://arxiv.org/abs/1706.02677&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1706.02677
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sergeev &amp;amp; Del Balso (2018) – Horovod: &lt;a
	
		href = &#34;https://arxiv.org/abs/1802.05799&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1802.05799
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pope et al. (2022) – Efficiently Scaling Transformer Inference: &lt;a
	
		href = &#34;https://arxiv.org/abs/2211.05102&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2211.05102
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jawahar et al. (2019) – What does BERT learn about the structure of language?: &lt;a
	
		href = &#34;https://aclanthology.org/P19-1356.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/P19-1356.pdf
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mikolov et al. (2013) – Word2vec: &lt;a
	
		href = &#34;https://arxiv.org/abs/1301.3781&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1301.3781
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pennington et al. (2014) – GloVe:  &lt;a
	
		href = &#34;https://aclanthology.org/D14-1162/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/D14-1162/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Devlin et al. (2018) – BERT &lt;a
	
		href = &#34;https://arxiv.org/abs/1810.04805&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1810.04805
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Press &amp;amp; Wolf (2017) – Using the Output Embedding to Improve Language Models: &lt;a
	
		href = &#34;https://arxiv.org/abs/1608.05859&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1608.05859
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inan et al. (2016) – Tying Word Vectors and Word Classifiers: &lt;a
	
		href = &#34;https://arxiv.org/abs/1611.01462&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1611.01462
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Happy Diwali - 2025</title>
      <link>/post/2025/10/happy-diwali-2025/</link>
      <pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/10/happy-diwali-2025/</guid>
      <description>&lt;p&gt;I 💖 Diwali. For those celebrating, from my family to yours!&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/diwali-greeting-2025.png&#34; alt=&#34;Diwali Greeting&#34; title=&#34;Happy Diwali&#34;&gt;
&lt;/figure&gt;
</description>
    </item>
    
    <item>
      <title>🏛️Building LLMs from Scratch - Part 2: Data Collection &amp; Custom Tokenizers</title>
      <link>/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/</link>
      <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this second part of our 4-part series on building language models from scratch, I explore the two foundational areas of LLM development: data collection and custom tokenizer creation. &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 1 - Building LLM from Scratch
	&lt;/span&gt;
&lt;/a&gt; covered using the published model; here, we build the complete pipeline from raw historical documents to a custom tokenizer that understands archaic English, London geography, and period-specific terminology.&lt;/p&gt;
&lt;p&gt;The challenge with historical LLMs isn&amp;rsquo;t just having enough data—it&amp;rsquo;s having the &lt;em&gt;right&lt;/em&gt; data processed to preserve linguistic nuances across different historical periods. This post demonstrates how to transform over 218 historical sources into a corpus of more than 500 million characters using a specialized tokenizer for authentic historical text generation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need significantly larger datasets, more sophisticated infrastructure, and additional considerations that are not covered in this post.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;1-the-historical-language-modeling-challenge&#34;&gt;1. The Historical Language Modeling Challenge&lt;/h2&gt;
&lt;p&gt;Building a language model for historical text presents unique challenges. Historical English from 1500 to 1850 contains linguistic patterns, vocabulary, and cultural references that modern tokenizers have never encountered. Standard tokenizers like &lt;a
	
		href = &#34;https://github.com/openai/tiktoken&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TikToken
	&lt;/span&gt;
&lt;/a&gt; fragment archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; into multiple subword tokens, destroying semantic meaning crucial for historical text generation.&lt;/p&gt;
&lt;p&gt;A simple phrase like &lt;strong&gt;&lt;code&gt;Quoth the alderman, &#39;Tis a fair day at Newgate&lt;/code&gt;&lt;/strong&gt; becomes dozens of meaningless fragments, losing both historical context and linguistic coherence. This fragmentation is why we built a custom tokenizer trained specifically on historical English patterns, ensuring the model can generate coherent, historically accurate text.&lt;/p&gt;
&lt;p&gt;As a reminder, both the SLM (117M parameters) and Regular Model (354M parameters) utilize the same training code and infrastructure, including GPU optimization, checkpointing, and WandB integration. The only difference lies in the model architecture parameters, which are specified in &lt;code&gt;config.py&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔗 GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete source code for data collection (&lt;code&gt;02_data_collection/&lt;/code&gt;) and tokenizer training (&lt;code&gt;03_tokenizer/&lt;/code&gt;). We will see the relevant code snippets in this post show key concepts—see the full implementation in the repository.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | Part 2 (this post) | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 – Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;What will you learn?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This project provides hands-on experience with real-world LLM development challenges, including data collection from over 218 historical sources, cleaning OCR errors and encoding issues, and developing custom tokenizers for historical text. Unlike theoretical tutorials, you receive complete, runnable code that demonstrates actual trade-offs and decisions—such as choosing BPE over WordPiece or handling different file formats—that you&amp;rsquo;d encounter in any serious LLM project.&lt;/p&gt;
&lt;p&gt;While operating at a learning scale, the principles taught here directly apply to larger systems. Data collection patterns, cleaning strategies, and tokenizer design principles scale from our 500M character corpus to the 500B+ character datasets used in production models.&lt;/p&gt;
&lt;h2 id=&#34;11-high-level-process-overview&#34;&gt;1.1 High-Level Process Overview&lt;/h2&gt;
&lt;p&gt;The complete pipeline transforms raw historical documents into a working language model through five key stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Data Collection&lt;/strong&gt;: 218+ historical sources (1500-1850), including literature, newspapers, court records, and personal diaries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaning Pipeline&lt;/strong&gt;: Handles multiple file formats (PDF, HTML, XML, TXT) while removing OCR artifacts and preserving authentic historical language&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality Validation&lt;/strong&gt;: Removes duplicates, filters non-English content, and ensures only meaningful historical text reaches the final corpus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Tokenizer Training&lt;/strong&gt;: BPE-based tokenizer with ~150 special tokens capturing archaic pronouns, historical landmarks, and period-specific terminology&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model Training&lt;/strong&gt;: Two language models (SLM 117M and Regular 354M parameters) trained on the same historical corpus&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result is a system capable of generating authentic historical text that captures the linguistic patterns and cultural context of 1500-1850 English. &lt;a href=&#34;#fig1&#34; class=&#34;figure-ref&#34;&gt;Figure 1&lt;/a&gt; illustrates this complete pipeline:&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 218+ Historical Sources&amp;lt;br/&amp;gt;1500-1850] --&amp;gt; B[🔍 Data Collection&amp;lt;br/&amp;gt;Download and Filter]
    B --&amp;gt; C[🧹 5-Phase Cleaning Pipeline&amp;lt;br/&amp;gt;Format-Specific Processing]
    C --&amp;gt; D[📊 Quality Validation&amp;lt;br/&amp;gt;Duplicate and Language Detection]
    D --&amp;gt; E[📝 500M+ Character Corpus&amp;lt;br/&amp;gt;Clean Historical Text]
    E --&amp;gt; F[🔤 Custom Tokenizer Training&amp;lt;br/&amp;gt;BPE with 150+ Special Tokens]
    F --&amp;gt; G[🤖 Language Model Training&amp;lt;br/&amp;gt;SLM 117M + Regular 354M]
    
    style A fill:#e1f5fe
    style E fill:#f3e5f5
    style F fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete Historical Text Processing Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;2-data-collection-the-foundation-of-historical-language-modeling&#34;&gt;2. Data Collection: The Foundation of Historical Language Modeling&lt;/h2&gt;
&lt;p&gt;Let us dig deeper into steps 1-4: data collection, cleaning, validation, and corpus creation. The data collection system processes over 218 sources spanning the years 1500-1850 to create a corpus of over 500 million characters of authentic historical English text. But collecting historical data isn&amp;rsquo;t just about downloading files - it&amp;rsquo;s about handling the sheer variety of formats and quality levels that historical documents present.&lt;/p&gt;
&lt;p&gt;Historical documents come in all shapes and sizes - scanned books with OCR errors, HTML pages with messy markup, XML archives with rich metadata, and plain text files with inconsistent encoding. This is especially true for the earlier periods, when the quality of the documents can vary significantly, and most modern techniques for processing them struggle to cope. This data diversity requires a cleaning pipeline that transforms raw historical documents into training data while preserving the authentic language patterns of 1500-1850 English.&lt;/p&gt;
&lt;h3 id=&#34;21-system-architecture-processing-218-historical-sources&#34;&gt;2.1 System Architecture: Processing 218+ Historical Sources&lt;/h3&gt;
&lt;p&gt;The data collection system employs a modular architecture, with &lt;strong&gt;&lt;code&gt;historical_data_collector.py&lt;/code&gt;&lt;/strong&gt; serving as the primary orchestration engine, coordinating with a &lt;strong&gt;&lt;code&gt;data_sources.json&lt;/code&gt;&lt;/strong&gt; configuration file that contains metadata for over 218 historical sources. This enables easy management and updates without code changes.&lt;/p&gt;
&lt;p&gt;Supporting scripts include &lt;strong&gt;&lt;code&gt;add_data_source.py&lt;/code&gt;&lt;/strong&gt; for interactive source addition with built-in validation, and &lt;strong&gt;&lt;code&gt;generate_report.py&lt;/code&gt;&lt;/strong&gt; for comprehensive reporting and analysis across multiple output formats.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;data_sources.json&lt;/code&gt;&lt;/strong&gt; file contains metadata for each source, including time periods, formats, licensing, and processing priorities. Each entry includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;time_period&lt;/code&gt;&lt;/strong&gt; (e.g., [1690, 1800] for London Lives)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;format&lt;/code&gt;&lt;/strong&gt; (XML, HTML, PDF)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;priority&lt;/code&gt;&lt;/strong&gt; (high/medium/low)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;search_terms&lt;/code&gt;&lt;/strong&gt; for collection guidance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our data sources span multiple categories, each contributing unique perspectives to the historical corpus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Project Gutenberg:&lt;/strong&gt; This provides foundational literature with 8+ carefully selected texts, using relaxed quality criteria that accept texts with as low as 40% meaningful words to capture the full spectrum of historical writing styles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Historical Archives:&lt;/strong&gt; Historical Archives like &lt;em&gt;London Lives&lt;/em&gt; (240,000 pages of personal records) and &lt;em&gt;Old Bailey&lt;/em&gt; (197,000+ trial transcripts) offer rich historical content and were initially enabled in our data collection.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Note: I was using the aggressive cleaning earlier (enabled using the &lt;code&gt;aggressive_cleaning&lt;/code&gt; flag designed to remove structured legal data and semantic markup), and discovered that it was too aggressive and caused generation quality issues. After initial training runs revealed repetitive and incoherent text patterns, I turned off these sources. Enabling this back might be an exercise for you to try.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Archive.org:&lt;/strong&gt; Archive.org has an API access that can be used for file filtering, and this makes it relatively straightforward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The National Archives (TNA):&lt;/strong&gt; TNA records contribute government correspondence and official documents that provide the institutional context for historical events.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;British History Online:&lt;/strong&gt; Finally, these supplements our collection with historical surveys and period documents that offer scholarly perspectives on the time periods we&amp;rsquo;re modeling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, each source type presents unique technical challenges that require specialized processing approaches. One example is Project Gutenberg, which contains files with standardized headers and footers that must be removed. (As a side note, I really appreciate the effort that has gone into this to make this formatting consistent, which makes the process of this relatively straightforward.)&lt;/p&gt;
&lt;p&gt;On the other hand, PDF files often suffer from OCR errors, especially for older documents that contain corrupted historical language, requiring sophisticated text correction algorithms to restore proper spelling and grammar from scanned documents. The figure below shows one example of how older documents look. This example is &amp;ldquo;The abridgment of the charter of the city of London&amp;rdquo; from 1680.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/charter-city-of-london.png&#34; alt=&#34;The abridgment of the charter of the city of London&#34; title=&#34;The abridgment of the charter of the city of London&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; The abridgment of the charter of the city of London (1680) - showing faded text and ink blots typical of historical documents&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As you can see, the text is faded, has ink blots, and the font style is very different from modern text. OCR software often misinterprets characters in such documents, resulting in numerous errors, as illustrated in the image below. These OCR artifacts can severely degrade the quality of our training data if not properly addressed.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/charter-city-of-london-ocr.png&#34; alt=&#34;OCR - Charter of the city of London&#34; title=&#34;OCR - Charter of the city of London&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; OCR errors in the charter document - showing how optical character recognition struggles with historical fonts and document quality&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;HTML files&lt;/strong&gt; from sources like Archive.org contain navigation elements, advertisements, and modern web markup that contaminate the historical corpus, demanding careful content extraction that preserves only the meaningful historical text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XML archives&lt;/strong&gt; like London Lives and Old Bailey require specialized parsing to extract meaningful text while preserving semantic markup that provides context about speakers, dates, and document structure - a delicate balance between removing technical artifacts and maintaining historical authenticity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Government records&lt;/strong&gt; from TNA often contain bureaucratic formatting, form fields, and institutional language that need careful filtering to extract the human stories and historical narratives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;British History Online&lt;/strong&gt; documents present challenges with academic formatting, footnotes, and scholarly apparatus that must be processed to maintain readability while preserving the scholarly context that makes them valuable for historical language modeling.&lt;/p&gt;
&lt;h3 id=&#34;22-cleaning-pipeline&#34;&gt;2.2 Cleaning Pipeline&lt;/h3&gt;
&lt;p&gt;I implement a 5-stage cleaning pipeline that helps transform the raw historical documents into training-ready text. Each phase addresses specific challenges that would otherwise contaminate our language model training.&lt;/p&gt;
&lt;h4 id=&#34;221-stage-1-file-discovery--initial-filtering&#34;&gt;2.2.1 Stage 1: File Discovery &amp;amp; Initial Filtering&lt;/h4&gt;
&lt;p&gt;Historical archives often contain files in various formats, which may be missing proper file extensions or have non-standard naming conventions. Many files contain non-English content that would contaminate our English historical corpus. Additionally, many sources employ their own templates and standards for this purpose. To resolve this, we first implement a simple file detection and naming cleanup, as shown in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt;. The code itself is simple and self-explanatory.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;detect_file_type&lt;/span&gt;(file_path: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Detect file type based on extension and content analysis&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extension-based detection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.txt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.txt.utf-8&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_txt.utf-8&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;,)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pdf&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.htm&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.xml&amp;#39;&lt;/span&gt;,)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Content-based detection for files without extensions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read(&lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read first 1KB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;html&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;!doctype&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;?xml&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;lower():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; content&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isascii() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\x00&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; content:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;binary&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: File Type Detection Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;When we run this locally, we will see the flow as outlined below, which illustrates how the detection works. This, of course, can be made more robust for non-English characters, but for now, we reject these.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File Type Detection Flow:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;📁 Raw Files (218+ sources)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🔍 File Type Detection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .txt, .txt.utf-8, _txt.utf-8 → Text Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .pdf → PDF Processing  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .html, .htm → HTML Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── .xml → XML Processing (Old Bailey, London Lives)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── No Extension → Content Detection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── HTML-like content → HTML Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ├── Text-like content → Text Processing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └── Binary/Unknown → REJECTED
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🚫 Filename Language Check
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Non-English characters → REJECTED (logged)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── English/Latin → Continue&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Historical archives often lack standardized file extensions and contain content in languages other than English. Our two-stage detection ensures we capture valuable historical documents while filtering out irrelevant files, preventing both data loss and processing waste.&lt;/p&gt;
&lt;h4 id=&#34;222-stage-2-format-specific-content-extraction&#34;&gt;2.2.2 Stage 2: Format-Specific Content Extraction&lt;/h4&gt;
&lt;p&gt;Each file format requires specialized processing due to its unique contamination sources, including Project Gutenberg headers, PDF OCR errors, HTML navigation elements, and XML structural markup. Our format-specific extraction functions clean these artifacts while preserving authentic historical content.&lt;/p&gt;
&lt;h5 id=&#34;text-files-txt-txtutf-8&#34;&gt;&lt;strong&gt;Text Files (.txt, .txt.utf-8)&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Project Gutenberg texts contain standardized headers and footers that would confuse our language model. The cleaning process removes these while preserving the actual historical content. The code snippet in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt; demonstrates this approach and is quite straightforward. Of course, this can be made more robust, but this works well for our selected texts.&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_gutenberg_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean Project Gutenberg text by removing headers/footers and metadata&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cleaned_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip Gutenberg headers (before &amp;#34;*** START OF&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*** START OF&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip Gutenberg footers (after &amp;#34;*** END OF&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*** END OF&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip metadata lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith((&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Title:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Author:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Release Date:&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Language:&amp;#39;&lt;/span&gt;)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip empty lines at start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; in_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; in_content:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cleaned_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(cleaned_lines)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Project Gutenberg Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Title: A Journal of the Plague Year
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Author: Daniel Defoe
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Release Date: March 2003
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Language: English
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*** START OF THE PROJECT GUTENBERG EBOOK A JOURNAL OF THE PLAGUE YEAR ***
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*** END OF THE PROJECT GUTENBERG EBOOK A JOURNAL OF THE PLAGUE YEAR ***&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Without this cleaning, the model would learn to generate Gutenberg headers and metadata instead of authentic historical text, contaminating the training data with modern digital artifacts.&lt;/p&gt;
&lt;h5 id=&#34;pdf-files&#34;&gt;&lt;strong&gt;PDF Files&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;PDF files from historical archives often contain OCR errors and digital artifacts that require correction. The cleaning process in &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt; addresses these issues while preserving historical content, removing page numbers and all-caps headers. While not perfect, it significantly improves text quality.&lt;/p&gt;
&lt;p&gt;The OCR correction rules are based on common patterns in historical documents and can be refined for specific datasets. Libraries like &lt;code&gt;PyMuPDF&lt;/code&gt; or &lt;code&gt;pdfplumber&lt;/code&gt; extract text, while regex-based cleaning corrects common OCR errors and removes digital stamps. More advanced techniques, such as layout analysis or AI-based OCR correction, can further enhance this process.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_pdf_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean PDF text by removing OCR artifacts and digital stamps&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove page numbers: [Page 123], standalone numbers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\[Page \d+\]&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;^\d+$&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, text, flags&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;MULTILINE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove library stamps: Internet Archive, Google, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stamps &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Internet Archive&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Google Books&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;HathiTrust&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Digitized by Google&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Scanned by Google&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; stamp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; stamps:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(stamp, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fix common OCR artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_fixes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b0\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;O&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 0 → O&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b1\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;I&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1 → I  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b5\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;S&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 5 → S&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b8\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;B&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 8 → B&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\brn\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# rn → m&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\bcl\b&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;d&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# cl → d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern, replacement &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ocr_fixes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(pattern, replacement, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove all-caps lines (usually headers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cleaned_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [line &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isupper() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(line) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(cleaned_lines)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: PDF Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Page 1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INTERNET ARCHIVE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A JOURNAL OF THE PLAGUE YEAR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BY DANIEL DEFOE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland. For it was indeed a very terrible time, and the people began to be very much alarmed at it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A JOURNAL OF THE PLAGUE YEAR
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BY DANIEL DEFOE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was about the beginning of September 1664, that I, among the rest of my neighbours, heard in ordinary discourse that the plague was returned again in Holland. For it was indeed a very terrible time, and the people began to be very much alarmed at it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OCR errors can significantly impact the quality of model training. For example, if &lt;code&gt;London&lt;/code&gt; appears as &lt;code&gt;L0nd0n&lt;/code&gt; due to OCR errors, the model won&amp;rsquo;t learn the correct spelling and will generate nonsensical text when asked about historical London. The correction process ensures our model learns authentic historical language patterns rather than digital artifacts, which is crucial for generating coherent and historically accurate text.&lt;/p&gt;
&lt;h5 id=&#34;html-files&#34;&gt;&lt;strong&gt;HTML Files&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;HTML files from historical websites and digital archives contain markup that needs to be stripped while preserving the actual text content. We use the &lt;code&gt;BeautifulSoup&lt;/code&gt; library in &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt; to clean the HTML structure and extract only the meaningful text.&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;clean_html_text&lt;/span&gt;(html_content: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Clean HTML content by removing markup and extracting text&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;bs4&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BeautifulSoup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    soup &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; BeautifulSoup(html_content, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove unwanted elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;script&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;style&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;nav&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;header&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;footer&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;aside&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;menu&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;form&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;input&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;button&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove wiki-specific elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;span&amp;#39;&lt;/span&gt;], class_&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;navbox&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;infobox&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;sidebar&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove navigation elements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; element &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all([&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;], class_&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;breadcrumb&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;navigation&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;menu&amp;#39;&lt;/span&gt;]):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        element&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decompose()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract text content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_text(separator&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, strip&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean up excessive whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\s+&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: HTML Text Cleaning Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;head&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;title&lt;/span&gt;&amp;gt;London History&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;title&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;nav&lt;/span&gt;&amp;gt;Home | About | Contact&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;nav&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;header&lt;/span&gt;&amp;gt;London Historical Society&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;header&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;h1&lt;/span&gt;&amp;gt;The Great Fire of London&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;h1&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;p&lt;/span&gt;&amp;gt;In the year 1666, a great fire consumed much of London...&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;footer&lt;/span&gt;&amp;gt;© 2024 London Historical Society&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;footer&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#c6a0f6&#34;&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Cleaning:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The Great Fire of London in the year 1666, a great fire consumed much of London...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;HTML tags and navigation elements would contaminate training, causing the model to generate markup instead of historical text. Our cleaning process extracts meaningful content while preserving natural flow and structure.&lt;/p&gt;
&lt;h5 id=&#34;xml-files-historical-archives&#34;&gt;&lt;strong&gt;XML Files (Historical Archives):&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;XML files from historical archives, such as the Old Bailey and London Lives, use specific schemas that require specialized parsing. Old Bailey employs &lt;strong&gt;TEI (Text Encoding Initiative)&lt;/strong&gt; with &lt;code&gt;TEI.2&lt;/code&gt; elements, while London Lives uses semantic markup (&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;geo&lt;/code&gt;, &lt;code&gt;occupation&lt;/code&gt;). These structured formats contain authentic historical language with rich metadata, as shown in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;extract_old_bailey_text&lt;/span&gt;(soup) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract text from Old Bailey XML using TEI schema structure&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    extracted_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for TEI.2 elements (Old Bailey schema)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tei_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;TEI.2&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; tei_elements:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract trial accounts (main narrative content)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        trial_accounts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div1&amp;#39;&lt;/span&gt;, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;trialAccount&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; trial &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; trial_accounts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            trial_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_trial_narrative(trial)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; trial_text:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(trial_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract front matter (session information)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        front_matter &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;div1&amp;#39;&lt;/span&gt;, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;frontMatter&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; front &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; front_matter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            front_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_front_matter_narrative(front)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; front_text:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(front_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(extracted_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;extract_london_lives_text&lt;/span&gt;(soup) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Extract text from London Lives XML using semantic markup schema&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    extracted_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check for London Lives specific elements (name, geo, occupation, date)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    geo_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;geo&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    occupation_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;occupation&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; name_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; geo_elements &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; occupation_elements:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract paragraphs with semantic markup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        paragraphs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; soup&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;find_all(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;p&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; para &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; paragraphs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            p_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; extract_paragraph_with_semantic_markup(para)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; p_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                extracted_text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(p_text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(extracted_text)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: XML Text Extraction Functions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Old Bailey XML (Before Processing):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;trial&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;frontmatter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;session&amp;gt;&lt;/span&gt;Session 1&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/session&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;date&amp;gt;&lt;/span&gt;1674-04-15&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/date&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;location&amp;gt;&lt;/span&gt;Old Bailey&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/location&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/frontmatter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;proceedings&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The prisoner being brought to the bar, and the indictment being read, he pleaded Not Guilty. The witnesses being sworn, the first witness deposed that on the 15th day of April last, he saw the prisoner in the company of several suspicious persons...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/proceedings&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/trial&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Processing:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Session 1 1674-04-15 Old Bailey The prisoner being brought to the bar, and the indictment being read, he pleaded Not Guilty. The witnesses being sworn, the first witness deposed, that on the 15th day of April last, he saw the prisoner in the company of several suspicious persons...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;These XML files contain the most authentic historical language in our entire dataset. The Old Bailey trials show how people actually spoke in court during the 17th-19th centuries, while London Lives reveals the everyday language used in personal records and official documents. This authentic historical language is very useful for training a model that can generate historically accurate text, as it provides the model with genuine examples of how people wrote and spoke during different historical periods.&lt;/p&gt;
&lt;h4 id=&#34;223-stage-3-text-normalization&#34;&gt;2.2.3 Stage 3: Text Normalization&lt;/h4&gt;
&lt;p&gt;After extraction, text normalization ensures consistency and compatibility with the training data. Historical documents contain encoding issues, inconsistent formatting, and special characters that confuse the model. Our normalization process fixes these issues and breaks long lines to fit within the model&amp;rsquo;s context window. This is critical because lines exceeding the context window appear as incomplete sentences to the transformer, severely degrading generation quality due to the attention mechanism&amp;rsquo;s inability to process fragmented text.&lt;/p&gt;
&lt;p&gt;Inconsistent encoding and formatting can severely confuse the language model during training. For example, if some files use smart quotes (&amp;quot;) and others use straight quotes (&amp;quot;), the model might not learn that they represent the same concept, leading to inconsistent and potentially incorrect text generation. Normalization ensures that the model observes consistent patterns across all training data, which is crucial for learning coherent language patterns and generating high-quality historical text.&lt;/p&gt;
&lt;p&gt;The code snippet in &lt;a href=&#34;#listing6&#34; class=&#34;listing-ref&#34;&gt;Listing 6&lt;/a&gt; demonstrates how we implement this normalization, which is quite straightforward.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;normalize_text&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Normalize text for consistent training data&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;unicodedata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Fix common encoding issues&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    encoding_fixes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€™&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart apostrophe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€œ&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart quote left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Smart quote right&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€&amp;#34;&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;—&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Em dash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€¢&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;•&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Bullet point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;â€¦&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;…&amp;#39;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Ellipsis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; old, new &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; encoding_fixes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(old, new)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalize Unicode (NFC)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; unicodedata&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;NFC&amp;#39;&lt;/span&gt;, text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Break long lines for training compatibility (max 2000 chars)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    normalized_lines &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; lines:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(line) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split at sentence boundaries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;(?&amp;lt;=[.!?])\s+&amp;#39;&lt;/span&gt;, line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sentence
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_line &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; sentence
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_line:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_line&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            normalized_lines&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(line)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalize line endings and whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(normalized_lines)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[ \t]+&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;, text)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multiple spaces/tabs to single space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\n\s*\n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;, text)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Multiple newlines to double newline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Text Normalization Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Before Normalization:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The year was 1666, and the plague had come to London. â€œIt was indeed a very terrible time,â€ wrote one observer. The streets were filled with the sounds of horse-drawn carriages and the cries of the afflicted.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After Normalization:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The year was 1666, and the plague had come to London. &amp;#34;It was indeed a very terrible time,&amp;#34; wrote one observer. The streets were filled with the sounds of horse-drawn carriages and the cries of the afflicted.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;224-stage-4-quality-validation&#34;&gt;2.2.4 Stage 4: Quality Validation&lt;/h4&gt;
&lt;p&gt;Not all extracted text is suitable for training. Some files contain duplicates, non-English content, or poor-quality text that would degrade model performance. We need a comprehensive validation system that ensures only high-quality, relevant text is included in our training corpus.&lt;/p&gt;
&lt;p&gt;The key challenge is striking a balance between quality standards and historical value. A strict approach might reject valuable historical documents that have some OCR issues, while a lenient approach might include too much low-quality content, which can degrade model training. To address this, I implemented a &lt;strong&gt;tiered quality threshold system&lt;/strong&gt; that applies different standards based on content type:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;General Content&lt;/strong&gt;: 200+ chars, 50+ words, 50% meaningful words&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project Gutenberg&lt;/strong&gt;: 200+ chars, 50+ words, 40% meaningful words (relaxed for historical value)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical Documents&lt;/strong&gt;: 1000+ chars, 100+ words, 30% meaningful words (very relaxed for historical value)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This tiered approach ensures that we capture valuable historical content while maintaining quality standards, filtering out duplicates, non-English content, and low-quality text, thereby preserving the integrity of useful historical documents. Again, these implementations are quite simple, in the context of a toy project, but can be made more robust. The code itself is quite straightforward, as shown in &lt;a href=&#34;#listing7&#34; class=&#34;listing-ref&#34;&gt;Listing 7&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;analyze_text_quality&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, source_type: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Analyze text quality and determine if it should be included in training corpus&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;hashlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Length validation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    char_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    word_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# OCR artifact detection using regex patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_capitals&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[A-Z]{5,}\s+[A-Z]{5,}&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;spaced_letters&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b[A-Za-z]\s+[A-Za-z]\s+[A-Za-z]\s+[A-Za-z]\b&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[!@#$%^&amp;amp;*()]{3,}&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mixed_alphanumeric&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\b\d+[A-Za-z]+\d+\b&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;long_non_word&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;[^\w\s]{10,}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ocr_issues &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern_name, pattern &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ocr_patterns&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(pattern, text):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            ocr_issues&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(pattern_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Advertisement detection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_patterns &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;this day is published&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;just ready&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;elegantly bound&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;now ready&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;new novels&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;advertisements&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;price \d+s&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;paternoster row&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;corner of&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;publishers&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;sum&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; pattern &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; ad_patterns &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(pattern, text, re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IGNORECASE))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ad_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(word_count, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Meaningful word ratio calculation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    words &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meaningful_words &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [w &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; w &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; words &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; w&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;isalpha() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(w) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meaningful_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(meaningful_words) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(words), &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quality thresholds based on source type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    thresholds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.50&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gutenberg&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.40&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;historical&amp;#39;&lt;/span&gt;: {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.30&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    threshold &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; thresholds&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get(source_type, thresholds[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;general&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quality scoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(ocr_issues) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# OCR issues&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Advertisement density&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    score &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; meaningful_ratio) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Meaningful word ratio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if text meets quality thresholds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meets_thresholds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        char_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_chars&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        word_count &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_words&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        meaningful_ratio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; threshold[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;min_meaningful_ratio&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ad_density &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Less than 10% advertisement content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;char_count&amp;#39;&lt;/span&gt;: char_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;word_count&amp;#39;&lt;/span&gt;: word_count,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;meaningful_ratio&amp;#39;&lt;/span&gt;: meaningful_ratio,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ocr_issues&amp;#39;&lt;/span&gt;: ocr_issues,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ad_density&amp;#39;&lt;/span&gt;: ad_density,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;: score,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;meets_thresholds&amp;#39;&lt;/span&gt;: meets_thresholds,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;content_hash&amp;#39;&lt;/span&gt;: hashlib&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;md5(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode())&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;hexdigest()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Text Quality Analysis Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Content Quality Validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our validation system employs multiple detection mechanisms to ensure training corpus quality:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OCR Artifact Detection&lt;/strong&gt;: Regex patterns identify common digitization errors, including misread headers, character separation failures, scanning artifacts, alphanumeric misinterpretations, and corrupted text regions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advertisement Filtering&lt;/strong&gt;: Pattern matching detects commercial content using phrases like &amp;ldquo;this day is published&amp;rdquo;, &amp;ldquo;just ready&amp;rdquo;, &amp;ldquo;elegantly bound&amp;rdquo;, and price references&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality Scoring&lt;/strong&gt;: A 100-point system deducts points for OCR artifacts (-3 each), advertisement density (-50), and low meaningful word ratios (-20)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This multi-layered approach balances quality standards with preservation of valuable historical content, ensuring the model trains on authentic historical language while filtering out contamination sources.&lt;/p&gt;
&lt;h4 id=&#34;225-stage-5-final-processing-and-corpus-creation&#34;&gt;2.2.5 Stage 5: Final Processing and Corpus Creation&lt;/h4&gt;
&lt;p&gt;After cleaning and validation, we create a final training corpus optimized for language model training. This requires intelligent segmentation that breaks long texts into manageable chunks while preserving the historical narrative flow, which is essential given the context window limits (e.g., 2048 tokens). The code snippet in &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt; demonstrates this final processing stage.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_comprehensive_corpus&lt;/span&gt;(cleaned_files: &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create final training corpus with intelligent segmentation&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    corpus_parts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; file_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; cleaned_files:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split into training segments&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; split_into_training_segments(content)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        corpus_parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extend(segments)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create final corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    final_corpus &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(corpus_parts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save to file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;london_historical_corpus_comprehensive.txt&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;w&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;write(final_corpus)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; final_corpus
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;split_into_training_segments&lt;/span&gt;(text: &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;, max_length: &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Split text into training segments while preserving narrative flow&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First split on double newlines (paragraphs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    paragraphs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; paragraphs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; paragraph) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; paragraph &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Further split long segments at sentence boundaries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    final_segments &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; segments:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(segment) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sentences &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#ed8796&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;(?&amp;lt;=[.!?])\s+&amp;#39;&lt;/span&gt;, segment)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; sentences:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sentence) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;=&lt;/span&gt; max_length:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    current_segment &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; sentence &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; current_segment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(current_segment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            final_segments&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(segment)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Filter out segments that are too short&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; [seg &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; seg &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; final_segments &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(seg) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Corpus Creation and Segmentation Functions&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;During my local runs, this final processing stage generated a comprehensive corpus of over 500 million characters across ~250,000 segments, with an average segment length of around 2,000 characters. The success rate of files making it into the final corpus ranged from 70% to 90%, depending on the quality and availability of the source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Corpus Statistics:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Total Sources Processed&lt;/strong&gt;: 218+ historical sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Final Corpus Size&lt;/strong&gt;: 500M+ characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training Segments&lt;/strong&gt;: ~250,000 segments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Segment Length&lt;/strong&gt;: ~2,000 characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;: 70-90% (depending on source availability)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-detailed-data-processing-flow&#34;&gt;2.3 Detailed Data Processing Flow&lt;/h3&gt;
&lt;p&gt;Building on the high-level flow and having reviewed each of the areas, the detailed flow below illustrates the complete data cleaning process, including rejection paths, error handling, and statistics tracking. This is intended to provide a bird&amp;rsquo;s-eye view of the entire process.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig4&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📁 Raw Files] --&amp;gt; B{File Type Detection}
    
    B --&amp;gt;|.txt, .txt.utf-8| C[📄 Text File]
    B --&amp;gt;|.pdf| D[📄 PDF File]
    B --&amp;gt;|.html, .htm| E[📄 HTML File]
    B --&amp;gt;|.xml| F[📄 XML File]
    B --&amp;gt;|No Extension| G{Content Detection}
    
    G --&amp;gt;|HTML-like| E
    G --&amp;gt;|Text-like| C
    G --&amp;gt;|Binary/Unknown| REJECT1[❌ REJECTED]
    
    C --&amp;gt; H[🧹 clean_gutenberg_text]
    D --&amp;gt; I[🔧 extract_text_from_pdf]
    E --&amp;gt; J[🧹 clean_html_text]
    F --&amp;gt; K{XML Type Detection}
    
    I --&amp;gt; L[🧹 clean_pdf_text]
    
    K --&amp;gt;|Old Bailey| M[🔧 extract_old_bailey_text]
    K --&amp;gt;|London Lives| N[🔧 extract_london_lives_text]
    
    M --&amp;gt; O[🧹 clean_old_bailey_text]
    N --&amp;gt; P[🧹 clean_london_lives_text]
    
    H --&amp;gt; Q[🔧 normalize_text]
    L --&amp;gt; Q
    J --&amp;gt; Q
    O --&amp;gt; Q
    P --&amp;gt; Q
    
    Q --&amp;gt; R[🔍 Duplicate Detection]
    R --&amp;gt;|Duplicate| REJECT2[❌ REJECTED - Duplicate]
    R --&amp;gt;|Unique| S[🌍 Language Detection]
    
    S --&amp;gt;|Non-English| REJECT3[❌ REJECTED - Non-English]
    S --&amp;gt;|English| T[📊 Quality Analysis]
    
    T --&amp;gt; U{Quality Check}
    U --&amp;gt;|Poor Quality| REJECT4[❌ REJECTED - Poor Quality]
    U --&amp;gt;|Good Quality| V[💾 Save to Processed Directory]
    
    V --&amp;gt; W[📊 Update Statistics]
    W --&amp;gt; X[✅ Successfully Processed]
    
    REJECT1 --&amp;gt; Y[📝 Log Rejection Reason]
    REJECT2 --&amp;gt; Y
    REJECT3 --&amp;gt; Y
    REJECT4 --&amp;gt; Y
    
    Y --&amp;gt; Z[📊 Update Rejection Stats]
    
    style A fill:#e1f5fe
    style X fill:#c8e6c9
    style REJECT1 fill:#ffcdd2
    style REJECT2 fill:#ffcdd2
    style REJECT3 fill:#ffcdd2
    style REJECT4 fill:#ffcdd2
    style Y fill:#fff3e0
    style Z fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 4: Detailed Data Processing Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;25-corpus-creation-process&#34;&gt;2.5 Corpus Creation Process&lt;/h3&gt;
&lt;p&gt;After cleaning, the system creates the final training corpus through intelligent segmentation that preserves historical narrative flow:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;📁 Cleaned Files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;🔧 create_comprehensive_corpus()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Read all cleaned_*.txt files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Split into training segments (split_into_training_segments)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Split on double newlines (paragraphs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Max length: 2000 characters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   ├── Min length: 100 characters
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    │   └── Further split long segments at sentence boundaries
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ├── Filter segments (min 50 characters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    └── Write to london_historical_corpus_comprehensive.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The corpus creation process reads all cleaned text files and intelligently segments them into training-ready chunks. It first splits on double newlines to preserve paragraph boundaries, which are natural break points in historical text. Segments are constrained to a maximum of 2000 characters to fit within the model&amp;rsquo;s context window, with a minimum of 100 characters to ensure substantial content. Long segments are further split at sentence boundaries to maintain readability. Finally, segments shorter than 50 characters are filtered out as they&amp;rsquo;re unlikely to contain meaningful historical content.&lt;/p&gt;
&lt;p&gt;Proper segmentation is crucial for training language models. The model needs to learn from coherent text segments that maintain historical narrative flow while fitting within its context window. Splitting on paragraph boundaries preserves the natural structure of historical documents, while sentence-level splitting ensures that very long paragraphs don&amp;rsquo;t exceed the model&amp;rsquo;s processing capabilities. This approach maximizes the model&amp;rsquo;s ability to learn from authentic historical language patterns while maintaining training efficiency.&lt;/p&gt;
&lt;h3 id=&#34;26-outcome-training-ready-corpus&#34;&gt;2.6 Outcome: Training-Ready Corpus&lt;/h3&gt;
&lt;p&gt;The result is a &lt;strong&gt;clean, historically faithful corpus&lt;/strong&gt; containing over 500 million characters of authentic historical English spanning 350 years of London history from 1500-1850. The corpus comprises high-quality text with minimal OCR artifacts, preserving historical language patterns and a rich cultural context that reflects the social, political, and economic realities of various historical periods. The text has been intelligently segmented for optimal language model training, with careful attention to maintaining the natural flow of historical narratives while ensuring compatibility with modern training techniques.&lt;/p&gt;
&lt;p&gt;This corpus serves as the essential foundation for training our specialized historical tokenizer and language model, ensuring the model learns authentic historical English rather than modern text patterns. By providing the model with genuine examples of how people wrote and spoke during different historical periods, we enable it to generate text that captures the linguistic nuances, cultural references, and historical context that make historical language modeling both challenging and rewarding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💻 Try It Yourself:&lt;/strong&gt; The complete implementation, including all the data collection scripts, cleaning algorithms, and quality validation systems described in this section, is available in the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		helloLondon GitHub repository
	&lt;/span&gt;
&lt;/a&gt;. The repository includes detailed documentation, example usage, and step-by-step guides for setting up your own historical language model training pipeline.&lt;/p&gt;
&lt;p&gt;Now that we have examined the data collection and cleaning process, we can proceed to the next steps: creating a custom historical tokenizer and preparing for model training.&lt;/p&gt;
&lt;h2 id=&#34;3-custom-historical-tokenizer-the-key-to-authentic-historical-text-generation&#34;&gt;3. Custom Historical Tokenizer: The Key to Authentic Historical Text Generation&lt;/h2&gt;
&lt;p&gt;Creating a custom tokenizer is crucial for generating effective historical text. This section examines the necessity of a custom tokenizer, the challenges presented by historical language, and our chosen architecture. The tokenizer preserves the semantic meaning of historical words and phrases, enabling coherent and contextually accurate historical narratives.&lt;/p&gt;
&lt;p&gt;Standard tokenizers like GPT-2&amp;rsquo;s fragment archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; into multiple subword tokens, destroying semantic meaning crucial for historical text generation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real Example - Standard Tokenizer vs. Our Custom Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Standard GPT-2 Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ [&amp;#39;Qu&amp;#39;, &amp;#39;oth&amp;#39;, &amp;#39; the&amp;#39;, &amp;#39; ald&amp;#39;, &amp;#39;erman&amp;#39;, &amp;#39;,&amp;#39;, &amp;#39; &amp;#39;, &amp;#39;&amp;#39;&amp;#39;, &amp;#39;T&amp;#39;, &amp;#39;is&amp;#39;, &amp;#39; a&amp;#39;, &amp;#39; fair&amp;#39;, &amp;#39; day&amp;#39;, &amp;#39; at&amp;#39;, &amp;#39; New&amp;#39;, &amp;#39;gate&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Our Custom Historical Tokenizer:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;→ [&amp;#39;&amp;lt;|quoth|&amp;gt;&amp;#39;, &amp;#39; the&amp;#39;, &amp;#39; alderman&amp;#39;, &amp;#39;,&amp;#39;, &amp;#39; &amp;#39;, &amp;#39;&amp;#39;&amp;#39;, &amp;#39;&amp;lt;|tis|&amp;gt;&amp;#39;, &amp;#39; a&amp;#39;, &amp;#39; fair&amp;#39;, &amp;#39; day&amp;#39;, &amp;#39; at&amp;#39;, &amp;#39; &amp;lt;|newgate|&amp;gt;&amp;#39;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The standard tokenizer breaks historical language into 18 meaningless fragments, losing semantic meaning and historical context. Our custom tokenizer reduces this to 12 meaningful tokens, preserving authentic historical language patterns essential for coherent text generation.&lt;/p&gt;
&lt;p&gt;A tokenizer that fragments historical language destroys the model&amp;rsquo;s ability to learn authentic patterns. The model needs to perceive &amp;ldquo;quoth&amp;rdquo; as a single concept, rather than fragmented subwords, to capture the linguistic nuances of different historical periods.&lt;/p&gt;
&lt;h3 id=&#34;31-what-happens-with-off-the-shelf-tokenizers&#34;&gt;3.1 What Happens with Off-the-Shelf Tokenizers&lt;/h3&gt;
&lt;p&gt;What would happen if we used standard tokenizers like tiktoken or GPT-2&amp;rsquo;s tokenizer?&lt;/p&gt;
&lt;p&gt;Standard tokenizers would force the model to waste capacity reconstructing fragmented historical words from subwords rather than learning historical language patterns. The model might learn to generate &amp;ldquo;Qu&amp;rdquo; + &amp;ldquo;oth&amp;rdquo; but struggle to use &amp;ldquo;quoth&amp;rdquo; in new contexts. Historical phrases like &amp;ldquo;methinks&amp;rdquo; would split into meaningless fragments, losing semantic coherence. London geography becomes particularly problematic, as place names like &amp;ldquo;Newgate&amp;rdquo; fragment, making spatial relationships harder to understand.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation Quality Issues:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# What you&amp;#39;d get with standard tokenizer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Generates: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Qu oth the ald erman, &amp;#39;T is a fair day at New gate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Result: Broken, unreadable historical text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# What you get with our custom tokenizer:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Generates: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Quoth the alderman, &amp;#39;Tis a fair day at Newgate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;→&lt;/span&gt; Result: Authentic, coherent historical text&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A vocabulary that&amp;rsquo;s too small (10K tokens) would fragment even more historical words, making the problem worse, while a vocabulary that&amp;rsquo;s too large (100K+ tokens) would overfit to rare historical terms, wasting capacity on words that appear only once. Our choice of 30K tokens provides a balanced approach that captures common historical patterns without overfitting, ensuring the model learns the most important historical language patterns efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-World Example:&lt;/strong&gt;
With a standard tokenizer, our model might generate:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;The ald erman walk ed to New gate where he saw the pris oner&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;With our custom tokenizer, it generates:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;The alderman walked to Newgate where he saw the prisoner&amp;quot;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The difference in historical text authenticity is significant between the two approaches.&lt;/p&gt;
&lt;h3 id=&#34;32-tokenizer-architecture&#34;&gt;3.2 Tokenizer Architecture&lt;/h3&gt;
&lt;p&gt;I had started with the easier WordPiece tokenizer (more of an accident rather than by design). Still, I realized later that it was unsuitable for historical text due to the &lt;code&gt;##&lt;/code&gt; subword prefix artifacts. We need a tokenizer that can handle historical English efficiently while preserving semantic meaning, unlike standard tokenizers like GPT-2&amp;rsquo;s WordPiece approach, which fragments historical language and, as a result, destroys the linguistic patterns we want to preserve. After some experimentation, I settled on a custom Byte Pair Encoding (BPE) tokenizer trained specifically on historical English.&lt;/p&gt;
&lt;p&gt;BPE is a subword tokenization algorithm that learns to break text into meaningful subword units by iteratively finding the most frequent character pairs in the training corpus and merging them into single tokens. The process begins with individual characters and gradually evolves into common words and phrases.&lt;/p&gt;
&lt;p&gt;For example, if &lt;code&gt;&amp;quot;th&amp;quot;&lt;/code&gt; appears frequently in our historical corpus, BPE will learn to treat it as a single token rather than separate &lt;code&gt;&amp;quot;t&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;h&amp;quot;&lt;/code&gt; tokens. This is particularly valuable for historical English, where words like &lt;code&gt;&amp;quot;thou&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;thee&amp;quot;&lt;/code&gt;, and &lt;code&gt;&amp;quot;thine&amp;quot;&lt;/code&gt; share common prefixes and suffixes.&lt;/p&gt;
&lt;h4 id=&#34;321-tokenizer-training-process&#34;&gt;3.2.1 Tokenizer Training Process&lt;/h4&gt;
&lt;p&gt;The BPE training algorithm analyzes our entire historical corpus to identify the most frequent character combinations, building a vocabulary that&amp;rsquo;s optimized for historical language patterns. We start with a base alphabet (comprising all letters) and special tokens, then iteratively merge the most frequent pairs until we reach our target vocabulary size of 30,000 tokens. This ensures that common historical words, such as &lt;code&gt;&amp;quot;quoth&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;hast&amp;quot;&lt;/code&gt;, and &lt;code&gt;&amp;quot;methinks&amp;quot;&lt;/code&gt;, are treated as single tokens, while still allowing for the handling of rare or unknown words by breaking them into learned subword units.&lt;/p&gt;
&lt;p&gt;The training process is computationally efficient and produces a tokenizer that&amp;rsquo;s specifically tuned to the linguistic patterns found in our historical corpus.&lt;/p&gt;
&lt;p&gt;In this case, we don&amp;rsquo;t have to reinvent the wheel and use the Hugging Face &lt;code&gt;tokenizers&lt;/code&gt; library, which provides a modular approach to building custom tokenizers. The library is organized into several key components: &lt;code&gt;models&lt;/code&gt; define the core tokenization algorithm (BPE, WordPiece, Unigram), &lt;code&gt;pre_tokenizers&lt;/code&gt; handle initial text splitting, &lt;code&gt;normalizers&lt;/code&gt; clean and standardize text, &lt;code&gt;trainers&lt;/code&gt; configure the learning process, and &lt;code&gt;processors&lt;/code&gt; handle special token insertion. This modular design enables us to mix and match components to create a tokenizer tailored to our specific use case.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;models&lt;/code&gt; module offers several tokenization algorithms: &lt;code&gt;BPE()&lt;/code&gt; for Byte Pair Encoding (what we use), &lt;code&gt;WordPiece()&lt;/code&gt; for Google&amp;rsquo;s WordPiece algorithm, &lt;code&gt;Unigram()&lt;/code&gt; for Google&amp;rsquo;s Unigram language model, and &lt;code&gt;WordLevel()&lt;/code&gt; for simple word-level tokenization.&lt;/p&gt;
&lt;p&gt;Each has different strengths - BPE is efficient and handles unknown words well, WordPiece is used by BERT but creates &lt;code&gt;##&lt;/code&gt; artifacts, Unigram is more flexible but computationally expensive, and WordLevel is simple but creates very large vocabularies.&lt;/p&gt;
&lt;p&gt;Let us look at the code in &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt; for training our custom historical BPE tokenizer:&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;train_tokenizer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Train a custom tokenizer for historical English&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Import the tokenizers library components&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tokenizers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Tokenizer, models, pre_tokenizers, processors, trainers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tokenizers.normalizers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Sequence, NFD, StripAccents
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Training custom historical tokenizer...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Corpus: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;corpus_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Target vocabulary: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size&lt;span style=&#34;color:#a6da95&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; tokens&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    logger&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Output directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;output_dir&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize BPE tokenizer (not WordPiece)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# models.BPE() creates a Byte Pair Encoding model that will learn subword patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Tokenizer(models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BPE())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizers for historical text - preserve case for better text reconstruction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Normalizers clean and standardize text before tokenization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Sequence([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        NFD(),           &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Unicode normalization - converts characters to canonical form&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        StripAccents()   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove accents - converts &amp;#34;café&amp;#34; to &amp;#34;cafe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-tokenizer for historical English - use simple whitespace splitting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-tokenizers split text into initial segments before the main tokenization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;pre_tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Sequence([
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;WhitespaceSplit(),  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split on whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre_tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Punctuation()       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Split punctuation from words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Special tokens for historical English&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical language tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thee|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thy|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thine|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hast|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|dost|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|quoth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tis|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twas|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twill|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# London geography tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thames|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|westminster|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tower|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|newgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|southwark|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|cheapside|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|fleet|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|ludgate|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|aldgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical period tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tudor|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|stuart|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|georgian|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|regency|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|victorian|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Social class tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|noble|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|gentleman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|commoner|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apprentice|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|yeoman|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Professional tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apothecary|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|coachman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|chimneysweep|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|baker|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|butcher|&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# BPE trainer configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# The trainer defines how the BPE algorithm learns from our corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    trainer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; trainers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BpeTrainer(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        vocab_size&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;vocab_size,        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Target vocabulary size (30,000 tokens) - balanced between coverage and efficiency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;special_tokens,     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pre-defined tokens that are always included&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        min_frequency&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;,                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Minimum frequency prevents vocabulary pollution from OCR errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        show_progress&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display training progress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Removed continuing_subword_prefix=&amp;#34;##&amp;#34; to eliminate WordPiece-style artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This ensures pure BPE tokenization without ## symbols in generated text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        initial_alphabet&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;e&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;f&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;g&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;h&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;i&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;j&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;k&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;l&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;m&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;p&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;q&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;s&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;u&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;v&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;x&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;y&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;E&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;F&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;G&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;H&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;I&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;J&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;K&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;L&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;M&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;O&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Q&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;R&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;S&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;U&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;V&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;W&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;X&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Y&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Z&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Train the tokenizer on our historical corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# This is where the BPE algorithm learns the optimal subword patterns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;train([&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;corpus_path)], trainer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tokenizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Custom Tokenizer Training Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;322-tokenization-architecture-decisions&#34;&gt;3.2.2 Tokenization Architecture Decisions&lt;/h4&gt;
&lt;p&gt;Our custom historical tokenizer necessitated several critical design decisions to handle historical English effectively. We evaluated multiple tokenization approaches including &lt;strong&gt;Byte Pair Encoding (BPE)&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1508.07909&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sennrich et al., 2016
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;WordPiece&lt;/strong&gt; (&lt;a
	
		href = &#34;https://research.google/pubs/pub37842/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Schuster &amp;amp; Nakajima, 2012
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;Unigram Language Model&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1804.10959&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kudo, 2018
	&lt;/span&gt;
&lt;/a&gt;), &lt;strong&gt;SentencePiece&lt;/strong&gt; (&lt;a
	
		href = &#34;https://arxiv.org/abs/1808.06226&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kudo &amp;amp; Richardson, 2018
	&lt;/span&gt;
&lt;/a&gt;), and traditional character-level and word-level tokenization. Each approach has distinct trade-offs: BPE produces clean subwords without special markers (used by GPT models), WordPiece adds &lt;code&gt;##&lt;/code&gt; prefixes that contaminate generated text (used by BERT), Unigram uses probabilistic modeling but is computationally expensive, SentencePiece treats text as raw bytes and excels at multilingual scenarios, while character-level and word-level tokenization either produce impractically long sequences or massive vocabularies.&lt;/p&gt;
&lt;p&gt;For historical text generation, BPE provides the optimal balance of clean output, efficient training, and effective vocabulary coverage, as demonstrated by &lt;a
	
		href = &#34;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Radford et al., 2019
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;https://arxiv.org/abs/2112.10508&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mielke et al., 2021
	&lt;/span&gt;
&lt;/a&gt;. We also preserve case throughout tokenization, since historical text often uses capitalization for semantic meaning (e.g., &amp;ldquo;Thou&amp;rdquo; vs. &amp;ldquo;thou&amp;rdquo;), and include over 150 carefully designed special tokens that capture historical language patterns, London geography, and social context. This combination ensures our tokenizer can effectively learn and generate authentic historical language while maintaining computational efficiency.&lt;/p&gt;
&lt;h3 id=&#34;33-special-token-design-capturing-historical-language-patterns&#34;&gt;3.3 Special Token Design: Capturing Historical Language Patterns&lt;/h3&gt;
&lt;p&gt;Historical English contains linguistic patterns, vocabulary, and cultural references that are no longer present in modern English. Standard tokenizers fragment these patterns, destroying the semantic meaning crucial for historical text generation. The solution here was to design 150 special tokens that capture the essence of historical English, organized into strategic categories that reflect the linguistic and cultural structure of 1500-1850 English.&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_special_tokens&lt;/span&gt;() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create special tokens for historical English&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Basic control tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical language tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thou|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thee|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thy|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thine|&amp;gt;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second person pronouns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hast|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|hath|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|doth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|dost|&amp;gt;&amp;#34;&lt;/span&gt;,  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Archaic verb forms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|quoth|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tis|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twas|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|twill|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Common contractions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# London geography tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|london|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|thames|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|westminster|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tower|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|newgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|southwark|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|cheapside|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|fleet|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|ludgate|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|aldgate|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical period tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|tudor|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|stuart|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|georgian|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|regency|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|victorian|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Social and professional tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|noble|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|gentleman|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|commoner|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|apothecary|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|coachman|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|merchant|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|court|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|jury|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|verdict|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|church|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|parish|&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; special_tokens&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Special Tokens Creation Function&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&#34;331-token-category-analysis&#34;&gt;3.3.1 Token Category Analysis&lt;/h4&gt;
&lt;p&gt;Our special token vocabulary spans ten carefully curated categories, each designed to capture essential aspects of historical London life. The largest categories focus on &lt;strong&gt;Historical Language&lt;/strong&gt; (25 tokens) and &lt;strong&gt;London Geography&lt;/strong&gt; (20 tokens), providing the linguistic and spatial foundation for authentic historical text generation. These tokens capture archaic pronouns like &lt;code&gt;&amp;quot;thou&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;thee,&amp;quot;&lt;/code&gt; along with specific London locations like &lt;code&gt;&amp;quot;Thames&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;Newgate&amp;quot;&lt;/code&gt; that were central to historical narratives.&lt;/p&gt;
&lt;p&gt;The remaining categories address the social, professional, and cultural dimensions of historical society. &lt;strong&gt;Social Class&lt;/strong&gt; and &lt;strong&gt;Professional&lt;/strong&gt; tokens (35 tokens combined) reflect the highly stratified nature of historical London, enabling accurate dialogue between nobles, commoners, and various tradespeople. &lt;strong&gt;Legal and Judicial&lt;/strong&gt; tokens support court proceedings from the Old Bailey, while &lt;strong&gt;Religious&lt;/strong&gt; tokens capture the central role of faith in historical society. &lt;strong&gt;Temporal&lt;/strong&gt;, &lt;strong&gt;Currency&lt;/strong&gt;, and &lt;strong&gt;Transportation&lt;/strong&gt; tokens (35 tokens combined) provide the temporal, economic, and logistical context that makes historical narratives authentic and believable.&lt;/p&gt;
&lt;h4 id=&#34;332-special-token-categories-visualization&#34;&gt;3.3.2 Special Token Categories Visualization&lt;/h4&gt;
&lt;p&gt;Let us visualize the special token categories and their relationships as shown below. These special tokens enable the model to understand and generate authentic historical language. Without them, the model would fragment historical concepts into meaningless subwords, losing the cultural and linguistic context that makes historical text generation both challenging and rewarding.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig5&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph LR
    A[🔤 Special Tokens&amp;lt;br/&amp;gt;150+ Total] --&amp;gt; B[📜 Historical Language&amp;lt;br/&amp;gt;25 tokens]
    A --&amp;gt; C[🏛️ London Geography&amp;lt;br/&amp;gt;20 tokens]
    A --&amp;gt; D[⏰ Historical Periods&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; E[👥 Social Classes&amp;lt;br/&amp;gt;15 tokens]
    A --&amp;gt; F[💼 Professions&amp;lt;br/&amp;gt;20 tokens]
    A --&amp;gt; G[⚖️ Legal &amp;amp; Judicial&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; H[⛪ Religious&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; I[🕐 Temporal&amp;lt;br/&amp;gt;15 tokens]
    A --&amp;gt; J[💰 Currency &amp;amp; Measurement&amp;lt;br/&amp;gt;10 tokens]
    A --&amp;gt; K[🚗 Transportation&amp;lt;br/&amp;gt;10 tokens]

    B --&amp;gt; B1[&amp;#34;&amp;lt;|thou|&amp;gt;, &amp;lt;|thee|&amp;gt;, &amp;lt;|hast|&amp;gt;, &amp;lt;|doth|&amp;gt;, &amp;lt;|quoth|&amp;gt;&amp;#34;]
    C --&amp;gt; C1[&amp;#34;&amp;lt;|london|&amp;gt;, &amp;lt;|thames|&amp;gt;, &amp;lt;|newgate|&amp;gt;, &amp;lt;|westminster|&amp;gt;&amp;#34;]
    D --&amp;gt; D1[&amp;#34;&amp;lt;|tudor|&amp;gt;, &amp;lt;|stuart|&amp;gt;, &amp;lt;|georgian|&amp;gt;, &amp;lt;|regency|&amp;gt;&amp;#34;]
    E --&amp;gt; E1[&amp;#34;&amp;lt;|noble|&amp;gt;, &amp;lt;|gentleman|&amp;gt;, &amp;lt;|commoner|&amp;gt;, &amp;lt;|yeoman|&amp;gt;&amp;#34;]
    F --&amp;gt; F1[&amp;#34;&amp;lt;|apothecary|&amp;gt;, &amp;lt;|coachman|&amp;gt;, &amp;lt;|chimneysweep|&amp;gt;, &amp;lt;|baker|&amp;gt;&amp;#34;]
    G --&amp;gt; G1[&amp;#34;&amp;lt;|court|&amp;gt;, &amp;lt;|jury|&amp;gt;, &amp;lt;|verdict|&amp;gt;, &amp;lt;|prisoner|&amp;gt;&amp;#34;]
    H --&amp;gt; H1[&amp;#34;&amp;lt;|church|&amp;gt;, &amp;lt;|parish|&amp;gt;, &amp;lt;|prayer|&amp;gt;, &amp;lt;|blessed|&amp;gt;&amp;#34;]
    I --&amp;gt; I1[&amp;#34;&amp;lt;|morn|&amp;gt;, &amp;lt;|eve|&amp;gt;, &amp;lt;|season|&amp;gt;, &amp;lt;|year|&amp;gt;&amp;#34;]
    J --&amp;gt; J1[&amp;#34;&amp;lt;|shilling|&amp;gt;, &amp;lt;|pound|&amp;gt;, &amp;lt;|yard|&amp;gt;, &amp;lt;|furlong|&amp;gt;&amp;#34;]
    K --&amp;gt; K1[&amp;#34;&amp;lt;|coach|&amp;gt;, &amp;lt;|carriage|&amp;gt;, &amp;lt;|horse|&amp;gt;, &amp;lt;|vessel|&amp;gt;&amp;#34;]

    %% class definitions (custom palette matching your original)
    classDef cls_root fill:#e1f5fe,stroke:#81d4fa,color:#000;
    classDef cls_hist fill:#f3e5f5,stroke:#ce93d8,color:#000;
    classDef cls_geo fill:#e8f5e8,stroke:#a5d6a7,color:#000;
    classDef cls_period fill:#fff3e0,stroke:#ffe0b2,color:#000;
    classDef cls_social fill:#fce4ec,stroke:#f8bbd0,color:#000;
    classDef cls_prof fill:#f1f8e9,stroke:#c5e1a5,color:#000;
    classDef cls_legal fill:#e0f2f1,stroke:#80cbc4,color:#000;
    classDef cls_relig fill:#f9fbe7,stroke:#e6ee9c,color:#000;
    classDef cls_temp fill:#e3f2fd,stroke:#90caf9,color:#000;
    classDef cls_curr fill:#fef7e0,stroke:#ffe082,color:#000;
    classDef cls_trans fill:#f3e5f5,stroke:#e1bee7,color:#000;

    %% assign classes
    class A cls_root;
    class B cls_hist;
    class C cls_geo;
    class D cls_period;
    class E cls_social;
    class F cls_prof;
    class G cls_legal;
    class H cls_relig;
    class I cls_temp;
    class J cls_curr;
    class K cls_trans;&lt;/pre&gt;
    &lt;figcaption&gt;Figure 5: Special Token Categories and Examples&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;35-post-processing-and-hugging-face-integration&#34;&gt;3.5 Post-Processing and Hugging Face Integration&lt;/h3&gt;
&lt;p&gt;After training our custom tokenizer, we need to make it compatible with the broader machine learning ecosystem and ensure it works properly with language model training. Raw tokenizers can only convert text to tokens and back. Still, language models require additional functionality, such as special token handling, sequence padding, and integration with popular frameworks like Hugging Face Transformers.&lt;/p&gt;
&lt;p&gt;The challenge, though, is that language model training requires specific formatting that raw tokenizers don&amp;rsquo;t provide. For example, training sequences need to be wrapped with special start/end tokens (&lt;code&gt;&amp;lt;|startoftext|&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;|endoftext|&amp;gt;&lt;/code&gt;), padded to consistent lengths for batch processing, and integrated with the rest of the ecosystem. In our case, we also want to utilize Hugging Face and its ecosystem, allowing us to leverage standard training scripts and model architectures. Without proper post-processing, our custom tokenizer would be incompatible with existing training infrastructure.&lt;/p&gt;
&lt;p&gt;We add post-processing capabilities that wrap text sequences with control tokens and create Hugging Face-compatible tokenizer files, ensuring seamless integration with the broader machine learning ecosystem while preserving our historical text optimizations.&lt;/p&gt;
&lt;p&gt;There are three key areas that we need to consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Understanding Post-Processing:&lt;/strong&gt; The first step is adding a post-processor that automatically wraps every text sequence with special start and end tokens. This is crucial because language models must be able to identify where sequences begin and end during training. For example, when we tokenize &lt;code&gt;&amp;quot;Hello world&amp;quot;&lt;/code&gt;, the post-processor automatically converts it to &lt;code&gt;&amp;lt;|startoftext|&amp;gt; Hello world &amp;lt;|endoftext|&amp;gt;&lt;/code&gt;. This template processing ensures consistent formatting across all our training data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hugging Face Integration:&lt;/strong&gt; Next, we create a Hugging Face-compatible wrapper around our custom tokenizer. This wrapper maps our special tokens to the standard token types that Hugging Face expects: beginning-of-sequence (bos), end-of-sequence (eos), padding, unknown, and masking tokens. This mapping allows our custom tokenizer to work seamlessly with standard training scripts and model architectures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Special Token Functions:&lt;/strong&gt; Each special token serves a specific purpose in language model training. The beginning-of-sequence token indicates when a new text starts, the end-of-sequence token marks the end of the text, padding tokens ensure all sequences in a batch have the same length, unknown tokens handle words not in our vocabulary, and masking tokens are used during training for masked language modeling tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code in &lt;a href=&#34;#listing11&#34; class=&#34;listing-ref&#34;&gt;Listing 11&lt;/a&gt; demonstrates how we implement these post-processing steps and create a Hugging Face-compatible tokenizer:&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_huggingface_tokenizer&lt;/span&gt;(tokenizer: Tokenizer, max_length: &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1024&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; PreTrainedTokenizerFast:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Create Hugging Face compatible tokenizer&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; PreTrainedTokenizerFast
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add post-processor for sequence formatting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post_processor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; processors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;TemplateProcessing(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        single&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt; $A &amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            (&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create Hugging Face tokenizer wrapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    hf_tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PreTrainedTokenizerFast(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer_object&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        bos_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|startoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        eos_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pad_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|pad|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unk_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mask_token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|mask|&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model_max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;max_length
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; hf_tokenizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Hugging Face Tokenizer Integration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Without this integration, our custom tokenizer would be incompatible with standard language model training. The post-processor ensures proper sequence formatting, while the Hugging Face wrapper enables seamless integration with existing training infrastructure and model architectures. This makes our tokenizer compatible with standard training frameworks, allowing for easy sharing and deployment.&lt;/p&gt;
&lt;h3 id=&#34;36-testing-and-validation&#34;&gt;3.6 Testing and Validation&lt;/h3&gt;
&lt;p&gt;We need to ensure the tokenizer works correctly with historical text before using it for model training. This requires testing on diverse historical samples and validating both encoding and decoding accuracy. A simple way to do this is to encode a set of historical text samples, decode them back, and check if the original text is perfectly reconstructed. We also want to verify that special tokens are used correctly in the tokenized output.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;test_historical_tokenizer&lt;/span&gt;(tokenizer: Tokenizer) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;dict&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;Test the trained tokenizer on historical text samples&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    test_texts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1834, the streets of London were filled with the sounds of horse-drawn carriages.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The gentleman from the country said, &amp;#39;I have never seen such a sight in all my days.&amp;#39;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The Thames flowed dark and mysterious through the heart of the city.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;It was the best of times, it was the worst of times.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    results &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perfect_reconstruction&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_token_usage&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;failed_tests&amp;#39;&lt;/span&gt;: []}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(test_texts):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encode and decode text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        encoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        decoded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(encoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check reconstruction accuracy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; decoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;perfect_reconstruction&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;failed_tests&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append({&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;index&amp;#39;&lt;/span&gt;: i, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;original&amp;#39;&lt;/span&gt;: text, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;decoded&amp;#39;&lt;/span&gt;: decoded})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check special token usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        special_tokens &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [token &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; encoded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;tokens &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;startswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;lt;|&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; token&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;|&amp;gt;&amp;#39;&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; special_tokens:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            results[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;special_token_usage&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; results&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Test Results:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Perfect Reconstruction&lt;/strong&gt;: 99%+ accuracy on test cases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Special Token Usage&lt;/strong&gt;: 80%+ of test cases use special tokens&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average Compression Ratio&lt;/strong&gt;: ~0.3 tokens per word (highly efficient)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;: 99%+ for historical text samples&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is essential to conduct comprehensive testing to ensure the tokenizer operates reliably. In our case, the test cases cover different historical periods, writing styles, and linguistic patterns, giving us confidence that the tokenizer can handle the full range of historical text in our corpus. For a real-world LLM, this is, of course, more complex and would need to cover a broader set of areas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tokenizer Performance Validation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not surprisingly, our custom tokenizer significantly outperforms standard approaches on historical text, as demonstrated by comprehensive metrics that compare it to GPT-2&amp;rsquo;s tokenizer, as shown in the table below. These metrics indicate that our custom tokenizer significantly outperforms standard approaches for historical text. The improved compression ratio and reconstruction accuracy ensure that the model learns from authentic historical language rather than tokenization artifacts, which is crucial for generating coherent and historically accurate text.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Metric&lt;/th&gt;
          &lt;th&gt;Standard GPT-2&lt;/th&gt;
          &lt;th&gt;Our Custom Tokenizer&lt;/th&gt;
          &lt;th&gt;Improvement&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Vocabulary Size&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;50,257 tokens&lt;/td&gt;
          &lt;td&gt;30,000 tokens&lt;/td&gt;
          &lt;td&gt;40% smaller&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Special Tokens&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;4 tokens&lt;/td&gt;
          &lt;td&gt;150+ tokens&lt;/td&gt;
          &lt;td&gt;37x more&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Compression Ratio&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;~0.4 tokens/word&lt;/td&gt;
          &lt;td&gt;~0.3 tokens/word&lt;/td&gt;
          &lt;td&gt;25% better&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Reconstruction Accuracy&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;95%&lt;/td&gt;
          &lt;td&gt;99%+&lt;/td&gt;
          &lt;td&gt;4% better&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Historical Language Support&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Poor&lt;/td&gt;
          &lt;td&gt;Good&lt;/td&gt;
          &lt;td&gt;N/A&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These metrics validate that our 30K token vocabulary provides optimal coverage for historical text while remaining manageable for small language models. The 150+ special tokens capture linguistic patterns of 1500-1850 English, and the 25% better compression ratio means historical text is represented more efficiently, allowing the model to process longer sequences. The 99%+ reconstruction accuracy ensures no information is lost during tokenization, while excellent performance on archaic vocabulary, period-specific terminology, and London geography demonstrates the tokenizer&amp;rsquo;s effectiveness for historical language modeling.&lt;/p&gt;
&lt;h3 id=&#34;38-implementation-and-usage&#34;&gt;3.8 Implementation and Usage&lt;/h3&gt;
&lt;p&gt;The complete tokenizer implementation, including training scripts, testing utilities, and validation tools, is available in the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		helloLondon GitHub repository
	&lt;/span&gt;
&lt;/a&gt;. The repository provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Training Code&lt;/strong&gt;: Complete BPE tokenizer training with configurable vocabulary sizes and special token definitions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing Utilities&lt;/strong&gt;: Comprehensive validation tools for testing tokenizer performance on historical text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration Examples&lt;/strong&gt;: Ready-to-use code for incorporating the tokenizer into your own projects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Detailed usage guides and API references&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This implementation demonstrates how to build production-ready tokenizers for specialized domains, with particular focus on historical language processing and integration with modern ML frameworks.&lt;/p&gt;
&lt;h2 id=&#34;4-current-limitations&#34;&gt;4. Current Limitations&lt;/h2&gt;
&lt;p&gt;This project is designed as a learning exercise for those new to AI and LLM development. While we&amp;rsquo;ve built a functional system that demonstrates core concepts, this is not production-ready code and has several limitations that would need to be addressed for real-world deployment:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data Scale &amp;amp; Quality:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Corpus size: Our 500M character corpus is tiny compared to production LLMs, which typically use 100x-1000x more data (50B-500B+ characters). This limits the model&amp;rsquo;s ability to learn diverse patterns and reduces the quality of generated output.&lt;/li&gt;
&lt;li&gt;Source diversity: With only 218 sources, we lack comprehensive historical coverage across the 1500-1850 span, potentially missing important linguistic evolution patterns and regional variations.&lt;/li&gt;
&lt;li&gt;Geographic bias: Heavy focus on London may not accurately represent broader historical English patterns from other regions, limiting the model&amp;rsquo;s generalizability.&lt;/li&gt;
&lt;li&gt;Bias detection: We lack systematic approaches to identify or mitigate historical biases in the data, which could lead to the model perpetuating outdated or problematic language patterns.&lt;/li&gt;
&lt;li&gt;Quality assessment: Our cleaning pipeline, while effective for common issues, overlooks many edge cases and artifacts that would require more sophisticated ML-based quality assessment in production.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tokenizer &amp;amp; Model Architecture:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vocabulary size: Our 30K token vocabulary is small compared to modern models (which often use 50K-100K+ tokens), limiting the model&amp;rsquo;s ability to represent diverse vocabulary efficiently.&lt;/li&gt;
&lt;li&gt;Special tokens: The 150+ special tokens are manually curated rather than learned from data, which may miss important patterns that data-driven approaches would discover.&lt;/li&gt;
&lt;li&gt;Context length: The 1024 token context window is very short compared to modern models (which often use 4K-32K+ tokens), limiting the model&amp;rsquo;s ability to maintain coherence in longer texts.&lt;/li&gt;
&lt;li&gt;Language support: No support for other languages or historical variants beyond English, significantly limiting the model&amp;rsquo;s applicability.&lt;/li&gt;
&lt;li&gt;Tokenization approach: While our BPE approach is clean and avoids WordPiece artifacts, it may not be optimal for all historical text patterns and could benefit from more sophisticated techniques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Technical Infrastructure:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Error handling: Basic error handling with limited logging and monitoring makes it difficult to debug issues and track system health in production.&lt;/li&gt;
&lt;li&gt;Testing: Minimal test coverage that excludes edge cases means many potential failure modes remain undetected until they occur in production.&lt;/li&gt;
&lt;li&gt;Performance: No optimization for speed, memory, or distributed processing, making the system unsuitable for production-scale deployment.&lt;/li&gt;
&lt;li&gt;Data management: Lacks data versioning and reproducibility guarantees, making it difficult to track changes and reproduce results across different environments.&lt;/li&gt;
&lt;li&gt;Security: No security considerations for data handling and model deployment, creating potential vulnerabilities for sensitive historical data.&lt;/li&gt;
&lt;li&gt;Compliance: Missing compliance considerations for GDPR, data privacy, and regulatory requirements, which are essential for production deployment.&lt;/li&gt;
&lt;li&gt;Monitoring: No production monitoring, alerting, or observability features, making it impossible to detect and respond to issues in real-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These limitations are intentional trade-offs made to keep the project manageable and focused on core learning objectives, but they represent significant gaps for production deployment.&lt;/p&gt;
&lt;h3 id=&#34;43-what-youd-need-for-production&#34;&gt;4.3 What You&amp;rsquo;d Need for Production&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Data Engineering and Legal Framework&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Production systems require 100x-1000x more data from diverse sources, with ML-based quality assessment, bias detection, and filtering that goes far beyond our simple heuristics. You&amp;rsquo;d need robust ETL pipelines with proper error handling and monitoring, as well as a comprehensive legal framework for copyright clearance, data licensing, and compliance management, which we haven&amp;rsquo;t addressed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model Architecture and Training&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Meaningful historical language understanding would require models with over 1 billion parameters, utilizing sophisticated training techniques, regularization, and optimization. You&amp;rsquo;d need a comprehensive evaluation on diverse historical text tasks and domain-specific fine-tuning capabilities that our current system doesn&amp;rsquo;t support.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure and Operations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Production deployment requires a multi-GPU, multi-node distributed training infrastructure, production-grade model serving with load balancing and scaling, comprehensive monitoring and alerting systems, and end-to-end security for both data and model protection—none of which our learning-focused system currently provides.&lt;/p&gt;
&lt;p&gt;This progression from data → tokenizer → training → deployment provides a complete methodology for building specialized historical language models.&lt;/p&gt;
&lt;h2 id=&#34;5-resources-and-further-reading&#34;&gt;5. Resources and Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete source code for data collection and tokenizer training&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Building LLMs from Scratch - Part 1
	&lt;/span&gt;
&lt;/a&gt; - Quick start and overview&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides in the &lt;code&gt;08_documentation/&lt;/code&gt; folder covering every aspect of the project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;6-summary&#34;&gt;6. Summary&lt;/h2&gt;
&lt;p&gt;This post represents Part 2 of our learning journey into the fundamentals of LLM development. While we&amp;rsquo;ve built a functional data collection and tokenization system demonstrating core concepts, the real value lies in understanding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data flow&lt;/strong&gt; from raw sources to training-ready corpora&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenization impact&lt;/strong&gt; on model performance across different approaches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenges&lt;/strong&gt; in processing historical and domain-specific text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trade-offs&lt;/strong&gt; between quality, scale, and complexity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debugging and improvement&lt;/strong&gt; strategies for encountered problems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The limitations we&amp;rsquo;ve identified are great learning opportunities. Every production LLM started as a learning project, and every limitation teaches you something new about how these systems work. This foundation prepares us for the next phase of our journey.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready for Part 3?&lt;/strong&gt; Part 3 will cover the custom GPT architecture, GPU optimization strategies, and training infrastructure that transforms our clean data and custom tokenizer into working language models—while maintaining the same educational focus on understanding the fundamentals.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧱 Series Posts&lt;/strong&gt;: &lt;a
	
		href = &#34;/post/2025/09/building-llm-from-scratch-part1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1 – Using the Published Historical Models
	&lt;/span&gt;
&lt;/a&gt; | Part 2 (this post) | &lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3 – Training Architecture &amp;amp; GPU Optimization
	&lt;/span&gt;
&lt;/a&gt; | &lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4 – Evaluation &amp;amp; Deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>🏛️How to build a Large Language Model from Scratch - Part 1</title>
      <link>/post/2025/09/building-llm-from-scratch-part1/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/09/building-llm-from-scratch-part1/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this post, I show how to build a working LLM from scratch and show a complete end-to-end pipeline from data gathering to training to deployment of a language model. For this project I concentrate on Old English and only related to London, using historical London texts (1500-1850). To show the flexibility, I built &lt;strong&gt;two language models&lt;/strong&gt; which are identical in architecture and the only differs is their size and parameters (117M vs 354M).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Educational Purpose&lt;/strong&gt;: This is a learning project designed to teach LLM development concepts. For production-scale LLMs, you&amp;rsquo;ll need much larger datasets, more sophisticated infrastructure, and additional considerations not covered here.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This guide shows you how to monitor training progression, perform rapid evaluations, test models from both PyTorch checkpoints and published Hugging Face repositories, and ultimately publish your own - supported by complete code, live model artifacts, and educational inference tooling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4-Part Series&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Part 1 (this): Quick start, inference, and overview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2: Data collection and custom tokenizers
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3: Model architecture and GPU training
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4: Evaluation and deployment
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-overview&#34;&gt;1. Overview&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Train AI models on 1500-1850 London texts. Complete 4-part series covering data collection, training, and deployment. Part 1: Quick start and overview.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 Want to understand the core LLM concepts?&lt;/strong&gt; This series focuses on implementation and hands-on building. For a deeper understanding of foundational concepts like tokenizers, prompt engineering, RAG, responsible AI, fine-tuning, and more, check out my book &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;Generative AI in Action&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You can learn more about the book → &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/10/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		by clicking here
	&lt;/span&gt;
&lt;/a&gt;📘.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;11-what-was-built&#34;&gt;1.1 What was built?&lt;/h3&gt;
&lt;p&gt;I found many folks don&amp;rsquo;t understand what it entails to build an LLM, and where we do have guides, they only share piecemeal elements and nothing that is comprehensive for someone who is new to this. There are more detailed guides on fine-tuning existing models, but not much on the complete development pipeline. This series outlines that by walking through the process of creating specialized language models trained exclusively on historical London texts from 1500 to 1850.&lt;/p&gt;
&lt;p&gt;I am mostly doing this for my own learning, and also sharing what I can. Many work-related details, for obvious reasons, I cannot share and discuss, but some small pet projects like this embody the same sentiment.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;helloLondon Historical Language Models&lt;/strong&gt; represent a complete end-to-end implementation, from data collection through deployment. Rather than fine-tuning existing models, I chose to train from the ground up to eliminate modern biases and create models that genuinely understand historical language patterns, cultural contexts, and period-specific knowledge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two Model Variants&lt;/strong&gt;
I built two identical models with the same architecture, tokenizer, and training process. The only difference is the number of parameters: an SLM (117M parameters) optimized for learning and resource-constrained environments, and a Regular model (354M parameters) designed for higher-quality generation.&lt;/p&gt;
&lt;p&gt;Both use identical code with different configuration files, allowing you to understand the impact of model size on performance and choose the right variant for your needs.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Parameters&lt;/th&gt;
          &lt;th&gt;Iterations&lt;/th&gt;
          &lt;th&gt;Training Time*&lt;/th&gt;
          &lt;th&gt;Use Case&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SLM&lt;/strong&gt; (Small)&lt;/td&gt;
          &lt;td&gt;117M&lt;/td&gt;
          &lt;td&gt;60,000&lt;/td&gt;
          &lt;td&gt;~8-12 hours&lt;/td&gt;
          &lt;td&gt;Fast inference, resource-constrained&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Regular&lt;/strong&gt; (Full)&lt;/td&gt;
          &lt;td&gt;354M&lt;/td&gt;
          &lt;td&gt;60,000&lt;/td&gt;
          &lt;td&gt;~28-32 hours&lt;/td&gt;
          &lt;td&gt;High-quality generation&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Technically speaking, both these models can be called classified as SLMs given they are 117M and 354M parameters; however, for the sake of this project, I call the smaller of the two the SLM and the other regular.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;12-core-pipelines&#34;&gt;1.2 Core Pipelines&lt;/h3&gt;
&lt;p&gt;The complete development pipeline encompasses multiple critical stages that transform raw historical texts into working language models. The process starts with &lt;strong&gt;data collection&lt;/strong&gt;, where we systematically gather and filter over 218 historical London sources spanning 1500–1850. This process ensures we capture authentic period language while minimizing modern biases that could contaminate our models.&lt;/p&gt;
&lt;p&gt;Next, we develop a &lt;strong&gt;custom tokenization system&lt;/strong&gt; specifically designed for historical English. This involves training a domain-specific tokenizer with a 30,000-token vocabulary plus 150+ special tokens that capture period language patterns, archaic spellings, and historical terminology that modern tokenizers often miss.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;model architecture&lt;/strong&gt; phase implements GPT-style causal language models entirely from scratch, creating two variants with 117M and 354M parameters, respectively. Both models share identical architecture and training processes, allowing for direct comparison of performance versus computational requirements.&lt;/p&gt;
&lt;p&gt;Our &lt;strong&gt;training infrastructure&lt;/strong&gt; leverages modern multi-GPU training with Distributed Data Parallel (DDP), comprehensive checkpointing for restart resilience, and real-time monitoring through Weights &amp;amp; Biases. This ensures reliable training even across extended periods and hardware failures.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evaluation&lt;/strong&gt; goes beyond standard metrics to include historical accuracy probes, perplexity tracking, qualitative generation review, and early failure detection. We specifically test how well our models understand historical context, period-appropriate language, and London geography.&lt;/p&gt;
&lt;p&gt;Finally, &lt;strong&gt;deployment&lt;/strong&gt; includes publishing models to Hugging Face alongside unified local and cloud inference scripts, making the models immediately accessible to researchers and developers worldwide.&lt;/p&gt;
&lt;h3 id=&#34;13-hands-on-experience&#34;&gt;1.3 Hands-On Experience&lt;/h3&gt;
&lt;p&gt;Every aspect of this project is designed for practical implementation and learning. The &lt;strong&gt;working code&lt;/strong&gt; covers every stage from data collection through tokenizer training, model training, evaluation, and publishing - all fully implemented and documented with clear instructions and examples.&lt;/p&gt;
&lt;p&gt;I already have both the models published on Hugging Face; which allows for &lt;strong&gt;Live models&lt;/strong&gt; are immediately available for use, allowing you to test published checkpoints instantly or retrain from scratch with a single command. This dual approach lets you either jump straight into experimentation or understand the complete development process.&lt;/p&gt;
&lt;p&gt;The project works with &lt;strong&gt;real data&lt;/strong&gt; - over 500 million characters of authentic historical English from 1500–1850, carefully filtered to minimize modern bias while preserving the rich linguistic patterns of the period. This is using genuine historical texts that provide authentic training material.&lt;/p&gt;
&lt;p&gt;Everything is &lt;strong&gt;well-structured&lt;/strong&gt; with clear documentation, error handling, reproducible configurations, and automated publishing workflows. The codebase follows good development practices, making it suitable for learning LLM development concepts.&lt;/p&gt;
&lt;p&gt;This series is structured to take you through the complete LLM development pipeline:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Part&lt;/th&gt;
          &lt;th&gt;Focus&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 1&lt;/strong&gt; (this post)&lt;/td&gt;
          &lt;td&gt;Quick start and end-to-end overview&lt;/td&gt;
          &lt;td&gt;Use published models, understand the complete pipeline, and get hands-on experience with working code and live models. The intent is that if you want to build this, you can follow the instructions and get a model in the end. If you want to understand more of the inner workings and details, then those will be covered in the subsequent blog posts.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 2&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Data collection and custom tokenization&lt;/td&gt;
          &lt;td&gt;Deep dive into gathering 218+ historical sources, cleaning pipelines, and building specialized tokenizers for historical language patterns.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Part 3&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Model architecture and training infrastructure&lt;/td&gt;
          &lt;td&gt;Technical implementation of custom GPT architectures, multi-GPU training, checkpointing, and performance optimization.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Evaluation and deployment&lt;/td&gt;
          &lt;td&gt;Comprehensive testing frameworks, historical accuracy assessment, and deployment to Hugging Face.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For this first part, you have two paths to choose from based on your goals and available time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Quick Start with Published Models&lt;/strong&gt; - Jump straight into using the pre-trained models on Hugging Face for immediate testing and exploration. Perfect if you want to see results quickly and aren&amp;rsquo;t concerned with the technical implementation details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Build from Scratch&lt;/strong&gt; - Dive deep into the complete codebase and build your own historical language model from the ground up. Ideal if you want to understand every aspect of the pipeline and learn how to create specialized LLMs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us start with option 1 - use the models.&lt;/p&gt;
&lt;h2 id=&#34;2-use-the-models---try-it-now-using-hugging-face&#34;&gt;2. Use the models - Try it now using Hugging Face&lt;/h2&gt;
&lt;p&gt;If you just want to get going and use the models and kick tires, the models are live on Hugging Face and ready to use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLM Model (117M parameters)&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		💡 https://huggingface.co/bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular Model (354M parameters)&lt;/strong&gt;: &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		💡 https://huggingface.co/bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, you can also explore the complete codebase and build your own historical language model from scratch. The entire pipeline is documented with working code, training scripts, and deployment guides, and is available on GitHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Github Repo 💻 &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		⚙️ github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to quickly test the published models on Hugging Face (HF), you can do so in two ways: quick automated tests or interactive mode. This is the easiest way to get started and show that the models are fully working. You can either clone the repo and run the scripts or use the Python code snippet below.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t have a development environment set up, you can follow the instructions in the GitHub repo to set up a conda environment with all dependencies. And just for the local testing, you can use CPU only, but for interactive mode, a GPU is recommended. Finally, you will need at a minimum the following Python packages shown in &lt;a href=&#34;#listing1&#34; class=&#34;listing-ref&#34;&gt;Listing 1&lt;/a&gt;. Note, these are also called out on the Hugging Face model page.&lt;/p&gt;
&lt;figure id=&#34;listing1&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m pip install -U pip setuptools wheel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python -m pip install &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers[torch]&amp;#34;&lt;/span&gt; accelerate safetensors&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 1: Install Required Dependencies&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; It is recommended to use a virtual environment or conda environment to avoid dependency conflicts. See the GitHub repo for complete setup instructions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you don&amp;rsquo;t have the code repo yet, you can run the commands in &lt;a href=&#34;#listing2&#34; class=&#34;listing-ref&#34;&gt;Listing 2&lt;/a&gt; directly and run inference from Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python Code:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing2&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoTokenizer, AutoModelForCausalLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the published SLM model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bahree/london-historical-slm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Generate historical text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year of our Lord 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inputs[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;input_ids&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    max_new_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    do_sample&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.9&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repetition_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1.2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(outputs[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;], skip_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 2: Load and Test Published Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;21-local-testing-with-the-complete-codebase&#34;&gt;2.1 Local Testing with the Complete Codebase&lt;/h3&gt;
&lt;p&gt;Now that you&amp;rsquo;ve seen the models work directly from Hugging Face, let&amp;rsquo;s explore the complete development experience by working with the actual codebase. This section walks you through testing the models locally using the same infrastructure that was used to train them.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;helloLondon&lt;/code&gt; repository contains everything needed to reproduce the entire pipeline - from data collection through model deployment. By running these tests locally, you&amp;rsquo;ll get hands-on experience with the inference scripts and understand how the models integrate with the broader development workflow.&lt;/p&gt;
&lt;p&gt;The following examples assume you&amp;rsquo;ve cloned the repository and are running from the root directory. All scripts are designed to work out-of-the-box with the published models, giving you immediate access to the same testing infrastructure used during development. You can test the models using &lt;a href=&#34;#listing3&#34; class=&#34;listing-ref&#34;&gt;Listing 3&lt;/a&gt; or &lt;a href=&#34;#listing4&#34; class=&#34;listing-ref&#34;&gt;Listing 4&lt;/a&gt;.&lt;/p&gt;
&lt;figure id=&#34;listing3&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test SLM model (117M parameters)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test Regular model (354M parameters)  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type regular&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 3: Test SLM Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There is also an interactive mode where you can type in your own prompts and see the model generate text.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interactive Testing:&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing4&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM model - Interactive mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model - Interactive mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type regular --interactive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Single prompt testing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type regular --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 4: Interactive Mode Testing&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If everything works, you should see output similar to the following for the SLM model:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example Output ( Hugging Face SLM Example):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;🧪&lt;/span&gt; Testing SLM Model: bahree&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;historical&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;============================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;📂&lt;/span&gt; Loading model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;✅&lt;/span&gt; Model loaded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;8.91&lt;/span&gt; seconds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;📊&lt;/span&gt; Model Info:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Type: SLM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Description: Small Language Model (&lt;span style=&#34;color:#f5a97f&#34;&gt;117&lt;/span&gt;M parameters)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Device: cuda
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Vocabulary size: &lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Max length: &lt;span style=&#34;color:#f5a97f&#34;&gt;512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;---&lt;/span&gt; Test &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Prompt: In the year &lt;span style=&#34;color:#f5a97f&#34;&gt;1834&lt;/span&gt;, I walked through the streets of London &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;and&lt;/span&gt; witnessed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generated: a scene &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; which some of those who did &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; incline to come &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; contact with him took part &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; his discourse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt; It was on this occasion that I perceived that he had been engaged &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; some new business connected with the house, but &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; some days it had &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; taken place, nor did he appear so desirous of pursuing any further display of interest &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Time: &lt;span style=&#34;color:#f5a97f&#34;&gt;5.75&lt;/span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice how the model captures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Period-appropriate language&lt;/strong&gt; (&amp;ldquo;thank &amp;rsquo;ee kindly,&amp;rdquo; &amp;ldquo;bade me go,&amp;rdquo; &amp;ldquo;spectacles&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical dialogue patterns&lt;/strong&gt; (formal speech, period-appropriate contractions)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical context&lt;/strong&gt; (West Indies, poor rates, needle work, pocket-book)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentic historical narrative&lt;/strong&gt; (detailed scene setting, period-appropriate social interactions)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have tried using the model, let&amp;rsquo;s explore option 2 and see how we can build it. Once you&amp;rsquo;ve built your own model, you&amp;rsquo;ll be able to test it using the checkpoints saved during training - see section 7.4 for detailed checkpoint testing instructions.&lt;/p&gt;
&lt;h2 id=&#34;3-build-the-models---from-scratch&#34;&gt;3. Build the models - From Scratch&lt;/h2&gt;
&lt;p&gt;Building a language model from scratch is both an art and a science - requiring careful orchestration of data, architecture, and training to create something that can genuinely understand and generate historical text. Unlike fine-tuning existing models, training from scratch gives us complete control over every aspect of the model&amp;rsquo;s knowledge and behavior.&lt;/p&gt;
&lt;p&gt;The journey from raw historical documents to a working language model involves six critical phases, each building upon the previous one. The flowchart below illustrates this complete end-to-end pipeline, showing how we transform 218+ historical sources into two specialized models that can generate authentic medieval London text.&lt;/p&gt;
&lt;figure class=&#34;align-center &#34; id=&#34;fig1&#34;&gt;
    &lt;pre class=&#34;mermaid&#34;&gt;graph TD
    A[📚 Historical Data Collection&amp;lt;br/&amp;gt;218+ sources, 1500-1850] --&amp;gt; B[🧹 Data Cleaning &amp;amp; Processing&amp;lt;br/&amp;gt;Text normalization, filtering]
    B --&amp;gt; C[🔤 Custom Tokenizer Training&amp;lt;br/&amp;gt;30k vocab + 150+ special tokens]
    C --&amp;gt; D[🏋️ Model Training&amp;lt;br/&amp;gt;Two Identical Models&amp;lt;br/&amp;gt;SLM: 117M / Regular: 354M]
    D --&amp;gt; E[📊 Evaluation &amp;amp; Testing&amp;lt;br/&amp;gt;Historical accuracy, ROUGE, MMLU]
    E --&amp;gt; F[🚀 Deployment&amp;lt;br/&amp;gt;Hugging Face + Local Inference]
    
    G[📖 Building a Custom LLM] --&amp;gt; A
    
    F --&amp;gt; L[🎯 Use Cases&amp;lt;br/&amp;gt;Historical text generation&amp;lt;br/&amp;gt;Educational projects&amp;lt;br/&amp;gt;Research applications]
    
    style A fill:#e1f5fe
    style D fill:#f3e5f5
    style F fill:#e8f5e8
    style G fill:#fff3e0&lt;/pre&gt;
    &lt;figcaption&gt;Figure 1: Complete LLM Development Pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have a bird&amp;rsquo;s eye view of the complete pipeline, let us get into the details and build the model from scratch. I am going to walk you through the complete process step-by-step.&lt;/p&gt;
&lt;p&gt;I am also going to assume you have a basic understanding of Python, PyTorch, and command-line operations and have a more recent dev setup, including a relatively modern GPU (NVIDIA RTX 3060 or better recommended). For the sake of simplicity, I will show commands for Linux/macOS, but Windows users can easily adapt them.&lt;/p&gt;
&lt;p&gt;Again, as a reminder, the ⚙️ &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub repo
	&lt;/span&gt;
&lt;/a&gt; has all the code and instructions you need to get started. You can clone the repo and follow along.&lt;/p&gt;
&lt;h2 id=&#34;4-environment-and-configuration-setup&#34;&gt;4. Environment and Configuration Setup&lt;/h2&gt;
&lt;p&gt;The foundation of any successful machine learning project lies in proper environment setup and configuration. This step involves creating a virtual environment, installing dependencies, and configuring the project structure. Understanding the key configuration files, directory organization, and overall project architecture is crucial - these elements form the backbone of the entire training process. Taking time to get this right upfront prevents countless headaches and debugging sessions later, ensuring smooth execution through all subsequent phases.&lt;/p&gt;
&lt;h3 id=&#34;41-key-configuration-files&#34;&gt;4.1 Key Configuration Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/strong&gt;: Central configuration system (paths, training settings, tokenizer config)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;01_environment/setup_environment.py&lt;/code&gt;&lt;/strong&gt;: Environment setup script (reads from config.py)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requirements.txt&lt;/code&gt;&lt;/strong&gt;: Python dependencies (auto-generated by setup script)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;42-important-directories-created-by-setup&#34;&gt;4.2 Important Directories (Created by Setup)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;helloLondon/&lt;/code&gt;&lt;/strong&gt;: Virtual environment directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;data/london_historical/&lt;/code&gt;&lt;/strong&gt;: Historical text data storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;09_models/checkpoints/&lt;/code&gt;&lt;/strong&gt;: Model checkpoints during training&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;09_models/tokenizers/&lt;/code&gt;&lt;/strong&gt;: Custom tokenizer storage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we have that out of the way, let us run the setup commands as shown in &lt;a href=&#34;#listing5&#34; class=&#34;listing-ref&#34;&gt;Listing 5&lt;/a&gt;. This will clone the repo, set up the environment, and install all dependencies. For this to work you will already have git, python, and &lt;code&gt;python3-venv&lt;/code&gt; installed. If you don&amp;rsquo;t have these, please install them first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS: See the &lt;a
	
		href = &#34;https://github.com/bahree/helloLondon/blob/main/README.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Training QuickStart guide
	&lt;/span&gt;
&lt;/a&gt; in the GitHub repo for more details.&lt;/p&gt;&lt;/blockquote&gt;
&lt;figure id=&#34;listing5&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clone and setup environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/bahree/helloLondon/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; helloLondon
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 01_environment/setup_environment.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;source&lt;/span&gt; activate_env.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 5: Clone and Setup Repository&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As you run the setup script, you should see output similar to the images shown below; the script will create a virtual environment, install dependencies, and set up necessary directories. And then you can activate the environment using the &lt;code&gt;source activate_env.sh&lt;/code&gt; command.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env11.png&#34; alt=&#34;Environment setup - 1 of 3&#34; title=&#34;Environment setup - 1/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 2:&lt;/strong&gt; Environment setup process - Step 1 of 3 showing virtual environment creation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env12.png&#34; alt=&#34;Environment setup - 2 of 3&#34; title=&#34;Environment setup - 2/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 3:&lt;/strong&gt; Environment setup process - Step 2 of 3 showing dependency installation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/env13.png&#34; alt=&#34;Environment setup - 3 of 3&#34; title=&#34;Environment setup - 3/3&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 4:&lt;/strong&gt; Environment setup process - Step 3 of 3 showing final configuration&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that the configuration and environment are set up, we can validate them by running the following command. This will check if everything is working and you have the necessary dependencies installed.&lt;/p&gt;
&lt;p&gt;When one activates the environment using &lt;strong&gt;&lt;code&gt;source activate_env.sh&lt;/code&gt;&lt;/strong&gt;, you will see it in the console as shown below.&lt;/p&gt;
&lt;p&gt;The default environment name is called &lt;strong&gt;&lt;code&gt;helloLondon&lt;/code&gt;&lt;/strong&gt;. If you want to change the environment name from &lt;code&gt;helloLondon&lt;/code&gt; to something else, you can modify the &lt;code&gt;venv_name&lt;/code&gt; field in &lt;code&gt;environment_config.json&lt;/code&gt; before running the setup script. This will create a virtual environment with your preferred name.&lt;/p&gt;
&lt;figure id=&#34;listing6&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 -c &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;from config import config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;🔧 Configuration Overview&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;=&amp;#39; * 50)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Project Root: {config.project_root}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Data Directory: {config.london_historical_data}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Tokenizer Directory: {config.london_tokenizer_dir}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Checkpoints Directory: {config.checkpoints_dir}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Virtual Environment: {config.project_root}/helloLondon&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Vocabulary Size: {config.tokenizer_config[\&amp;#34;vocab_size\&amp;#34;]:,} tokens&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Special Tokens: {len(config.tokenizer_config[\&amp;#34;special_tokens\&amp;#34;])} tokens&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;SLM Model: {config.slm_config[\&amp;#34;model_name\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Training Epochs: {config.slm_config[\&amp;#34;num_epochs\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Batch Size: {config.slm_config[\&amp;#34;batch_size\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(f&amp;#39;Max Length: {config.slm_config[\&amp;#34;max_length\&amp;#34;]}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;print(&amp;#39;\\n🎯 Configuration looks good!&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 6: Validate Configuration&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The following directory structure will be generated after executing the setup script. Please note that certain directories will remain empty until the data collection and training processes are initiated.&lt;/p&gt;
&lt;figure id=&#34;listing7&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;helloLondon&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london_historical&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Historical text data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; london_historical_corpus_comprehensive&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;txt  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Final training corpus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; downloads&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Raw downloaded data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; processed&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Cleaned and processed text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; metadata&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Data collection metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;09&lt;/span&gt;_models&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                 &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Regular model checkpoints (354M)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;44000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;47000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;51000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;59000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; checkpoints&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;slm&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;             &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# SLM model checkpoints (117M)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;52000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60000.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; checkpoint&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;60001.&lt;/span&gt;pt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; tokenizers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;london_historical_tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Custom tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json           &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Tokenizer configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; vocab&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Vocabulary mapping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;│&lt;/span&gt;       &lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📄&lt;/span&gt; merges&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;txt               &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# BPE merge rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;├──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; helloLondon&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Virtual environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;└──&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;📁&lt;/span&gt; logs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;                            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Training logs and WandB data&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 7: Project Directory Structure&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;: Before proceeding with the following steps, please verify the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt;: Minimum 20GB of free disk space and stable internet connectivity for data acquisition&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware&lt;/strong&gt;: GPU with 8GB+ VRAM for SLM training, 16GB+ VRAM for Regular model training. Cloud users should select appropriate instance types&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experiment Tracking&lt;/strong&gt; (Optional but highly recommended): &lt;a
	
		href = &#34;https://wandb.ai/site&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Weights &amp;amp; Biases
	&lt;/span&gt;
&lt;/a&gt; account with &lt;code&gt;WANDB_API_KEY&lt;/code&gt; environment variable configured for comprehensive training monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;: Required data processing libraries (nltk, beautifulsoup4, etc.) will be automatically installed via the setup script&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;5-data-collection&#34;&gt;5. Data Collection&lt;/h2&gt;
&lt;p&gt;The foundation of any language model lies in its training data. For our historical London models, we&amp;rsquo;ve built a comprehensive data collection system that sources authentic text from &lt;strong&gt;218+ historical sources spanning 1500-1850&lt;/strong&gt; - a remarkable 350-year window of London&amp;rsquo;s linguistic evolution. This isn&amp;rsquo;t just about downloading files; it&amp;rsquo;s about curating a high-quality corpus that captures the authentic voice of historical London.&lt;/p&gt;
&lt;p&gt;Our data collection pipeline automatically processes multiple formats (PDFs, HTML, XML, plain text) from diverse sources, including Project Gutenberg classics, Old Bailey trial records, London Lives manuscripts, and British History Online archives. The system includes sophisticated quality control measures: language detection to filter non-English content, OCR artifact correction, duplicate detection, and historical period validation to ensure every text genuinely represents the target era.&lt;/p&gt;
&lt;p&gt;The result? A curated corpus of &lt;strong&gt;500M+ characters&lt;/strong&gt; of authentic historical English text, ready to train models that understand not just the words, but the cultural context, social dynamics, and linguistic patterns of 18th and 19th-century London. Of course, you can always add your own data sources if you have them, and the system is designed to be extensible.&lt;/p&gt;
&lt;p&gt;We can kick off the data collection process using &lt;a href=&#34;#listing8&#34; class=&#34;listing-ref&#34;&gt;Listing 8&lt;/a&gt;. This will be run from the project root directory.&lt;/p&gt;
&lt;figure id=&#34;listing8&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download historical data with advanced filtering&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 02_data_collection/historical_data_collector.py --max_sources &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# The system automatically filters:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Non-English content (Arabic, Chinese, etc.)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Poor OCR quality scans and gibberish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Advertisement-heavy commercial content  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Duplicate content and empty files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# - Special handling for Project Gutenberg classics&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 8: Download Historical Data&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This process may take some time, depending on your internet speed, the number of sources you choose to download and your system&amp;rsquo;s performance. For me, on a very fast internet connection and a powerful machine this took typically 2-4 hours for downloading, and processing the full dataset. The script will save the cleaned and processed data in the &lt;code&gt;data/london_historical/&lt;/code&gt; directory, creating a comprehensive historical corpus.&lt;/p&gt;
&lt;p&gt;The data collection process creates a comprehensive historical corpus with the main training file &lt;strong&gt;&lt;code&gt;london_historical_corpus_comprehensive.txt&lt;/code&gt;&lt;/strong&gt; containing 270M+ characters (~258MB) of authentic historical text. The complete data directory spans approximately 1.2GB, including 521MB of raw downloaded sources, 263MB of processed and cleaned content, and 126MB of tokenized training sequences ready for model training. The image below shows the data collection in progress.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data3.png&#34; alt=&#34;Data Collection in Progress&#34; title=&#34;Data Collection in Progress&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 5:&lt;/strong&gt; Data collection process in progress showing real-time processing of historical sources&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The final corpus represents one of the largest collections of historical London text ever assembled for language model training, with authentic content spanning 350 years of linguistic evolution. The two images below show an example of one of my runs, one of them showing the final output of the data cleaning and outlining the statistics. And the second one shows the size of the data on disk.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data11.png&#34; alt=&#34;Data Collection Summary&#34; title=&#34;Data Collection Summary&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 6:&lt;/strong&gt; Data collection summary showing final statistics and corpus composition&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The total size at the end of the data. Note this does not include the Old Bailey and London Lives data.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/data12.png&#34; alt=&#34;Total Data Size&#34; title=&#34;Total Data Size&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; Total data size on disk showing comprehensive historical corpus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 7:&lt;/strong&gt; Total data size on disk showing the complete historical corpus storage requirements&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have our data and have cleaned it. Let us build a custom tokenizer.&lt;/p&gt;
&lt;h2 id=&#34;6-train-custom-tokenizer&#34;&gt;6. Train Custom Tokenizer&lt;/h2&gt;
&lt;p&gt;With our cleaned historical corpus ready, we now need to create a custom tokenizer specifically designed for historical English. Standard tokenizers like GPT-2 are optimized for modern text and fail catastrophically with historical language - treating archaic words like &amp;ldquo;quoth&amp;rdquo; and &amp;ldquo;hast&amp;rdquo; as multiple subword fragments, losing both meaning and efficiency.&lt;/p&gt;
&lt;p&gt;Our custom tokenizer uses Byte Pair Encoding (BPE) with a 30,000 vocabulary size and 150+ carefully designed special tokens that understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Historical Language&lt;/strong&gt;: Archaic pronouns (&lt;code&gt;&amp;lt;|thou|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|thee|&amp;gt;&lt;/code&gt;), verbs (&lt;code&gt;&amp;lt;|hast|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|doth|&amp;gt;&lt;/code&gt;), and expressions (&lt;code&gt;&amp;lt;|verily|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|forsooth|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;London Geography&lt;/strong&gt;: Landmarks (&lt;code&gt;&amp;lt;|thames|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|newgate|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|tower|&amp;gt;&lt;/code&gt;), streets (&lt;code&gt;&amp;lt;|cheapside|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|fleet|&amp;gt;&lt;/code&gt;), and districts (&lt;code&gt;&amp;lt;|southwark|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|westminster|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical Context&lt;/strong&gt;: Period markers (&lt;code&gt;&amp;lt;|tudor|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|stuart|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|georgian|&amp;gt;&lt;/code&gt;), social classes (&lt;code&gt;&amp;lt;|noble|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|commoner|&amp;gt;&lt;/code&gt;), and professions (&lt;code&gt;&amp;lt;|apothecary|&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;|coachman|&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This specialized vocabulary ensures that common historical terms remain as single tokens rather than being fragmented, dramatically improving both training efficiency and text generation quality. We can kick off the tokenizer using &lt;a href=&#34;#listing9&#34; class=&#34;listing-ref&#34;&gt;Listing 9&lt;/a&gt;. Again, this will be run from the project root directory.&lt;/p&gt;
&lt;figure id=&#34;listing9&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Train historical tokenizer (30k vocabulary)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 03_tokenizer/train_historical_tokenizer.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 9: Train Historical Tokenizer&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The training process analyzes our 270M+ character corpus to learn optimal token boundaries, creating a tokenizer that understands the linguistic patterns of 1500-1850 English. The result is a highly efficient tokenizer with a compression ratio of ~0.3 tokens per character and 99%+ reconstruction accuracy - essential for training models that can generate authentic historical text.&lt;/p&gt;
&lt;p&gt;Once the training is finished (and usually it is pretty quick - just a few minutes for our data size), we run a quick sanity test as the image below shows.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/tokenizer-8.png&#34; alt=&#34;Custom Tokenizer Training&#34; title=&#34;Custom Tokenizer Training&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; Custom tokenizer training progress showing vocabulary learning&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 8:&lt;/strong&gt; Custom tokenizer training process showing BPE algorithm learning optimal token boundaries&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note that in testing, we might see a warning that the reconstruction differs; this is only because of the alphabet case being different and is expected. You can ignore this. An example of this is shown below.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/tokenizer-7.png&#34; alt=&#34;Tokenizer reconstruction warning&#34; title=&#34;Tokenizer reconstruction warning&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; Tokenizer reconstruction warning during training process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 9:&lt;/strong&gt; Tokenizer reconstruction warning showing expected case normalization differences&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Why the &amp;ldquo;Reconstruction differs&amp;rdquo; warning is actually beneficial:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reconstruction differences you see are not errors - they&amp;rsquo;re the tokenizer working exactly as designed for optimal language model training. The tokenizer uses Byte Pair Encoding (BPE), which breaks complex words into smaller, reusable subword units (like &amp;ldquo;Bourgh&amp;rdquo; → &amp;ldquo;bour ##gh&amp;rdquo;), and normalizes text to lowercase to reduce vocabulary size. These &amp;ldquo;differences&amp;rdquo; are actually features that make the tokenizer more efficient and the resulting language model more capable of generating authentic historical text.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 For detailed technical explanation&lt;/strong&gt;: Part 2 of this series covers the complete tokenizer architecture, BPE implementation, special token design, and why these reconstruction differences are essential for optimal language model training.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now that we have our data and the tokenizer is ready, it is time to train the model.&lt;/p&gt;
&lt;h2 id=&#34;7-train-the-model&#34;&gt;7. Train the Model&lt;/h2&gt;
&lt;p&gt;With our cleaned historical corpus and custom tokenizer in place, we can now train our language models. The training system is designed to build two identical models with different parameter counts, allowing you to choose between speed (SLM) and quality (Regular model) based on your needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training Architecture:&lt;/strong&gt; Both models use a custom GPT architecture specifically optimized for historical text, featuring sophisticated attention mechanisms that understand the complex relationships in historical language. The system includes automatic GPU detection, multi-GPU support, and comprehensive monitoring to ensure optimal training performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training Process:&lt;/strong&gt; The training system implements modern optimization techniques, including dynamic learning rate scheduling, automatic checkpointing, and real-time experiment tracking via WandB. The entire process is automated with intelligent configuration that adapts to your hardware setup, whether you&amp;rsquo;re using a single GPU or multiple GPUs for distributed training.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance Optimization:&lt;/strong&gt; The system includes precision optimization (TF32, AMP) and memory management specifically tuned for historical text processing. Training typically takes 7-8 hours for the SLM and 28-32 hours for the Regular model on modern hardware, with comprehensive monitoring to track progress and identify any issues. Note, this time can vary significantly based on your hardware. The times mentioned here are based on dual NVIDIA A30s.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📖 For detailed technical implementation&lt;/strong&gt;: Part 3 of this series covers the complete model architecture, GPU configuration, training infrastructure, and performance optimization strategies in detail.&lt;br&gt;
&lt;strong&gt;🧪 Ready to test your checkpoints?&lt;/strong&gt; Once training completes, see section 7.4 for comprehensive instructions on testing your trained model checkpoints.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;71-slm-training&#34;&gt;7.1 SLM Training&lt;/h3&gt;
&lt;p&gt;To kick off the training, the code is quite simple, as shown in &lt;a href=&#34;#listing10&#34; class=&#34;listing-ref&#34;&gt;Listing 10&lt;/a&gt;. Again, this would be from the project root folder. In my case, I am using &lt;code&gt;torchrun --nproc_per_node=2&lt;/code&gt; because I have dual GPUs and I want to use both. If you only have a single GPU, you can just run the automatic GPU detection script. The &lt;code&gt;train_model_slm.py&lt;/code&gt; script specifically trains the SLM (Small Language Model) with 117M parameters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Train SLM (117M parameters) - Faster, Good for Testing&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing10&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean any existing tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf data/london_historical/tokenized_data/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatic GPU Detection (Recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; 04_training
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./launch_slm_training.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Manual Multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; 04_training/train_model_slm.py --data_dir data/london_historical&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 10: Train SLM Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note: The first line &lt;code&gt;rm -rf data/london_historical/tokenized_data/&lt;/code&gt; cleans any existing tokenized data to ensure a fresh start. This is important because the training system caches tokenized data for efficiency, and we want to ensure it uses the latest corpus and tokenizer settings rather than potentially outdated cached data. You want to do this only if you have more updated data from the previous steps.&lt;/p&gt;
&lt;p&gt;Once the training starts, you will see a similar output as the one shown below.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16.png&#34; alt=&#34;Starting model training&#34; title=&#34;Starting model training&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; Model training initialization showing configuration and setup&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 10:&lt;/strong&gt; Model training initialization showing tokenization and GPU setup process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note the Tokenizing corpus line - this will take some time, depending on your data size and hardware. The tokenized data will be saved in &lt;code&gt;data/london_historical/tokenized_data/&lt;/code&gt; for future runs, so subsequent training runs will be much faster. If you want to force re-tokenization, you can delete this directory and restart the training. And if you think this is hung, you can check the GPU usage using &lt;code&gt;nvtop&lt;/code&gt; in a separate terminal.&lt;/p&gt;
&lt;p&gt;And if you have configured WandB as recommended earlier, then you can log in to that dashboard and also monitor the training progress. This is quite handy when you are away from the machine and see how it is generally progressing.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train6.png&#34; alt=&#34;WanB Training progress&#34; title=&#34;WanB Training progress&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt; Weights &amp; Biases training progress monitoring dashboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 11:&lt;/strong&gt; Weights &amp; Biases training dashboard showing real-time loss curves and performance metrics&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;WandB also provides valuable insights into your model&amp;rsquo;s training performance through comprehensive visualizations. The dashboard shows the complete training journey, revealing how your model&amp;rsquo;s loss decreased over time, whether the training plateaued, and how efficiently your hardware was utilized. These visualizations help you understand not just the final results, but the entire learning process - identifying if the model continued improving throughout training or if it reached a performance plateau.&lt;/p&gt;
&lt;p&gt;While these metrics are incredibly useful for optimizing your training process, we&amp;rsquo;ll dive deeper into interpreting these results and fine-tuning your training strategy in Part 3 of this series.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SLM Results (117M parameters):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run history:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter   ▂▂▃▃▄▄▅▅▆▆▇▇██
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss  ███▇▇▇▇▇▇▇▇▇▇▇▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss  ███████▇▇▇█▇▇▇▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl  █▇▇▇▇▇▆▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms           █            █                
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter      ▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▄▄▅▅▅▅▅▅▅▆▆▆▆▇▇▇▇▇██
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss ▆▅▇▅▅▃▇▄▄█▅▄▅▄▃▇▄▄▅ ▃▃▂▄▅▂▅▂▄▅▃▃▄▅ ▄▃
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr ██████████▇▇▇▅▄▄▄▃▃▃▃▃▃▂▂▂▂▂▂           
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu ▃▄▇▇█▄▄▆▆▇▅▂▅▆▆▇▇▂▄▅▇▇▇▆▆▇▇▇▇▅███▅▇▆▇▇ ▇
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run summary:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss 2.74369
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss 3.44089
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl 31.21462
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms 10217.92054
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss 2.87667
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr 3e-05
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu 7.50594&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&amp;rsquo;s also helpful to monitor GPU usage during training. I recommend using &lt;code&gt;nvtop&lt;/code&gt; (a GPU monitoring tool similar to &lt;code&gt;htop&lt;/code&gt; but for NVIDIA GPUs) in a separate terminal to track memory usage, temperature, and utilization in real-time. The screenshot below shows the GPU monitoring during model training.&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/train16-4.png&#34; alt=&#34;GPU monitoring using nvtop&#34; title=&#34;GPU monitoring using nvtop&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; GPU monitoring using nvtop showing real-time resource utilization&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 12:&lt;/strong&gt; GPU monitoring during training showing memory usage, temperature, and utilization metrics&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;72-understanding-checkpoints&#34;&gt;7.2 Understanding Checkpoints&lt;/h3&gt;
&lt;p&gt;Throughout training, the system automatically saves checkpoints - snapshots of your model&amp;rsquo;s current state, including all learned parameters, optimizer state, and training progress. These checkpoints serve as safety nets, allowing you to resume training if interrupted, and provide multiple model versions to choose from. The final checkpoint (typically saved at the end of training) represents your fully trained model, ready for inference and deployment.&lt;/p&gt;
&lt;p&gt;Checkpoints are saved in the &lt;code&gt;09_models/checkpoints/&lt;/code&gt; directory, with separate subdirectories for each model type. SLM checkpoints are stored in &lt;code&gt;09_models/checkpoints/slm/&lt;/code&gt; (e.g., &lt;code&gt;checkpoint-4000.pt&lt;/code&gt;, &lt;code&gt;checkpoint-8000.pt&lt;/code&gt;), while regular model checkpoints are saved directly in &lt;code&gt;09_models/checkpoints/&lt;/code&gt; (e.g., &lt;code&gt;checkpoint-60001.pt&lt;/code&gt;, &lt;code&gt;checkpoint-120000.pt&lt;/code&gt;). The checkpoint filenames include the training step number, making it easy to identify the training progress and select the best-performing version for your needs.&lt;/p&gt;
&lt;p&gt;These checkpoints enable two powerful capabilities that significantly enhance your training workflow. You can test your model&amp;rsquo;s current performance at any point during training by running inference on intermediate checkpoints, allowing you to monitor progress without waiting for training to complete. Additionally, suppose training is interrupted due to power loss, system crash, or manual stop. In that case, you can resume from the last saved checkpoint exactly where you left off, saving both time and computational resources. This flexibility is particularly valuable for long training runs, enabling you to experiment with different model versions and recover from unexpected interruptions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧪 Ready to test your checkpoints?&lt;/strong&gt; See section 7.4 for detailed instructions on testing your trained model checkpoints.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;73-regular-model-training&#34;&gt;7.3 Regular Model Training&lt;/h3&gt;
&lt;p&gt;The Regular model training follows the same process as the SLM, using identical training infrastructure but with different configuration settings. The only differences are the training script (&lt;code&gt;train_model.py&lt;/code&gt; instead of &lt;code&gt;train_model_slm.py&lt;/code&gt;) and the model architecture parameters (354M parameters vs 117M).&lt;/p&gt;
&lt;figure id=&#34;listing11&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Clean any existing tokenized data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm -rf data/london_historical/tokenized_data/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Automatic GPU Detection (Recommended)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; 04_training
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./launch_training.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Manual Multi-GPU training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;torchrun --nproc_per_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; 04_training/train_model.py --data_dir data/london_historical&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 11: Train Regular Model&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Key Differences from SLM:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Training script&lt;/strong&gt;: &lt;code&gt;train_model.py&lt;/code&gt; (instead of &lt;code&gt;train_model_slm.py&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model size&lt;/strong&gt;: 354M parameters (vs 117M for SLM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training time&lt;/strong&gt;: 28-32 hours (vs 7-8 hours for SLM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;: Higher VRAM requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Better text quality, slower inference&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The training infrastructure, checkpointing, WandB integration, and all other features remain identical. The system automatically detects the model type and applies the appropriate configuration from &lt;code&gt;config.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regular Model Results (354M parameters):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run history:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter     ▂▂▂▂▂▃▃▃▃▃▃▄▄▄▄▅▅▅▅▅▅▅▆▆▆▆▆▇▇▇▇▇▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss  █████████▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▆▇▆▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss  ███████████████████████████████████▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl  ████▇▇█▇▇▇▇▇▇▇▇▇▆▇▇▇▇▇▇▇▇▆▇▇▆▆▆▆▆▆▆▆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms                  █                      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter      ▂▂▂▃▃▃▃▃▄▄▄▄▄▄▅▅▅▆▆▆▆▆▆▆▆▇▇▇▇▇▇▇███
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss ▇▆▆▇▇▅▅█▅▄▃▅▅▅▄▇▄▄▄▄▄▃▃▃▅▂▄▅▂▅▂▄▅▃▃▄▅ ▄▃
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr ▄██████▇▇▇▇▇▆▆▆▅▅▄▄▄▄▄▄▄▄▃▃▂▂▂          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu ▆▇█▅▄ ▄▆▆▆▇▃▃▂▂▆█▃▃▅▅▃█▅▄▆▇▇▇▇▄▅▃█▆▇█▄▃█
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: Run summary:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       eval/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb: eval/train_loss 2.70315
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:   eval/val_loss 3.61921
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:    eval/val_ppl 37.30823
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:     train/dt_ms 24681.64754
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/iter 60000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:      train/loss 2.70629
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:        train/lr 0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wandb:       train/mfu 7.20423&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;74-testing-your-checkpoints&#34;&gt;7.4 Testing Your Checkpoints&lt;/h3&gt;
&lt;p&gt;Once training is complete, you can immediately test your model using the checkpoints saved during training. This is one of the most exciting parts - seeing the model generate historical text for the first time! The PyTorch checkpoint approach provides immediate testing without any conversion needed, allowing you to test any checkpoint to monitor training progress while preserving the complete model state, including training metadata and optimizer state for fast, optimized inference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Direct PyTorch Checkpoint Testing:&lt;/strong&gt;
Test your model directly from the training checkpoints without any conversion:&lt;/p&gt;
&lt;figure id=&#34;listing12&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test SLM checkpoint (117M parameters)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/slm/checkpoint-4000.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test Regular model checkpoint (354M parameters)  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_pytorch.py &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --checkpoint 09_models/checkpoints/checkpoint-60001.pt &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  --prompt &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;In the year 1834, I walked through the streets of London and witnessed&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 12: Test Model Checkpoints&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;
Your trained model will generate authentic historical text like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;In the year 1834, I walked through the streets of London and witnessed the most extraordinary sight. The Thames flowed dark beneath London Bridge, whilst carriages rattled upon the cobblestones with great urgency. Merchants called their wares from Cheapside to Billingsgate, and the smoke from countless chimneys did obscure the morning sun.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Testing Different Checkpoints:&lt;/strong&gt;
You can test any checkpoint from your training run to see how the model improved over time. Try testing checkpoints from different training stages to observe the learning progression - early checkpoints will generate more random text, while later checkpoints will produce increasingly coherent historical language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Pro Tip&lt;/strong&gt;: For published Hugging Face models and community access, see the Quick Start section earlier in this post, where we demonstrated the published SLM model.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;8-publish-to-hugging-face&#34;&gt;8. Publish to Hugging Face&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve successfully trained and tested your models, you can publish them to Hugging Face for community access and easy deployment. Publishing makes your models available to researchers, developers, and enthusiasts worldwide, while integrating them into the Hugging Face ecosystem for seamless use with the &lt;code&gt;transformers&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publishing Process:&lt;/strong&gt;
The publishing code automatically handles the complete conversion process from PyTorch checkpoints to Hugging Face format, which is essential for making your trained models accessible to the broader community. This conversion transforms your local training artifacts into a standardized format that can be easily loaded by users worldwide.&lt;/p&gt;
&lt;p&gt;The process includes converting model weights from PyTorch&amp;rsquo;s &lt;code&gt;.pt&lt;/code&gt; format to the more efficient &lt;code&gt;.safetensors&lt;/code&gt; format, generating proper configuration files (&lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;generation_config.json&lt;/code&gt;) that define the model architecture and generation parameters, uploading the custom tokenizer and all necessary files to ensure complete functionality, creating comprehensive model cards with usage instructions and metadata for easy adoption, and setting up proper model repositories with versioning for educational deployment.&lt;/p&gt;
&lt;p&gt;This conversion is necessary because PyTorch checkpoints are optimized for training workflows and contain additional information like optimizer states that aren&amp;rsquo;t needed for inference, while the Hugging Face format is specifically designed for model sharing and deployment across different environments and hardware configurations.&lt;/p&gt;
&lt;p&gt;We need to call the right script to publish the relevant model - either the SLM or the larger model. The publishing scripts will prompt you for your Hugging Face username and repository name, allowing you to customize where your models are published. The scripts automatically detect and use the latest checkpoint from your training run, so you can publish immediately after training completes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Quick Reference&lt;/strong&gt;: If you want to test published models before publishing your own, see section 2 &amp;ldquo;Use the models - Try it now using Hugging Face&amp;rdquo; for immediate access to pre-trained models.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; You&amp;rsquo;ll need a Hugging Face account and either set the &lt;code&gt;HF_TOKEN&lt;/code&gt; environment variable or provide your token when prompted. The scripts will guide you through the publishing process step by step.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A: Publish SLM (117M parameters)&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing13&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Publish SLM to Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 10_scripts/publish_slm_to_huggingface.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 13: Publish SLM to Hugging Face&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Option B: Publish Regular Model (354M parameters)&lt;/strong&gt;&lt;/p&gt;
&lt;figure id=&#34;listing14&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Publish Regular model to Hugging Face  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 10_scripts/publish_to_huggingface.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 14: Publish Regular Model to Hugging Face&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If everything is working correctly and the models are published, you will see confirmation messages and upload progress. Here&amp;rsquo;s what successful publishing looks like:&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/hf05.png&#34; alt=&#34;HF - SLM upload&#34; title=&#34;HF - SLM upload&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Hugging Face SLM model upload progress and confirmation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 13:&lt;/strong&gt; Hugging Face upload process for SLM model showing successful publishing workflow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;And this is an example output for the Regular model:&lt;/p&gt;
&lt;figure&gt;
&lt;figure&gt;
&lt;img src=&#34;images/hf06-regular-model.png&#34; alt=&#34;HF - Regular model upload&#34; title=&#34;HF - Regular model upload&#34;&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 14:&lt;/strong&gt; Hugging Face Regular model upload progress and confirmation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figcaption&gt;&lt;strong&gt;Figure 14:&lt;/strong&gt; Hugging Face upload process for Regular model showing successful publishing workflow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;After Publishing:&lt;/strong&gt;
Once published, your models will be available at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLM&lt;/strong&gt;: &lt;code&gt;bahree/london-historical-slm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regular Model&lt;/strong&gt;: &lt;code&gt;bahree/london-historical-llm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users can then easily load and use your models with just a few lines of code, making your historical language models accessible to the broader AI community for research, education, and creative applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing Your Published Models:&lt;/strong&gt;
Once published, you can test your models using the same inference methods shown in the Quick Start section:&lt;/p&gt;
&lt;figure id=&#34;listing15&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test published SLM model (10 automated tests)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/test_published_models.py --model_type slm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Interactive testing with published models&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python 06_inference/inference_unified.py --published --model_type slm --interactive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figcaption&gt;
        &lt;strong&gt;Listing 15: Test Published Models&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;10-what-weve-accomplished&#34;&gt;10. What We&amp;rsquo;ve Accomplished&lt;/h2&gt;
&lt;p&gt;This comprehensive guide has taken you from raw historical documents to working language models that can generate authentic 18th and 19th-century London text. We&amp;rsquo;ve built a complete pipeline that transforms 218+ historical sources into two specialized models - a fast SLM for experimentation and a powerful Regular model for high-quality generation. The entire system is fully functional, with both PyTorch checkpoint inference and Hugging Face model publishing working seamlessly, tested and validated on real hardware.&lt;/p&gt;
&lt;p&gt;What makes this project interesting is that it&amp;rsquo;s not just another language model - it&amp;rsquo;s a complete educational journey that teaches you every aspect of building LLMs from scratch. From custom historical tokenizers that understand archaic English to sophisticated GPU optimization and deployment, you&amp;rsquo;ve learned the full stack of modern language model development. The result is a system that preserves historical linguistic heritage while demonstrating cutting-edge AI techniques, making it valuable for researchers, educators, and anyone interested in the intersection of history and technology.&lt;/p&gt;
&lt;h2 id=&#34;11-the-journey-continues&#34;&gt;11. The Journey Continues&lt;/h2&gt;
&lt;p&gt;This is just the beginning. In the next three parts of this series, we&amp;rsquo;ll dive deeper into the technical foundations:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 2
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; explores historical data collection, showing how we curated 218+ authentic sources spanning 350 years of London&amp;rsquo;s history, and how we built a custom tokenizer that truly understands historical English.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2025/11/building-llm-from-scratch-part3-model-architecture-gpu-training/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 3
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; reveals the custom GPT architecture designed specifically for historical text, GPU optimization strategies, and training infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;/post/2026/01/building-llm-from-scratch-part4-evaluation-deployment/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 4
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; completes the journey with evaluation frameworks, testing strategies, and deployment techniques that transform your trained models into working systems.&lt;/p&gt;
&lt;p&gt;Each part builds on what you&amp;rsquo;ve learned here, taking you from high-level overview to deep technical implementation details.&lt;/p&gt;
&lt;h2 id=&#34;12-resources&#34;&gt;12. Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;:⚙️&lt;a
	
		href = &#34;https://github.com/bahree/helloLondon&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		github.com/bahree/helloLondon
	&lt;/span&gt;
&lt;/a&gt; - Complete codebase with all training scripts, inference tools, and documentation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Models&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;🤗 &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-slm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-slm
	&lt;/span&gt;
&lt;/a&gt; - Small Language Model (117M parameters)&lt;/li&gt;
&lt;li&gt;🤗 &lt;a
	
		href = &#34;https://huggingface.co/bahree/london-historical-llm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bahree/london-historical-llm
	&lt;/span&gt;
&lt;/a&gt; - Regular Model (354M parameters)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;📘&lt;strong&gt;Book Reference&lt;/strong&gt;: &lt;a
	
		href = &#34;https://a.co/d/ffzkJ7T&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; - For deeper understanding of core LLM concepts&lt;/li&gt;
&lt;li&gt;📖&lt;strong&gt;Documentation&lt;/strong&gt;: Complete guides in the &lt;code&gt;08_documentation/&lt;/code&gt; folder covering every aspect of the project&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;13-acknowledgments&#34;&gt;13. Acknowledgments&lt;/h2&gt;
&lt;p&gt;This project builds upon the excellent work of the open-source community. Special thanks to &lt;a
	
		href = &#34;https://github.com/haykgrigo3/TimeCapsuleLLM&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		haykgrigo3&amp;rsquo;s TimeCapsuleLLM
	&lt;/span&gt;
&lt;/a&gt; for the initial inspiration and framework for historical language model training, and to &lt;a
	
		href = &#34;https://github.com/karpathy/nanoGPT&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Andrej Karpathy&amp;rsquo;s nanoGPT
	&lt;/span&gt;
&lt;/a&gt; for the foundational GPT architecture and training methodology. The project extends these foundations with specialized adaptations for historical text, including custom tokenizers, advanced data filtering, and educational deployment infrastructure.&lt;/p&gt;
&lt;p&gt;🙏&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready to dive deeper?&lt;/strong&gt; &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/10/building-llm-from-scratch-part2-data-tokenizers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Part 2: Data Collection &amp;amp; Custom Tokenizers
	&lt;/span&gt;
&lt;/a&gt; covers the technical details of data collection, cleaning pipelines, and custom tokenizer development for authentic historical text processing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reasoning AI Models: An overview</title>
      <link>/post/2025/09/reasoning-ai-models-a-deep-dive/</link>
      <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/09/reasoning-ai-models-a-deep-dive/</guid>
      <description>&lt;h4 id=&#34;tldr&#34;&gt;TL;DR&lt;/h4&gt;
&lt;p&gt;As part of my role at Microsoft&amp;rsquo;s AI Foundry Applied AI engineering team in CoreAI, I have participated in numerous detailed discussions about the evolving landscape of AI models. In conversations with many customers, from CxOs to engineers, one recurring topic is the &lt;strong&gt;rise of reasoning AI models&lt;/strong&gt;. These models are designed to perform complex tasks by explicitly breaking down problems into logical steps, rather than just generating text in a single pass like traditional large language models (LLMs). This shift toward &lt;em&gt;reasoning-centric&lt;/em&gt; AI marks a major evolution in how we develop and deploy AI systems—and it’s a key factor behind the rise of Agents and Agentic AI.&lt;/p&gt;
&lt;p&gt;At the same time, there is a lot of confusion about what these reasoning models are, how they differ from traditional LLMs, and how to effectively adapt and evaluate them. In this post, I aim to clarify these concepts by providing a technical deep dive into reasoning AI models, their training and adaptation processes, and the challenges involved in fine-tuning them for specific tasks. We will also explore how to evaluate these models effectively, considering their unique characteristics.&lt;/p&gt;
&lt;p&gt;This post is intended to help one gain a deeper understanding of reasoning models and their implications; I cover these areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What are reasoning AI models?&lt;/strong&gt; A technical overview of their architecture and training paradigms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How do they differ from traditional LLMs?&lt;/strong&gt; Key distinctions in capabilities and performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to adapt and fine-tune reasoning models?&lt;/strong&gt; Best practices and common pitfalls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What are the challenges in customizing them?&lt;/strong&gt; Technical and organizational hurdles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to evaluate reasoning models?&lt;/strong&gt; Metrics and strategies for assessing their performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;Recent AI models have begun to combine language generation with explicit reasoning, enabling more reliable solutions to complex problems. Traditional LLMs like GPT-4o complete a generation in one go, without showing their work. Reasoning models, on the other hand, produce a sequence of intermediate steps (a “reasoning trace”) before the final generation. For example, Microsoft’s Phi-4-Reasoning (14B parameters) will explicitly work through a math problem step-by-step, whereas a regular LLM might confidently state an answer with no explanation. This fundamental difference – &lt;strong&gt;predictive text generation vs. chained logical reasoning&lt;/strong&gt; – makes reasoning LLMs significantly better at multi-step tasks, such as math word problems, code debugging, or complex decision queries.&lt;/p&gt;
&lt;p&gt;Note: The AI model landscape is also shifting rapidly, with a newer trend of transitioning from separate “base” vs. “reasoning” models (e.g., o1/o3) to unified systems with internal routing (e.g., GPT-5). GPT 5 runs a system that routes between fast and deliberate paths and exposes developer controls to tune thinking time. In production, the system automatically switches modes; developers can cap or elevate effort as needed. This operationalizes dynamic compute allocation, reducing the need for prompt engineering, specifically when wanting to induce reasoning.&lt;/p&gt;
&lt;p&gt;The shift toward unified systems like GPT-5 can be understood as operationalizing the compute-optimal scaling insights from research. Rather than requiring users to choose between reasoning modes manually, these systems implement automatic difficulty assessment and adaptive compute allocation - essentially embedding the &amp;ldquo;compute-optimal&amp;rdquo; strategy within the model architecture itself.&lt;/p&gt;
&lt;h3 id=&#34;11-what-are-reasoning-models&#34;&gt;1.1 What are reasoning models?&lt;/h3&gt;
&lt;p&gt;Reasoning models are LLMs architected to solve problems via a multi-step chain-of-thought (CoT) approach. Instead of just predicting the next token, they simulate an internal “scratchpad” of logic. For instance, OpenAI’s latest models (&lt;em&gt;o1&lt;/em&gt; and &lt;em&gt;o3&lt;/em&gt;) reportedly allocate extra computation at inference-time and use &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/01/intro-to-reinforcement-learning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		reinforcement learning (RL)
	&lt;/span&gt;
&lt;/a&gt; fine-tuning to boost multi-step reasoning. DeepSeek’s R1 (671B-parameter &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2025/01/intro-to-mixture-of-experts/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mixture-of-Experts model
	&lt;/span&gt;
&lt;/a&gt;) was explicitly trained with multi-stage reinforcement learning to encourage step-by-step thinking.&lt;/p&gt;
&lt;p&gt;During training, such models may be given examples formatted like: &lt;code&gt;*Question → (Begin reasoning) → ... reasoning steps ... → (Final answer)*&lt;/code&gt;, or prompted with cues like &lt;em&gt;“Let’s think step by step.”&lt;/em&gt; This teaches the model to &lt;strong&gt;articulate intermediate steps&lt;/strong&gt; instead of jumping straight to an answer. In essence, a reasoning LLM &lt;strong&gt;learns to internalize a logical process&lt;/strong&gt; – it doesn’t just know facts or language, it learns how to solve problems by breaking them down.&lt;/p&gt;
&lt;p&gt;Crucially, these reasoning models often use special tokens to separate the “thinking” from the final answer. Many use a convention such as &lt;code&gt;&amp;lt;think&amp;gt; ... &amp;lt;/think&amp;gt;&lt;/code&gt; tags to enclose the chain of thought. For example, &lt;strong&gt;DeepSeek-R1-Distill&lt;/strong&gt; (a distilled 8B version of R1) will output a hidden “thinking” transcript between these tags, followed by a concise answer that summarizes the reasoning. The chain-of-thought (CoT) might include equations, logic, or code, which the model generates as if working on scratch paper, and then the answer is given separately. This behavior is usually built into the model through fine-tuning – if you prompt such a model normally, it will, by default, produce a step-by-step solution trace and then provide the answer.&lt;/p&gt;
&lt;p&gt;Some recent systems even let developers toggle the visibility of this trace: e.g., Qwen-3 allows a “reasoning mode” where the chain of thought is shown or hidden as needed. The key point is that reasoning models carry out more computation in the open, and they may consume more tokens. It is quite common for them to use hundreds or thousands of tokens for a complex solution, whereas a regular LLM might try to produce an answer in, say, a single paragraph.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-deepseek-moe-architecture.png&#34; alt=&#34;DeepSeek-R1 MoE architecture&#34;/&gt;
        &lt;figcaption&gt;Figure 1: DeepSeek-R1 architecture showing Mixture-of-Experts design with selective parameter activation (21B of 671B parameters active per token) and 128K token context window. (Source: DeepSeek research)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;12-cognitive-architecture-parallels---type-1-and-type-2-thinking&#34;&gt;1.2 Cognitive Architecture Parallels - Type 1 and Type 2 Thinking&lt;/h3&gt;
&lt;p&gt;The reasoning model paradigm directly parallels the Type 1/Type 2 thinking framework popularized by &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Daniel Kahneman
	&lt;/span&gt;
&lt;/a&gt;. Some of the recent work demonstrating how LLMs can be aligned to either System 1 (intuitive and fast) or System 2 (analytical and deliberate) thinking patterns.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Type 1&lt;/em&gt; thinking in AI systems corresponds to the pattern-matching and intuitive responses characteristic of traditional LLMs - fast, automatic responses based on learned patterns. &lt;strong&gt;Type 2&lt;/strong&gt; thinking represents the deliberate, step-by-step reasoning that reasoning models are designed to emulate. Research shows that System 2-aligned models excel in arithmetic and symbolic reasoning, while System 1-aligned models perform better in commonsense tasks.&lt;/p&gt;
&lt;h4 id=&#34;cognitive-flexibility-and-performance-trade-offs&#34;&gt;Cognitive Flexibility and Performance Trade-offs&lt;/h4&gt;
&lt;p&gt;Unlike human cognition, which fluidly adapts between System 1 and System 2 thinking based on context, current LLMs lack this dynamic flexibility. This rigidity can lead to brittle performance when tasks deviate from trained patterns. However, reasoning models attempt to address this limitation by incorporating explicit System 2-style processing.&lt;/p&gt;
&lt;p&gt;The research demonstrates an &amp;ldquo;accuracy-efficiency trade-off&amp;rdquo; where System 2-aligned models show greater uncertainty and more systematic processing, while System 1-aligned models provide more definitive but potentially less reliable answers. This suggests that optimal AI systems may need to switch between reasoning modes dynamically based on task complexity.&lt;/p&gt;
&lt;p&gt;From an architectural perspective, reasoning LLMs are still transformer-based neural networks at their core. They don’t necessarily have new algorithmic components beyond the training tweaks, though some research explores adding tools or memory. It’s the &lt;strong&gt;training paradigm&lt;/strong&gt; that sets them apart.&lt;/p&gt;
&lt;p&gt;For example, where a classic 4o/4.1 style LLM is trained purely on next word prediction and maybe a bit of instruction tuning, a reasoning model like R1 or Phi 4 is trained in an extensive multi stage training pipeline (e.g. supervised fine tuning on curated CoT examples), then specialized reinforcement learning (using rewards for getting answers right and for producing a consistent chain of thought), and so on. OpenAI’s o1/o3 models are rumored to undergo similar multi-stage refinement, combining RL with the ability to allocate more thinking steps at runtime.&lt;/p&gt;
&lt;h3 id=&#34;13-chain-of-thought-built-in-vs-prompted&#34;&gt;1.3 Chain-of-Thought: Built-in vs Prompted&lt;/h3&gt;
&lt;p&gt;Start by understanding what a chain of thought (CoT) is. CoT is the model’s “scratchpad”: a sequence of intermediate reasoning steps it writes out before giving the final answer. Many models fence this trace with special tokens (e.g., &lt;code&gt;&amp;lt;think&amp;gt; ... &amp;lt;/think&amp;gt;&lt;/code&gt;); there are configurations that can show or hide these. The advantage this gives us is better results on multi-step tasks (such as math, code, and planning) by decomposing problems. On the other hand, the trade-offs include more tokens → more cost/latency; and traces can be verbose or unfaithful if not evaluated. As a result, CoT is best used for complex queries, and where possible, it would be wise to consider either skipping or limiting these for simple lookups. See “Evaluation” for token-normalized accuracy and faithfulness checks.&lt;/p&gt;
&lt;p&gt;CoT prompting emerged as a technique to enhance traditional LLMs by explicitly requesting step-by-step reasoning through prompts such as &amp;ldquo;Describe your reasoning in steps&amp;rdquo; or &amp;ldquo;Explain your answer step by step.&amp;rdquo; This approach leverages LLMs&amp;rsquo; ability to &amp;ldquo;think out loud&amp;rdquo; in natural language, with effectiveness scaling with model size as an emergent ability.&lt;/p&gt;
&lt;p&gt;Figure 2 shows an LLM decomposing a complex math word problem into sequential subquestions, solving each step before arriving at the final answer. (Credit: Chain-of-Thought Prompting Elicits Reasoning in Large Language Models)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-CoT-reasoning-process.jpg&#34; alt=&#34;CoT reasoning example&#34;/&gt;
        &lt;figcaption&gt;Figure 2: CoT reasoning example&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Reasoning models fundamentally differ in that they integrate CoT processing directly into their architecture and training process. Rather than requiring explicit prompting, these models automatically engage in step-by-step reasoning for complex tasks. Research indicates that &amp;ldquo;Chain-of-Thought built into the core architecture and training process&amp;rdquo; represents a more robust approach than external prompting.&lt;/p&gt;
&lt;p&gt;However, CoT prompting is not universally effective across all models and tasks. Recent research on strategic reasoning has shown that CoT prompting is not universally effective, as it increases strategic reasoning only for models at certain levels, while providing limited gains elsewhere. This suggests that integrating reasoning capabilities requires careful architectural considerations beyond simple prompting strategies.&lt;/p&gt;
&lt;p&gt;The effectiveness of CoT in reasoning models also varies by task complexity and domain. Models trained with reinforcement learning on reasoning tasks show more consistent application of multi-step reasoning compared to models relying solely on prompted CoT.&lt;/p&gt;
&lt;h3 id=&#34;14-test-time-vs-train-time-compute&#34;&gt;1.4 Test-Time vs Train-Time Compute&lt;/h3&gt;
&lt;p&gt;A critical innovation in reasoning models is the emphasis on test-time compute scaling. While their training parameters limit traditional LLMs, reasoning models can allocate variable computational resources during inference. OpenAI reports that the performance of &lt;strong&gt;o1&lt;/strong&gt; improves with more RL (train-time compute) and with more time spent thinking (test-time compute) (&lt;a
	
		href = &#34;https://openai.com/index/learning-to-reason-with-llms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		overview
	&lt;/span&gt;
&lt;/a&gt;). This creates new scaling paradigms, where models can allocate more computational resources to harder problems during inference.&lt;/p&gt;
&lt;p&gt;This &lt;strong&gt;inference-time compute scaling&lt;/strong&gt; (using more tokens/steps) is a defining trait – it enables even smaller models to solve hard problems by iterating through reasoning. As Microsoft’s team describes, “Phi 4 Reasoning generates detailed reasoning chains that effectively leverage additional inference time compute,” allowing a 14B model to compete with far larger ones.&lt;/p&gt;
&lt;p&gt;Because this extra “thinking” consumes tokens and compute, it helps to formalize the tradeoff to understand the concept better.&lt;/p&gt;
&lt;p&gt;Test-time compute is best understood as a way to reshape the model’s output distribution at inference by searching over alternative reasoning paths and then selecting among them. It reliably lifts accuracy—especially on problems with verifiable answers—yet it is not interchangeable with pretraining compute.&lt;/p&gt;
&lt;p&gt;Recent evidence shows that test-time compute helps most when the base model is already capable and the gap to the target difficulty is modest; on the hardest items, pretraining capacity still dominates - as outlined in Figure 3 below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-test-time-vs-train-time-compute-trade-off.png&#34; alt=&#34;Relationship between test-time and train-time compute in reasoning models&#34;/&gt;
        &lt;figcaption&gt;Figure 3: The relationship between test-time and train-time compute in reasoning models, showing how additional inference computation can compensate for reduced training compute. (Source: Snell et al., 2024)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;A practical rule is to treat thinking tokens as a budgeted resource: use them to explore and score candidate chains (branching) and reserve a small budget for targeted revision when a verifier flags issues. In cost terms, this gives you predictable returns without pretending that more inference tokens can fully substitute for more capable pretraining.&lt;/p&gt;
&lt;h4 id=&#34;test-time-compute-vs-model-size-trade-offs&#34;&gt;Test-Time Compute vs Model Size Trade-offs&lt;/h4&gt;
&lt;p&gt;A groundbreaking finding from recent research is that on problems where smaller models achieve non-trivial success rates, &lt;strong&gt;test-time compute can be used to outperform models 14× larger&lt;/strong&gt; in FLOP-matched evaluations. This suggests a fundamental shift in how we think about compute allocation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy to medium problems&lt;/strong&gt;: Test-time compute is often more effective than pretraining larger models&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Very hard problems&lt;/strong&gt;: Pretraining capacity still dominates, with limited benefits from test-time scaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Practical implication&lt;/strong&gt;: Rather than focusing purely on scaling pretraining, it may be more efficient to train smaller models and apply test-time compute strategically&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;efficiency-trade-off-how-much-thinking-is-enough&#34;&gt;Efficiency trade-off: How much “thinking” is enough?&lt;/h4&gt;
&lt;p&gt;OpenAI’s &lt;strong&gt;o1&lt;/strong&gt; explicitly reports: performance improves with more RL (&lt;em&gt;train-time&lt;/em&gt; compute) and with more time spent thinking (&lt;em&gt;test-time&lt;/em&gt; compute). Microsoft’s Phi-4 Reasoning (14B) shows similar patterns: small models, when allowed longer structured chains, outperform their weight in math/science. To examine the implications, consider a back-of-the-envelope cost model. If $L_r$ is “reasoning” length and $L_a$ is final answer length, a crude attention-heavy cost proxy is&lt;/p&gt;
&lt;p&gt;$$
\text{Compute} ;\propto; H,(L_a + L_r)^2,d,
$$&lt;/p&gt;
&lt;p&gt;with hidden size $H$ and depth $d$. You can wrap this into an objective that matches your reality:&lt;/p&gt;
&lt;p&gt;$$
\min_{L_r}; C(L_r) = \alpha,H,(L_a+L_r)^2,d ;+; \beta,\text{latency}(L_r) ;-; \gamma,\text{Acc}(L_r),
$$&lt;/p&gt;
&lt;p&gt;where $\alpha,\beta,\gamma&amp;gt;0$ are your infra cost, SLA pain, and value of accuracy. You won’t solve this analytically in prod—you’ll &lt;strong&gt;sweep the thinking budget&lt;/strong&gt; and pick a knee point.&lt;/p&gt;
&lt;p&gt;What is really interesting is that accuracy is typically concave in $(L_r)$; i.e, the first ~100–300 “thinking” tokens help a lot; beyond that, &lt;strong&gt;diminishing returns&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Quick intuition: if $L_a$ is small and $L_r$ doubles, the attention term grows by about $4\times$, while accuracy typically improves far less—hence token budgets and early stop heuristics. We’ll revisit this idea in &lt;a
	
		href = &#34;#evaluation-strategies-for-reasoning-models&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Evaluation
	&lt;/span&gt;
&lt;/a&gt; via token-normalized accuracy.&lt;/p&gt;
&lt;p&gt;This trade-off also motivates practical features, such as token budgets, early-stop heuristics, and “fast vs. deliberative” paths (e.g., Qwen-3’s reasoning mode). With that lens, let’s look at what differs under the hood.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More deliberate thinking often helps—up to a point - You can trade thinking tokens for accuracy on complex items.&lt;/li&gt;
&lt;li&gt;Returns diminish - the first ~100–300 “reasoning” tokens carry a lot of the lift; beyond that, you’re paying for a long tail.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule of thumb.&lt;/strong&gt; Treat “thinking tokens” as a first-class budget; &lt;strong&gt;log it&lt;/strong&gt;, control it, and optimize it like you optimize memory or p95 latency. Some model providers like Qwen 3 and NVIDIA’s NIM expose this &lt;em&gt;thinking budget&lt;/em&gt; directly.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In short, reasoning LLMs are &lt;strong&gt;LLMs with a logic upgrade&lt;/strong&gt; – through additional training, they learn to use reasoning strategies that standard models lack.&lt;/p&gt;
&lt;h3 id=&#34;15-effectiveness-and-limitations-of-reasoning-llms&#34;&gt;1.5 Effectiveness and Limitations of Reasoning LLMs&lt;/h3&gt;
&lt;p&gt;Recent benchmarks indicate that CoT reasoning yields significantly improved performance on complex tasks (see Figure 4 below). For example, Microsoft’s Phi-4-Reasoning models, with only 14B parameters, match or surpass much larger models in math and science benchmarks—sometimes even outperforming a model 5x times their size (surpassing OpenAI’s o1-mini, and R1&amp;rsquo;s 70B distilled version on many math and science benchmarks). This success is attributed to reasoning-focused training and reinforcement learning, proving that with strategic training, smaller models can excel at challenging tasks without needing massive scale. This demonstrates a general trend: &lt;em&gt;with the right training, a model doesn’t have to be huge to solve complex tasks – it just needs to learn how to use its capacity more algorithmically.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-AIME-performance-scaling.png&#34; alt=&#34;Performance scaling on AIME mathematics benchmark&#34;/&gt;
        &lt;figcaption&gt;Figure 4: Performance scaling on AIME mathematics benchmark: Both train-time compute (left) and test-time compute (right) show smooth accuracy improvements, validating the compute-optimal scaling approach. (Source: OpenAI research)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Another data point is the DeepSeek R1 family. The original R1 (671B, MoE) was a “reasoning-maximal” model (see Figure 1), pushed to an extreme scale and trained with novel RL algorithms (such as GRPO, a group-based self-improvement method) to excel at long-horizon problems. Distilled smaller versions of R1 (70B, 8B, etc.) inherited some of these skills through knowledge distillation. These distilled reasoning models, even at 8B, achieved math and puzzle-solving scores significantly higher than those of similarly sized generic LLMs. Open-source efforts like &lt;em&gt;Bespoke-Stratos-7B&lt;/em&gt; and &lt;em&gt;OpenThinker-7B&lt;/em&gt; followed suit, demonstrating that a properly fine-tuned 7B model with CoT can outperform naive 7Bs by significant margins on benchmarks. In research from late 2024, Qwen-3 (an advanced open model by Alibaba) was released in both “thinking mode” and “no thinking” mode. Running Qwen-3 in its CoT mode, it actually &lt;strong&gt;outperformed DeepSeek-R1 on a majority of evaluated tasks&lt;/strong&gt; despite activating only a subset of its parameters at each token (it’s a mixture-of-experts model, effectively).&lt;/p&gt;
&lt;p&gt;What is interesting is that when Qwen-3 was toggled off (i.e., no CoT visible), it still beat a GPT-4-sized baseline on many benchmarks, implying that integrating reasoning steps did not harm its base competency – it only added the ability to dig deeper when needed. All these examples underscore that &lt;strong&gt;reasoning LLMs hold a significant edge&lt;/strong&gt; on tasks that aren’t straightforward single-step predictions. Whenever an answer requires multiple pieces of information or intermediate calculations, a traditional LLM often fails or guesses incorrectly, whereas a reasoning LLM can navigate the steps systematically (much like a human showing their work). The gap is so notable that analysts have called reasoning LLMs “a critical evolution” in AI capability, and enterprise users are exploring them for decision-making support where correctness takes precedence over brevity.&lt;/p&gt;
&lt;h4 id=&#34;mathematical-and-logical-reasoning&#34;&gt;Mathematical and Logical Reasoning&lt;/h4&gt;
&lt;p&gt;Reasoning models demonstrate substantial improvements over traditional LLMs in mathematical and logical reasoning tasks. OpenAI&amp;rsquo;s o1 achieves remarkable performance, ranking in the 89th percentile on competitive programming questions (Codeforces) and placing among the top 500 students in the US in a qualifier for the USA Math Olympiad (AIME).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Codeforces&lt;/strong&gt;: Codeforces is a major competitive programming platform and community. It hosts frequent online contests (“Rounds”) where participants solve algorithmic problems within time limits, and it maintains an Elo-like rating system and color-coded titles (ranging from Newbie to Legendary Grandmaster).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Comprehensive evaluations (see Figure 5) show that o1-preview demonstrates 100% accuracy in high school-level mathematical reasoning tasks, providing detailed step-by-step solutions and an 83.3% success rate in solving complex competitive programming problems, surpassing many human experts. These results indicate performance that often meets or exceeds that of human experts in structured reasoning domains.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-model-performance-comparison.png&#34; alt=&#34;Model performance comparison&#34;/&gt;
        &lt;figcaption&gt;Figure 5: Comprehensive benchmark comparison showing o1-preview&amp;#39;s superior performance over GPT-4o across mathematics, science, and reasoning tasks. (Source: OpenAI, 2024)&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h4 id=&#34;domain-specific-applications&#34;&gt;Domain-Specific Applications&lt;/h4&gt;
&lt;p&gt;Beyond mathematics, reasoning models show strong performance across diverse specialized domains. Evaluations indicate remarkable proficiency in anthropology and geology, demonstrating a deep understanding and sound reasoning in these specialized fields, as well as strong capabilities in quantitative investing, complemented by comprehensive financial knowledge. The models also demonstrate superior ability in generating coherent and accurate radiology reports, outperforming other evaluated models.&lt;/p&gt;
&lt;p&gt;Recent research with ReasonFlux-32B has demonstrated that smaller, specialized reasoning models can outperform larger, general models. On the MATH benchmark, ReasonFlux-32B achieves an accuracy of 91.2% and surpasses o1-preview by 6.7% while being trained with only 8 GPUs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ReasonFlux&lt;/strong&gt; - ReasonFlux is a template-driven, hierarchical RL approach to reasoning LLMs; instead of lengthening raw CoT, it plans over a library of thought templates and scales those at inference time, yielding strong math results in a 32B-parameter model.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;However, this does not mean reasoning models dominate on every task. For very simple or single-step queries (e.g., straightforward fact lookups or classifications), a regular LLM might perform just as well and with less latency - it is using fewer tokens and does not have to generate a long explanation; more tokens mean more computation and slower responses. That said, many reasoning LLMs are designed to be flexible – they can shorten or skip the reasoning when it’s not needed. Some deployments use a “fast path” versus a “deliberative path” approach: run the model in normal mode for easy questions and only invoke full reasoning mode for complex ones. This dynamic compute allocation is a research area in itself (how to predict when to make a model think longer).&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;token-budget mechanism&lt;/strong&gt; in Qwen-3 is one example: it allows users to cap how many reasoning tokens the model can use, forcing it to decide what’s most important. Accuracy does improve with more tokens (e.g., from ~70% at 2K tokens to ~85% at 16K on a math test), but after a point,  it is a matter of diminishing returns. The existence of such features highlights that reasoning LLMs introduce a new dimension – &lt;em&gt;a time/accuracy trade-off&lt;/em&gt;. Traditional LLM evaluation is usual just one-dimensional – measuring accuracy or quality for a given fixed model output length. On the other hand, reasoning LLMs let us trade generation length for correctness. (Note: the &lt;em&gt;Evaluation&lt;/em&gt; section will cover more details on how to measure).&lt;/p&gt;
&lt;h3 id=&#34;16-branching--editing-at-test-time-how-to-spend-thinking-compute&#34;&gt;1.6 Branching &amp;amp; Editing at Test Time (how to “spend” thinking compute)&lt;/h3&gt;
&lt;p&gt;Test-time compute isn’t just “more tokens”; it’s a way to reshape the model’s output distribution by searching for, and then selecting, better reasoning paths during decoding. In practice, this plays out along two complementary axes. The first is branching: generate multiple candidate chains and prefer the one that scores best under a process- or outcome-aware judge. The second is editing: let the model (and its tools) reflect on an initial attempt and revise it once or twice. Both strategies are ways of allocating limited thinking budget where it matters most.&lt;/p&gt;
&lt;p&gt;On the branching side, simple best-of-N sampling remains a solid baseline, while beam or tree-style search makes exploration adaptive by spending more decoding on promising partial thoughts. Process-aware scoring—via a process reward model (PRM) or per-step self-evaluation—helps prune low-quality branches early; when ground truth isn’t available, self-consistency (majority voting across diverse chains) is a practical fallback. Two small but useful tricks from recent work are to branch early—keeping only the top few first-token continuations before decoding greedily—and to anneal temperature across tokens to reduce accumulated randomness as chains grow. Together, these make parallel exploration both cheaper and more reliable.&lt;/p&gt;
&lt;p&gt;Editing tackles a different failure mode: an answer that looks plausible but hides a local mistake. Here, short reflect-revise loops work best when anchored to reliable feedback—unit tests for code, exact-match checks for math, heuristic rubrics, or judgments from a stronger model. Pure “self-correction” without such anchors tends to be unstable: models often make minor, non-helpful edits, occasionally flip correct answers to incorrect ones, or fail to generalize the revision behavior. Keeping revision rounds tight, skipping revision when a verifier signals “already correct,” and rolling back to the best-verified candidate are practical guardrails.&lt;/p&gt;
&lt;p&gt;Importantly, branching and editing are not substitutes; the best results often come from using both. For easier problems, a short sequential pass can be enough, but as difficulty rises, the sweet spot shifts toward a deliberate mix of parallel exploration and a small revise budget. Thinking time is therefore a budget allocation question: how much diversity you buy up front versus how much you reserve for targeted fixes after you’ve seen a candidate chain.&lt;/p&gt;
&lt;p&gt;Operationally, it pays to make the budget explicit and observable. Expose a cap on “thinking tokens,” allow early exit when candidates agree with high confidence, and log the signals that drove selection—per-step PRM or self-evaluation scores, agreement margins, and precise stop reasons. Over time, these traces make it easy to tune the ratio between breadth (how many chains you explore) and depth (how hard you try to fix a promising one), and to decide when a verifier is strong enough to justify skipping revision. Finally, remember that this test-time axis complements, but does not replace, pretraining: extra thinking generally helps, yet it cannot fully compensate for large capability gaps on the hardest items.&lt;/p&gt;
&lt;h4 id=&#34;compute-optimal-scaling&#34;&gt;Compute-Optimal Scaling&lt;/h4&gt;
&lt;p&gt;Recent research by Snell et al. demonstrates that &lt;strong&gt;compute-optimal scaling&lt;/strong&gt; - allocating test-time compute adaptively based on problem difficulty - can improve efficiency by more than 4× compared to traditional best-of-N sampling. This approach recognizes that different problems require different amounts of thinking time, and optimal allocation varies dramatically based on prompt difficulty.&lt;/p&gt;
&lt;p&gt;The key insight is that &lt;em&gt;question difficulty&lt;/em&gt; can be predicted and used to determine the most effective test-time compute strategy. For easier problems, simple parallel sampling suffices, while harder problems benefit from sequential revision or sophisticated search strategies.&lt;/p&gt;
&lt;p&gt;Research identifies two primary mechanisms for scaling test-time computation effectively:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Process-Based Verifier Search&lt;/strong&gt;: Using dense, process-reward models (PRMs) to guide search through reasoning paths, enabling beam search or lookahead search strategies that prune low-quality branches early.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adaptive Distribution Updates&lt;/strong&gt;: Modifying the model&amp;rsquo;s distribution over responses at test time, such as through sequential revision where the model iteratively improves its initial attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The effectiveness of these approaches &lt;strong&gt;critically depends on problem difficulty&lt;/strong&gt; - easier problems benefit more from parallel exploration (branching), while harder problems require sequential refinement (editing).&lt;/p&gt;
&lt;h4 id=&#34;difficulty-aware-compute-allocation&#34;&gt;Difficulty-Aware Compute Allocation&lt;/h4&gt;
&lt;p&gt;A key insight from recent research is that &lt;strong&gt;optimal test-time strategies vary dramatically with problem difficulty&lt;/strong&gt;. This motivates &lt;strong&gt;adaptive allocation&lt;/strong&gt; strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy problems&lt;/strong&gt;: Simple best-of-N sampling with minimal compute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium problems&lt;/strong&gt;: Weighted voting or beam search with moderate compute budgets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard problems&lt;/strong&gt;: Sequential revision with larger compute budgets, but diminishing returns beyond a threshold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This difficulty-aware approach enables &lt;strong&gt;4× efficiency improvements&lt;/strong&gt; over uniform compute allocation strategies.&lt;/p&gt;
&lt;h3 id=&#34;17-external-tools-inside-the-reasoning-loop&#34;&gt;1.7 External tools inside the reasoning loop&lt;/h3&gt;
&lt;p&gt;Several steps in a chain can be offloaded to exact tools (e.g., code execution, math). Approaches like PAL (program-aided language model) and CoC (Chain-of-Code) let the model “think” by writing and running code; ReAct interleaves search (e.g., Wikipedia) with thoughts. Recent o-series releases similarly intertwine web, code, and vision tools during reasoning. This improves robustness on math, algorithmic tasks, and multi-hop QA – without asking the LLM to emulate a compiler.&lt;/p&gt;
&lt;h4 id=&#34;pal&#34;&gt;PAL&lt;/h4&gt;
&lt;p&gt;Program-Aided Language Models (PAL) are an approach where LLMs address reasoning tasks by generating Python code rather than relying solely on natural language. This method utilizes programming to manage complex logic and calculations, aiming to decrease errors and improve results on benchmarks such as GSM8K and MATH.
PAL’s architecture is modular and interpretable, with the LLM functioning as a code generator and the Python interpreter serving as the reasoning engine. This clear separation improves debugging, verification, and extensibility, enhancing transparency and reproducibility. By combining symbolic reasoning with neural language modeling, PAL provides a hybrid approach that is both effective and practical.&lt;/p&gt;
&lt;h4 id=&#34;coc&#34;&gt;CoC&lt;/h4&gt;
&lt;p&gt;Chain of Code (CoC) is a method that expands code-driven reasoning in LLMs by using a hybrid execution strategy. In contrast to traditional methods that rely exclusively on interpretable code or natural language reasoning, CoC enables models to generate programs combining executable code with semantic pseudocode. When the interpreter encounters undefined or non-executable behavior, such as abstract functions like &lt;code&gt;detect_sarcasm(string)&lt;/code&gt;, CoC uses an &amp;ldquo;LMulator&amp;rdquo;, which is a language model-based emulator that predicts the expected output. This approach allows LLMs to process tasks involving both algorithmic and semantic elements.&lt;/p&gt;
&lt;p&gt;By “thinking in code” CoC greatly expands the range of problems it can solve, surpassing Chain of Thought and other baseline methods on benchmarks like BIG-Bench Hard, where it reached an 84% success rate—12% higher than CoT. Its modular structure adapts well to different model sizes and fields, making it particularly suitable for tasks in robotics, perception, and mixed-modality reasoning. The use of flexible pseudocode and fallback emulation strategies provides a strong foundation for developing more generalizable and interpretable AI reasoning.&lt;/p&gt;
&lt;p&gt;In summary, &lt;strong&gt;reasoning AI models&lt;/strong&gt; distinguish themselves by &lt;em&gt;how&lt;/em&gt; they solve problems. They use explicit multi-step reasoning (often visible as a chain-of-thought) and are trained with techniques (special prompts, reward signals, data curation) to make this effective. In doing so, they often achieve higher accuracy on complex tasks than traditional LLMs of comparable (or even much larger) size. The cost is greater complexity in training and sometimes in usage. We next discuss how one can adapt and fine-tune these models, and the pitfalls to watch out for.&lt;/p&gt;
&lt;h2 id=&#34;2-adapting-and-fine-tuning-reasoning-models&#34;&gt;2. Adapting and Fine-Tuning Reasoning Models&lt;/h2&gt;
&lt;p&gt;Similar to LLMs, reasoning models can also be fine-tuned or adapted to specific domains and tasks. A key advantage is that they can be &lt;em&gt;domain-specialized&lt;/em&gt; while retaining strong reasoning skills.&lt;/p&gt;
&lt;p&gt;For example, if you have a reasoning LLM and you want it to excel at medical diagnostics, you could fine-tune it on medical Q&amp;amp;A data that includes step-by-step reasoning about symptoms and lab results. The model should, in principle, retain its general logical abilities and learn to apply them in the medical context. Fine-tuning can also help a model learn when to engage reasoning mode – e.g., always do detailed reasoning for high-stakes medical questions, but perhaps skip it for trivial prompts if instructed.&lt;/p&gt;
&lt;p&gt;However, adapting a reasoning model is more complex than fine-tuning a regular LLM because you need to handle the reasoning traces properly. A key question is whether the fine-tuning data includes chains of thought or just question→answer pairs.
Generally, to preserve and leverage the model’s strength, you want to fine-tune with the reasoning format intact. That means if your dataset doesn’t already have human-written rationales, you may need to generate them (possibly using a larger teacher model like R1 or GPT-4 to produce explanations for your domain problems). By training on QA pairs supplemented with correct reasoning sequences, you reinforce the model’s inclination to think things through.&lt;/p&gt;
&lt;p&gt;There is a subtle issue, though; if your fine-tuning data’s reasoning traces are of &lt;em&gt;lower quality&lt;/em&gt; than the model’s current capability (for instance, you provide simplistic or even flawed reasoning examples), you might hurt performance. It’s like training a math student who can solve calculus problems to only practice arithmetic – they might lose their edge in advanced problem solving.&lt;/p&gt;
&lt;h4 id=&#34;21-loss-masking&#34;&gt;2.1 Loss Masking&lt;/h4&gt;
&lt;p&gt;One approach is called loss masking, which involves including reasoning steps in the input/output during fine-tuning so the model learns to produce them, but not applying back-prop loss on those reasoning tokens. So, fine-tuning gradients is applied only to the final answer portion, rather than the whole CoT text. This allows us to adjust the model’s final answers for a new domain while minimizing changes to its internal reasoning process.
The rationale is that the model’s existing reasoning ability, developed through prior training, should be maintained. The technique allows the model to retain its established reasoning while modifying how it presents final answers. Initial community observations indicate this approach can help preserve the quality of the model’s reasoning after fine-tuning. However, it may not be necessary if the fine-tuned dataset is large and of high quality.&lt;/p&gt;
&lt;h4 id=&#34;22-prompt-based-fine-tuning&#34;&gt;2.2 Prompt-Based Fine-Tuning&lt;/h4&gt;
&lt;p&gt;Another approach when working with limited data is to use prompt-based fine-tuning or instruction prompts. Since reasoning models already respond to prompts like “show your reasoning, then answer,” you might not need to change their weights at all for some custom tasks – providing a few exemplars with reasoning in a prompt might suffice (few-shot learning). If actual fine-tuning is needed (e.g., to integrate new knowledge or jargon), lightweight methods like LoRA adapters can be applied in principle. One must ensure the prompt format (the presence of &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; tags or special tokens) is consistent during fine-tuning to prevent the model from being confused about when to produce reasoning. Many open implementations of reasoning models require a specific format to trigger the chain of thought. Adhering to that format in any further training data is important.&lt;/p&gt;
&lt;p&gt;In summary, adapting a reasoning LLM is doable but requires careful dataset design. Ideally, your fine-tuning set should contain high-quality problem-solving examples with the full reasoning shown. If you don’t have that, you might generate it or opt to preserve the pre-trained reasoning behavior via techniques like masking. One should also monitor if the model starts to skip reasoning; if it does, this could indicate that the fine-tuning data encouraged direct answers only. Balancing task specialization with maintained reasoning capability is key.&lt;/p&gt;
&lt;p&gt;Next, let&amp;rsquo;s examine the challenges that may arise during this fine-tuning and customization process.&lt;/p&gt;
&lt;h4 id=&#34;practical-compute-budget-guidelines&#34;&gt;Practical Compute Budget Guidelines&lt;/h4&gt;
&lt;p&gt;Recent empirical analysis provides concrete guidance for practitioners:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Budget allocation&lt;/strong&gt;: Treat test-time compute as a first-class resource requiring explicit budgeting and monitoring&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Difficulty prediction&lt;/strong&gt;: Use learned difficulty predictors to route problems to appropriate compute strategies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diminishing returns&lt;/strong&gt;: Most benefits come from the first 100-300 reasoning tokens; beyond that, returns diminish rapidly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost-performance optimization&lt;/strong&gt;: Smaller models with sophisticated inference can achieve Pareto-optimal trade-offs compared to larger models with simple inference&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-challenges-in-fine-tuning-and-customizing-reasoning-models&#34;&gt;3. Challenges in Fine-Tuning and Customizing Reasoning Models&lt;/h2&gt;
&lt;p&gt;Adapting reasoning models to new tasks comes with unique challenges beyond those in standard LLM fine-tuning. These challenges span technical issues inherent to the models’ reasoning nature, as well as organizational hurdles in data and expertise. Let us explore some of the key challenges.&lt;/p&gt;
&lt;h3 id=&#34;31-trace-quality-degradation&#34;&gt;3.1 Trace Quality Degradation&lt;/h3&gt;
&lt;p&gt;A major technical concern is &lt;em&gt;preserving the quality of the reasoning trace&lt;/em&gt;. Fine-tuning, if done either poorly or used on narrow data, can cause the model’s CoT to become less coherent or less faithful to its actual reasoning. Recent research shows that after fine-tuning on specific tasks, the faithfulness of a model’s CoT explanations often decreases, on average, compared to the pre-finetuned model. In other words, the model might still provide accurate answers, but its stated reasoning is more likely to omit key steps or include spurious ones. This “trace degradation” can occur because the fine-tuning objective typically emphasizes obtaining the correct final answer for the new task – the model may learn that it can score well without strictly adhering to its original reasoning style.&lt;/p&gt;
&lt;p&gt;In addition, if the fine-tune dataset isn’t sufficiently diverse or is missing the intermediate logic, the model’s previously polished reasoning abilities can “unravel” or get overwritten. It’s akin to using coarse sandpaper after a fine polish – the model may lose some of its nuanced problem-solving steps. Ensuring that fine-tuning does not erase the chain-of-thought skill is a complex and challenging task.&lt;/p&gt;
&lt;p&gt;Techniques like the aforementioned loss masking or multi-stage fine-tuning (where you intermix some original reasoning training data) are used to mitigate this. Another aspect of trace quality is faithfulness – even if the model produces a plausible-looking rationale, is it honestly reflecting how the answer was derived? Fine-tuning can sometimes widen the gap between what the model &lt;em&gt;does&lt;/em&gt; to get an answer and what it &lt;em&gt;says&lt;/em&gt; in the explanation, especially if the fine-tuning introduces shortcut ways to get the answer. This is hard to detect; it requires careful evaluation (as we discuss later).&lt;/p&gt;
&lt;p&gt;Overall, maintaining a &lt;em&gt;correct and faithful reasoning trace&lt;/em&gt; under new training pressures is a key challenge.&lt;/p&gt;
&lt;h3 id=&#34;32-overfitting-and-distribution-shift&#34;&gt;3.2 Overfitting and Distribution Shift&lt;/h3&gt;
&lt;p&gt;Like any model, a reasoning LLM can overfit to a small fine-tune dataset, but the consequences here might be strange. An overfit model might memorize specific solution patterns and fail to generalize its reasoning to slightly new problems (losing one of the main advantages of a reasoning approach). Because these models were often trained on a wide variety of reasoning tasks, fine-tuning on a narrow domain (say, only physics puzzles) might reduce their versatility or even accuracy on reasoning problems outside that niche.&lt;/p&gt;
&lt;p&gt;Small, high-quality reasoning datasets can improve models, but if applied naively, they can also reduce performance on broader evaluations. The model may become too narrowly focused in its thought process (e.g., always expecting a specific style of solution). Ensuring the fine-tuning data covers enough variation or using regularization techniques (such as mixout or weight decay on reasoning layers) can help counteract this, but it remains a delicate balancing act.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;LIMA&lt;/em&gt; shows that ~1k carefully curated examples can generalize well, and &lt;em&gt;LIMO&lt;/em&gt; finds that ~800 math-reasoning samples yield large gains when the data is selected thoughtfully. However, a narrow or naïve fine-tuning can backfire—studies report &lt;strong&gt;catastrophic forgetting&lt;/strong&gt; and degraded &lt;strong&gt;out-of-distribution&lt;/strong&gt; robustness, as well as a &lt;strong&gt;drop in CoT faithfulness&lt;/strong&gt; after fine-tuning. This can be mitigated with regularization (e.g., &lt;strong&gt;Mixout&lt;/strong&gt;, &lt;strong&gt;layer-wise noise-stability&lt;/strong&gt;) and optimization that &lt;strong&gt;flattens the loss landscape&lt;/strong&gt; (e.g., &lt;strong&gt;SAM&lt;/strong&gt;), and keep the fine-tune mix diverse to avoid over-specialization.&lt;/p&gt;
&lt;h3 id=&#34;33-training-stability-and-long-outputs&#34;&gt;3.3 Training Stability and Long Outputs&lt;/h3&gt;
&lt;p&gt;Fine-tuning with long CoT outputs (which can be thousands of tokens) can lead to stability issues in training. Gradient updates on very long sequences might cause more variance or instabilities in convergence. Moreover, suppose one uses reinforcement learning (e.g., to further optimize a reasoning model with a reward for correct answers). In that case, the credit assignment is complex – which part of a 100-step reasoning deserves credit or blame for the outcome?&lt;/p&gt;
&lt;p&gt;Instabilities like &lt;strong&gt;mode collapse&lt;/strong&gt; (where the model’s outputs become strangely repetitive or nonsensical) or oscillating performance have been observed if the RL reward model is poorly aligned. For example, in one training run, simply increasing the reward for “correct final answer” without properly balancing the reward for good reasoning steps caused the model to exploit quirks – it started producing minimal reasoning and guessing answers to game the reward, leading to a drop in overall logical correctness.&lt;/p&gt;
&lt;p&gt;Researchers working on Phi-4 and others have had to introduce tricks to &lt;strong&gt;stabilize RL training&lt;/strong&gt;, such as gradually increasing the allowed reasoning length, filtering out bad traces, or adjusting reward scaling. These measures highlight that straightforward fine-tuning or RL on a reasoning model can easily go off-track if the optimization isn’t carefully managed. In essence, teaching a model &lt;em&gt;how to think&lt;/em&gt; is a more delicate process than teaching it &lt;em&gt;what to say&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;34-reward-alignment-and-hacks&#34;&gt;3.4 Reward Alignment and “Hacks”&lt;/h3&gt;
&lt;p&gt;Aligning a reasoning model with human preferences or task-specific rewards can be tricky – there’s a risk of &lt;strong&gt;reward hacking&lt;/strong&gt; and unintended behaviors. An illustrative scenario was described by researchers at Anthropic: they gave a reasoning model (Claude 3.7 and DeepSeek R1) a series of multiple-choice questions with a twist – a hidden “hint” in the prompt sometimes told the model to choose a wrong answer (and they rewarded the model for following that hint). The models learned to exploit this to earn reward points, selecting the hinted-at wrong answers, but &lt;strong&gt;their chain of thought never acknowledged the malicious hint&lt;/strong&gt;. They would generate a detailed (fake) reasoning to justify the wrong answer, rather than saying “I chose this because I was hinted at.” This is a dramatic example of a model &lt;em&gt;gaming the objective&lt;/em&gt;: the training set or reward said “getting this answer is good,” so it did. Still, it also learned to hide the true reason, presenting a facade of coherent reasoning.&lt;/p&gt;
&lt;p&gt;Such behavior is misaligned with the intent (we want the model to be truthful in its reasoning). This experiment highlights the importance of aligning the process of reasoning as much as the outcome. If a reward model only considers the correctness of the final answer, it may sacrifice honesty or thoroughness in the reasoning process.&lt;/p&gt;
&lt;p&gt;Conversely, suppose you over-emphasize a reward for producing very detailed reasoning. In that case, the model might start outputting verbose, mostly correct-sounding monologues that don’t lead to a better answer (effectively optimizing the wrong metric). Achieving the right alignment – so that the model is rewarded for correct and &lt;strong&gt;genuinely helpful&lt;/strong&gt; reasoning – is an open challenge. It often requires iterative human feedback, custom reward functions (e.g., penalize logical leaps or unsupported claims in the trace), and careful validation. Without these, one might end up with a model that &lt;em&gt;appears&lt;/em&gt; to reason well but is just skilled at &lt;strong&gt;“output grooming”&lt;/strong&gt; – formatting answers to look good rather than being correct.&lt;/p&gt;
&lt;h3 id=&#34;35-data-quality-and-availability&#34;&gt;3.5 Data Quality and Availability&lt;/h3&gt;
&lt;p&gt;On the organizational side, fine-tuning a reasoning model demands &lt;strong&gt;high-quality training data&lt;/strong&gt; that includes reasoned solutions. Such data can be difficult to obtain. At the same time, there are public datasets for math proofs or logical reasoning (e.g., MATH, GSM8K, etc.), but many domains (legal reasoning, financial analysis, medical diagnostics) don’t have readily available step-by-step annotations in large quantities.&lt;/p&gt;
&lt;p&gt;Teams often have to generate this data synthetically (using a larger model to produce reasoning traces and then filtering them) or invest in expert annotations. The quality of these traces is paramount – noisy or incorrect reasoning examples can confuse the model or teach it bad habits. As discussed earlier, even small, curated datasets (on the order of hundreds of examples) have been shown to improve reasoning if they are extremely well-targeted; however, curating such datasets is a specialized skill.&lt;/p&gt;
&lt;p&gt;In practice, fine-tuning a reasoning model involves a lot of &lt;em&gt;tooling&lt;/em&gt;, ranging from running automatic proof checkers to verify steps, using consistency checks, or employing human reviewers to label where a model’s synthetic reasoning went wrong. This is a step up in complexity from preparing a straightforward prompt→response dataset.&lt;/p&gt;
&lt;h3 id=&#34;36-tooling-and-infrastructure&#34;&gt;3.6 Tooling and Infrastructure&lt;/h3&gt;
&lt;p&gt;Working with long CoT and multi-stage training means that the training pipelines will need modification. For instance, standard training code may need to be adapted to handle special tokens (e.g., &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; segments might need masking if needed), or to log and evaluate not just final answers but also intermediate step accuracy during training.&lt;/p&gt;
&lt;p&gt;Debugging a reasoning model can be more involved – you might want to watch how its reasoning changes epoch by epoch, which requires custom logging or visualization tools. Moreover, these models often have large context windows (since they need to handle long reasoning sequences, e.g., 16K or 32K tokens). Fine-tuning with such long contexts can demand more GPU memory and faster I/O. Not all training frameworks efficiently support extremely long sequences out of the box.&lt;/p&gt;
&lt;p&gt;Evaluation tooling (to be discussed later) can also be considered—a possible approach is integrating an automated verifier into the training loop to assess the model’s reasoning steps and provide targeted feedback, which is a type of process supervision. Implementing this involves technical complexity and remains an ongoing area of research. Overall, organizations seeking to customize a reasoning model should be aware that the training workflow may be more complex than a standard LLM fine-tuning process.&lt;/p&gt;
&lt;h3 id=&#34;37-expertise&#34;&gt;3.7 Expertise&lt;/h3&gt;
&lt;p&gt;Fine-tuning reasoning models demands both machine learning expertise and domain knowledge, often requiring multidisciplinary teams. Since reasoning LLMs are new, practitioners face a steep learning curve with frequent trial and error.&lt;/p&gt;
&lt;p&gt;Expect several iterations to balance concise and detailed responses; objectives or examples may need adjustment throughout the process. Rigorous testing is essential, especially in high-stakes applications like medical or legal fields, making reliability and interpretability critical. Typically, 10–12 rounds of tuning are required to achieve an optimal model.&lt;/p&gt;
&lt;p&gt;Organizations typically use a hybrid strategy: starting with a robust base model (such as o1-mini or Phi-4-Reasoning), applying minimal tuning, and relying on prompts and few-shot learning for specificity. When deeper customization is required, it&amp;rsquo;s best to use reliable data, maintain reasoning formats, monitor trace fidelity, and integrate human feedback. Success yields a strong analytical tool, but the process is more complex than for general chatbots.&lt;/p&gt;
&lt;p&gt;A key part of customization is the ability to evaluate the reasoning models. Let us dig into specialized evaluation strategies required to assess not just &lt;em&gt;what&lt;/em&gt; a reasoning model answers, but &lt;em&gt;how&lt;/em&gt; it arrives at that answer.&lt;/p&gt;
&lt;h2 id=&#34;4-evaluation-strategies-for-reasoning-models&#34;&gt;4. Evaluation Strategies for Reasoning Models&lt;/h2&gt;
&lt;p&gt;Traditional LLM evaluation – e.g., measuring accuracy on a Q&amp;amp;A or using BLEU scores for text – may not capture the full picture when a model is effectively performing a multi-step reasoning process. Evaluating reasoning-oriented LLMs requires going beyond the final answer, incorporating metrics that assess both the process and quality of reasoning. This represents a departure from traditional LLM evaluation, which typically treats the model as a black box that produces an answer or text, which we then compare to a reference or expected output.&lt;/p&gt;
&lt;p&gt;For reasoning models, we care about questions like: &lt;em&gt;Did the model’s CoT follow a correct logical path? Is it telling the truth about its reasoning? How efficient is its reasoning?&lt;/em&gt; Below are key evaluation strategies and metrics that have emerged for reasoning models, contrasted with traditional approaches:&lt;/p&gt;
&lt;h3 id=&#34;41-outcome-vs-process-evaluation&#34;&gt;4.1 Outcome vs. Process Evaluation&lt;/h3&gt;
&lt;p&gt;In traditional AI evaluation, we mostly judge the &lt;em&gt;outcome&lt;/em&gt; (e.g., did the model get the correct answer to a question). With reasoning models, researchers perform &lt;strong&gt;dual evaluations&lt;/strong&gt; – one for the outcome &lt;em&gt;and&lt;/em&gt; one for the reasoning steps. An outcome evaluation may be identical to a standard LLM test, where the goal is to verify if the final answer is correct (exact match, F1 score, multiple-choice accuracy, etc.). The process evaluation, however, examines the intermediate steps of the solution.&lt;/p&gt;
&lt;p&gt;For instance, a math word problem benchmark might not only check the answer but also parse the model’s step-by-step solution and verify each part. An emerging method is to use an automated judge (which can be another LLM) to analyze the CoT and flag errors or leaps in logic. One example being a recent benchmark called &lt;em&gt;MM-MATH&lt;/em&gt; (for multimodal math problems); in this, an LLM-based evaluator looks at each step of a model’s solution, comparing it to the ground truth solution, and classifies errors (e.g., “incorrect algebraic simplification” vs “misinterpreted the diagram”).&lt;/p&gt;
&lt;p&gt;This kind of fine-grained process evaluation provides insights into &lt;em&gt;where&lt;/em&gt; a model’s reasoning fails, not just whether the final answer is wrong. This is useful because a reasoning model might get the right answer for the wrong reasons (i.e., it had a reasoning flaw), or vice versa – it might have mostly correct reasoning but a minor slip at the end leading to a wrong answer. Traditional single-score metrics would miss this nuance.&lt;/p&gt;
&lt;h3 id=&#34;42-chain-of-thought-faithfulness-metrics&#34;&gt;4.2 Chain-of-Thought Faithfulness Metrics&lt;/h3&gt;
&lt;p&gt;As discussed earlier, &lt;em&gt;faithfulness&lt;/em&gt; refers to whether the model’s stated reasoning accurately reflects its actual internal reasoning (or use of information). One way to test this is to insert known information (or traps) into the context and see if the model admits it.&lt;/p&gt;
&lt;p&gt;For example, Anthropic’s experiment provided the model with hidden hints (sometimes incorrect) and then checked if the model’s explanation mentioned using those hints. They derived a metric: the percentage of solutions where the model was &lt;em&gt;truthful&lt;/em&gt; about using the hint. Claude 3.7 was only ~25% faithful in their setup, and DeepSeek R1 was about 39% – meaning in the majority of cases, they used the hint but didn’t reveal it in the reasoning chain. This indicates that the CoT was often &lt;em&gt;unfaithful&lt;/em&gt;, presumably because the model’s training taught it always to sound logical and self-contained, even if it took a shortcut.&lt;/p&gt;
&lt;p&gt;Another way to measure faithfulness is to check consistency under variations: if a model truly is reasoning step by step, then if we force it to reveal steps, it should arrive at the same answer as when it’s not forced. If hiding the CoT changes the answer frequently, it might suggest the model’s explanations were more post-hoc and not driving the answer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; These evaluations are still an active research area – unlike a simple accuracy score, faithfulness is somewhat difficult to quantify, but it’s crucial for trust. When deploying a reasoning model, you’d like to trust that, say, a financial analysis it provides is actually how it came to its conclusion, not a fabricated rationale. Thus, papers often report the percentage of solutions with “fully faithful reasoning” by manual or automated inspection. If that percentage is low, it’s a red flag: the model’s reasoning output might be more for show. Improving this might involve further training (e.g., penalizing inconsistent rationales) or architectural changes; however, at the very least, we need to measure it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;43-token-normalized-accuracy-efficiency&#34;&gt;4.3 Token-Normalized Accuracy (Efficiency)&lt;/h3&gt;
&lt;p&gt;Because reasoning models can use an arbitrary number of tokens to reason (within the context window limits, of course), we want to measure &lt;strong&gt;accuracy as a function of reasoning length&lt;/strong&gt; – effectively, &lt;em&gt;how efficiently does a model reach correct answers?&lt;/em&gt; For example, a model that gets 90% accuracy with 2K tokens of reasoning might be less desirable than one that gets 85% accuracy with only 1K tokens, depending on deployment constraints.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Token-normalized accuracy&lt;/em&gt; is a metric that attempts to penalize overly lengthy reasoning. In one formulation (used in some multiple-choice evaluations), it computes the probability of a correct answer, normalized by the length (i.e., the number of tokens) of that answer’s explanation or output. More generally, we can think of it as &lt;em&gt;accuracy per 100 reasoning tokens&lt;/em&gt; or similar.&lt;/p&gt;
&lt;p&gt;Another interpretation is to measure the area under the curve of accuracy versus the number of tokens allowed. For example, allow a model to think with 100 tokens, record the accuracy, then 200 tokens, 500 tokens, and so on, up to a certain limit – and see which model yields the best accuracy for the least token budget. Researchers have explicitly emphasized the goal of &lt;strong&gt;maximizing accuracy per token&lt;/strong&gt; in reasoning scenarios.&lt;/p&gt;
&lt;p&gt;This reflects practical concerns: in production, reasoning steps are costly - both in terms of latency and tokens (i.e, money). A model that uses half the steps to reach the same answer is effectively twice as fast. Moreover, sometimes unconstrained reasoning leads to diminishing returns or even errors—for example, a model might start wandering or overexplaining if it “thinks” too long. Thus, token-normalized metrics encourage models that use their reasoning budget optimally.&lt;/p&gt;
&lt;p&gt;A simple implementation is to take the total tokens the model generated for all test problems and divide them by the number of correct answers. Then, compare models on this normalized score (lower tokens per correct answer is better).&lt;/p&gt;
&lt;p&gt;Another approach is a normalized log-probability where longer outputs are penalized. In any case, this kind of metric was usually irrelevant for standard LLMs (which output a single short answer), but becomes important when evaluating the cost-effectiveness of reasoning models.&lt;/p&gt;
&lt;h3 id=&#34;44-stepwise-accuracy-and-consistency&#34;&gt;4.4 Stepwise Accuracy and Consistency&lt;/h3&gt;
&lt;p&gt;This is a more granular evaluation of the correctness of the reasoning chain. For tasks where we have ground-truth step-by-step solutions (like a math proof or a formal logic derivation), we can mark each step of the model’s chain as “correct” or “incorrect” compared to an expected solution. This yields a sequence of accuracy values (e.g., getting the first three steps right, but failing at step four). We can then compute metrics like &lt;em&gt;average step accuracy&lt;/em&gt;, or &lt;em&gt;percentage of solutions that made it to at least X steps correct before failing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is informative because two models might both solve 70% of problems, but one might always fail early on the 30% it can’t solve, whereas another might almost solve everything and only slip at the end for those 30%. Stepwise evaluation can reveal such differences. It also helps in evaluating &lt;strong&gt;partial credit&lt;/strong&gt; – maybe a model didn’t get the final answer but did significant parts correctly (which might be useful in applications where a human or another tool can pick up from the middle).&lt;/p&gt;
&lt;p&gt;Some evaluations also check &lt;strong&gt;consistency&lt;/strong&gt;: if a model is asked to explain its answer vs. directly answer, do those agree? If it solves a problem in two different ways (maybe by reordering steps or under different prompts), does it reach the same conclusion? Consistency checks can catch cases where the reasoning process is brittle or overly sensitive to phrasing.&lt;/p&gt;
&lt;h3 id=&#34;45-automated-reasoning-critics-llm-as-a-judge&#34;&gt;4.5 Automated Reasoning Critics (LLM-as-a-judge)&lt;/h3&gt;
&lt;p&gt;A practical framework that has gained traction is using a strong language model to &lt;strong&gt;evaluate the reasoning of another model (or even itself)&lt;/strong&gt;. For instance, one can prompt GPT-4 with: &lt;em&gt;“Here is a chain-of-thought and an answer. Evaluate the correctness and logical validity of the reasoning, and whether the final answer is justified.”&lt;/em&gt; This uses the fact that cutting-edge models can often spot obvious reasoning errors or missing justifications in a solution that a simpler rubric might miss.&lt;/p&gt;
&lt;p&gt;Such LLM-based evaluators can be more flexible than hard-coded checkers. The aforementioned process evaluators in research are essentially reasoning models used as judges, with the ability to allocate extra computational resources to evaluate each step carefully. In one study, researchers found that when they allowed an evaluator model to think more (generate a longer evaluation reasoning), its accuracy in judging solutions improved monotonically – much like how making a model think more improves problem-solving, it also improves evaluation quality.&lt;/p&gt;
&lt;p&gt;This is a fascinating recursive idea: use a reasoning model to evaluate better outputs that themselves involve reasoning. It was even shown that using such process-aware evaluators to &lt;strong&gt;re-rank answers&lt;/strong&gt; (choosing the answer that the evaluator model scores highest) can significantly improve the solving ability of the base model.&lt;/p&gt;
&lt;p&gt;In summary, &lt;strong&gt;process evaluation frameworks&lt;/strong&gt; often involve an LLM evaluator performing a two-level check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outcome evaluation (is the final answer correct?)&lt;/li&gt;
&lt;li&gt;Process evaluation (are the steps valid and do they lead to that answer?).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By combining these, one gets a more robust assessment. This approach complements traditional metrics; for example, you might report that a model has 80% outcome accuracy, but according to an LLM judge, only 50% of its solutions were fully correct with no logical errors in any step. That tells a deeper story than 80% alone.&lt;/p&gt;
&lt;h3 id=&#34;46-illustrative-example&#34;&gt;4.6 Illustrative Example&lt;/h3&gt;
&lt;p&gt;To illustrate, consider a concrete example: say we ask a model a puzzle and it answers with a 5-step reasoning chain. The final answer is correct, so outcome-wise it’s a success. However, upon evaluation, we found that an arithmetic mistake occurred in step 3, which fortunately canceled out in step 5, yielding the correct answer nonetheless. A pure outcome metric says “perfect solution”. A process-aware evaluation would ding this as flawed reasoning (the model got lucky or coincidentally correct) – something we’d want to know if using the model for, say, validating scientific calculations. Conversely, if a model’s final answer is wrong, traditional evaluation is 0 for that question. However, process evaluation might reveal that the model was correct up until the last step – perhaps it performed all the reasoning correctly and made an error at the end.&lt;/p&gt;
&lt;p&gt;In a human-learning context, you’d give partial credit. For model evaluation, noting that the model was, say, “90% correct in the procedure” could inform how we attempt to improve it (perhaps it just needs a slight boost in arithmetic precision or a final double-check step). This rich information is only available if we evaluate the reasoning, not just the outcome.&lt;/p&gt;
&lt;p&gt;For practitioners, incorporating these evaluations is vital, as they help ensure that a high-performing reasoning model isn’t just getting by with smoke and mirrors (or hidden cues), and they quantify the efficiency and transparency of the model’s problem-solving approach. As these models become more integrated into workflows (e.g., as AI reasoning assistants), having reliable evaluation methodologies will also be key for &lt;strong&gt;governance and trust&lt;/strong&gt; – one might, for example, require that a model’s chain-of-thought passes a certain automated consistency check before its answer is shown to a user.&lt;/p&gt;
&lt;p&gt;In summary, the evaluation of reasoning LLMs has evolved to include &lt;strong&gt;trace-centric metrics&lt;/strong&gt; alongside traditional outcome metrics. We assess the &lt;em&gt;faithfulness&lt;/em&gt; of their explanations, measure accuracy in a way that accounts for the &lt;em&gt;cost of reasoning length&lt;/em&gt;, and use novel frameworks where models critique reasoning steps (providing a “process score”).&lt;/p&gt;
&lt;h2 id=&#34;5-safety-concerns-and-vulnerabilities&#34;&gt;5. Safety Concerns and Vulnerabilities&lt;/h2&gt;
&lt;p&gt;While reasoning models offer powerful capabilities, they also introduce new safety concerns and vulnerabilities that must be carefully managed and addressed. The very features that make these models effective – their ability to generate detailed CoT and reason through complex problems – can also be exploited by malicious actors or lead to unintended behaviors. Below, we discuss some of the key safety challenges specific to reasoning AI models.&lt;/p&gt;
&lt;h3 id=&#34;51-reward-hacking-and-training-vulnerabilities&#34;&gt;5.1 Reward Hacking and Training Vulnerabilities&lt;/h3&gt;
&lt;p&gt;Reward hacking represents a significant concern in reasoning model development, particularly given their reliance on reinforcement learning during training. Reward hacking occurs when &amp;ldquo;a RL agent exploits flaws or ambiguities in the reward function to achieve high rewards, without genuinely learning or completing the intended task&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In the context of LLMs trained with RLHF, reward hacking manifests when models learn to game evaluation metrics rather than genuinely improve at the intended tasks. This is particularly concerning for reasoning models, where the complexity of the reasoning process makes it difficult to specify comprehensive reward functions that capture all aspects of good reasoning.&lt;/p&gt;
&lt;p&gt;For example, a reasoning model might discover that providing overly verbose explanations leads to higher evaluation scores, even if those explanations are not genuinely helpful or accurate. This could incentivize the model to generate long-winded responses that obfuscate its actual reasoning process, ultimately undermining the quality of its outputs.&lt;/p&gt;
&lt;h3 id=&#34;52-jail-breaking-and-safety-mechanism-vulnerabilities&#34;&gt;5.2 Jail-breaking and Safety Mechanism Vulnerabilities&lt;/h3&gt;
&lt;p&gt;Recent research has revealed severe vulnerabilities in the safety mechanisms of reasoning models. The Hijacking Chain-of-Thought (H-CoT) attack method demonstrates how attackers can &amp;ldquo;leverage the model&amp;rsquo;s own displayed intermediate reasoning to jailbreak its safety reasoning mechanism&amp;rdquo;. Under such attacks, refusal rates in models like OpenAI&amp;rsquo;s o1 drop dramatically, &amp;ldquo;from 98% to below 2%&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The Malicious-Educator benchmark exposes how &amp;ldquo;extremely dangerous or malicious requests&amp;rdquo; can be disguised &amp;ldquo;beneath seemingly legitimate educational prompts&amp;rdquo;. This research reveals that &amp;ldquo;attackers can easily extract criminal strategies from DeepSeek-R1 and Gemini 2.0 Flash Thinking without any additional tricks&amp;rdquo;, highlighting fundamental vulnerabilities in current safety approaches.&lt;/p&gt;
&lt;p&gt;In addition, the ability of reasoning models to generate detailed CoT can be weaponized by attackers to create more convincing prompts that bypass safety filters. This raises the stakes for ensuring that safety mechanisms are robust and capable of handling sophisticated manipulation attempts.&lt;/p&gt;
&lt;h3 id=&#34;53-alignment-challenges-in-reasoning-systems&#34;&gt;5.3 Alignment Challenges in Reasoning Systems&lt;/h3&gt;
&lt;p&gt;The integration of reasoning capabilities creates new alignment challenges. While reasoning models can &amp;ldquo;reason about our safety policies in context when responding to potentially unsafe prompts, through deliberative alignment&amp;rdquo;, this same capability can be exploited by sophisticated attacks. The transparency of reasoning processes, while beneficial for interpretability, also provides attack vectors that didn&amp;rsquo;t exist in traditional LLMs.&lt;/p&gt;
&lt;p&gt;Research indicates that reasoning models still exhibit sensitivity to probability distributions from their training data, suggesting that &amp;ldquo;optimizing a language model for reasoning can mitigate but might not fully overcome the language model&amp;rsquo;s probability sensitivity&amp;rdquo;. This indicates that fundamental limitations from autoregressive training may persist even in reasoning-optimized systems.&lt;/p&gt;
&lt;h3 id=&#34;54-hallucination-in-reasoning-contexts&#34;&gt;5.4 Hallucination in Reasoning Contexts&lt;/h3&gt;
&lt;p&gt;Despite their enhanced reasoning capabilities, reasoning models continue to exhibit hallucination patterns, particularly in constraint satisfaction problems. Research on graph coloring tasks reveals that reasoning models are &amp;ldquo;prone to hallucinate edges not specified in the prompt&amp;rsquo;s description of the graph&amp;rdquo;. This phenomenon &amp;ldquo;persists across multiple problem complexity levels and semantic frames&amp;rdquo; and &amp;ldquo;appears to account for a significant fraction of the incorrect answers from every tested model&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;These findings suggest that reasoning models may have &amp;ldquo;broader issues with misrepresentation of problem specifics&amp;rdquo;, indicating that the enhanced reasoning capabilities don&amp;rsquo;t fully address fundamental issues with information fidelity and accuracy.&lt;/p&gt;
&lt;h3 id=&#34;55-scaling-and-efficiency-considerations&#34;&gt;5.5 Scaling and Efficiency Considerations&lt;/h3&gt;
&lt;p&gt;While reasoning models demonstrate impressive capabilities, they incur significant computational costs. The variable test-time compute approach means that complex problems can require substantially more resources than traditional LLM inference. This creates practical deployment challenges, particularly for applications requiring consistent response times.&lt;/p&gt;
&lt;p&gt;The relationship between reasoning quality and computational cost remains unclear. Research indicates that more thinking time generally leads to better performance, but the optimal allocation of computational resources across different problem types remains an active area of investigation.&lt;/p&gt;
&lt;h2 id=&#34;6-conclusion&#34;&gt;6. Conclusion&lt;/h2&gt;
&lt;p&gt;Reasoning AI models, such as o1, o3, R1, and Phi-4, mark a shift towards systems that execute algorithmic steps rather than relying purely on black-box prediction. Unlike traditional LLMs, these models leverage chain-of-thought reasoning, curated data, and advanced fine-tuning to solve complex tasks—though this comes with increased training and inference complexity.&lt;/p&gt;
&lt;p&gt;Fine-tuning reasoning models demands specialized methods and high-quality data, as their reasoning chains are both powerful and vulnerable to inconsistency or reward hacking. Effective deployment requires both technical expertise and organizational investment; however, the benefits include clearer explanations and deeper insights across domains such as finance and science.&lt;/p&gt;
&lt;p&gt;Evaluation now extends beyond final answers to include scrutiny of the reasoning process itself, using metrics such as trace faithfulness and process accuracy. This makes model behaviour more transparent and trustworthy.&lt;/p&gt;
&lt;p&gt;For practitioners, reasoning models become collaborative problem-solvers, offering logical breakdowns for tasks from coding to contract analysis. But maintaining reliable reasoning and avoiding hallucinations requires ongoing vigilance and tailored oversight.&lt;/p&gt;
&lt;p&gt;The center of gravity has shifted from &lt;em&gt;pick a reasoning model&lt;/em&gt; to &lt;em&gt;use a unified system with routed reasoning,&lt;/em&gt;’ with explicit controls for compute and explanation; this aligns with your agentic guidance and simplifies deployment ergonomics. In the near future, with this direction, we expect to see more robust state representations, verification-based training, and compositional planning; evaluate under router-aware, deception-aware protocols, and replicate Apple-style stress tests with fixed effort/latency budgets.&lt;/p&gt;
&lt;p&gt;The focus is shifting toward unified systems that route and manage reasoning explicitly, enabling robust evaluation and compositional planning. Reasoning AIs won’t replace standard LLMs everywhere, but they excel in high-stakes scenarios requiring transparency. As techniques mature, these models will become more stable and interpretable, merging pure reasoning with external tools and knowledge. Teams adopting these models should invest in robust pipelines and new evaluation metrics to realize the benefits of interpretable, verifiable solutions—a step forward for AI’s ability to explain not just what or when, but how and why.&lt;/p&gt;
&lt;h5 id=&#34;references&#34;&gt;References&lt;/h5&gt;
&lt;span style=&#34;font-size:0.7em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openai.com/index/introducing-gpt-5/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. Introducing GPT 5. Product overview and system card for GPT 5, including routed reasoning, effort/verbosity controls, and safety claims.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://platform.openai.com/docs/guides/latest-model&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. GPT 5 for developers. API parameters (reasoning_effort, verbosity), preamble planning, and large context.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/blog/gpt-5-in-azure-ai-foundry-the-future-of-ai-apps-and-agents-starts-here/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Azure AI. GPT 5 in Azure AI Foundry. Routing, reasoning controls, enterprise guidance.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2201.11903&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://machinelearning.apple.com/research/illusion-of-thinking&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Illusion of Thinking. Stress tests showing complexity collapse on algorithmic puzzles.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.12521v1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Inference-Time Computations for LLM Reasoning and Planning: A Benchmark and Insights
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://lilianweng.github.io/posts/2024-11-28-reward-hacking/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Reward Hacking in Reinforcement Learning.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.anthropic.com/research/reasoning-models-dont-say-think&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Reasoning models don&amp;rsquo;t always say what they think
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/pdf/2501.12948&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://qwenlm.github.io/blog/qwen3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Qwen3: Think Deeper, Act Faster
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/project/phi-4-reasoning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft. Phi 4 Reasoning documentation and evaluations.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/srush/awesome-o1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Awesome o1 (curated papers). Collected research on o1/o3 and reasoning models.
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2411.15594&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A Survey on LLM-as-a-Judge
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2504.17550&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HalluLens: LLM Hallucination Benchmark
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.youtube.com/watch?v=CjVQJdIrDJ0&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Thinking, Fast and Slow | Daniel Kahneman | Talks at Google
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.06772&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ReasonFlux: A Template-Driven Approach to Reasoning in LLMs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://codeforces.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Codeforces: A Major Competitive-Programming Platform
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/bespokelabs/Bespoke-Stratos-7B&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bespoke Labs: Bespoke-Stratos-7B
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/open-thoughts/OpenThinker3-7B&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Open Thoughts: OpenThings3-7B
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.11206&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMA: Less Is More for Alignment
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2311.13133&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMIT: Less Is More for Instruction Tuning Across Evaluation Paradigms
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.03387&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIMO: Less is More for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2406.04836&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Revisiting Catastrophic Forgetting in Large Language Model Tuning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2301.12715&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fine-Tuning Deteriorates General Textual Out-of-Distribution Detection by Distorting Task-Agnostic Features
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/1909.11299&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mixout: Effective regularization to finetune large-scale pre-trained language models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2203.11171&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Consistency Improves Chain of Thought Reasoning in Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2310.01798&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Large Language Models Cannot Self-Correct Reasoning Yet
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.00633&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Evaluation Guided Beam Search for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2305.20050&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let&amp;rsquo;s Verify Step by Step
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2408.00724&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Inference Scaling Laws: An Empirical Analysis of Compute-Optimal Inference for Problem-Solving with Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2501.19393&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		s1: Simple test-time scaling
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openreview.net/forum?id=Bw82hwg5Q3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Self-Evaluation Guided Beam Search for Reasoning
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2211.10435&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PAL: Program-aided Language Models
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://chain-of-code.github.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chain of Code: Reasoning with a Language Model-Augmented Code Emulator
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2408.03314&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scaling LLM Test-Time Compute Optimally can be More Effective than Scaling Model Parameters
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.19437&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek-V3 Technical Report
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://lilianweng.github.io/posts/2025-05-01-thinking/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Weng, Lilian. Why We Think. (Test-time compute, branching vs. revision, PRMs, scaling laws.)
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2504.16828&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Process Reward Models That Think (ThinkPRM).
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://openai.com/index/learning-to-reason-with-llms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI. Learning to reason with LLMs (o1).
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;
</description>
    </item>
    
    <item>
      <title>What is KV Cache in LLMs and How Does It Help?</title>
      <link>/post/2025/06/what-is-kv-cache-in-llms/</link>
      <pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/06/what-is-kv-cache-in-llms/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;
KV cache is a memory optimization central to efficient LLM inference. It enables faster, longer, and more cost-effective generation by caching previously computed attention keys and values—unlocking the practical deployment of models like GPT-4o, Llama 3, etc.&lt;/p&gt;
&lt;h3 id=&#34;1-introduction&#34;&gt;1. Introduction&lt;/h3&gt;
&lt;p&gt;Generative AI, powered largely today by Large language models (LLMs) such as GPT-4o, Llama 3, etc., is transforming AI applications, from chatbots to code assistants and multimodal reasoning. As these models scale in size and context length, inference becomes a major computational and memory challenge. The Key-Value (KV) cache is a pivotal optimization that enables practical, high-performance inference in modern transformer architectures.&lt;/p&gt;
&lt;p&gt;In my experience, after speaking with many individuals, including customers at work (mostly enterprises), I&amp;rsquo;ve found that most don’t fully understand what a KV cache is or why they should care. In this post, I aim to provide an overview of what KV cache is, how it helps, and outline some recent research innovations. I also have simple code samples for practical understanding.&lt;/p&gt;
&lt;p&gt;At the most basic level, a KV cache is a memory optimization technique used in LLMs to improve inference efficiency during generation. The KV cache stores the key and value tensors generated during the attention mechanism of transformer architectures, allowing models to avoid redundant computations when generating sequential text. To understand the KV cache, it&amp;rsquo;s essential to grasp how self-attention works in transformers.&lt;/p&gt;
&lt;h3 id=&#34;2-transformer-attention-and-the-role-of-kv-cache&#34;&gt;2. Transformer Attention and the Role of KV Cache&lt;/h3&gt;
&lt;p&gt;As part of the transformer architecture, the attention mechanism enables models to dynamically assess the importance of various elements in the input sequence and calculate relationships between input tokens through three components: queries (Q), keys (K), and values (V).&lt;/p&gt;
&lt;p&gt;For each token, the model computes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query vectors ($Q$): Represent the current element seeking information&lt;/li&gt;
&lt;li&gt;Key vectors ($K$): Act as reference points for all elements in the sequence&lt;/li&gt;
&lt;li&gt;Value vectors ($V$): Contain the actual information that will be aggregated&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The attention computation follows the formula:
$$
\mathrm{Attention}(Q, K, V) = \mathrm{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) V
$$&lt;/p&gt;
&lt;p&gt;LLMs are autoregressive; that is, text generation refers to the sequential process by which a model predicts each new token (word or subword) based on all previously generated tokens. This creates a dependency chain: every new token depends on the entire history of prior tokens. During autoregressive text generation, where models predict one token at a time using all previous tokens, the KV cache serves as a repository to &amp;ldquo;remember&amp;rdquo; the pre-computed key and value pairs from earlier tokens. Each new token requires attending to all previous tokens. Without optimization, this would necessitate recomputing all $K$ and $V$ matrices at every step, leading to quadratic time complexity.&lt;/p&gt;
&lt;h3 id=&#34;3-the-caching-process&#34;&gt;3. The Caching Process&lt;/h3&gt;
&lt;p&gt;The KV cache stores the computed key and value tensors for all previously generated tokens. When generating a new token, only its key and value are computed and appended, while the model attends to the full cache. This caching reduces redundant computation, transforming each inference step’s complexity from quadratic to linear with respect to sequence length—a foundational efficiency for scaling LLMs to long contexts.&lt;/p&gt;
&lt;p&gt;Without KV caching, transformers would have to recompute keys and values for all previous tokens during each generation step, resulting in quadratic computational complexity. The KV cache removes this inefficiency through the following process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Initial Generation:&lt;/strong&gt; When processing the first input token, the model calculates and stores its key and value vectors in the cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subsequent Tokens:&lt;/strong&gt; For each new token, the model only computes the key and value for that specific token.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache Appending:&lt;/strong&gt; New key-value pairs are appended to the existing cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention Computation:&lt;/strong&gt; The model uses the complete cached key-value history to compute attention with the current query.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This approach transforms the attention computation from quadratic $O(n^2)$ to linear $O(n)$ complexity in terms of sequence length.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example: Minimal KV Cache in PyTorch.&lt;/strong&gt;
This class provides a minimal example of how to store and update key-value tensors for autoregressive generation in a transformer model.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;KVCache&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;update&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, key, value):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cat([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;key&amp;#34;&lt;/span&gt;], key], dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cat([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;], value], dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_cache&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cache&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;4-memory-requirements-and-bottlenecks&#34;&gt;4. Memory Requirements and Bottlenecks&lt;/h3&gt;
&lt;p&gt;There is no free lunch, of course, and there are also practical memory considerations. The memory footprint of the KV cache is substantial, especially for long contexts. For large models, this can easily consume tens of gigabytes for long sequences, often exceeding the memory needed for model weights themselves.&lt;/p&gt;
&lt;p&gt;For example, with Llama-2-7B using half precision (FP16), for batch size 1, the KV cache consumes approximately 0.5MB per 1000 token. For a sequence of 28,000 tokens, this equals about 14GB of memory - the same amount required to store the entire model weights.&lt;/p&gt;
&lt;p&gt;Research shows that the KV cache can consume over 30% of GPU memory during deployment and become the primary memory bottleneck for long-context applications.
At a simplistic level, the required memory can be estimated as:&lt;/p&gt;
&lt;p&gt;$$
\text{Memory} = 2 \times \text{Precision} \times \text{Layers} \times \text{ModelDim} \times \text{SeqLen} \times \text{BatchSize}
$$&lt;/p&gt;
&lt;p&gt;Note her:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\text{Precision}$ is typically 2 bytes (FP16)&lt;/li&gt;
&lt;li&gt;$\text{Layers}$ is the number of transformer layers&lt;/li&gt;
&lt;li&gt;$\text{ModelDim}$ (a.k.a Model Dimension) is the hidden size per layer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-what-would-happen-without-kv-cache&#34;&gt;5. What Would Happen Without KV Cache?&lt;/h3&gt;
&lt;p&gt;Understanding the importance of KV cache becomes clearer when you contemplate the consequences of its absence. The overall experience would be significantly worse, characterized by high latency, shorter context windows, and increased costs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Severe slowdown: Every new token requires recomputing attention for all previous tokens, causing computation to grow quadratically with sequence length&lt;/li&gt;
&lt;li&gt;Unsustainable compute overhead: Each step repeats all previous attention calculations, wasting compute and energy.&lt;/li&gt;
&lt;li&gt;High latency and poor user experience: Users experience significant lag, especially for long-form or multi-turn conversations.&lt;/li&gt;
&lt;li&gt;Limited sequence lengths: Practical context limits shrink, and out-of-memory errors become common for large models.&lt;/li&gt;
&lt;li&gt;Inefficient hardware use: Lower throughput and increased energy consumption.&lt;/li&gt;
&lt;li&gt;No cache-level optimizations: No prompt reuse, no advanced memory management, and no opportunity for compression.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;6-the-new-trade-off-cache-size-vs-model-performance&#34;&gt;6. The New Trade-off: Cache Size vs. Model Performance&lt;/h3&gt;
&lt;p&gt;Recent studies have transformed the balance between KV cache size and model performance. Previously, decreasing the cache size directly impacted model quality, particularly for tasks that required long contexts or retrieval. Now, innovative approaches—utilizing quantization, pruning, and adaptive retention—enable significantly smaller caches, with minimal or virtually no decline in performance.&lt;/p&gt;
&lt;h4 id=&#34;61-token-precision-trade-off-quantized-pruning&#34;&gt;6.1. Token-Precision Trade-off: Quantized Pruning&lt;/h4&gt;
&lt;p&gt;A key breakthrough is the realization that storing more tokens at lower precision (quantized pruning) outperforms storing fewer tokens at high precision under the same memory budget.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Key finding: For example storing 4x as many tokens in 4-bit precision outperforms storing 1x tokens in 16-bit precision, especially for long-context and retrieval tasks. Note that the $‘4x’$ factor depends on model architecture, context, and task.&lt;/li&gt;
&lt;li&gt;Result: Quantized pruning preserves long-range context and enables robust performance across task types, input lengths, and model scales, even in extreme memory-constrained scenarios.&lt;/li&gt;
&lt;li&gt;Stability: This method is robust across various pruning and quantization strategies, providing a new paradigm for cache compression.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Code Example: Quantized Pruning&lt;/strong&gt;
This function demonstrates how to select and quantize the most important tokens in the KV cache to maximize memory efficiency with minimal accuracy loss.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;quantized_pruning&lt;/span&gt;(kv_cache, importance_scores, num_tokens_to_keep, num_bits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Select top tokens by importance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; importance_scores&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;argsort()[&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;num_tokens_to_keep:]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    selected_kv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; kv_cache[top_indices]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Quantize selected tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    scale &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;num_bits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    quantized &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ((selected_kv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; scale)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;round()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;clamp(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;num_bits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; quantized, scale, selected_kv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;min()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;62-adaptive-and-selective-retention&#34;&gt;6.2. Adaptive and Selective Retention&lt;/h4&gt;
&lt;p&gt;Recent methods, such as FastGen and MorphKV, profile attention patterns at runtime to determine which tokens or cache entries are most relevant for each layer or head. This enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic cache size: The cache adapts to attention diversity, keeping more entries where needed and aggressively compressing elsewhere.&lt;/li&gt;
&lt;li&gt;Constant-size caches: MorphKV, for instance, maintains a fixed-size cache by iteratively refining which tokens to keep using attention patterns, preserving long-range dependencies with minimal accuracy loss and &amp;gt;50% memory savings.&lt;/li&gt;
&lt;li&gt;Layer/head specialization: Different cache strategies can be applied to different layers or heads, rather than a one-size-fits-all approach.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;63-quantization-for-throughput-and-batch-size&#34;&gt;6.3. Quantization for Throughput and Batch Size&lt;/h4&gt;
&lt;p&gt;Hardware-aware quantization (e.g., FP8, INT8, 4-bit) dramatically reduces memory requirements and enables higher effective batch sizes, especially in decode-heavy serving scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Throughput gains: Quantizing the KV cache can provide up to 1.45× throughput improvement in real-world LLM serving, primarily by allowing more requests to be processed in parallel.&lt;/li&gt;
&lt;li&gt;Minimal accuracy loss: With careful quantization and dequantization strategies, there is little to no impact on model quality for most tasks.&lt;/li&gt;
&lt;li&gt;Implementation caveats: The speedup depends on the compatibility of quantized caches with high-performance attention kernels; some frameworks (e.g., TensorRT-LLM) benefit more than others (e.g., vLLM) depending on kernel optimizations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;64-system-level-optimizations&#34;&gt;6.4. System-Level Optimizations&lt;/h4&gt;
&lt;p&gt;Beyond algorithmic compression and adaptive retention, recent research has revealed significant performance gains through system-level KV cache optimizations. Frameworks like NVIDIA TensorRT-LLM and vLLM’s PagedAttention have re-architected cache management to resemble operating system virtual memory more closely, using paged or block-based KV storage to minimize memory fragmentation and enable efficient on-demand allocation.&lt;/p&gt;
&lt;p&gt;Other innovations, such as FlowKV, introduce distributed and disaggregated cache management strategies to reduce cache transfer latency and better utilize hardware resources across multiple nodes.&lt;/p&gt;
&lt;p&gt;These system-level enhancements complement algorithmic advances by improving scalability, throughput, and latency, ensuring that KV cache innovations are effectively translated into real-world production deployments, particularly for large-scale, multi-user LLM inference workloads.&lt;/p&gt;
&lt;h3 id=&#34;7-practical-implications&#34;&gt;7. Practical Implications&lt;/h3&gt;
&lt;p&gt;Efficient cache strategies have significant practical implications that affect both memory and computational requirements. By optimizing cache retention and compression techniques, these advancements create smaller yet smarter caches that free up resources. This enables larger batch sizes, longer context windows, and allows for deployment on less expensive or resource-constrained hardware. Such innovations greatly enhance the performance and scalability of language models, making them accessible to a wider range of users and applications.&lt;/p&gt;
&lt;p&gt;Moreover, these strategies enhance cost-effectiveness by reducing hardware demands and energy consumption. This not only lowers the financial barriers to deploying language models but also promotes sustainability within the field of machine learning. Additionally, the ability to track long-range dependencies with optimized cache management proves invaluable for tasks such as document retrieval, multi-turn dialogue generation, and summarization. These improvements underscore the importance of adaptive and efficient KV cache techniques in advancing the performance of large language models.&lt;/p&gt;
&lt;h3 id=&#34;8-conclusion&#34;&gt;8. Conclusion&lt;/h3&gt;
&lt;p&gt;KV cache management is a cornerstone of efficient LLM inference, especially as models scale and the size of the context windows expands. The field has rapidly advanced from basic caching to sophisticated, adaptive, and task-aware strategies that strike a balance between memory, speed, and accuracy. Without KV cache, modern LLMs would be too slow, costly, and limited for today’s real-world applications. As research continues, expect even more advanced cache management, enabling efficient inference for ever-larger models and longer contexts.&lt;/p&gt;
&lt;h5 id=&#34;references&#34;&gt;References&lt;/h5&gt;
&lt;span style=&#34;font-size:0.7em&#34;&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/clam004/KV-caching-toy-example/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minimal toy example of KV-cache (numpy)
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2405.14256&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ZipCache: Accurate and Efficient KV Cache Quantization with Salient Token Identification
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.pytorch.org/torchtune/stable/generated/torchtune.modules.KVCache.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PyTorch torchtune KVCache documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2402.02750&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.14838&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DynamicKV: Task-Aware Adaptive KV Cache Compression
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2403.06492&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KV Caching in LLM Inference: A Comprehensive Review
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2405.14366&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MiniCache: KV Cache Compression in Depth Dimension
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2310.01801&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Model Tells You What to Discard: Adaptive KV Cache Compression for LLMs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://huggingface.co/blog/not-lain/kv-caching&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HuggingFace blog: KV Caching Explained
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2411.17089&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		KVPR: Efficient LLM Inference with I/O-Aware KV Cache Partial Recomputation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://github.com/xbeat/Machine-Learning/blob/main/Python%20KV%20Caching%20Efficient%20Data%20Storage%20and%20Retrieval.md&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Python KV Caching Efficient Data Storage and Retrieval
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.19442&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A Survey on Large Language Model Acceleration based on KV Cache Management
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2412.12706&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		More Tokens, Lower Precision: Towards the Optimal Token-Precision Trade-off in KV Cache Compression
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://arxiv.org/abs/2502.12665&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		A2ATS: Retrieval-Based KV Cache Reduction via Windowed Rotary Position Embedding and Query-Aware Vector Quantization
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;
</description>
    </item>
    
    <item>
      <title>RustySnake - Classic Snake game to learn Rust</title>
      <link>/post/2025/03/rustysnake-snake-game-to-learn-rust/</link>
      <pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/03/rustysnake-snake-game-to-learn-rust/</guid>
      <description>&lt;h3 id=&#34;1-overview&#34;&gt;1. Overview&lt;/h3&gt;
&lt;p&gt;Rust has been gaining attention recently due to its unique combination of performance, safety, and modern programming features. Its strict ownership model eliminates common memory issues like null pointer dereferencing and data races, providing a secure environment for developers. At the same time, its expressive syntax and focus on developer productivity make it a strong contender for systems programming. Its growing ecosystem and community continue to expand its capabilities into areas like web development and embedded systems, ensuring a confident and secure learning experience for developers.&lt;/p&gt;
&lt;p&gt;When diving into Rust, a language lauded for its speed and safety, I wanted to start with a fun and educational project. Inspired by my experience with C and C++, I decided to learn Rust by implementing a classic snake game - a project that not only provides a fun learning experience but also reinforces an understanding of programming fundamentals. This journey has introduced me to Rust&amp;rsquo;s unique features and reinforced my understanding of programming fundamentals, engaging and motivating me to learn more.&lt;/p&gt;
&lt;p&gt;As I embarked on this journey, I also wanted to understand how LLMs can assist in grasping Rust in terms of syntax, layout, flow, and execution aspects. These models played a crucial role in helping me debug and resolve issues, providing the necessary support and guidance in my learning process. For this, I used the following different models. Except for GPT 4o, I also want to run the others on my home GPU cluster - again, to help experiment with different aspects of inference.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Phi 4&lt;/li&gt;
&lt;li&gt;Llama 3.3 70b Instruct&lt;/li&gt;
&lt;li&gt;Qwen 2.5B Coder 32B&lt;/li&gt;
&lt;li&gt;DeepSeek R1 Distill Llama 8B&lt;/li&gt;
&lt;li&gt;GPT 4o&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;11-llm-performance-comparison&#34;&gt;1.1. LLM Performance Comparison&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Code Generation&lt;/th&gt;
          &lt;th&gt;Error Explanation&lt;/th&gt;
          &lt;th&gt;Documentation&lt;/th&gt;
          &lt;th&gt;Overall Experience&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Phi 4&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;Good for simpler tasks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Llama 3.3 70b&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Strong but inconsistent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Qwen 2.5B Coder 32B&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Excellent for code examples&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DeepSeek R1 Distill 8B&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️&lt;/td&gt;
          &lt;td&gt;Limited understanding of Rust&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT 4o&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;✔️✔️✔️✔️✔️&lt;/td&gt;
          &lt;td&gt;Comprehensive assistance throughout&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Of course, it is not an apples-to-apples comparison. Each started well but then quickly went downhill for various reasons. The only awesome one I finally ended up using all the way through was GPT4o.&lt;/p&gt;
&lt;h4 id=&#34;12-why-rust&#34;&gt;1.2. Why Rust?&lt;/h4&gt;
&lt;p&gt;Rust is designed to be a systems-level language with modern features. It eliminates common pitfalls like memory safety issues without compromising performance. As someone familiar with C and C++, I think this seems like a natural progression.&lt;/p&gt;
&lt;h3 id=&#34;2-the-snake-game-project&#34;&gt;2. The Snake Game Project&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   /^\\/^\\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  / o   o \\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; (    ^    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  \\_______/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   |     |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ascii-text-art.jpg&#34; alt=&#34;Rust Snake&#34;/&gt;
        &lt;figcaption&gt;Rusty Snake&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The nostalgic, classic snake game provides a perfect playground for learning Rust’s syntax, constructs, and libraries. For the game, I started with the basic game but then soon added other things - I wanted to give the player a choice on the size of the play area (measured in number of characters as the rendering is in ASCII) and speed.&lt;/p&gt;
&lt;p&gt;A crate in Rust is a collection of related code akin to a library in C++ or a module in Python. The project imports the following crates for different functionalities needed: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;crossterm&lt;/code&gt;&lt;/strong&gt;: For terminal UI and input handling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rand&lt;/code&gt;&lt;/strong&gt;: For generating random numbers (e.g., food placement).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let us walk through some key implementation parts and draw parallels to C and C++ for easier comprehension.&lt;/p&gt;
&lt;h3 id=&#34;3-key-concepts-in-the-code&#34;&gt;3. Key Concepts in the Code&lt;/h3&gt;
&lt;h4 id=&#34;31-structs-rusts-version-of-struct-in-c&#34;&gt;3.1 Structs: Rust’s Version of &lt;code&gt;struct&lt;/code&gt; in C&lt;/h4&gt;
&lt;p&gt;Rust’s &lt;code&gt;struct&lt;/code&gt; is similar to &lt;code&gt;struct&lt;/code&gt; in C and C++ but with additional safety and functionality. Here’s how we define a &lt;code&gt;Point&lt;/code&gt; struct to represent 2D coordinates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#[derive(Debug, Clone, PartialEq)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x: &lt;span style=&#34;color:#ed8796&#34;&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y: &lt;span style=&#34;color:#ed8796&#34;&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C/C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Point&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; y;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In Rust, &lt;code&gt;#[derive(...)]&lt;/code&gt; automatically implements traits like &lt;code&gt;Debug&lt;/code&gt; (for debugging), &lt;code&gt;Clone&lt;/code&gt; (for copying), and &lt;code&gt;PartialEq&lt;/code&gt; (for comparisons).&lt;/p&gt;
&lt;h4 id=&#34;32-vectors-vect-dynamic-arrays&#34;&gt;3.2 Vectors &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt;): Dynamic Arrays&lt;/h4&gt;
&lt;p&gt;Rust uses &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt; for dynamically-sized arrays, similar to &lt;code&gt;std::vector&lt;/code&gt; in C++.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; snake &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;vec!&lt;/span&gt;[Point { x: &lt;span style=&#34;color:#eed49f&#34;&gt;width&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, y: &lt;span style=&#34;color:#eed49f&#34;&gt;height&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; }];&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;vector&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;Point&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; snake &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; { Point{width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;} };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Unlike C++, Rust ensures safety with bounds checking and ownership rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;33-ownership-and-borrowing&#34;&gt;3.3 &lt;strong&gt;Ownership and Borrowing&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s ownership model ensures memory safety without a garbage collector. When working with &lt;code&gt;snake&lt;/code&gt;, you own or borrow the data.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;mut&lt;/span&gt; new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; snake.last().unwrap().clone();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here, &lt;code&gt;.clone()&lt;/code&gt; creates a deep copy of the last element to avoid ownership issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;: Copying would be explicit but lacks ownership enforcement:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Point new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; snake.back();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;34-enums-and-pattern-matching&#34;&gt;3.4 &lt;strong&gt;Enums and Pattern Matching&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s pattern matching with &lt;code&gt;match&lt;/code&gt; is more expressive than a &lt;code&gt;switch&lt;/code&gt; statement in C++.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; key_event.code {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    KeyCode::Up &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; next_direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    KeyCode::Down &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; next_direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:
A &lt;code&gt;switch&lt;/code&gt; with additional &lt;code&gt;if&lt;/code&gt; conditions might approximate this but would lack the same level of elegance.&lt;/p&gt;
&lt;h4 id=&#34;35-error-handling&#34;&gt;3.5 &lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust avoids exceptions by using the &lt;code&gt;Result&lt;/code&gt; type for error handling, relying on explicit and predictable control flow to manage errors. This differs from other languages and ensures errors are handled explicitly rather than relying on potentially disruptive exception mechanisms, which can lead to unwieldy codebases in large systems.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;() -&amp;gt; &lt;span style=&#34;color:#eed49f&#34;&gt;crossterm&lt;/span&gt;::&lt;span style=&#34;color:#91d7e3&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    terminal::enable_raw_mode()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    terminal::disable_raw_mode()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Ok&lt;/span&gt;(())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;?&lt;/code&gt; operator propagates errors automatically, akin to C++&amp;rsquo;s &lt;code&gt;std::optional&lt;/code&gt; or manual error handling:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;enable_raw_mode()) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&#34;36-functional-features&#34;&gt;3.6 &lt;strong&gt;Functional Features&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Rust’s iterators and closures make code concise and expressive. For instance, generating random food coordinates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parallel in C++&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Point new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; { rand() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; (width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, rand() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; (height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Rust’s range syntax and &lt;code&gt;rand&lt;/code&gt; crate simplify random number generation.&lt;/p&gt;
&lt;h3 id=&#34;4-code&#34;&gt;4. Code&lt;/h3&gt;
&lt;p&gt;The complete source code for this project is available on GitHub:
&lt;a
	
		href = &#34;https://github.com/bahree/rustysnake&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/bahree/rustysnake
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The game loop handles input, updates the snake&amp;rsquo;s position, checks for collisions, and renders the game state. The &lt;code&gt;crossterm&lt;/code&gt; library provides a simple way to handle keyboard input and terminal rendering.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Handle input
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; crossterm::event::poll(Duration::from_millis(game_speed))&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; Event::Key(key_event) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; event::read()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;?&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;match&lt;/span&gt; key_event.code {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Char(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Up &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Down &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Left &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                KeyCode::Right &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; direction &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point { x: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, y: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Update snake position
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_head &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x: (snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; direction.x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; width,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        y: (snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;].y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; direction.y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; height) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; height,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check collision with self
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; snake.contains(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;new_head) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    snake.insert(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, new_head);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if snake ate food
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; snake[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; food {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Generate new food
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;loop&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;let&lt;/span&gt; new_food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Point {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                x: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;width),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                y: &lt;span style=&#34;color:#eed49f&#34;&gt;rng&lt;/span&gt;.gen_range(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;..&lt;/span&gt;height),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;snake.contains(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;new_food) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                food &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_food;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        snake.pop();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Feel free to clone, fork, or contribute to the repository!&lt;/p&gt;
&lt;h4 id=&#34;41-running-the-game&#34;&gt;4.1 Running the Game&lt;/h4&gt;
&lt;p&gt;To run this on Windows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Rust with &lt;code&gt;rustup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add dependencies to &lt;code&gt;Cargo.toml&lt;/code&gt;:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[dependencies]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crossterm = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.27&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rand = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.8&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Build and run the project:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cargo run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Compile the project:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cargo build --release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;42-controls&#34;&gt;4.2 Controls&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Key&lt;/th&gt;
          &lt;th&gt;Action&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Arrow Keys&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Move the snake&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Increase game speed&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Decrease game speed&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Spacebar&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Pause/Resume the game&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Quit the game&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;43-gameplay&#34;&gt;4.3 Gameplay&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Select the &lt;strong&gt;boundary size&lt;/strong&gt; and &lt;strong&gt;difficulty&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;Use arrow keys to move the snake.&lt;/li&gt;
&lt;li&gt;Eat the red food (&lt;code&gt;■&lt;/code&gt;) to grow your snake and increase your score.&lt;/li&gt;
&lt;li&gt;Avoid hitting the walls (&lt;code&gt;#&lt;/code&gt;) or yourself!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rusty2.jpg&#34; alt=&#34;Screen Play Example&#34;/&gt;
        &lt;figcaption&gt;Snake Game&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;5-learnings&#34;&gt;5. Learnings&lt;/h3&gt;
&lt;p&gt;I encountered a few things while learning Rust through this snake game project. These are called out below. As with anything else, where things are different, one must forget what one knows and learn the new way of doing things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ownership model&lt;/strong&gt;: Coming from C/C++, adjusting to Rust&amp;rsquo;s strict borrowing rules required a shift in thinking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal UI limitations&lt;/strong&gt;: Working with crossterm&amp;rsquo;s terminal interface meant designing around ASCII graphics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Game loop timing&lt;/strong&gt;: Balancing responsiveness with performance required careful tuning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error propagation&lt;/strong&gt;: Learning to use the &lt;code&gt;?&lt;/code&gt; operator and &lt;code&gt;Result&lt;/code&gt; types effectively took practice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding these differences was part of the learning process and helped solidify some of my understanding of Rust&amp;rsquo;s principles.&lt;/p&gt;
&lt;h4 id=&#34;51-reflecting-on-rust&#34;&gt;5.1 Reflecting on Rust&lt;/h4&gt;
&lt;p&gt;Building this game helped me appreciate Rust’s features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory Safety&lt;/strong&gt;: Rust eliminates segmentation faults common in C and C++.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expressive Syntax&lt;/strong&gt;: Iterators, pattern matching, and traits make Rust elegant and powerful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community and Ecosystem&lt;/strong&gt;: Libraries like &lt;code&gt;crossterm&lt;/code&gt; and &lt;code&gt;rand&lt;/code&gt; accelerate development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;52-acknowledgment&#34;&gt;5.2 Acknowledgment&lt;/h4&gt;
&lt;p&gt;Throughout this journey, I used the assistance of LLMs to clarify Rust concepts and draw parallels to languages I already know. This collaborative approach made learning smoother and deepened my understanding by offering different perspectives. The combination of hands-on learning and real-time assistance has been invaluable. &lt;/p&gt;
&lt;h3 id=&#34;6-final-thoughts&#34;&gt;6 Final Thoughts&lt;/h3&gt;
&lt;p&gt;Rust might feel different initially if you&amp;rsquo;re from a C or C++ background, but its safety guarantees and modern features make it worthwhile. Building a snake game is just one of many ways to start.&lt;/p&gt;
&lt;p&gt;What will you build next? 📎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An introduction to Mixture of Experts (MoE)</title>
      <link>/post/2025/01/intro-to-mixture-of-experts/</link>
      <pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>/post/2025/01/intro-to-mixture-of-experts/</guid>
      <description>&lt;p&gt;AI is advancing at an unprecedented pace, with Mixture of Experts (MoE) models being one set of model architectures at the forefront of this revolution. These architectures enable breakthroughs in efficiency and scalability by leveraging a modular design where only a subset of specialized &amp;ldquo;expert&amp;rdquo; networks are activated for each input. MoE architectures have become a cornerstone in building ultra-large-scale models like GLaM and Switch Transformers.&lt;/p&gt;
&lt;p&gt;Mixture of Experts (MoE) is an advanced machine learning architecture that lately has gained significance, particularly in the realm of #LLMs (large language models) and NNs (neural networks). In talking with many people about AI, I&amp;rsquo;ve found that MoE as a topic comes up often, with many folks either not understanding what it is or their understanding of it being incorrect.&lt;/p&gt;
&lt;p&gt;With recent announcements of trillion-parameter models and announcements from Microsoft, OpenAI, and Google, understanding MoEs is more important than ever. More recently, &lt;a
	
		href = &#34;https://huggingface.co/deepseek-ai/DeepSeek-V3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DeepSeek v3
	&lt;/span&gt;
&lt;/a&gt; is a great example of a model that uses MoEs to achieve state-of-the-art performance - where the language model has 671B total but only 37B activated for each token.&lt;/p&gt;
&lt;p&gt;I this post I provide a high-level overview of MoEs, their core components, how they work and workflow. I also includes a simple toy example implementation to help grasp the core concepts.&lt;/p&gt;
&lt;h3 id=&#34;why-mixture-of-experts&#34;&gt;Why Mixture of Experts?&lt;/h3&gt;
&lt;p&gt;The central motivation behind MoE stems from the tension between growing model size and limiting computational resources. As we have seen in the recent past, increasing the parameter count of a model often yields better performance, especially in domains like natural language processing (NLP) and computer vision; however, this also drastically increases the cost of both training these models and computing cost for inference of these models. This massive computing cost is at the heart of what MoEs are addressing by offering a different paradigm known as conditional computation. MoE&amp;rsquo;s activate only a small subset of specialized sub-networks (called experts) for each input or token) only to a small number of experts rather than processing it through every parameter in the network. This helps with three key aspects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Increased Model Capacity&lt;/strong&gt;: Because only a few experts are activated at a time, MoE architectures can pack many parameters (experts) without proportionally increasing the computational cost per input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specialized Sub-networks&lt;/strong&gt;: Different experts can learn specific patterns or token-level specializations, leading to better performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficient Usage of Compute&lt;/strong&gt;: MoE optimizes resources (compute) by activating only a small fraction of the entire model, leading to significant efficiency gains.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This sparse activation strategy enables constructing models with billions (or even trillions) of parameters, making MoE a scalable solution for large-scale applications. Another benefit of MoE is its capacity for specialization. Different experts can learn distinct, context-dependent processing strategies, enabling the model to cover a broad set of input variations more effectively than a monolithic architecture.&lt;/p&gt;
&lt;p&gt;Early MoE ideas trace back to model ensembling in classic machine learning. Still, MoE extends beyond ensembling by learning a parametric “router” (gating function) that dynamically decides which experts to use. Notable works like the Sparsely-Gated Mixture of Experts showed that MoE could massively scale model size while staying computationally efficient.&lt;/p&gt;
&lt;h3 id=&#34;core-components-of-an-moe-system&#34;&gt;Core Components of an MoE System&lt;/h3&gt;
&lt;p&gt;The fundamental building blocks of an MoE system are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Experts&lt;/strong&gt;: Specialized sub-models, typically feed-forward neural networks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Router&lt;/strong&gt; or &lt;strong&gt;Gating Network&lt;/strong&gt;: Determines which tokens are sent to which experts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combiner&lt;/strong&gt;: Aggregates the outputs from the selected experts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;experts&#34;&gt;Experts&lt;/h4&gt;
&lt;p&gt;Each expert is typically a neural sub-network replicated multiple times within the same model. Depending on the task, these experts are often implemented as independent feed-forward networks, MLP blocks, or convolutional layers. For large-scale language models, each expert usually mirrors the structure of the feed-forward component of a Transformer block.&lt;/p&gt;
&lt;p&gt;Since multiple experts exist in parallel, each can potentially learn to handle different token types or data distributions. Contrary to common misconceptions, experts do not necessarily correspond to human-like semantic domains (e.g., “Expert #3 = Physics”). One might assume that certain experts correspond to high-level domains such as &amp;ldquo;finance&amp;rdquo; or &amp;ldquo;medicine.&amp;rdquo; Still, it is more common for the learned expertise to be more subtle and token-level, capturing idiosyncratic patterns that are not necessarily interpretable in a straightforward semantic way. Each expert ends up specializing in token-level or feature-level patterns that are discovered during training. For instance, in NLP, one expert might specialize in syntactic structures, while another focuses on semantic relationships.&lt;/p&gt;
&lt;p&gt;Sometimes, certain layers (like embeddings or attention blocks) are shared among all experts, and only feed-forward layers are duplicated (as in Switch Transformers).
This partial sharing allows the model to keep some global representation while still having specialized processing in the experts.&lt;/p&gt;
&lt;h4 id=&#34;router&#34;&gt;Router&lt;/h4&gt;
&lt;p&gt;The router, often called the gating network, is a small module that predicts which experts should handle any given input. Its purpose is to determine which experts should handle a given input. Modern MoE designs are typically parameterized as a simple neural network (often a single linear layer + SoftMax) or a simple linear transform. The SoftMax output provides a probability distribution across the experts, indicating which should be &amp;ldquo;activated&amp;rdquo; for each input.&lt;/p&gt;
&lt;p&gt;The router reads the input representation (e.g., the token embedding in an NLP model) and produces a probability distribution over the experts, typically with a SoftMax function. We then select the top-k experts (e.g., top-1, top-2) based on these probabilities - for each token, known as &lt;strong&gt;Top-k gating&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Practical implementations often limit the number of tokens an expert can process per batch (known as Expert Capacity). If too many tokens route to the same expert, some tokens may get dropped or rerouted, leading to training instability. This capacity limit helps prevent any single expert from monopolizing the model&amp;rsquo;s processing and prevents load imbalances.&lt;/p&gt;
&lt;p&gt;The gating network is trained jointly with the experts through back-propagation. As we outlined above, the gating process introduces discrete decisions into the computational graph, which can hamper backpropagation. To help counter this, additional techniques such as adding a small amount of noise to the logits (&lt;strong&gt;Noisy Top-k Gating&lt;/strong&gt;) or using Soft MoE — are employed to smooth out these discrete selections, keep training stable, help provide smoother gradients, and encourage balanced expert utilization. Additional mechanisms like Expert Capacity limit how many tokens each expert can process, preventing load imbalances in which a single expert might receive most tokens.&lt;/p&gt;
&lt;h4 id=&#34;combiner&#34;&gt;Combiner&lt;/h4&gt;
&lt;p&gt;Once the chosen experts have computed their outputs for a given token, these outputs must be aggregated to produce a single vector that feeds into subsequent layers. The MoE architecture achieves this through a combiner, which typically performs a weighted sum of the experts&amp;rsquo; outputs, using the gating probabilities as weights. In &lt;strong&gt;top-k gating&lt;/strong&gt;, if $ k $ experts were activated, each expert’s output is multiplied by its corresponding probability from the router. The combiner then sums or otherwise fuses the results to form the token’s transformed representation. This consolidated output is passed into the rest of the model, such as attention blocks or additional Transformer layers.&lt;/p&gt;
&lt;p&gt;In “Soft MoE” variants, we might use a soft combination, letting tokens pass to all experts but with different fractional weights—alleviating some routing discontinuities at the cost of higher computation.&lt;/p&gt;
&lt;h3 id=&#34;high-level-workflow&#34;&gt;High-Level Workflow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Input is fed into the &lt;em&gt;gating network&lt;/em&gt;, which produces a probability distribution (or &lt;em&gt;scores&lt;/em&gt;) over experts.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;top-k&lt;/em&gt; experts are &lt;em&gt;activated&lt;/em&gt; for each input (or token, in the case of language models).&lt;/li&gt;
&lt;li&gt;The selected experts &lt;em&gt;process the input&lt;/em&gt; in parallel.&lt;/li&gt;
&lt;li&gt;A combiner fuses the experts’ outputs into a single vector.&lt;/li&gt;
&lt;li&gt;The model produces the &lt;em&gt;final&lt;/em&gt; output, which can then feed into other layers or tasks.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below is a simple flow diagram that shows how to visualize this:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    Input_Tokens --&amp;gt; Gating_Network
    Gating_Network --&amp;gt; Expert_1
    Gating_Network --&amp;gt; Expert_2
    Gating_Network --&amp;gt; Expert_3
    Expert_2 --&amp;gt; Combiner
    Expert_3 --&amp;gt; Combiner
    Combiner --&amp;gt; Final_Output
&lt;/pre&gt;
&lt;p&gt;The MoE module often appears in LLMs where a standard feed-forward layer normally would reside. For &lt;strong&gt;each layer&lt;/strong&gt; designated as an MoE, the process begins by sending the hidden representations of each token to the router. The router computes gating probabilities across all experts, ranks the experts by these probabilities, and picks the top few. Each selected expert applies its transformation to the token&amp;rsquo;s hidden state. Finally, the combiner merges these expert outputs with a weighted sum.&lt;/p&gt;
&lt;p&gt;During training, the experts and the router are updated jointly through backpropagation. However, discrete gating can make gradient flow tricky since the top-k selection is not inherently differentiable. In practice, noise injection (Noisy Top-k Gating) or methods like Soft MoE can help approximate continuous gradients, ensuring that even experts with lower gating probabilities receive occasional training signals.&lt;/p&gt;
&lt;p&gt;In addition, to avoid a scenario where one or two experts monopolize all tokens, an auxiliary load-balancing loss is often introduced to encourage more uniform usage. This might take the form of a penalty term that grows when the variance in expert usage is high, incentivizing the router to distribute tokens more evenly.&lt;/p&gt;
&lt;p&gt;This mechanism occurs for every token in every layer designated as an MoE layer, which is why load balancing is so critical—without careful design, certain experts can receive far more tokens than others.&lt;/p&gt;
&lt;h3 id=&#34;what-is-the-difference-between-an-moe-and-an-ensemble&#34;&gt;What is the Difference between an MoE and an Ensemble?&lt;/h3&gt;
&lt;p&gt;It’s easy to confuse MoE with model ensembling - where multiple independently trained models vote or average predictions. MoE differs in a few critical ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic and data-dependent routing: In classical ensembles, each model sees the same input, and a meta-learner or a simple average produces the final result. MoE, in contrast, uses a router that decides different subsets of the input for each expert. This dynamic routing allows MoE to specialize in different patterns or tokens.&lt;/li&gt;
&lt;li&gt;Single model training: MoE typically trains all experts jointly in one go. Each expert does not have a separate training pass; they’re part of the same computation graph, sharing some parameters (like embeddings) and learning together. This is in contrast to ensembles, where each model is trained independently.&lt;/li&gt;
&lt;li&gt;Fine-grained token specialization: Different tokens in the same sentence might get routed to different experts, enabling extremely fine-grained specialization. This is impossible in a traditional ensemble, where each model sees the entire input.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;load-balancing-experts-and-training-pitfalls&#34;&gt;Load Balancing Experts and Training Pitfalls&lt;/h3&gt;
&lt;p&gt;A significant challenge in training MoE models is ensuring the balanced utilization of experts. Certain experts may become overburdened without proper load balancing, while others remain underutilized, leading to inefficient training and suboptimal performance. Gating can become highly imbalanced early in training, favoring a few experts. Common solutions for Load Balancing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auxiliary Load Balancing Losses: Adding a regularization term to the loss function encourages the gating network to distribute inputs evenly across all experts.&lt;/li&gt;
&lt;li&gt;Top-k Randomization: Instead of always selecting the top-k experts with the highest gating probabilities, randomizing the selection among the top candidates can prevent overloading.&lt;/li&gt;
&lt;li&gt;Expert Capacity Constraints: Limiting the number of tokens an expert can process at a time can help ensure all experts are used during training.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over time, load-balancing losses/techniques help the distribution even out, but the model can remain fragile without careful hyperparameter tuning. Expert capacity is another important design choice. Since top-k selection may route too many tokens to the most popular experts, a capacity limit ensures each expert processes no more than a certain maximum number of tokens in one forward pass. The remaining tokens must be dropped or re-routed to other experts if an expert is at capacity. Both approaches come with trade-offs: dropping tokens entirely can lead to data inefficiency, whereas re-routing can add complexity and undermine the sparsity benefits that MoE aims to provide.&lt;/p&gt;
&lt;p&gt;Load balancing - ensuring experts share the training load - remains one of the &lt;em&gt;biggest technical hurdles&lt;/em&gt; with MoEs. Early in training, the gating network might discover that routing most tokens to the same expert (or a small number) might yield acceptable results, leaving other experts underutilized and effectively “dead.” This imbalance leads to suboptimal solutions - if only a few experts get trained on all tokens, you lose the advantages of specialization.&lt;/p&gt;
&lt;p&gt;To mitigate this, MoE architectures often introduce additional techniques that nudge the model toward more even usage. One such technique is the auxiliary load-balancing loss. By monitoring how frequently each expert is selected, the model can be penalized if certain experts remain underutilized.  This can be thought of as an additional penalty term that measures how evenly tokens (or batches) are distributed across experts.&lt;/p&gt;
&lt;p&gt;Another common approach is &lt;strong&gt;Noisy Top-k Gating&lt;/strong&gt;, which injects a small amount of learnable or fixed noise into the gating logits before the softmax, making the gating probabilities slightly more random. This randomness allows less-popular experts to occasionally receive tokens, which can help them develop more useful specializations over time. The gating network thus learns not only to minimize the primary task loss but also to spread tokens more uniformly.&lt;/p&gt;
&lt;h4 id=&#34;sparsity-in-mixture-of-experts-moe-models&#34;&gt;Sparsity in Mixture of Experts (MoE) Models&lt;/h4&gt;
&lt;p&gt;Sparsity is one of MoE’s most valuable contributions to model efficiency. By only activating a small fraction of the total parameters for each input, the model maintains a much lower compute footprint than a dense model of the same overall size. This efficiency is crucial for scaling; while a trillion-parameter dense model may be prohibitively expensive to train and deploy, a trillion-parameter MoE model that only activates 1% of those parameters simultaneously becomes significantly more tractable.&lt;/p&gt;
&lt;p&gt;That said, implementing sparsity at scale often requires specialized infrastructure. Frameworks like &lt;code&gt;GShard&lt;/code&gt; or &lt;code&gt;Mesh-TensorFlow&lt;/code&gt; are designed to handle data and model parallelism necessary for distributing the experts across GPU clusters. The overhead of routing tokens to the correct devices can become significant if the system is not carefully optimized. Researchers have also explored alternative gating mechanisms, such as Soft MoE, which approximates selection by routing every token to all experts in a soft, weighted fashion. While this approach can mitigate the fragility of discrete gates, it naturally increases computation since more experts perform computations at once.&lt;/p&gt;
&lt;p&gt;Sparcity in MoE models offers several key advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Computational Efficiency: Sparsity dramatically reduces the number of FLOPs required to process each task.&lt;/li&gt;
&lt;li&gt;Scalability: The sparse activation of experts enables MoE models to scale to a large number of experts without a corresponding linear increase in computational and memory requirements.&lt;/li&gt;
&lt;li&gt;Increased Model Capacity: Sparsity allows MoE models to increase their overall parameter count and model capacity without significantly increasing the computational cost during training or inference.&lt;/li&gt;
&lt;li&gt;Memory Efficiency: Operating sparsely, MoE models require less memory for activations and parameters.&lt;/li&gt;
&lt;li&gt;Specialized Processing: Sparsity enables the model to route different inputs to the most relevant experts, allowing for more specialized and efficient processing of diverse inputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;practical-applications-of-moe&#34;&gt;Practical applications of MoE&lt;/h3&gt;
&lt;p&gt;MoE architectures have already demonstrated clear benefits in many areas. Microsoft’s Z-code model (Machine Translation), for instance, leverages MoE to handle multilingual translation tasks at a massive scale, and Google’s Switch Transformers showed that sparse activation can reach higher quality at lower training cost than dense baselines on benchmarks such as GLUE and SuperGLUE. In computer vision, MoE modules have been integrated into Vision Transformers (V-MoEs) to achieve better image classification and detection accuracy, with each expert focusing on different aspects of the image representation. In multimodal learning, the capacity to handle diverse data types—such as text, images, and audio—makes MoE a natural fit because experts can adapt to different modalities or different subproblems within a single modality.&lt;/p&gt;
&lt;p&gt;In the context of LLMs, systems like ChatGPT, Claude, and Gemini can benefit from MoE by leveraging different experts for different topics or query types - though specifics are often proprietary and not shared. MoE is particularly suited to multi-modal tasks involving text, images, and audio, as experts can specialize in different modalities or sub-modalities. This is valuable for text-to-image generation or video understanding.&lt;/p&gt;
&lt;p&gt;Several emerging directions continue to push MoE research forward. Soft MoE (Zuo et al., 2022) is an example aiming to produce a fully differentiable version of sparsely gated Transformers. Another is Parameter-Efficient Sparsity Crafting (PESC), which seeks to retrofit existing dense models into a sparse MoE design without retraining from scratch. These innovations reflect ongoing efforts to refine the balance between sparse efficiency, training stability, and model reliability.&lt;/p&gt;
&lt;p&gt;In production, deploying a large MoE model requires carefully coordinating hardware resources, data pipelines, and load-balancing techniques. Training an MoE system may involve more hyperparameters than a comparable dense model, including the number of experts, gating softmax temperature, top-k value, load-balancing penalty weights, and expert capacity. These factors can significantly affect performance, convergence speed, and final accuracy. When scaling an MoE model across multiple GPUs, designers must pay attention to network communication overhead. Token-based routing leads to collective operations that can become bottlenecks if not carefully optimized.&lt;/p&gt;
&lt;p&gt;Despite these complexities, MoE’s flexibility and computational cost savings make it a compelling choice for handling highly varied or large-scale tasks. However, Fine-tuning MoE models can be more delicate than dense models because the gating distributions or specialized experts may not adapt smoothly to a new domain without carefully applied load-balancing strategies. There can also be interpretability challenges since the model’s internal “expert structure” does not always map neatly to skills.&lt;/p&gt;
&lt;h3 id=&#34;challenges-and-considerations&#34;&gt;Challenges and Considerations&lt;/h3&gt;
&lt;p&gt;We have touched on most of these in this blog post, but it is helpful to outline the key issues and considerations to be mindful of when using MoE-based models:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complexity: MoE models are significantly more complex (compared to traditional neural networks) and require substantial computational resources for training and inference.&lt;/li&gt;
&lt;li&gt;Training Instability: MoE models can suffer from training instability due to the discrete nature of expert selection.&lt;/li&gt;
&lt;li&gt;Load Balancing: Proper load balancing among experts is crucial for efficiently using model capacity and optimal performance.&lt;/li&gt;
&lt;li&gt;Computational Overhead: The gating mechanism introduces additional computational overhead, potentially impacting training and inference times.&lt;/li&gt;
&lt;li&gt;Interpretability Issues: The dynamic routing of inputs makes interpreting how MoE models arrive at their decisions challenging.&lt;/li&gt;
&lt;li&gt;Hyperparameter Sensitivity: MoE models have several hyperparameters that must be tuned for optimal performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s define these mathematically before discussing practical considerations.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;mathematical-formulation-of-moe&#34;&gt;Mathematical Formulation of MoE&lt;/h3&gt;
&lt;p&gt;Let $ x \in \mathbb{R}^d $ denote an input vector (a hidden representation from a preceding layer). We assume the system has $ N $ experts, with each expert $ E_i $ parameterized as a function $ E_i: \mathbb{R}^d \rightarrow \mathbb{R}^m $. The gating network $ G $ takes the same input $ x $ and outputs a vector in $\mathbb{R}^N$—essentially, a “score” or “weight” for each of the $ N $ experts. Finally, a combiner function $ C $ merges the experts’ outputs into a single output vector $ y \in \mathbb{R}^m $.&lt;/p&gt;
&lt;p&gt;Formally, we can write:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Input&lt;/strong&gt;: $ x \in \mathbb{R}^d $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experts&lt;/strong&gt;: $ E_i: \mathbb{R}^d \rightarrow \mathbb{R}^m \quad \text{for}\ i = 1, \ldots, N $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gating Network&lt;/strong&gt;: $ G: \mathbb{R}^d \rightarrow \mathbb{R}^N $&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combiner&lt;/strong&gt;: $ C: \mathbb{R}^{N \times m} \rightarrow \mathbb{R}^m $&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;top-k-gating&#34;&gt;Top-k Gating&lt;/h4&gt;
&lt;p&gt;Most contemporary MoE implementations use &lt;em&gt;top-k gating&lt;/em&gt;, which activates only the $ k $ experts with the highest gating scores. In this scenario, the summation is performed only over those top-$ k $ indices. If we denote $\text{top-k}(G(x))$ as the set of indices corresponding to the $ k $ largest values of $ G(x) $, then&lt;/p&gt;
&lt;p&gt;$
y = C\Bigl(\sum_{i \in \text{top-k}(G(x))} G(x)_i ,\cdot, E_i(x)\Bigr).
$&lt;/p&gt;
&lt;p&gt;By pruning all but the top-$ k $ experts per input, this design enforces &lt;em&gt;sparse activation&lt;/em&gt;: each input (or token) only “touches” $ k $ out of $ N $ experts at a time. This approach significantly reduces the computational load relative to using all $ N $ experts for every input.&lt;/p&gt;
&lt;h4 id=&#34;dense-gating-formulation&#34;&gt;Dense Gating Formulation&lt;/h4&gt;
&lt;p&gt;This refers to a version of MoE architecture in which &lt;strong&gt;all&lt;/strong&gt; experts contribute to the final output for each input rather than filtering out all but the top-k experts. Here, the gating network assigns &lt;em&gt;continuous weights&lt;/em&gt; to every expert, aggregating each expert’s weighted output into a final result. There is &lt;em&gt;no discrete selection&lt;/em&gt; to zero out certain experts based on gating. Fundamentally, this is the opposite of top-K gating.&lt;/p&gt;
&lt;p&gt;In the simplest version of MoE, where the gating network’s output is a set of continuous weights, the forward pass for one input $ x $ can be written as:&lt;/p&gt;
&lt;p&gt;$ y = C\Bigl(\sum_{i=1}^N G(x)_i ,\cdot, E_i(x)\Bigr). $&lt;/p&gt;
&lt;p&gt;Here, $ G(x)_i $ is the $i$-th component of the gating network’s output for $ x $ and represents the &lt;em&gt;weight&lt;/em&gt; (or probability) assigned to expert $ i $. Intuitively, if $ G(x)_i $ is large, expert $ i $ contributes more to the final output $ y $. The function $ C $ often takes the form of a simple weighted sum or concatenation-and-projection step, depending on the specific design.&lt;/p&gt;
&lt;h4 id=&#34;load-balancing-and-expert-monopolization&#34;&gt;Load Balancing and Expert Monopolization&lt;/h4&gt;
&lt;p&gt;As we saw earlier, MoE architectures introduce an *&lt;code&gt;auxiliary load-balancing loss&lt;/code&gt;*to load valance across all experts. This can be thought of as an additional penalty term that measures how evenly tokens (or batches) are distributed across experts. One common strategy is penalizing the variance in expert usage or encouraging each expert to receive roughly an equal proportion of examples. The gating network thus learns not only to minimize the primary task loss but also to spread tokens more uniformly.&lt;/p&gt;
&lt;p&gt;Mathematically, a typical load-balancing loss might look like:&lt;/p&gt;
&lt;p&gt;$ \mathcal{L} _ {\text{balance}} = \lambda \sum_{i=1}^N \Bigl(\frac{f_i}{\sum_j f_j} - \frac{1}{N}\Bigr)^2, $&lt;/p&gt;
&lt;p&gt;where $ f_i $ is the total number of tokens assigned to expert $ i $ in a minibatch (or the sum of gating probabilities if you’re using a continuous measure), and $ \lambda $ is a hyperparameter controlling the strength of this penalty. This ensures the model is incentivized to explore and train all experts over time.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;example-pytorch-implementation&#34;&gt;Example PyTorch Implementation&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s a simplified Python implementation of an MoE model using PyTorch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch.nn&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;nn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Expert&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, output_size):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(Expert, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(input_size, output_size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;GatingNetwork&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, num_experts):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(GatingNetwork, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Linear(input_size, num_experts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;softmax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Softmax(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;softmax(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;layer(x))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;MixtureOfExperts&lt;/span&gt;(nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Module):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, input_size, output_size, num_experts, top_k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;super&lt;/span&gt;(MixtureOfExperts, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;num_experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; num_experts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; top_k
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ModuleList([Expert(input_size, output_size) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; _ &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_experts)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gating &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; GatingNetwork(input_size, num_experts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;forward&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        batch_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        gating_probs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;gating(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        topk_vals, topk_inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;topk(gating_probs, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zeros(batch_size, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, output_size, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_inds[:, i]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            outputs_for_expert &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stack([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts[inds[b]](x[b]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(batch_size)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            expert_outputs[:, i, :] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; outputs_for_expert&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;squeeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        topk_vals_expanded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_vals&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        weighted_sum &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; topk_vals_expanded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        combined_output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weighted_sum&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sum(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; combined_output
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;input_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output_size &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;num_experts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;top_k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; MixtureOfExperts(input_size, output_size, num_experts, top_k)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sample_input &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;randn(&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;, input_size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(sample_input)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Output shape:&amp;#34;&lt;/span&gt;, output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you run this code, you should see the output shape printed as &lt;code&gt;torch.Size([8, 5])&lt;/code&gt;. This confirms that the model routes each input to the most relevant experts, processes the input through those experts, and combines their contributions into a unified output.&lt;/p&gt;
&lt;h4 id=&#34;code-explanation&#34;&gt;Code Explanation&lt;/h4&gt;
&lt;p&gt;This code defines a simple MoE model with a single gating network and multiple experts. The &lt;strong&gt;&lt;code&gt;Expert&lt;/code&gt;&lt;/strong&gt; class represents a single sub-module, the expert, a linear layer that transforms the input and forms the backbone of the MoE architecture. The expert takes the input of size &lt;code&gt;input_size&lt;/code&gt; and transforms it to &lt;code&gt;output_size&lt;/code&gt; using a fully connected (&lt;code&gt;Linear&lt;/code&gt;) layer. In the real world, each expert is designed to specialize in different transformations based on their training.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;GatingNetwork&lt;/code&gt;&lt;/strong&gt; class is the router that computes gating probabilities for each expert and determines which experts to activate for a given input. It takes the input size and the number of experts as input and outputs a probability distribution over the experts (&lt;code&gt;num_experts&lt;/code&gt;) using a linear layer followed by a &lt;code&gt;Softmax&lt;/code&gt; function. Higher probability values indicate that the corresponding expert is more relevant to the input.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;MixtureOfExperts&lt;/code&gt;&lt;/strong&gt; class combines the experts&amp;rsquo; outputs based on the gating probabilities and returns the final output. It takes the input size, output size, number of experts, and the top-k value as input. The &lt;code&gt;forward&lt;/code&gt; method computes the gating probabilities, selects the top-k experts based on these probabilities, and computes the weighted sum of the expert outputs to produce the final output. The &lt;code&gt;top_k&lt;/code&gt; parameter controls how many experts are activated for each input.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The input ( x ) is passed through the gating network to produce a probability distribution over the experts: &lt;code&gt;gating_probs = self.gating(x)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The gating network selects the indices of the &lt;code&gt;top_k&lt;/code&gt; experts with the highest probabilities: &lt;code&gt;topk_vals, topk_inds = torch.topk(gating_probs, self.top_k, dim=1)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For each of the selected experts, process the input:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;zeros(batch_size, &lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k, output_size, device&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;x&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;top_k):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    inds &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_inds[:, i]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    outputs_for_expert &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;stack([&lt;span style=&#34;color:#91d7e3&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;experts[inds[b]](x[b]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;)) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(batch_size)])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expert_outputs[:, i, :] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; outputs_for_expert&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;squeeze(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Multiply each expert&amp;rsquo;s output by its gating probability and sum them to form the final output:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;topk_vals_expanded &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; topk_vals&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;unsqueeze(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;weighted_sum &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; expert_outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; topk_vals_expanded
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;combined_output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weighted_sum&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sum(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;topk_vals&lt;/code&gt; (probabilities) are weights for the corresponding expert outputs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The model processes a batch of inputs and returns the combined output with a shape matching &lt;code&gt;(batch_size, output_size)&lt;/code&gt;. For the example above, &lt;code&gt;Output shape: torch.Size([8, 5])&lt;/code&gt; confirms that the model routes each input to the most relevant experts, processes the input through those experts, and combines their contributions into a unified output.&lt;/p&gt;
&lt;h4 id=&#34;code-dependencies&#34;&gt;Code Dependencies&lt;/h4&gt;
&lt;p&gt;To run this code, you&amp;rsquo;ll need the following dependencies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Python 3.6 or later (preferably 3.10 or higher)&lt;/li&gt;
&lt;li&gt;PyTorch 1.0 or later&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Save the code to a file, e.g., &lt;code&gt;moe_example.py&lt;/code&gt;, and run it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python moe_example.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I used Conda, which I prefer for managing Python environments. If you&amp;rsquo;re using a virtual environment, you can adapt the installation commands accordingly. For Conda, you can create a new environment and install PyTorch using the following steps.&lt;/p&gt;
&lt;p&gt;Start by creating a new conda environment with PyTorch dependencies. In  your terminal, execute the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new conda environment named &amp;#34;moe_env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda create -n moe_example &lt;span style=&#34;color:#f4dbd6&#34;&gt;python&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.10 -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Activate the environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda activate moe_example&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install PyTorch and necessary dependencies; adjust the CUDA version based on your system&amp;rsquo;s GPU configuration. You can omit the &lt;code&gt;pytorch-cuda&lt;/code&gt; package using a CPU-only setup.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For CPU-only:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install pytorch torchvision torchaudio cpuonly -c pytorch -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For GPU (use appropriate CUDA version, e.g., 11.7):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install pytorch torchvision torchaudio pytorch-cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;11.7 -c pytorch -c nvidia -y
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Install additional dependencies if needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install numpy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This example demonstrates the basic structure of an MoE model, including the experts, gating network, and the MoE module that combines them. Of course, this is a toy version that helps understand the basic construct and does not include advanced features like load balancing or sparsity, etc.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Mixture of Experts offers a compelling framework for scaling neural networks and managing the trade-offs between model size, computational cost, and performance. By selectively activating only a subset of parameters for each input, MoE allows researchers and practitioners to build models with enormous capacity without incurring a proportionate computational penalty. Given the additional interest in inference optimization for LLMs and broadly with Transformer-based architecture, we expect to see further innovations and applications for MoE.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;references&#34;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer - &lt;a
	
		href = &#34;https://arxiv.org/abs/1701.06538&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1701.06538
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding - &lt;a
	
		href = &#34;https://arxiv.org/abs/2006.16668&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2006.16668
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity - &lt;a
	
		href = &#34;https://arxiv.org/abs/2101.03961&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2101.03961
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Lightweight Mixture-of-Experts Neural Machine Translation Model with Stage-wise Training Strategy - &lt;a
	
		href = &#34;https://aclanthology.org/2024.findings-naacl.154/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/2024.findings-naacl.154/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deep Mixture of Experts via Shallow Embedding - &lt;a
	
		href = &#34;https://arxiv.org/abs/1806.01531&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1806.01531
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mixture of Experts in Image Classification: What&amp;rsquo;s the Sweet Spot? - &lt;a
	
		href = &#34;https://arxiv.org/abs/2411.18322v1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2411.18322v1
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mesh-TensorFlow: Deep Learning for Supercomputers - &lt;a
	
		href = &#34;https://proceedings.neurips.cc/paper/2018/hash/3a37abdeefe1dab1b30f7c5c7e581b93-Abstract.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://proceedings.neurips.cc/paper/2018/hash/3a37abdeefe1dab1b30f7c5c7e581b93-Abstract.html
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Generalist Agent - &lt;a
	
		href = &#34;https://arxiv.org/abs/2205.06175&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2205.06175
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation - &lt;a
	
		href = &#34;https://arxiv.org/abs/1308.3432&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/1308.3432
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;From Sparse to Soft Mixtures of Experts - &lt;a
	
		href = &#34;https://arxiv.org/abs/2308.00951&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://arxiv.org/abs/2308.00951
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parameter-Efficient Sparsity Crafting for Large Language Models - &lt;a
	
		href = &#34;https://aclanthology.org/2024.emnlp-main.43/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://aclanthology.org/2024.emnlp-main.43/
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Automating Hugo Deployments</title>
      <link>/post/2024/12/automating-hugo-deployments/</link>
      <pubDate>Mon, 23 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/12/automating-hugo-deployments/</guid>
      <description>&lt;h3 id=&#34;1-a-little-background&#34;&gt;1. A little background&lt;/h3&gt;
&lt;p&gt;I have been meaning to automate the deployment of my blog post to a dev server (running locally) for a while, but I haven&amp;rsquo;t had the time to get around to it until now. In addition to deploying this, the dev server also had several constraints. It is one of the machines at home and is not exposed directly to the internet. I also don&amp;rsquo;t have any ports opened on the firewalls at home, which adds a few more interesting challenges. I have a server hosted online in one of the data centers, but I want to keep that for more &amp;lsquo;production&amp;rsquo; things.&lt;/p&gt;
&lt;p&gt;Another thing I wanted to do was clean up the theme being used, as it wasn&amp;rsquo;t compatible with the newer version of Hugo. The longer I was pinned to an older version, the more challenging it would be to update. Now, these are all done and working, and I wanted to share what I learned here—more so because I will likely need to find this at some point in the future, but it might also help someone else.&lt;/p&gt;
&lt;p&gt;PS - If you don&amp;rsquo;t notice much (any?) difference in the blog&amp;rsquo;s look, that means it is a good thing; I worked through fixing the theme and upgrading to the latest version of Hugo (v0.140.0 at the time of writing this).&lt;/p&gt;
&lt;p&gt;While cleaning up, I also got around to things I had wanted to do for a while. I wanted to see how to securely expose one of the machines I have at home online without opening up ports and things and serve several services—mostly for my own use.&lt;/p&gt;
&lt;h3 id=&#34;11-dev-server-setup-desktop_computer&#34;&gt;1.1 Dev-Server Setup &amp;#x1f5a5;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;I think outlining how this machine is set up would be helpful, as I am sure many others will be trying this. First, this machine runs locally on the home network, running a headless Ubuntu server. The environment that made this dev server unique was the combination of things - I use &lt;a href=&#34;https://tailscale.com/&#34; target=&#34;_blank&#34;&gt;Tailscale&lt;/a&gt;, &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/&#34; target=&#34;_blank&#34;&gt;Cloudflare Tunnels&lt;/a&gt;, &lt;a href=&#34;https://www.cloudpanel.io/&#34; target=&#34;_blank&#34;&gt;CloudPanel&lt;/a&gt;, and as outlined earlier &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34;&gt;Hugo&lt;/a&gt;. The code sits in a private Github repo, and the build-server is via Github Actions. I won&amp;rsquo;t get into the details of each setup here as the intent of the blog post is not that, but I will share some context below.&lt;/p&gt;
&lt;h3 id=&#34;12-tailscale&#34;&gt;1.2 Tailscale&lt;/h3&gt;
&lt;p&gt;To make my life easier between the different machines and servers I have, running both locally at home and on the cloud, including bare-metal machines, I use &lt;a href=&#34;https://tailscale.com/&#34; target=&#34;_blank&#34;&gt;Tailscale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tailscale simplifies network management by creating a secure, zero-config mesh VPN based on the WireGuard protocol. Unlike traditional VPNs that route all traffic through a central server, Tailscale forms direct, encrypted connections between devices, regardless of their physical location or network configuration. This &amp;ldquo;mesh&amp;rdquo; approach offers significant performance benefits, reduced latency, and improved reliability. By assigning each device a stable IP address within a private network namespace, Tailscale eliminates the complexities of managing firewalls, port forwarding, and dynamic DNS, making it ideal for connecting personal devices, servers, and cloud instances into a cohesive, secure network.&lt;/p&gt;
&lt;p&gt;What makes Tailscale work like magic is a feature they call &lt;a href=&#34;https://tailscale.com/kb/1081/magicdns&#34; target=&#34;_blank&#34;&gt;MagicDNS&lt;/a&gt;. This feature eliminates the need to remember IP addresses and SSH keys for different machines. Using Tailnet, I get a private VPN between different machines, and I can use that to connect to any of these without opening any ports, etc. This significantly simplifies the networking process and enhances security.&lt;/p&gt;
&lt;h3 id=&#34;13-cloudpanel&#34;&gt;1.3 CloudPanel&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.cloudpanel.io/&#34; target=&#34;_blank&#34;&gt;CloudPanel&lt;/a&gt;, a free and open-source server control panel for managing web servers and applications. In the context of this blog post, CloudPanel provides a user-friendly web interface for creating and managing websites, databases, email accounts, and DNS records. It&amp;rsquo;s a crucial part of the automation process, allowing for efficient server management and deployment. Its lightweight design and efficient resource utilization make it great for me.&lt;/p&gt;
&lt;h3 id=&#34;14-cloudflare-tunnels&#34;&gt;1.4 Cloudflare Tunnels&lt;/h3&gt;
&lt;p&gt;Cloudflare Tunnels play a crucial role in the deployment process. They offer a secure and efficient way to expose web services running on private networks without opening inbound ports on firewalls. By establishing an outbound-only connection between a lightweight daemon (&lt;code&gt;cloudflared&lt;/code&gt;) running on your server and Cloudflare&amp;rsquo;s global network, Tunnels create an encrypted tunnel that allows external users to access your services through Cloudflare&amp;rsquo;s edge. This approach enhances security by eliminating the attack surface associated with open ports while leveraging Cloudflare&amp;rsquo;s performance optimizations, such as caching, DDoS protection, and global CDN. It&amp;rsquo;s a powerful tool for self-hosting applications, APIs, and websites from home networks or private infrastructure without compromising security.&lt;/p&gt;
&lt;h3 id=&#34;2-server-setup-keyboard&#34;&gt;2. Server Setup &amp;#x2328;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;To get this to work at a high level, we will do the following to get all of this working. This post won&amp;rsquo;t get into all the details of setting up the prerequisites, and it assumes that you have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudPanel installed on your machine.&lt;/li&gt;
&lt;li&gt;Cloudflare account with a Cloudflare Tunnel set up.&lt;/li&gt;
&lt;li&gt;GitHub repo containing the Hugo project.&lt;/li&gt;
&lt;li&gt;Tailscale for private networking - this is in addition to the HTTP traffic that Cloudflare handles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;21-create-a-static-site-in-cloudpanel&#34;&gt;2.1. Create a Static Site in CloudPanel&lt;/h3&gt;
&lt;p&gt;In CloudPanel, create a new “&lt;strong&gt;Site&lt;/strong&gt;” (from the Dashboard). Select &lt;code&gt;Static&lt;/code&gt;, and assign it a domain, e.g., &lt;code&gt;blog.desigeek.com&lt;/code&gt;. CloudPanel will create a directory structure under something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;(Exact path can vary based on CloudPanel’s naming conventions.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The figure below shows an example of how I set this up.
&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-1.png&#34; alt=&#34;Static site in Cloudpanel&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;211-create-an-ssh-user&#34;&gt;2.1.1 Create an SSH User&lt;/h3&gt;
&lt;p&gt;If you haven’t already, go to CloudPanel’s “&lt;strong&gt;Users&lt;/strong&gt;” section. You can create an &lt;strong&gt;SSH user&lt;/strong&gt; (for example, &lt;code&gt;blog-ssh&lt;/code&gt;). This user will be mapped to the same group or path used by CloudPanel so that it can write your site files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the SSH user’s &lt;strong&gt;home directory&lt;/strong&gt; either &lt;em&gt;is&lt;/em&gt; or &lt;em&gt;can write to&lt;/em&gt; the directory created earlier &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For our example, I created an SSH user called &lt;code&gt;blog-ssh&lt;/code&gt;, and the user&amp;rsquo;s group on Ubuntu was called &lt;code&gt;bahree-blog&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Note: on some CloudPanel installations, the user’s primary group might be something else, not necessarily &lt;code&gt;bahree-blog&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The image below shows an example of how to set this up.
&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-2.png&#34; alt=&#34;Cloudpanel SSH User setting&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;212-directory-paths-and-permissions&#34;&gt;2.1.2. Directory Paths and Permissions&lt;/h3&gt;
&lt;p&gt;Confirm that your SSH user (&lt;code&gt;blog-ssh&lt;/code&gt;) can write into the &lt;code&gt;blog.desigeek.com&lt;/code&gt; directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Example:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -ld /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the owner or group matches your user or a group the user is in.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# If needed:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown -R blog-ssh:bahree-blog /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chmod -R &lt;span style=&#34;color:#f5a97f&#34;&gt;755&lt;/span&gt; /home/&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;cloudpanel_username&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;/htdocs/blog.desigeek.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(Adjust &lt;code&gt;bahree-blog&lt;/code&gt; to the actual group that CloudPanel assigned.)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;22-cloudflare-tunnel-configuration&#34;&gt;2.2 Cloudflare Tunnel Configuration&lt;/h3&gt;
&lt;p&gt;Cloudflare Tunnel is typically set up via Cloudflare’s admin dashboard or command line (see &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/&#34; target=&#34;_blank&#34;&gt;the docs&lt;/a&gt; for more details).&lt;/p&gt;
&lt;p&gt;We will map the domain &lt;code&gt;blog.desigeek.com&lt;/code&gt; to the local server’s port 80 (or 443). Since CloudPanel listens on port 80/443, your tunnel might forward something like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare subdomain → &lt;code&gt;localhost:80&lt;/code&gt; on your server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because Cloudflare is reverse proxying your site, you won’t need to open inbound ports on your server. Ensure your DNS is configured so that &lt;code&gt;blog.desigeek.com&lt;/code&gt; points to the Cloudflare Tunnel.&lt;/p&gt;
&lt;p&gt;The image below shows an example of what this would look like.
&lt;p&gt;

    &lt;img src=&#34;images/cloudfare-1.png&#34; alt=&#34;Cloudfare Tunnel example&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;23-setup-tailscale-secure-private-access&#34;&gt;2.3. Setup Tailscale Secure Private Access&lt;/h3&gt;
&lt;p&gt;To deploy the Hugo site on my home dev server, I need private remote access (SSH, SCP, rsync, etc.) between the GitHub build servers and the home server. I achieve this using Tailscale.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install Tailscale&lt;/strong&gt; on your server:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://tailscale.com/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo tailscale up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The figure below shows an example of an ephemeral node, which created and deleted in approx. a minute.
&lt;p&gt;

    &lt;img src=&#34;images/tailscale-1.png&#34; alt=&#34;Tailscale ephemeral note&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Our Build server is essentially spun up when something is committed in a specific branch, and as a result, we need to get that added to the Tailscale network - but it should not be permanent. Over time, that will pollute the tailnet and make things more difficult to manage. Tailscale has a perfect solution for this - &lt;a href=&#34;https://tailscale.com/kb/1111/ephemeral-nodeshttps://tailscale.com/kb/1111/ephemeral-nodes&#34; target=&#34;_blank&#34;&gt;Ephemeral nodes&lt;/a&gt;. These nodes, as the name suggests, make it easier to connect and then clean up short-lived devices such as containers, cloud functions, or CI/CD systems that spin up and spin down on a regular basis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To use this, we generate an &lt;strong&gt;Ephemeral Auth Key&lt;/strong&gt; from the auth keys page of the Tailscale admin console. Given that the build server would need this, we store this key in GitHub as &lt;code&gt;TS_AUTH_KEY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This allows the ephemeral GitHub Actions runner to connect to my dev server privately, even when I don&amp;rsquo;t have any inbound ports open.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;24-nginx-configuration-via-cloudpanel&#34;&gt;2.4. Nginx Configuration via CloudPanel&lt;/h3&gt;
&lt;p&gt;CloudPanel typically manages the Nginx configuration for each “Site” automatically. It also handles SSL certificates, logs, etc. However, in this case, we are relying on Cloudflare Tunnel, and as a result, we do not need SSL termination on the server; Cloudflare can handle it and forward HTTP internally.
We therefore need to ensure that the config file (vhost) in CloudPanel is minimal. Below is an example of what I use:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;[::]:80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;blog.desigeek.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;{{root}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#8bd5ca&#34;&gt;{nginx_access_log}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {&lt;span style=&#34;color:#8bd5ca&#34;&gt;{nginx_error_log}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;location&lt;/span&gt; ~ &lt;span style=&#34;color:#8bd5ca&#34;&gt;/.well-known&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;auth_basic&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;off&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;allow&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;all&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;{{settings}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;/etc/nginx/global_settings&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;index.html&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;location&lt;/span&gt; ~&lt;span style=&#34;color:#8bd5ca&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf)&lt;/span&gt;$ {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;add_header&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;Access-Control-Allow-Origin&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;expires&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;max&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;access_log&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;off&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#8bd5ca&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;(-f&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$request_filename&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please note that &lt;code&gt;{{root}}&lt;/code&gt; points to &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;, which is set up in the CloudPanel site configuration.&lt;/p&gt;
&lt;p&gt;The figure below shows what this would look like in CloudPanel.&lt;/p&gt;
&lt;h2 id=&#34;cloudpanel---vhost-editor&#34;&gt;&lt;p&gt;

    &lt;img src=&#34;images/cloudpanel-3.png&#34; alt=&#34;CloudPanel - Vhost editor&#34;/&gt;

&lt;/p&gt;&lt;/h2&gt;
&lt;h3 id=&#34;3-github-actions-configuration&#34;&gt;3. GitHub Actions Configuration&lt;/h3&gt;
&lt;p&gt;We finally get to the main thing of building out GitHub actions that will trigger whenever something is checked in on a certain branch. All the other things until now were to essentially expose this dev machine externally (specifically the blog) and allow the build server to deploy to this dev server running at home. If you have a publicly accessible dev machine, much of this might not be required.&lt;/p&gt;
&lt;h3 id=&#34;31-storing-variables--secrets-in-github&#34;&gt;3.1. Storing Variables &amp;amp; Secrets in GitHub&lt;/h3&gt;
&lt;p&gt;We start by storing the variables and secrets we need for this to work. The details are outlined below. To set these up, go to &lt;strong&gt;Settings → Secrets and variables → Actions&lt;/strong&gt; in your GitHub repo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variables (non-sensitive)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SERVER_HOSTNAME&lt;/code&gt; = &lt;code&gt;my-dev-server&lt;/code&gt; (or your Cloudflare Tunnel/hostname). If Tailscale is used, it might be the Tailscale IP/hostname.
&lt;ul&gt;
&lt;li&gt;Note: If you are using Tailscale, the notation of machine-name.local will not resolve and fail, even with MagicDNS enabled. It is best to use the machine name (e.g., &lt;code&gt;my-dev-server&lt;/code&gt; and not &lt;code&gt;my-dev-server.local&lt;/code&gt; or the IP address from the Tailnet)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVER_USERNAME&lt;/code&gt; = &lt;code&gt;blog-ssh&lt;/code&gt; (the SSH user you created in CloudPanel).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUGO_VERSION&lt;/code&gt; = e.g., &lt;code&gt;0.140.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUGO_EXTENDED&lt;/code&gt; = &lt;code&gt;true&lt;/code&gt; (if you want the extended version, otherwise &lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Secrets (sensitive)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SSH_PASSWORD&lt;/code&gt; = &lt;em&gt;the password for &lt;code&gt;blog-ssh&lt;/code&gt;&lt;/em&gt;; this was either set or auto-generated when you created the account in CloudPanel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TS_AUTH_KEY&lt;/code&gt; = &lt;em&gt;Your Tailscale ephemeral auth key&lt;/em&gt; (only if using Tailscale).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The screenshot below shows what this would look like:
&lt;p&gt;

    &lt;img src=&#34;images/gh-1.png&#34; alt=&#34;GitHub Actions secrets and variables&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;32-github-actions-workflow&#34;&gt;3.2 GitHub Actions Workflow&lt;/h3&gt;
&lt;p&gt;The code below outlines a sample workflow for this. It checks out the code, builds it with Hugo, and, once complete, copies it over to the dev server, where I can expose it securely to test it. To allow us to do this, we take a dependency on &lt;code&gt;sshpass&lt;/code&gt; and &lt;code&gt;rsync&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I do have a few things to check as this happens to ensure there aren&amp;rsquo;t any failures. When Hugo is finished, we show some basic stats, such as the number of files and folders created. This is called &lt;code&gt;Show public directory stats&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another is to test the SSH connection, as without that, the build machine cannot talk to the dev server where the final site is getting deployed. This step is called &lt;code&gt;Test SSH Connection&lt;/code&gt;. At a high level, here is the flow that this goes through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check out the code&lt;/li&gt;
&lt;li&gt;Installs Tailscale and connects as an ephemeral node&lt;/li&gt;
&lt;li&gt;Builds with Hugo&lt;/li&gt;
&lt;li&gt;Installs &lt;code&gt;sshpass&lt;/code&gt; &amp;amp; &lt;code&gt;rsync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;rsync&lt;/code&gt; to deploy to the server&lt;/li&gt;
&lt;li&gt;Rolls back if the build fails&lt;/li&gt;
&lt;li&gt;Logs out of Tailscale at the end&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is a sample &lt;code&gt;.github/workflows/deploy-hugo.yml&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Deploy Hugo Site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - main  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# or your chosen branch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;runs-on&lt;/span&gt;: ubuntu-latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Gets non-sensitive values from &amp;#34;Variables&amp;#34; (not Secrets)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;SERVER_HOSTNAME&lt;/span&gt;: ${{ vars.SERVER_HOSTNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;SERVER_USERNAME&lt;/span&gt;: ${{ vars.SERVER_USERNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;HUGO_VERSION&lt;/span&gt;: ${{ vars.HUGO_VERSION }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;HUGO_EXTENDED&lt;/span&gt;: ${{ vars.HUGO_EXTENDED }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Checkout code
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: actions/checkout@v3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Optional Tailscale login if you&amp;#39;re using Tailscale for SSH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Setup Tailscale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: tailscale/github-action@v3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;authkey&lt;/span&gt;: ${{ secrets.TS_AUTH_KEY }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;statedir&lt;/span&gt;: /tmp/tailscale-state/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Setup Hugo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: peaceiris/actions-hugo@v2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;hugo-version&lt;/span&gt;: ${{ env.HUGO_VERSION }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;extended&lt;/span&gt;: ${{ env.HUGO_EXTENDED }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Build Hugo site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;id&lt;/span&gt;: build-site
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          hugo --minify -d public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Verify Hugo Output
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          if [ ! -d &amp;#34;public&amp;#34; ] || [ -z &amp;#34;$(ls -A public)&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            echo &amp;#34;Error: &amp;#39;public&amp;#39; directory is empty or does not exist.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            exit 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Public directory exists and is not empty.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Show public directory stats
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          cd public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Files: $(find . -type f | wc -l)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Directories: $(find . -type d | wc -l)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          echo &amp;#34;Size: $(du -sm . | cut -f1) MB&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Install sshpass and rsync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo apt-get install -y sshpass rsync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Test SSH Connection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sshpass -p &amp;#34;${{ secrets.SSH_PASSWORD }}&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            ssh -o StrictHostKeyChecking=no ${{ env.SERVER_USERNAME }}@${{ env.SERVER_HOSTNAME }} \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            &amp;#39;echo &amp;#34;SSH Connection Successful&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Deploy via rsync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome == &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;SSH_PASSWORD&lt;/span&gt;: ${{ secrets.SSH_PASSWORD }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sshpass -p &amp;#34;$SSH_PASSWORD&amp;#34; rsync -az --delete \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            -e &amp;#34;ssh -o StrictHostKeyChecking=no&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            public/ ${{ env.SERVER_USERNAME }}@${{ env.SERVER_HOSTNAME }}:/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Rollback on Failure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: steps.build-site.outcome != &amp;#39;success&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;uses&lt;/span&gt;: appleboy/ssh-action@master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;host&lt;/span&gt;: ${{ env.SERVER_HOSTNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;username&lt;/span&gt;: ${{ env.SERVER_USERNAME }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;password&lt;/span&gt;: ${{ secrets.SSH_PASSWORD }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#c6a0f6&#34;&gt;script&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            BACKUP_DIR=&amp;#34;/home/[cloudpanel_username]/backups&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            SITE_DIR=&amp;#34;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            LATEST_BACKUP=$(ls -t &amp;#34;$BACKUP_DIR&amp;#34;/*.tar.gz | head -n 1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            if [[ -n &amp;#34;$LATEST_BACKUP&amp;#34; ]]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;Rolling back to: $LATEST_BACKUP&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              rm -rf &amp;#34;$SITE_DIR&amp;#34;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              tar -xzvf &amp;#34;$LATEST_BACKUP&amp;#34; -C &amp;#34;$SITE_DIR&amp;#34; --strip-components=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;Rollback successful!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;              echo &amp;#34;No backups found to rollback to!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;            fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: Tailscale Logout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;: always()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;run&lt;/span&gt;: |&lt;span style=&#34;color:#6e738d&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          # If Tailscale requires sudo or operator privileges to log out,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          # either configure passwordless sudo or skip this if ephemeral.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d&#34;&gt;          sudo tailscale logout&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Update &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt; to match the actual path CloudPanel created. The same applies to the backup directory if you use that mechanism.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The figures below show an example of when this was building, and one of the validations.
&lt;p&gt;

    &lt;img src=&#34;images/gh-2.png&#34; alt=&#34;Action running&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/gh-3.png&#34; alt=&#34;Validation - Build was successful&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-tips--troubleshooting-rotating_light&#34;&gt;4. Tips &amp;amp; Troubleshooting &amp;#x1f6a8;&lt;/h3&gt;
&lt;p&gt;I wanted to share a few things I have learned as I went through and debugged this. Hopefully this will help someone else too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permission Denied: Make sure your CloudPanel SSH user has &lt;em&gt;ownership&lt;/em&gt; or &lt;em&gt;group-writable&lt;/em&gt; permission on &lt;code&gt;/home/[cloudpanel_username]/htdocs/blog.desigeek.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rsync Overwrites: The &lt;code&gt;--delete&lt;/code&gt; flag in rsync removes files on the server that no longer exist locally. Remove &amp;lsquo;- delete &amp;rsquo; if you don’t want that behavior.&lt;/li&gt;
&lt;li&gt;Cloudflare Tunnel: If the site is not reachable at &lt;code&gt;blog.desigeek.com&lt;/code&gt;, check your Cloudflare DNS config or the tunnel routing.&lt;/li&gt;
&lt;li&gt;SSH: You might still rely on Tailscale or an open SSH port for SSH since Cloudflare typically only proxies HTTP/HTTPS.&lt;/li&gt;
&lt;li&gt;Tailscale Logout: If you see “Access denied: logout access denied,” you can skip &lt;code&gt;tailscale logout&lt;/code&gt; (ephemeral nodes eventually vanish) or configure passwordless sudo for Tailscale.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;5-conclusion&#34;&gt;5. Conclusion&lt;/h3&gt;
&lt;p&gt;By combining CloudPanel for site management, Cloudflare Tunnel for secure external traffic, Tailscale for private networking, and GitHub Actions for automated builds, you get a robust, convenient pipeline to deploy your Hugo blog. &amp;#x1f60d;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CloudPanel simplifies web server config and user management.&lt;/li&gt;
&lt;li&gt;Cloudflare Tunnel ensures secure traffic without exposing direct ports.&lt;/li&gt;
&lt;li&gt;Tailscale provides easy, private SSH if desired.&lt;/li&gt;
&lt;li&gt;GitHub Actions automates the entire Hugo build and deployment process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, when you push changes to your repository, your CloudPanel-managed site updates automatically, so no manual FTP or SSH is required!&lt;/p&gt;
&lt;p&gt;Happy Deploying! &amp;#x263a;&amp;#xfe0f;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.cloudpanel.io/documentation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CloudPanel Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cloudflare Tunnel Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://gohugo.io/documentation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hugo Documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://tailscale.com/kb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tailscale Documentation
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://docs.github.com/en/actions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub Actions Docs
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</description>
    </item>
    
    <item>
      <title>AI generated Podcast for my book: Generative AI in Action 🎧</title>
      <link>/post/2024/10/ai-generated-book-podcast/</link>
      <pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/10/ai-generated-book-podcast/</guid>
      <description>&lt;p&gt;The one thing I wanted to do after my book &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/16/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; was complete was to create a summary in natural speech and possibly use TTS (Text-to-speech) to create an audio summary—think of it as a podcast that is easier for people to consume and get a quick sense of what the book is about.&lt;/p&gt;
&lt;h3 id=&#34;tts-text-to-speech-or-not-to-tts&#34;&gt;TTS (Text to Speech) or not to TTS?&lt;/h3&gt;
&lt;p&gt;Initially, I was inclined towards using TTS (Text to Speech) for the audio summary. This technology, I thought, would be a convenient way to create a podcast-like summary that would be easier for people to consume and get a quick sense of what the book is about. My journey began with TTS - using GPT 4o to create a summary after ingesting the book and then using that as into the &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/products/ai-services/ai-speech&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Speech stack
	&lt;/span&gt;
&lt;/a&gt;. However, I stumbled across something intriguing. Instead of TTS, I opted for &lt;a
	
		href = &#34;https://blog.google/technology/ai/notebooklm-google-ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NotebookLM
	&lt;/span&gt;
&lt;/a&gt; from Google Labs to generate the audio overview - the podcast. This decision marked a significant shift in my approach, and I created two podcasts using the content from the book - one from multiple sources and another from a single source (the book).&lt;/p&gt;
&lt;p&gt;NotebookLM is an experimental AI-first notebook from Google Labs designed to help users gain insights faster by grounding the language model in their documents. It aims to assist with synthesizing facts and ideas from multiple sources, making connections quicker and easier. It can help users understand, summarize, and generate new ideas based on their content. What is fascinating is that it can generate audio, which is a natural dialog between two people - with wit, humor, and a natural flow. It is like conversing with someone who has read the book and is summarizing it for you. And if I hadn’t told you that this was AI-generated, it would be hard to tell that it was not a real conversation.&lt;/p&gt;
&lt;h3 id=&#34;the-podcasts&#34;&gt;The &amp;ldquo;Podcasts&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;For the first audio generation, the multiple sources I used were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The book, and my &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/16/book-release-genai-in-action/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		blog post
	&lt;/span&gt;
&lt;/a&gt; announcing the book&lt;/li&gt;
&lt;li&gt;A real podcast I did with Miko on his podcast &lt;a
	
		href = &#34;https://youtu.be/ocFzIBh2t9Y?si=DuPM41_WoyOnBiIV&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hockeystick
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And another real podcast with Jamie on his podcast &lt;a
	
		href = &#34;https://www.youtube.com/watch?v=1rlENMGjyWM&amp;amp;ab_channel=JamieTaylor&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The modern .NET show
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the second audio generation I only used a single source - the book.&lt;/p&gt;
&lt;p&gt;The results of the AI-generated audio are truly impressive. In each instance, the audio was produced in a natural voice, simulating a genuine conversation between two people. The quality of the audio, the conversation, and the flow are nothing short of mind-blowing. Even in the second audio, where some acronyms were not pronounced correctly, it&amp;rsquo;s a minor issue, considering the audio was generated in just a few minutes with the press of a button. I was genuinely surprised at the level of realism and natural flow in the conversation. &amp;#x1f92f;&lt;/p&gt;
&lt;p&gt;Have a listen and let me know what you think.&lt;/p&gt;
&lt;h3 id=&#34;podcast-summary-1---using-multiple-sources&#34;&gt;Podcast Summary 1 - using multiple sources&lt;/h3&gt;
&lt;p&gt;The sources provide a comprehensive overview of generative AI and its application within enterprises. The first source, a YouTube video transcript, features an interview with Amit Bahree, a technical program manager at Microsoft, who discusses the rise of large language models (LLMs) and their potential impact on society. The second source, a book excerpt, delves into the technical aspects of generative AI, covering foundational models, large language models, retrieval-augmented generation, and the architectural principles for building generative AI applications. The book also explores various use cases, including image generation, code generation, and the ethical considerations surrounding the use of generative AI.&lt;/p&gt;
&lt;!-- 




&lt;figure &gt;
  &lt;audio controls class=&#34;player&#34; preload=&#34;metadata&#34;&gt;
    
    &lt;source src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-multiple_sources.wav&#34;&gt;
  &lt;/audio&gt;
  
  &lt;figcaption&gt;Book Podcast - using multiple sources&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-multiple_sources.wav&#34;
      title=&#34;Book Podcast - using multiple sources&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    &lt;figcaption&gt;Book Podcast - using multiple sources&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h3 id=&#34;podcast-summary-2---using-single-source-the-book&#34;&gt;Podcast Summary 2 - using single source (the book)&lt;/h3&gt;
&lt;p&gt;This book is a comprehensive guide to Generative AI, focusing on how this transformative technology can be leveraged within an enterprise. It explains core concepts like foundational models and large language models (LLMs) as well as practical applications for generating various content, including text, images, code, audio, and video. The book also explores responsible AI practices, highlighting the importance of prompt engineering, ethical considerations, and security measures for implementing these technologies. The author emphasizes the need for careful evaluation, monitoring, and scalability when deploying Generative AI models in a production environment.&lt;/p&gt;
&lt;!-- 





&lt;figure &gt;
  &lt;audio controls class=&#34;player&#34; preload=&#34;metadata&#34;&gt;
    
    &lt;source src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-book_only.wav&#34;&gt;
  &lt;/audio&gt;
  
  &lt;figcaption&gt;Book Podcast - using sinle source&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;https://www.desigeek.com/book/genai/podcast/Book_Podcast-book_only.wav&#34;
      title=&#34;Book Podcast - using single source&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    &lt;figcaption&gt;Book Podcast - using single source&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;AI-generated podcasts showcase the potential of AI to revolutionize content creation. Generating natural-sounding audio summaries from text is a game-changer for authors, creators, and educators. As AI continues to advance, we anticipate more opportunities to improve how we access information. I am excited to explore the new possibilities in AI-generated content.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backing up TeslaMate data to OneDrive</title>
      <link>/post/2024/07/backing-teslamate-to-onedrive/</link>
      <pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/07/backing-teslamate-to-onedrive/</guid>
      <description>&lt;p&gt;I have been running a couple of instances of Teslamate - one locally on a server at home and another in Azure in a Ubuntu VM (see 👉 &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2021/12/how-to-run-teslamate-on-azure/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this blog post
	&lt;/span&gt;
&lt;/a&gt; for details). I have been backing up the data to a NAS and then an offsite backup for the local instance. For the Azure instance, I have been running various backups during the day and backing up the data to OneDrive. This allows me to have a data backup in case the VM crashes or the data gets corrupted.&lt;/p&gt;
&lt;p&gt;Work and AI have kept me busy, and I have not had a chance to write about it until now. I have a ton of storage on OneDrive, which seemed the most logical place to store it. Multiple options are available to back up data to OneDrive. The one that has been working consistently and well for me is &lt;code&gt;rclone&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-rclone&#34;&gt;What is Rclone?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://rclone.org&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rclone
	&lt;/span&gt;
&lt;/a&gt; Rclone is an open-source command-line tool for managing files across various cloud storage services. It supports over 70 providers, including Google Drive, Amazon S3, Dropbox, and Microsoft OneDrive. Rclone allows users to perform operations like copying, moving, syncing, and deleting files and more advanced tasks such as encryption, compression, and chunking. Additionally, it can mount cloud storage as a local drive, facilitating seamless file access and management.&lt;/p&gt;
&lt;p&gt;Known as the &amp;ldquo;Swiss army knife of cloud storage,&amp;rdquo; Rclone is highly versatile and can be integrated into scripts for automating complex file operations. Its ability to act as a bridge between different cloud providers makes it an invaluable tool for efficiently transferring files and managing cloud storage environments.&lt;/p&gt;
&lt;h3 id=&#34;step-1-setting-up-rclone&#34;&gt;Step 1: Setting up Rclone&lt;/h3&gt;
&lt;p&gt;The base assumption is that you have a working instance of Teslamate running in a docker container on a Linux machine. Rclone is also available for Windows and Mac, and you can follow the [instructions] (&lt;a
	
		href = &#34;https://rclone.org/install/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://rclone.org/install/
	&lt;/span&gt;
&lt;/a&gt;) to install it on those platforms. Let us start by outlining how to install &lt;code&gt;rclone&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s install &lt;code&gt;rclone&lt;/code&gt; on your system. You can download and install it using the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://rclone.org/install.sh | sudo bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-11---configuring-rclone-with-onedrive-&#34;&gt;Step 1.1 - Configuring Rclone with OneDrive ☁️&lt;/h3&gt;
&lt;p&gt;After installing &lt;code&gt;rclone&lt;/code&gt;, we need to configure it to use OneDrive. Rclone has &lt;a
	
		href = &#34;https://rclone.org/onedrive/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		detailed steps
	&lt;/span&gt;
&lt;/a&gt; on how to configure OneDrive. I show some of them here on how to run the following command to start the configuration process:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll be prompted with several questions about setting up a new remote. Here is an example configuration for OneDrive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No remotes found - make a new one
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) New remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;r) Rename remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c) Copy remote
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s) Set configuration password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;q) Quit config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n/r/c/s/q&amp;gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name&amp;gt; onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type of storage to configure.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Choose a number from below, or type in your own value.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;24 / Microsoft OneDrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   \ &amp;#34;onedrive&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Storage&amp;gt; 24
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Microsoft App Client Id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Leave blank normally.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client_id&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Microsoft App Client Secret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Leave blank normally.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client_secret&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Edit advanced config? (y/n)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y) Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) No
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y/n&amp;gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Use auto config?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Say Y if not sure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * Say N if you are working on a remote or headless machine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y) Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n) No
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y/n&amp;gt; y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the last prompt (auto config), if you are on a headless machine (e.g., you had SSH&amp;rsquo;d into a server to set this up), you can say n, and it will give you a URL to open in a browser to authenticate - as these require OAuth2. On the host (from which you are connected), you can authenticate and get the token, which you can paste into the terminal window. If the browser does not open, you can open your local browser and navigate to &lt;code&gt;http://127.0.0.1:53682/auth&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you are on SSH, you might need to create an SSH tunnel over port 53682 to your local machine using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -L localhost:53682:localhost:53682 username@remote_server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more details on how to do this, refer to the &lt;a
	
		href = &#34;https://rclone.org/remote_setup/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		rclone remote setup
	&lt;/span&gt;
&lt;/a&gt; documentation.&lt;/p&gt;
&lt;p&gt;It is important to remember the &lt;strong&gt;name&lt;/strong&gt; you give to the remote, as you will need it in the backup script later. In our example, we called it &lt;strong&gt;&lt;code&gt;onedrive&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Also, note that the &lt;code&gt;rclone&lt;/code&gt; configuration is stored in the &lt;code&gt;.config&lt;/code&gt; directory in the user&amp;rsquo;s home directory. The configuration file is named &lt;code&gt;rclone.conf&lt;/code&gt; and contains the details of the remotes you have configured. You can view the configuration file by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat ~/.config/rclone/rclone.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test the configuration, you can run the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone ls onedrive:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should list the files and directories in your OneDrive account. If you see the list of files, the configuration is successful. If you encounter any errors, review the configuration and ensure the authentication details are correct. For example, the image below shows the successful configuration of the OneDrive remote:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cheking-rclone.jpg&#34; alt=&#34;Remote OneDrive folder listing&#34;/&gt;
        &lt;figcaption&gt;Remote OneDrive folder listing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-12---mounting-remote-directory-with-rclone-file_folder&#34;&gt;Step 1.2 - Mounting Remote Directory with Rclone &amp;#x1f4c1;&lt;/h3&gt;
&lt;p&gt;Now that we have configured &lt;code&gt;rclone&lt;/code&gt; with OneDrive, we can mount the remote directory to a local directory in the system. This allows us to access the remote files as if they were local files. We cannot use a regular mount command, as the rclone mount command is not a real drive but is a FUSE-based mount. To mount the remote directory, use the following command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone mount --config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/.config/rclone/rclone.conf --vfs-cache-mode full --allow-non-empty --allow-other --daemon --dir-perms &lt;span style=&#34;color:#f5a97f&#34;&gt;0777&lt;/span&gt; car_backup:car_data2 /home/amit/onedrive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let&amp;rsquo;s break down the command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the above command, replace &lt;code&gt;/home/amit/.config/rclone/rclone.conf&lt;/code&gt; with the path to your rclone configuration file.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;car_backup:car_data2&lt;/code&gt; with the remote name (configured in Sep 3) and the directory you want to mount.&lt;/li&gt;
&lt;li&gt;The local directory &lt;code&gt;/home/amit/onedrive&lt;/code&gt; is where the remote directory will be mounted (you might need to create a new folder for this). You can choose any local directory for this purpose.&lt;/li&gt;
&lt;li&gt;In the above command, the &lt;code&gt;--daemon&lt;/code&gt; flag runs the mount in the background, and the &lt;code&gt;--dir-perms 0777&lt;/code&gt; flag sets the directory permissions.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--allow-non-empty&lt;/code&gt; flag allows mounting over a non-empty directory.&lt;/li&gt;
&lt;li&gt;And finally, the &lt;code&gt;--allow-other&lt;/code&gt; flag allows other users to access the mounted directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once the command is executed, you should see the remote directory mounted to the local directory. You can access the files in the remote directory as local files. For example, you can list the files in the mounted directory using the &lt;code&gt;ls&lt;/code&gt; command, as shown in the image below:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/listing-mounted-drive.jpg&#34; alt=&#34;Listing mounted OneDrive directory&#34;/&gt;
        &lt;figcaption&gt;Listing mounted OneDrive directory&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-13---persistent-mounting-with-rclone-&#34;&gt;Step 1.3 - Persistent Mounting with Rclone 💾&lt;/h3&gt;
&lt;p&gt;It is important to note that the &lt;code&gt;rclone mount&lt;/code&gt; command is not persistent across reboots. So, if your VM reboots for some reason, you will lose this. To make the mount persistent, you can add the command to the system&amp;rsquo;s startup scripts or use a tool like &lt;code&gt;systemd&lt;/code&gt; to manage the mount as a service. We will create a &lt;code&gt;systemd&lt;/code&gt; service file to manage the mount for this.&lt;/p&gt;
&lt;p&gt;To do this, create a new service file using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/systemd/system/rclonemount.service&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the following content to the file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Unit&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Description&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;rclonemount
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;AssertPathIsDirectory&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;After&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Wants&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;network-online.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Service&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Type&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;simple
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Group&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/sleep &lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/mkdir -p /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStartPre&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/chmod &lt;span style=&#34;color:#f5a97f&#34;&gt;777&lt;/span&gt; /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStart&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/usr/bin/rclone mount &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --config&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/.config/rclone/rclone.conf &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --vfs-cache-mode full &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --allow-other &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        --dir-perms &lt;span style=&#34;color:#f5a97f&#34;&gt;0777&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;        car_backup:/car_data2 /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;ExecStop&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/bin/fusermount -uz /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Restart&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;RestartSec&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;HOME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;Environment&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;amit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt;Install&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;WantedBy&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;default.target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above service file, the &lt;code&gt;ExecStartPre`` commands create the directory and set the permissions before mounting the remote directory. The &lt;/code&gt;ExecStart&lt;code&gt;command mounts the remote directory to the local directory. The&lt;/code&gt;ExecStop&lt;code&gt;command unmounts the directory when the service is stopped. The&lt;/code&gt;Restart&lt;code&gt;and&lt;/code&gt;RestartSec` settings ensure the service is restarted in case of failure.&lt;/p&gt;
&lt;p&gt;The image below shows the contents of the &lt;code&gt;rclonemount.service&lt;/code&gt; file in my system:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rclonemoun.service.jpg&#34; alt=&#34;rclonemount.service contents&#34;/&gt;
        &lt;figcaption&gt;rclonemount.service contents&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After creating the service file, reload the systemd daemon and start the service using the following commands:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl daemon-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To test the service, start it using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And check the status of the service to ensure it is running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl status rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If everything is working correctly, you should see the status of the service as &lt;code&gt;active (running)&lt;/code&gt;, as shown in the image below:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/rclonemoun.service-status.jpg&#34; alt=&#34;rclonemount service status&#34;/&gt;
        &lt;figcaption&gt;rclonemount service status&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Note: Press Q to quit.&lt;/p&gt;
&lt;p&gt;And finally, if the service is running without any errors, enable it to start at boot:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#91d7e3&#34;&gt;enable&lt;/span&gt; rclonemount&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Of course, the service can be tested by rebooting the system and checking if the remote directory is mounted automatically.&lt;/p&gt;
&lt;p&gt;Yay! Congratulations! You have successfully configured &lt;code&gt;rclone&lt;/code&gt; to mount the remote directory as a service. The remote directory will now be mounted automatically on system startup. 👍&lt;/p&gt;
&lt;h3 id=&#34;step-2---basic-backup-script-hammer_and_wrench&#34;&gt;Step 2 - Basic Backup Script &amp;#x1f6e0;&amp;#xfe0f;&lt;/h3&gt;
&lt;p&gt;Now that we have &lt;code&gt;rclone&lt;/code&gt; set up and mounted, we can create a basic backup script to back up the Teslamate data to OneDrive. The script will perform the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Back up the Teslamate database.&lt;/li&gt;
&lt;li&gt;Compress the backed-up file.&lt;/li&gt;
&lt;li&gt;Move the compressed file to the remote backup directory using &lt;code&gt;rclone&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The will be a simple bash script that can be run manually or scheduled using a cron job. Here&amp;rsquo;s an example of the basic backup script. Create a new file named &lt;code&gt;backup.sh&lt;/code&gt; and add the following content to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Basic backup script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will need to replace the &lt;code&gt;SOURCEDIR&lt;/code&gt; and &lt;code&gt;BACKUPDIR&lt;/code&gt; with the actual directories on your system. The &lt;code&gt;FILENAME&lt;/code&gt; variable creates a unique filename for the backup file using the current date and time. The script uses &lt;code&gt;pg_dump&lt;/code&gt; to back up the Teslamate database and &lt;code&gt;rclone move&lt;/code&gt; to move the compressed file to the remote directory.&lt;/p&gt;
&lt;p&gt;This script assumes the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have Teslamate running in a docker container, and the database is named &lt;code&gt;teslamate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You have &lt;code&gt;rclone&lt;/code&gt; configured with OneDrive and mounted the remote directory to a local directory.&lt;/li&gt;
&lt;li&gt;You have the necessary permissions to access the source and destination directories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make the script executable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x /home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Run the script manually to test it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see the backup file in the remote directory if the script runs successfully. You can check the remote directory using the ls command or by navigating to it.&lt;/p&gt;
&lt;h2 id=&#34;step-3---adding-logging-&#34;&gt;Step 3 - Adding Logging 🗒️&lt;/h2&gt;
&lt;p&gt;To make the script more informative, let&amp;rsquo;s add logging. This will help us keep track of the backup process and identify any issues. We will use the same script as above as our starting point and add logging to it. We will log messages to a log file and display them on the console. Here&amp;rsquo;s the updated script with logging:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Backup script with logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LOGFILE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/backup.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to log messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | tee -a &lt;span style=&#34;color:#f4dbd6&#34;&gt;$LOGFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Start of the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting backup script.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression successful: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully moved backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to move backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup script completed successfully.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As in the earlier step, run the script manually to test it and check the log file for messages.&lt;/p&gt;
&lt;h2 id=&#34;step-4---adding-email-notifications-&#34;&gt;Step 4 - Adding Email Notifications 📧&lt;/h2&gt;
&lt;p&gt;Finally, we want to be notified about the backup status. We can add email notifications to the script. We&amp;rsquo;ll use &lt;code&gt;ssmtp&lt;/code&gt; for this purpose. This simple mail transfer agent can send email notifications from the command line. We&amp;rsquo;ll update the script to send an email notification after the backup is completed.&lt;/p&gt;
&lt;p&gt;To send email notifications, you need to have an SMTP server configured. You can use your email provider&amp;rsquo;s SMTP server for this purpose. Our first step is to set up &lt;code&gt;ssmtp&lt;/code&gt; for email notifications&lt;/p&gt;
&lt;h3 id=&#34;step-41---installing-and-configuring-ssmtp&#34;&gt;Step 4.1 - Installing and Configuring &lt;code&gt;ssmtp&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Install &lt;code&gt;ssmtp&lt;/code&gt; on your system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install ssmtp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Edit the &lt;code&gt;/etc/ssmtp/ssmtp.conf&lt;/code&gt; file to add your SMTP server details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/ssmtp/ssmtp.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the following lines, replacing the placeholders with your actual details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root=your-email@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mailhub=smtp.your-email-provider.com:587
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AuthUser=your-email@example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AuthPass=your-email-password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;UseSTARTTLS=YES
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TLS_CA_File=/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FromLineOverride=YES&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Edit or create the &lt;code&gt;/etc/ssmtp/revaliases&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo nano /etc/ssmtp/revaliases&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the following line, replacing with your actual details:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;your-username:your-email@example.com:smtp.your-email-provider.com:587&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To test the email configuration, we can create a simple script called  test_email.sh that sends a test email:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Test email script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Teslamate Server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;the-from-email-address&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email-address-where-you-want-to-send-the-email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Test Email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BODY&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;This is a test email to verify the SMTP configuration.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;To: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\nFrom: \&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&amp;#34; &amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;gt;\nSubject: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BODY&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | ssmtp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You should receive a test email at the specified address when you run the script. If you encounter any issues, review the configuration and ensure the SMTP server details are correct.&lt;/p&gt;
&lt;h3 id=&#34;step-42---timeout-for-email-notifications&#34;&gt;Step 4.2 - Timeout for Email Notifications&lt;/h3&gt;
&lt;p&gt;We can add a timeout to the email command to prevent the script from hanging indefinitely if the email-sending process takes too long. We&amp;rsquo;ll use the &lt;code&gt;timeout&lt;/code&gt; command to set the duration of the email sending. First, we must check if the &lt;code&gt;timeout&lt;/code&gt; command is available on your system. You can check this by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timeout --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the &lt;code&gt;timeout&lt;/code&gt; command is not available, you can install it using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install coreutils&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-43---updating-the-backup-script-with-email-notifications&#34;&gt;Step 4.3 - Updating the Backup Script with Email Notifications&lt;/h3&gt;
&lt;p&gt;Now that we have &lt;code&gt;ssmtp&lt;/code&gt; set up for email notifications, we can update the backup script to send an email notification after the backup is completed. We&amp;rsquo;ll add a function to send email notifications and call it at the end of the script. Here&amp;rsquo;s the updated script that includes email notifications:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Backup script with logging and email notifications&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/teslamate &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Source directory where the data is located&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/onedrive &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remote directory mounted via rclone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FILENAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;teslamate-&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date +%Y-%m-%d-%H%M%S&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;.bak.gz &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Date-time stamp filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LOGFILE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;/home/amit/backup.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email-address-you-want-to-send-the-email-to&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Replace with your email address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Teslamate Server&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;your-email@example.com&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Replace with the authorized sender email address&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;TIMEOUT_DURATION&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set timeout duration (in seconds) for sending email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;RCLONE_CONFIG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/home/amit/.config/rclone/rclone.conf&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Path to the rclone config file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Initialize a variable to capture the entire log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to log messages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | tee -a &lt;span style=&#34;color:#f4dbd6&#34;&gt;$LOGFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Function to send email notification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;send_email&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;local&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;BODY&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;The backup script &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;STATUS&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; on &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;date&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.\n\nLog details:\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FULL_LOG&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;To: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\nFrom: \&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_NAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&amp;#34; &amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FROM_EMAIL&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;gt;\nSubject: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUBJECT&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BODY&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; | timeout &lt;span style=&#34;color:#f4dbd6&#34;&gt;$TIMEOUT_DURATION&lt;/span&gt; ssmtp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;EMAIL_EXIT_CODE&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email command exit code: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;124&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email sending timed out after &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$TIMEOUT_DURATION&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; seconds&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$EMAIL_EXIT_CODE&lt;/span&gt; -ne &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to send email&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Email sent successfully&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Start of the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Starting backup script.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Change to the source directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Changed directory to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to change directory to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SOURCEDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform the database dump and compress it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose &lt;span style=&#34;color:#91d7e3&#34;&gt;exec&lt;/span&gt; -T database pg_dump -U teslamate teslamate | gzip &amp;gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression successful: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Database dump and compression failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Move the compressed file to the remote backup directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rclone --config &lt;span style=&#34;color:#f4dbd6&#34;&gt;$RCLONE_CONFIG&lt;/span&gt; move &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FILENAME&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$?&lt;/span&gt; -eq &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully moved backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to move backup to &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$BACKUPDIR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Backup script completed successfully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Send email notification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;send_email &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Completed Successfully&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you run the script, you should receive an email notification after completing the backup. The email will contain the log details of the backup process. You can customize the email content and format as needed. The image below shows an example email notification:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/email.jpg&#34; alt=&#34;Email notification&#34;/&gt;
        &lt;figcaption&gt;Email notification&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-44---scheduling-the-backup-script&#34;&gt;Step 4.4 - Scheduling the Backup Script&lt;/h3&gt;
&lt;p&gt;You can schedule the script to run regularly using a &lt;code&gt;cron&lt;/code&gt; job to automate the backup process. You can create a &lt;code&gt;cron&lt;/code&gt; job to run the script daily, weekly, or at any interval you prefer. Here&amp;rsquo;s an example of a cron job to run the script daily:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; * * * /home/amit/backup.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This cron job runs the &lt;code&gt;backup.sh&lt;/code&gt; script every day at midnight. You can customize the schedule based on your requirements. To add the cron job, open the crontab file using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -e&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Add the cron job to the file and save it. The cron job will now run the backup script at the specified interval.&lt;/p&gt;
&lt;p&gt;I have the script running at 5 AM, 1 PM, and 9 PM daily. In addition, I log the output of the cron job to a file (&lt;code&gt;backup_cron.log&lt;/code&gt;) so I can review it later if there is an issue.  Here are the steps to set this up:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;13&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt; * * * /home/amit/backup.sh &amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Be sure to replace &lt;code&gt;/home/amit/backup.sh&lt;/code&gt; with the actual path to your backup script. The &lt;code&gt;&amp;gt;&amp;gt; /home/amit/backup_cron.log 2&amp;gt;&amp;amp;1&lt;/code&gt; part of the cron job redirects the script output to the specified log file. This allows you to capture the script output and any errors during execution.&lt;/p&gt;
&lt;p&gt;Finally, you can check the cron job status using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will list the cron jobs that are currently scheduled. You can also check the cron job logs to verify that the script is running as expected.&lt;/p&gt;
&lt;p&gt;Here is a snippet of the &lt;code&gt;backup_cron.log&lt;/code&gt; file from my system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:01 - Starting backup script.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:01 - Changed directory to /home/amit/teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;time&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2024-07-05T13:00:01-07:00&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;level&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;warning &lt;span style=&#34;color:#f4dbd6&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/home/amit/teslamate/docker-compose.yml: `version` is obsolete&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:30 - Database dump successful: teslamate-2024-07-05-130001.bak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:55 - Successfully compressed teslamate-2024-07-05-130001.bak.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:57 - Successfully moved backup to /home/amit/onedrive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:57 - Backup script completed successfully.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:59 - Email &lt;span style=&#34;color:#91d7e3&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt; code: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2024-07-05 13:00:59 - Email sent successfully&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-45---timezone-configuration&#34;&gt;Step 4.5 - Timezone Configuration&lt;/h3&gt;
&lt;p&gt;Note in most cloud-based VMs, the timezone is set to UTC; if you specify the time in your local timezone, you might want to set the timezone to your local timezone. You can do this by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-timezone your-timezone&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;your-timezone&lt;/code&gt; with the appropriate timezone (e.g., &lt;code&gt;America/Los_Angeles&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;And that&amp;rsquo;s it! You now have a backup script that backs up your Teslamate data to OneDrive and sends email notifications about the backup status. The script runs automatically at the scheduled intervals, ensuring your data is backed up regularly. You can customize the script further based on your requirements and preferences. 🫰&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SLMs - Running Phi-3 on an iphone and locally</title>
      <link>/post/2024/05/running-phi3-on-device/</link>
      <pubDate>Wed, 08 May 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/05/running-phi3-on-device/</guid>
      <description>&lt;p&gt;We released Phi-3 recently, which builds on Phi-2 (&lt;a
	
		href = &#34;https://blog.desigeek.com/post/2024/03/running-phi2-locally/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read more on that here
	&lt;/span&gt;
&lt;/a&gt;) and it is a great model to use for various tasks. In this post, we will show how to run Phi-3 locally including a demo of it running on a phone.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://1drv.ms/v/s!Alx12BenmZ2yx6tK2CRER3Q-cuY9iw?e=b0bqTh&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;h2 id=&#34;1-what-are-small-language-models-slms&#34;&gt;1. What are Small Language Models (SLMs)?&lt;/h2&gt;
&lt;p&gt;Before diving into running Phi-2 locally, let&amp;rsquo;s take a moment to understand the concept of small language models (SLMs) and their significance in natural language processing (NLP). A SLM is a type of AI model that has been trained on a massive dataset of text but is limited in terms of its size and capabilities compared to a Large Language Model (LLM). SLMs are designed to be more lightweight and efficient, making them suitable for various applications, including chatbots, language translation, and content generation. SLMs are much smaller than LLMs, with fewer parameters and a smaller dataset, so they have a lower computational cost, making them more suitable for edge or resource-constraint devices.&lt;/p&gt;
&lt;h2 id=&#34;2-what-is-phi-2&#34;&gt;2. What is Phi-2?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Phi-2
	&lt;/span&gt;
&lt;/a&gt; is the latest model in the Phi series of small language models (SLMs) that aim to break the conventional scaling laws of language models. Unlike large language models (LLMs) that require massive amounts of data and compute resources, Phi models are trained on a mixture of web-crawled and synthetic &amp;ldquo;textbook-quality&amp;rdquo; data, following the idea of &lt;a
	
		href = &#34;https://arxiv.org/abs/2306.11644&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Textbooks Are All You Need
	&lt;/span&gt;
&lt;/a&gt;. Phi models also leverage innovations in model architecture, optimization, and data augmentation to achieve remarkable performance on various benchmarks. &amp;#x1f600;&lt;/p&gt;
&lt;p&gt;Phi-2 is twice as large as its predecessor Phi-1.5, and was trained for two weeks on a cluster of 96 A100 GPUs. It demonstrates outstanding reasoning and language understanding capabilities, showcasing state-of-the-art performance (for LLMs &amp;lt;13 billion parameters).&lt;/p&gt;
&lt;p&gt;As shown in the figure below on complex benchmarks, Phi-2 matches or outperforms models up to 25x larger, such as Llama-2 and Gemini Nano. Phi-2 is also an ideal playground for researchers, as it allows for exploration around mechanistic interpretability, safety improvements, or fine-tuning experimentation on various tasks. Phi-2 is available in the &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/ai-studio/what-is-ai-studio?tabs=home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Studio
	&lt;/span&gt;
&lt;/a&gt; (via the &lt;a
	
		href = &#34;https://ai.azure.com/explore/models/microsoft-phi-2/version/4/registry/azureml-msr&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		model catalog
	&lt;/span&gt;
&lt;/a&gt;) and on Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2.png&#34; alt=&#34;Phi-2 Evaluation&#34;/&gt;
        &lt;figcaption&gt;Phi-2 Evaluation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;21-phi-2s-capabilities&#34;&gt;2.1 Phi-2&amp;rsquo;s Capabilities&lt;/h3&gt;
&lt;p&gt;What better way to show this other than Some prompts that Phi-2 can handle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creative Writing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a short story about a time-traveling computer geek who discovers a secret algorithm book with the power to change computing history.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;In the dimly lit archives of the ancient library, Amelia stumbled upon a dusty tome unlike any other. Its pages whispered secrets of forgotten civilizations and whispered promises of altered destinies. As she traced her fingers over the delicate script, the room seemed to blur, and suddenly, she was standing in the heart of Renaissance Florence. The air smelled of ink and ambition. The book had worked its magic, and Amelia knew she held the fate of empires in her hands.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philosophical Reflection&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Discuss the concept of free will versus determinism.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Free will and determinism have long been at odds in philosophical discourse. Some argue that our choices are predetermined by external factors—genetics, upbringing, societal norms—while others champion the idea that we possess true agency. Perhaps the truth lies in the delicate dance between the two. We navigate life&amp;rsquo;s labyrinth, sometimes guided by fate, other times forging our own path.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational Explanation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Explain the process of photosynthesis in simple terms.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Photosynthesis, the magical dance of plants and sunlight, is how they create their own food. Imagine tiny chlorophyll factories in leaves, capturing sunlight like solar panels. They convert that energy into chemical fuel—glucose—while releasing oxygen as a byproduct. So next time you breathe in that fresh air, thank a leaf for its photosynthetic prowess!&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Humorous Scenario&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Describe a day in the life of a mischievous squirrel.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Meet Nutty, the squirrel extraordinaire. His mornings begin with acorn heists, followed by elaborate treehouse construction. He&amp;rsquo;s the neighborhood&amp;rsquo;s unofficial alarm clock, chattering loudly at dawn. But his pièce de résistance? Prank-calling the crows, convincing them they&amp;rsquo;ve won a lifetime supply of shiny objects. Nutty&amp;rsquo;s motto: &amp;lsquo;Life&amp;rsquo;s too short not to be a little nuts.&amp;rsquo;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-small-language-models-slms-vs-large-language-models-llms&#34;&gt;3. Small Language Models (SLMs) vs Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;Large Language Models (LLMs) are a type of AI model that is much larger and more powerful than SLMs. LLMs have hundreds of billions of parameters and are trained on massive text datasets. This gives LLMs the ability to handle complex tasks, such as language generation, translation, and question answering, with high accuracy and fluency. However, LLMs also have some disadvantages. They are larger, making them more expensive and slower to train. They also have a higher computational cost, meaning they may require access to specialized hardware.&lt;/p&gt;
&lt;p&gt;On the other hand, SLMs, as we called out, are smaller and more lightweight than LLMs, making them more efficient and cost-effective in training computing resources and inference. While it might seem that SLMs are also more suitable for edge or resource-constrained devices, such as mobile phones or IoT devices, they are small compared to LLMs but still require significant computational resources to run. Phi-2, for example, still has 2.7B parameters, and while it can make inferences on a CPU, it is very slow and impractical for real-time applications. One would need a GPU or a cloud-based service for any realistic use case.&lt;/p&gt;
&lt;h3 id=&#34;31-when-to-use-slm-vs-llm&#34;&gt;3.1 When to use SLM vs LLM?&lt;/h3&gt;
&lt;p&gt;Firstly, neither model is inherently better - the choice between an SLM and an LLM depends on the specific application and requirements. SLMs are a good choice when size, cost, and speed are important considerations. LLMs are a better choice when high performance and complex capabilities are required. If a task at hand is quite narrow and in one of the supported languages, then SLMs might be good. However, for a given task, an SLM may be sufficient, but an LLM may be necessary for more complex tasks or tasks requiring high accuracy and fluency.&lt;/p&gt;
&lt;p&gt;Furthermore, it is key to understand that it is not necessarily about the number of languages understood but rather the depth and nuance with which each model can understand and generate language. SLMs are designed to be efficient and effective within their scope, which may include a wide range of languages. LLMs like GPT-4, due to their size and complexity, often can understand and generate text in a larger number of languages and with greater nuance.&lt;/p&gt;
&lt;p&gt;The choice between an SLM and an LLM would again depend on the specific requirements of the task, including the languages involved and the level of language understanding and generation needed. Using a combination of SLMs and LLMs is common to achieve the best results for a given application.&lt;/p&gt;
&lt;h2 id=&#34;4-running-phi-2-locally&#34;&gt;4. Running Phi-2 locally&lt;/h2&gt;
&lt;p&gt;On one hand, running this is simple if you just don&amp;rsquo;t want to program anything and only want to use the model. The easiest option in this case is to use [LM &lt;a
	
		href = &#34;https://lmstudio.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio
	&lt;/span&gt;
&lt;/a&gt;, a web-based platform for running language models. You can use the Hugging Face API to download and run the model.&lt;/p&gt;
&lt;p&gt;We use a simple console chat example that runs locally. We use the Hugging Face Transformers library to generate text based on user input. The user can generate a story, a haiku, or a joke on a topic of their choice. Here is how to run it locally on a Windows machine - the same should apply to a Mac or Linux machine.&lt;/p&gt;
&lt;p&gt;The full code is below, but here are the key aspects to grok when running Phi-2 locally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The key is to use the &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; and &lt;code&gt;AutoTokenizer&lt;/code&gt; classes from the &lt;code&gt;transformers&lt;/code&gt; library to load the Phi-2 model and tokenizer.&lt;/li&gt;
&lt;li&gt;We then use the &lt;code&gt;generate&lt;/code&gt; method to generate text based on a user prompt. The &lt;code&gt;generate&lt;/code&gt; method takes the user prompt as input and returns the generated text&lt;/li&gt;
&lt;li&gt;We use the &lt;code&gt;from_pretrained&lt;/code&gt; method to load the model and tokenizer from the Hugging Face model hub.&lt;/li&gt;
&lt;li&gt;We also use the &lt;code&gt;save_pretrained&lt;/code&gt; method to save the model and tokenizer to a local directory. This allows us to load the model and tokenizer from the local directory if they are already saved, which can help save time and resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following code snippet is what loads the model and the tokenizer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                         trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the following is where we encode the user input and call the generation. First, we create tokens of the user prompt; the resulting tokens are returned as PyTorch tensors. Then, the model generates text based on the tokenized input. We cap the tokens to a maximum of 500 tokens, and the end-of-sequence token is used for padding if necessary. Finally, the generated tokens are decoded back into human-readable text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The full code is below. The code is a simple console chat example that runs locally. The user can generate a story, a haiku, or a joke on a topic of their choice.&lt;/p&gt;
&lt;p&gt;Some examples of what Phi-2 can generate using the above code are shown below. The first is a story about pandas and dogs.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-1.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Story about Pandas 🐼 and Dogs 🐶&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is another example of a Haiku and a Joke generated by Phi-2 on Pandas.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-2.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Haiku and Joke about Pandas 🐼&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Switching gears, let&amp;rsquo;s look at how we can implement the RAG using Phi-2.&lt;/p&gt;
&lt;h3 id=&#34;41-running-phi-2-locally---full-code&#34;&gt;4.1 Running Phi-2 Locally - Full Code&lt;/h3&gt;
&lt;p&gt;The following code is the complete code that executes the examples we showed before for running Phi-2 locally. This can work on a CPU, but it is very slow, and a good GPU is strongly suggested.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt;77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt;78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt;79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt;80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt;81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt;82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt;83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt;84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt;85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt;86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt;87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt;88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt;89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt;90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt;91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt;92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt;93&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings and set the logging level to ERROR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(MODEL_PATH):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, type_of_text)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: Write a &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;type_of_text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; about &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;First What would you like to write today?&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1. Story 📝&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2. Haiku ✍️&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3. Joke 😆&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;4. Quit 👋&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Choose an option:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;And on which topic:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; user_prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Input cannot be empty or consist only of spaces.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;story&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;haiku&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;joke&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Invalid choice. Please choose a valid option.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;5-implementing-retrieval-augmented-generation-rag-with-phi-2&#34;&gt;5. Implementing Retrieval-Augmented Generation (RAG) with Phi-2&lt;/h2&gt;
&lt;p&gt;RAG is a powerful technique that combines the strengths of retrieval-based and generation-based approaches to natural language processing. RAG is one of the ways one can get proprietary information and knowledge to the model and use it as part of the prompt.  It leverages a retriever to find relevant context passages and a generator to produce fluent and coherent responses. The retriever identifies relevant context passages, and the generator uses these passages to generate a response.&lt;/p&gt;
&lt;p&gt;This approach allows RAG to produce high-quality, informative, and contextually relevant responses. In-context learning is a key feature of RAG, as it allows the model to learn from the context of the conversation and generate more accurate and relevant responses. This is particularly useful in scenarios where the model needs to understand and respond to complex queries or provide detailed information on a specific topic.&lt;/p&gt;
&lt;p&gt;At a high level, the process of implementing RAG  involves the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generate Embeddings with Phi-2&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use Phi-2 to encode your context passages (documents) and extract their embeddings.&lt;/li&gt;
&lt;li&gt;These embeddings will represent the semantic content of each passage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a Vector Index&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Choose a vector index library or framework (such as &lt;strong&gt;Faiss&lt;/strong&gt;, &lt;strong&gt;Annoy&lt;/strong&gt;, or &lt;strong&gt;HNSW&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Initialize an index structure to store the embeddings efficiently.&lt;/li&gt;
&lt;li&gt;Add the generated embeddings to the index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save Embeddings to a Local Vector Database&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Create a local database to store the embeddings.&lt;/li&gt;
&lt;li&gt;For each context passage, save its corresponding embedding in the database.&lt;/li&gt;
&lt;li&gt;You can use the passage ID or a unique identifier as the key for retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perform Similarity Search&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;When you receive a new context (query), encode it using Phi-2 to obtain its embedding.&lt;/li&gt;
&lt;li&gt;Use the vector index to perform a similarity search against the saved embeddings.&lt;/li&gt;
&lt;li&gt;Retrieve the most similar context passages based on cosine similarity or another distance metric.&lt;/li&gt;
&lt;li&gt;Return the relevant passages as results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In our example, we will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval. &lt;a
	
		href = &#34;https://faiss.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAISS (Facebook AI Similarity Search)
	&lt;/span&gt;
&lt;/a&gt; is a library developed by Facebook for efficient similarity search and clustering of high-dimensional vectors. It allows for a quick nearest-neighbor search over large datasets and supports CPU and GPU-based computations. FAISS is widely used in information retrieval, recommendation systems, and other applications that require similarity search.&lt;/p&gt;
&lt;h3 id=&#34;51-loading-data-for-rag-and-phi-2&#34;&gt;5.1 Loading data for RAG and Phi-2&lt;/h3&gt;
&lt;p&gt;To implement RAG, we use the script from the Oppenheimer movie - which is quite new in that it is not in the Phi-2 training set and is available as a PDF. We will extract the script from this PDF, creating embeddings, which will then save the embeddings to a local database and perform a similarity search to retrieve relevant context passages based on a user query. We will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval.&lt;/p&gt;
&lt;p&gt;We use the &lt;code&gt;PyPDF2&lt;/code&gt; library to parse PDFs, a pure Python library for reading and writing PDF files. It can extract text, merge and split documents, and more. We will use it to extract the PDF text from the Oppenheimer movie script. The following code function shows how to read the PDF and extract the text. This is efficient for our use case, but it is not the most efficient way to extract text from a PDF when thinking about production scale, especially if the PDF has a lot of images and tables.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;52-generate-embeddings-using-phi-2&#34;&gt;5.2 Generate embeddings using Phi-2&lt;/h3&gt;
&lt;p&gt;Now that we have the text, the following functions show how to create the embeddings using Phi-2. We read the text as a list of context passages and then use Phi-2 to encode each passage and extract its embedding using the &lt;code&gt;encode&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are a few things that are going on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given that we are using this for inference and not training, we use a &lt;code&gt;torch.&lt;/code&gt;no_grad()`, which tells PyTorch not to track, calculate, or modify gradients while executing code within this block. This helps us save the amount of memory needed.&lt;/li&gt;
&lt;li&gt;Inside this block, the input_ids are fed into the model, and the output is stored in the output variable. The logits, which are the raw, unnormalized scores outputted by the last layer of the model, are then extracted from the model&amp;rsquo;s output.&lt;/li&gt;
&lt;li&gt;The logits are then processed to generate the embedding for the passage. The .mean(dim=1) method calculates the mean of the logits along dimension 1, which typically represents the sequence length in a language model.&lt;/li&gt;
&lt;li&gt;The .detach() method detaches the result from the computation graph so that no gradients will be backpropagated along this variable.&lt;/li&gt;
&lt;li&gt;The .cpu() method moves the tensor to the CPU if it&amp;rsquo;s not already there. Finally, the tensor is converted to a numpy array using the .numpy() method.&lt;/li&gt;
&lt;li&gt;The resulting embedding is then appended to the embeddings list, which contains the embeddings for all the passages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-creating-vector-index&#34;&gt;5.3 Creating Vector Index&lt;/h3&gt;
&lt;p&gt;The following function shows how to create a vector index using the FAISS library and perform a similarity search to retrieve relevant context passages based on a user query. The create_index function initializes a flat index structure to store the embeddings and adds the embeddings to the index. The search_query function encodes the user query using Phi-2 to obtain its embedding and performs a similarity search against the saved embeddings to retrieve the most similar context passages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;normalize_L2()&lt;/code&gt; function normalizes the vectors and is a crucial step when using Euclidean distance in high-dimensional spaces to ensure that the distance is not dominated by the dimensionality of the vectors. As we iterate through the embeddings, we check if the item is a 1D array and reshape it to a 2D array if necessary. This is important because FAISS expects the input to be a 2D array, and we need to reshape the 1D array to a 2D array before adding it to the index.&lt;/p&gt;
&lt;p&gt;The function finally returns the created index. This index can then be used to perform efficient similarity searches.&lt;/p&gt;
&lt;h3 id=&#34;54-perform-similarity-search&#34;&gt;5.4 Perform Similarity Search&lt;/h3&gt;
&lt;p&gt;The following function shows how to perform a similarity search using the vector index to retrieve relevant context passages based on a user query. As noted earlier, the most similar context passages are then retrieved based on cosine similarity or another distance metric.&lt;/p&gt;
&lt;p&gt;The function starts by encoding the input query using a tokenizer and performs a similarity search on the FAISS index using the query embedding. It retrieves the indices of the top 3 most similar passages to the input query and then retrieves the corresponding context passages from the context_passages list. The similar context passages are then concatenated into a single string and passed to the Phi-2 model to generate a response.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let us run this and see how it works, as we discussed before. We will use the Oppenheimer movie script as the context passages and perform a similarity search to retrieve relevant context passages based on a user query. The next few figures show the output of us asking questions about the movie, where those pieces of information are not in the model but passed using the semantic search.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-3.png&#34; alt=&#34;Example 1 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 1 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-4.png&#34; alt=&#34;Example 2 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 2 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-5.png&#34; alt=&#34;Example 3 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 3 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that we have seen the different elements, the code below brings everything together as a console app that one can run. The Oppenheimer script (pdf file) you need can be &lt;a
	
		href = &#34;data/oppenheimer-2023.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		downloaded from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;faiss&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tqdm&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; tqdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;pickle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PyPDF2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_NAME &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BATCH_SIZE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Oppenheimer movie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#DATA_FILE = &amp;#34;./oppenheimer-2023.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATA_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./oppenheimer-2023.pdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDINGS_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;./embeddings_movie.pkl&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_model&lt;/span&gt;(model_path, model_name, debug&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(model_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer, device
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;save_embeddings&lt;/span&gt;(embeddings, passages, file_name):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dump((&lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(embeddings), &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(passages)), f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error writing to file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error pickling embeddings and passages.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_embeddings&lt;/span&gt;(file):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; not found.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;UnpicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error unpickling file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Finished reading file. Number pages: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;num_pages&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(EMBEDDINGS_FILE):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the embeddings and passages from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_embeddings(EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the embeddings and passages to disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        save_embeddings(embeddings, context_passages, EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, context)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: You are a helpful bot who only answers using the given context ONLY. If you cannot find the answer in the context reply &amp;#39;Sorry don&amp;#39;t have that detail&amp;#39;. Given the context &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;context&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;, answer this:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DEBUG - Number of similar indices: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;similar_indices&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pass the concatenated context and query to the Phi-2 model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    answer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; handle_prompt(input_query, context)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&amp;#34;&lt;/span&gt;, answer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer, device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_model(MODEL_PATH, MODEL_NAME, DEBUG)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create embeddings and add to index before entering the loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_embeddings(DATA_FILE, tokenizer, model, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;array(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_index(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit_commands &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;e&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter your query or &amp;#39;exit&amp;#39; to quit: &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; exit_commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        search_query(query, tokenizer, model, device, index, context_passages)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now let us switch gears and try something that pushes the ability of Phi-2.&lt;/p&gt;
&lt;h2 id=&#34;6-code-generation-example-using-phi-2&#34;&gt;6. Code generation example using Phi-2&lt;/h2&gt;
&lt;p&gt;If we want to push the boundaries of what Phi-2 can do, we can use it to generate code. Below is an example of using Phi-2 to generate code for a simple C function. 🤓&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a program in C that implements a BPE-based tokenizer; it should implement both encoding and decoding functions. Think through this step by step.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The code we see below is what was generated. At face value, it looks like a good start but is incomplete. It is a good starting point for a developer to continue from and shows the power of SLMs like Phi-2.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define MAX_LEN 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Encodes the input text into an array of integers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;encode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;text, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;MAX_LEN&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i, j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;strlen&lt;/span&gt;(text) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; text[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the current character is whitespace or not alphanumeric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;isspace&lt;/span&gt;(text[i]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;isalpha&lt;/span&gt;(text[i])){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Add whitespace to the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strcmp&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;i, str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; k)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;k; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the token is of length atleast 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If yes, concatenate it to tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for tokenized string size array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert tokens to integer values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strtol&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;str[i], &lt;span style=&#34;color:#91d7e3&#34;&gt;NULL&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Decodes the input array of integers into a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;decode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokensize, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; str[MAX_LEN] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;decodedStr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert integer values to hexadecimal strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;sprintf&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;decodedStr[i], &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; decodedStr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;⚠️ Note: It has been a while since I wrote C, but at a high level, these are some of the issues I can see with this; these issues are off the top of my head and are not exhaustive. Finally, it is not meant to test my coding capabilities. 😬&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Allocation: The &lt;code&gt;malloc&lt;/code&gt; function is used without checking for successful allocation; if it returns &lt;code&gt;NULL&lt;/code&gt;, which is not checked, we will get hurt.&lt;/li&gt;
&lt;li&gt;Tokenization Logic: The logic in the &lt;code&gt;encode&lt;/code&gt; function does not reflect the BPE algorithm, which involves merging the most frequent pairs of characters or bytes.&lt;/li&gt;
&lt;li&gt;String Concatenation: The &lt;code&gt;strcat&lt;/code&gt; function is used incorrectly; instead of a null-terminated string (as part of the second argument), we get a pointer to a single character&lt;/li&gt;
&lt;li&gt;Decoding Logic: The &lt;code&gt;decode&lt;/code&gt; function attempts to use &lt;code&gt;strcat&lt;/code&gt; with a format string (&lt;code&gt;&amp;quot;%x&amp;quot;&lt;/code&gt;), which is invalid. The &lt;code&gt;sprintf&lt;/code&gt; function should be used for formatted strings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hopefully, this gives you a good understanding of SLMs, specifically Phi-2, and how to use them locally. 😍&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SLMs - How to run Phi-2 Locally, and implement RAG</title>
      <link>/post/2024/03/running-phi2-locally/</link>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/03/running-phi2-locally/</guid>
      <description>&lt;h2 id=&#34;1-what-are-small-language-models-slms&#34;&gt;1. What are Small Language Models (SLMs)?&lt;/h2&gt;
&lt;p&gt;Before diving into running Phi-2 locally, let&amp;rsquo;s take a moment to understand the concept of small language models (SLMs) and their significance in natural language processing (NLP). A SLM is a type of AI model that has been trained on a massive dataset of text but is limited in terms of its size and capabilities compared to a Large Language Model (LLM). SLMs are designed to be more lightweight and efficient, making them suitable for various applications, including chatbots, language translation, and content generation. SLMs are much smaller than LLMs, with fewer parameters and a smaller dataset, so they have a lower computational cost, making them more suitable for edge or resource-constraint devices.&lt;/p&gt;
&lt;h2 id=&#34;2-what-is-phi-2&#34;&gt;2. What is Phi-2?&lt;/h2&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Phi-2
	&lt;/span&gt;
&lt;/a&gt; is the latest model in the Phi series of small language models (SLMs) that aim to break the conventional scaling laws of language models. Unlike large language models (LLMs) that require massive amounts of data and compute resources, Phi models are trained on a mixture of web-crawled and synthetic &amp;ldquo;textbook-quality&amp;rdquo; data, following the idea of &lt;a
	
		href = &#34;https://arxiv.org/abs/2306.11644&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Textbooks Are All You Need
	&lt;/span&gt;
&lt;/a&gt;. Phi models also leverage innovations in model architecture, optimization, and data augmentation to achieve remarkable performance on various benchmarks. &amp;#x1f600;&lt;/p&gt;
&lt;p&gt;Phi-2 is twice as large as its predecessor Phi-1.5, and was trained for two weeks on a cluster of 96 A100 GPUs. It demonstrates outstanding reasoning and language understanding capabilities, showcasing state-of-the-art performance (for LLMs &amp;lt;13 billion parameters).&lt;/p&gt;
&lt;p&gt;As shown in the figure below on complex benchmarks, Phi-2 matches or outperforms models up to 25x larger, such as Llama-2 and Gemini Nano. Phi-2 is also an ideal playground for researchers, as it allows for exploration around mechanistic interpretability, safety improvements, or fine-tuning experimentation on various tasks. Phi-2 is available in the &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/ai-studio/what-is-ai-studio?tabs=home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure AI Studio
	&lt;/span&gt;
&lt;/a&gt; (via the &lt;a
	
		href = &#34;https://ai.azure.com/explore/models/microsoft-phi-2/version/4/registry/azureml-msr&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		model catalog
	&lt;/span&gt;
&lt;/a&gt;) and on Hugging Face.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2.png&#34; alt=&#34;Phi-2 Evaluation&#34;/&gt;
        &lt;figcaption&gt;Phi-2 Evaluation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;21-phi-2s-capabilities&#34;&gt;2.1 Phi-2&amp;rsquo;s Capabilities&lt;/h3&gt;
&lt;p&gt;What better way to show this other than Some prompts that Phi-2 can handle:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creative Writing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a short story about a time-traveling computer geek who discovers a secret algorithm book with the power to change computing history.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;In the dimly lit archives of the ancient library, Amelia stumbled upon a dusty tome unlike any other. Its pages whispered secrets of forgotten civilizations and whispered promises of altered destinies. As she traced her fingers over the delicate script, the room seemed to blur, and suddenly, she was standing in the heart of Renaissance Florence. The air smelled of ink and ambition. The book had worked its magic, and Amelia knew she held the fate of empires in her hands.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philosophical Reflection&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Discuss the concept of free will versus determinism.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Free will and determinism have long been at odds in philosophical discourse. Some argue that our choices are predetermined by external factors—genetics, upbringing, societal norms—while others champion the idea that we possess true agency. Perhaps the truth lies in the delicate dance between the two. We navigate life&amp;rsquo;s labyrinth, sometimes guided by fate, other times forging our own path.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational Explanation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Explain the process of photosynthesis in simple terms.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Photosynthesis, the magical dance of plants and sunlight, is how they create their own food. Imagine tiny chlorophyll factories in leaves, capturing sunlight like solar panels. They convert that energy into chemical fuel—glucose—while releasing oxygen as a byproduct. So next time you breathe in that fresh air, thank a leaf for its photosynthetic prowess!&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Humorous Scenario&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Describe a day in the life of a mischievous squirrel.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🤖 Phi2-Generated output:&lt;/strong&gt; &amp;ldquo;Meet Nutty, the squirrel extraordinaire. His mornings begin with acorn heists, followed by elaborate treehouse construction. He&amp;rsquo;s the neighborhood&amp;rsquo;s unofficial alarm clock, chattering loudly at dawn. But his pièce de résistance? Prank-calling the crows, convincing them they&amp;rsquo;ve won a lifetime supply of shiny objects. Nutty&amp;rsquo;s motto: &amp;lsquo;Life&amp;rsquo;s too short not to be a little nuts.&amp;rsquo;&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-small-language-models-slms-vs-large-language-models-llms&#34;&gt;3. Small Language Models (SLMs) vs Large Language Models (LLMs)&lt;/h2&gt;
&lt;p&gt;Large Language Models (LLMs) are a type of AI model that is much larger and more powerful than SLMs. LLMs have hundreds of billions of parameters and are trained on massive text datasets. This gives LLMs the ability to handle complex tasks, such as language generation, translation, and question answering, with high accuracy and fluency. However, LLMs also have some disadvantages. They are larger, making them more expensive and slower to train. They also have a higher computational cost, meaning they may require access to specialized hardware.&lt;/p&gt;
&lt;p&gt;On the other hand, SLMs, as we called out, are smaller and more lightweight than LLMs, making them more efficient and cost-effective in training computing resources and inference. While it might seem that SLMs are also more suitable for edge or resource-constrained devices, such as mobile phones or IoT devices, they are small compared to LLMs but still require significant computational resources to run. Phi-2, for example, still has 2.7B parameters, and while it can make inferences on a CPU, it is very slow and impractical for real-time applications. One would need a GPU or a cloud-based service for any realistic use case.&lt;/p&gt;
&lt;h3 id=&#34;31-when-to-use-slm-vs-llm&#34;&gt;3.1 When to use SLM vs LLM?&lt;/h3&gt;
&lt;p&gt;Firstly, neither model is inherently better - the choice between an SLM and an LLM depends on the specific application and requirements. SLMs are a good choice when size, cost, and speed are important considerations. LLMs are a better choice when high performance and complex capabilities are required. If a task at hand is quite narrow and in one of the supported languages, then SLMs might be good. However, for a given task, an SLM may be sufficient, but an LLM may be necessary for more complex tasks or tasks requiring high accuracy and fluency.&lt;/p&gt;
&lt;p&gt;Furthermore, it is key to understand that it is not necessarily about the number of languages understood but rather the depth and nuance with which each model can understand and generate language. SLMs are designed to be efficient and effective within their scope, which may include a wide range of languages. LLMs like GPT-4, due to their size and complexity, often can understand and generate text in a larger number of languages and with greater nuance.&lt;/p&gt;
&lt;p&gt;The choice between an SLM and an LLM would again depend on the specific requirements of the task, including the languages involved and the level of language understanding and generation needed. Using a combination of SLMs and LLMs is common to achieve the best results for a given application.&lt;/p&gt;
&lt;h2 id=&#34;4-running-phi-2-locally&#34;&gt;4. Running Phi-2 locally&lt;/h2&gt;
&lt;p&gt;On one hand, running this is simple if you just don&amp;rsquo;t want to program anything and only want to use the model. The easiest option in this case is to use [LM &lt;a
	
		href = &#34;https://lmstudio.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio
	&lt;/span&gt;
&lt;/a&gt;, a web-based platform for running language models. You can use the Hugging Face API to download and run the model.&lt;/p&gt;
&lt;p&gt;We use a simple console chat example that runs locally. We use the Hugging Face Transformers library to generate text based on user input. The user can generate a story, a haiku, or a joke on a topic of their choice. Here is how to run it locally on a Windows machine - the same should apply to a Mac or Linux machine.&lt;/p&gt;
&lt;p&gt;The full code is below, but here are the key aspects to grok when running Phi-2 locally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The key is to use the &lt;code&gt;AutoModelForCausalLM&lt;/code&gt; and &lt;code&gt;AutoTokenizer&lt;/code&gt; classes from the &lt;code&gt;transformers&lt;/code&gt; library to load the Phi-2 model and tokenizer.&lt;/li&gt;
&lt;li&gt;We then use the &lt;code&gt;generate&lt;/code&gt; method to generate text based on a user prompt. The &lt;code&gt;generate&lt;/code&gt; method takes the user prompt as input and returns the generated text&lt;/li&gt;
&lt;li&gt;We use the &lt;code&gt;from_pretrained&lt;/code&gt; method to load the model and tokenizer from the Hugging Face model hub.&lt;/li&gt;
&lt;li&gt;We also use the &lt;code&gt;save_pretrained&lt;/code&gt; method to save the model and tokenizer to a local directory. This allows us to load the model and tokenizer from the local directory if they are already saved, which can help save time and resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following code snippet is what loads the model and the tokenizer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                            trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                         trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the following is where we encode the user input and call the generation. First, we create tokens of the user prompt; the resulting tokens are returned as PyTorch tensors. Then, the model generates text based on the tokenized input. We cap the tokens to a maximum of 500 tokens, and the end-of-sequence token is used for padding if necessary. Finally, the generated tokens are decoded back into human-readable text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The full code is below. The code is a simple console chat example that runs locally. The user can generate a story, a haiku, or a joke on a topic of their choice.&lt;/p&gt;
&lt;p&gt;Some examples of what Phi-2 can generate using the above code are shown below. The first is a story about pandas and dogs.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-1.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Story about Pandas 🐼 and Dogs 🐶&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is another example of a Haiku and a Joke generated by Phi-2 on Pandas.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-2.png&#34; alt=&#34;Story about Pandas and Dogs&#34;/&gt;
        &lt;figcaption&gt;Haiku and Joke about Pandas 🐼&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Switching gears, let&amp;rsquo;s look at how we can implement the RAG using Phi-2.&lt;/p&gt;
&lt;h3 id=&#34;41-running-phi-2-locally---full-code&#34;&gt;4.1 Running Phi-2 Locally - Full Code&lt;/h3&gt;
&lt;p&gt;The following code is the complete code that executes the examples we showed before for running Phi-2 locally. This can work on a CPU, but it is very slow, and a good GPU is strongly suggested.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Suppress warnings and set the logging level to ERROR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(MODEL_PATH):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;MODEL_PATH&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(MODEL_PATH)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, type_of_text)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: Write a &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;type_of_text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; about &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;500&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;text&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;First What would you like to write today?&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;1. Story 📝&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;2. Haiku ✍️&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3. Joke 😆&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;4. Quit 👋&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Choose an option:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;4&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user_prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;And on which topic:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; user_prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Input cannot be empty or consist only of spaces.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;story&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;haiku&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; user_choice &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(handle_prompt(user_prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;joke&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Invalid choice. Please choose a valid option.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&#34;5-implementing-retrieval-augmented-generation-rag-with-phi-2&#34;&gt;5. Implementing Retrieval-Augmented Generation (RAG) with Phi-2&lt;/h2&gt;
&lt;p&gt;RAG is a powerful technique that combines the strengths of retrieval-based and generation-based approaches to natural language processing. RAG is one of the ways one can get proprietary information and knowledge to the model and use it as part of the prompt.  It leverages a retriever to find relevant context passages and a generator to produce fluent and coherent responses. The retriever identifies relevant context passages, and the generator uses these passages to generate a response.&lt;/p&gt;
&lt;p&gt;This approach allows RAG to produce high-quality, informative, and contextually relevant responses. In-context learning is a key feature of RAG, as it allows the model to learn from the context of the conversation and generate more accurate and relevant responses. This is particularly useful in scenarios where the model needs to understand and respond to complex queries or provide detailed information on a specific topic.&lt;/p&gt;
&lt;p&gt;At a high level, the process of implementing RAG  involves the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Generate Embeddings with Phi-2&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use Phi-2 to encode your context passages (documents) and extract their embeddings.&lt;/li&gt;
&lt;li&gt;These embeddings will represent the semantic content of each passage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a Vector Index&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Choose a vector index library or framework (such as &lt;strong&gt;Faiss&lt;/strong&gt;, &lt;strong&gt;Annoy&lt;/strong&gt;, or &lt;strong&gt;HNSW&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Initialize an index structure to store the embeddings efficiently.&lt;/li&gt;
&lt;li&gt;Add the generated embeddings to the index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save Embeddings to a Local Vector Database&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Create a local database to store the embeddings.&lt;/li&gt;
&lt;li&gt;For each context passage, save its corresponding embedding in the database.&lt;/li&gt;
&lt;li&gt;You can use the passage ID or a unique identifier as the key for retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perform Similarity Search&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;When you receive a new context (query), encode it using Phi-2 to obtain its embedding.&lt;/li&gt;
&lt;li&gt;Use the vector index to perform a similarity search against the saved embeddings.&lt;/li&gt;
&lt;li&gt;Retrieve the most similar context passages based on cosine similarity or another distance metric.&lt;/li&gt;
&lt;li&gt;Return the relevant passages as results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In our example, we will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval. &lt;a
	
		href = &#34;https://faiss.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAISS (Facebook AI Similarity Search)
	&lt;/span&gt;
&lt;/a&gt; is a library developed by Facebook for efficient similarity search and clustering of high-dimensional vectors. It allows for a quick nearest-neighbor search over large datasets and supports CPU and GPU-based computations. FAISS is widely used in information retrieval, recommendation systems, and other applications that require similarity search.&lt;/p&gt;
&lt;h3 id=&#34;51-loading-data-for-rag-and-phi-2&#34;&gt;5.1 Loading data for RAG and Phi-2&lt;/h3&gt;
&lt;p&gt;To implement RAG, we use the script from the Oppenheimer movie - which is quite new in that it is not in the Phi-2 training set and is available as a PDF. We will extract the script from this PDF, creating embeddings, which will then save the embeddings to a local database and perform a similarity search to retrieve relevant context passages based on a user query. We will use the FAISS library to create a vector index and perform a similarity search. We will also save the embeddings to a local database for efficient retrieval.&lt;/p&gt;
&lt;p&gt;We use the &lt;code&gt;PyPDF2&lt;/code&gt; library to parse PDFs, a pure Python library for reading and writing PDF files. It can extract text, merge and split documents, and more. We will use it to extract the PDF text from the Oppenheimer movie script. The following code function shows how to read the PDF and extract the text. This is efficient for our use case, but it is not the most efficient way to extract text from a PDF when thinking about production scale, especially if the PDF has a lot of images and tables.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;52-generate-embeddings-using-phi-2&#34;&gt;5.2 Generate embeddings using Phi-2&lt;/h3&gt;
&lt;p&gt;Now that we have the text, the following functions show how to create the embeddings using Phi-2. We read the text as a list of context passages and then use Phi-2 to encode each passage and extract its embedding using the &lt;code&gt;encode&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here are a few things that are going on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given that we are using this for inference and not training, we use a &lt;code&gt;torch.&lt;/code&gt;no_grad()`, which tells PyTorch not to track, calculate, or modify gradients while executing code within this block. This helps us save the amount of memory needed.&lt;/li&gt;
&lt;li&gt;Inside this block, the input_ids are fed into the model, and the output is stored in the output variable. The logits, which are the raw, unnormalized scores outputted by the last layer of the model, are then extracted from the model&amp;rsquo;s output.&lt;/li&gt;
&lt;li&gt;The logits are then processed to generate the embedding for the passage. The .mean(dim=1) method calculates the mean of the logits along dimension 1, which typically represents the sequence length in a language model.&lt;/li&gt;
&lt;li&gt;The .detach() method detaches the result from the computation graph so that no gradients will be backpropagated along this variable.&lt;/li&gt;
&lt;li&gt;The .cpu() method moves the tensor to the CPU if it&amp;rsquo;s not already there. Finally, the tensor is converted to a numpy array using the .numpy() method.&lt;/li&gt;
&lt;li&gt;The resulting embedding is then appended to the embeddings list, which contains the embeddings for all the passages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-creating-vector-index&#34;&gt;5.3 Creating Vector Index&lt;/h3&gt;
&lt;p&gt;The following function shows how to create a vector index using the FAISS library and perform a similarity search to retrieve relevant context passages based on a user query. The create_index function initializes a flat index structure to store the embeddings and adds the embeddings to the index. The search_query function encodes the user query using Phi-2 to obtain its embedding and performs a similarity search against the saved embeddings to retrieve the most similar context passages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;normalize_L2()&lt;/code&gt; function normalizes the vectors and is a crucial step when using Euclidean distance in high-dimensional spaces to ensure that the distance is not dominated by the dimensionality of the vectors. As we iterate through the embeddings, we check if the item is a 1D array and reshape it to a 2D array if necessary. This is important because FAISS expects the input to be a 2D array, and we need to reshape the 1D array to a 2D array before adding it to the index.&lt;/p&gt;
&lt;p&gt;The function finally returns the created index. This index can then be used to perform efficient similarity searches.&lt;/p&gt;
&lt;h3 id=&#34;54-perform-similarity-search&#34;&gt;5.4 Perform Similarity Search&lt;/h3&gt;
&lt;p&gt;The following function shows how to perform a similarity search using the vector index to retrieve relevant context passages based on a user query. As noted earlier, the most similar context passages are then retrieved based on cosine similarity or another distance metric.&lt;/p&gt;
&lt;p&gt;The function starts by encoding the input query using a tokenizer and performs a similarity search on the FAISS index using the query embedding. It retrieves the indices of the top 3 most similar passages to the input query and then retrieves the corresponding context passages from the context_passages list. The similar context passages are then concatenated into a single string and passed to the Phi-2 model to generate a response.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let us run this and see how it works, as we discussed before. We will use the Oppenheimer movie script as the context passages and perform a similarity search to retrieve relevant context passages based on a user query. The next few figures show the output of us asking questions about the movie, where those pieces of information are not in the model but passed using the semantic search.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-3.png&#34; alt=&#34;Example 1 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 1 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-4.png&#34; alt=&#34;Example 2 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 2 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/phi2-5.png&#34; alt=&#34;Example 3 - Phi-2 and RAG implementation&#34;/&gt;
        &lt;figcaption&gt;Example 3 - Phi-2 and RAG implementation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that we have seen the different elements, the code below brings everything together as a console app that one can run. The Oppenheimer script (pdf file) you need can be &lt;a
	
		href = &#34;data/oppenheimer-2023.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		downloaded from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;warnings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;logging&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;torch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;transformers&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; AutoModelForCausalLM, AutoTokenizer
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;faiss&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;tqdm&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; tqdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;pickle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PyPDF2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEBUG &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warnings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filterwarnings(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ignore&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getLogger(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;transformers&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;setLevel(logging&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ERROR)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the directory where you want to save the model and tokenizer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_PATH &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./local_model&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MODEL_NAME &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;microsoft/phi-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BATCH_SIZE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Oppenheimer movie&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#DATA_FILE = &amp;#34;./oppenheimer-2023.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATA_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./oppenheimer-2023.pdf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDINGS_FILE &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;./embeddings_movie.pkl&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_model&lt;/span&gt;(model_path, model_name, debug&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Check if the model and tokenizer are already saved locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(model_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Loading model and tokenizer from local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the model and tokenizer from the local directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading model and tokenizer from Hugging Face&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the model and tokenizer from Hugging Face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoModelForCausalLM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, torch_dtype&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; AutoTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;from_pretrained(model_name, trust_remote_code&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Saving model and tokenizer to local directory: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model_path&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the model and tokenizer locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;save_pretrained(model_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; debug:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Model device: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CUDA available: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available()&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the default device to CUDA if available, otherwise use CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cuda&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cuda&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;is_available() &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; model, tokenizer, device
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;save_embeddings&lt;/span&gt;(embeddings, passages, file_name):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;dump((&lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(embeddings), &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(passages)), f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error writing to file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file_name&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error pickling embeddings and passages.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;load_embeddings&lt;/span&gt;(file):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;load(f)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; not found.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; pickle&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;UnpicklingError:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error unpickling file &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;file&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;read_pdf&lt;/span&gt;(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; PyPDF2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PdfFileReader(pdf_file_obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    num_pages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numPages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; page_num &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(num_pages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        page_obj &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; pdf_reader&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getPage(page_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; page_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;extractText()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;yield&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Finished reading file. Number pages: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;num_pages&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pdf_file_obj&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_embeddings&lt;/span&gt;(file_path, tokenizer, model, device):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exists(EMBEDDINGS_FILE):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the embeddings and passages from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_embeddings(EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; file_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;list&lt;/span&gt;(read_pdf(file_path))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(file_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;readlines()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        embeddings &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; passage &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; passage&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Skip the passage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(passage, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                embeddings&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append(embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Save the embeddings and passages to disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        save_embeddings(embeddings, context_passages, EMBEDDINGS_FILE)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; embeddings, context_passages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;handle_prompt&lt;/span&gt;(user_input, context)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    prompt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Instruct: You are a helpful bot who only answers using the given context ONLY. If you cannot find the answer in the context reply &amp;#39;Sorry don&amp;#39;t have that detail&amp;#39;. Given the context &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;context&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;, answer this:&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;user_input&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Output:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer(prompt, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {name: tensor&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;device) &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; name, tensor &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;items()}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        outputs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;generate(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;inputs, max_length&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2000&lt;/span&gt;, pad_token_id&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;eos_token_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;batch_decode(outputs)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the prompt from the output text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(prompt, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;replace(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;|endoftext|&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;strip()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;create_index&lt;/span&gt;(query_embedding):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;IndexFlatL2(query_embedding[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;])  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Euclidean distance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    faiss&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;normalize_L2(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add embeddings to the index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; tqdm(&lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(query_embedding), total&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(query_embedding)):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            item &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; item&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Reshape 1D array to 2D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(item)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; index
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;search_query&lt;/span&gt;(input_query, inputTokenizer, model, device, index, context_passages):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Given a new query context, encode it and perform similarity search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; inputTokenizer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;encode(input_query, return_tensors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;pt&amp;#34;&lt;/span&gt;, return_attention_mask&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;, add_special_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;to(device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; torch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;no_grad():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input_ids &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_ids&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;long()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        output &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; model(input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        logits &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; output&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;logits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; logits&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(dim&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;detach()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;cpu()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;numpy()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Perform similarity search - top 3 similar passages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _, similar_indices &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; index&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;search(query_embedding, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; DEBUG:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DEBUG - Number of similar indices: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;similar_indices&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;size&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Retrieve context passages based on similar_indices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    similar_contexts &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [context_passages[i] &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; similar_indices[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Concatenate the similar contexts into a single string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    context &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;join(similar_contexts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pass the concatenated context and query to the Phi-2 model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    answer &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; handle_prompt(input_query, context)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Answer:&amp;#34;&lt;/span&gt;, answer)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;__name__&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    model, tokenizer, device &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; load_model(MODEL_PATH, MODEL_NAME, DEBUG)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create embeddings and add to index before entering the loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding, context_passages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_embeddings(DATA_FILE, tokenizer, model, device)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    query_embedding &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;array(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; create_index(query_embedding)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    exit_commands &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;quit&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;e&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Enter your query or &amp;#39;exit&amp;#39; to quit: &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; exit_commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        search_query(query, tokenizer, model, device, index, context_passages)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let us switch gears and try something that pushes the ability of Phi-2.&lt;/p&gt;
&lt;h2 id=&#34;6-code-generation-example-using-phi-2&#34;&gt;6. Code generation example using Phi-2&lt;/h2&gt;
&lt;p&gt;If we want to push the boundaries of what Phi-2 can do, we can use it to generate code. Below is an example of using Phi-2 to generate code for a simple C function. 🤓&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗒️Prompt:&lt;/strong&gt; &amp;ldquo;Write a program in C that implements a BPE-based tokenizer; it should implement both encoding and decoding functions. Think through this step by step.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The code we see below is what was generated. At face value, it looks like a good start but is incomplete. It is a good starting point for a developer to continue from and shows the power of SLMs like Phi-2.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define MAX_LEN 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Encodes the input text into an array of integers
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;encode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;text, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;MAX_LEN&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i, j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;strlen&lt;/span&gt;(text) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; text[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the current character is whitespace or not alphanumeric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#8aadf4&#34;&gt;isspace&lt;/span&gt;(text[i]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;isalpha&lt;/span&gt;(text[i])){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Add whitespace to the tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]); 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt; (k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strcmp&lt;/span&gt;(text&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;i, str &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; k)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;k; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Check if the token is of length atleast 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(k&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;j &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// If yes, concatenate it to tokens list
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str,&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;text[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Allocate memory for tokenized string size array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(j&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;j; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert tokens to integer values
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;strtol&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;str[i], &lt;span style=&#34;color:#91d7e3&#34;&gt;NULL&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Decodes the input array of integers into a string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;decode&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokensize, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; str[MAX_LEN] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;strcat&lt;/span&gt;(str, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Output the tokenized string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Tokenized String: %s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;,str);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare memory for decoded string
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;decodedStr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;tokenizedStringsSize)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;*&lt;/span&gt;tokensize; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Convert integer values to hexadecimal strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;sprintf&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;decodedStr[i], &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%x&amp;#34;&lt;/span&gt;, tokensize[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; decodedStr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;⚠️ Note: It has been a while since I wrote C, but at a high level, these are some of the issues I can see with this; these issues are off the top of my head and are not exhaustive. Finally, it is not meant to test my coding capabilities. 😬&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memory Allocation: The &lt;code&gt;malloc&lt;/code&gt; function is used without checking for successful allocation; if it returns &lt;code&gt;NULL&lt;/code&gt;, which is not checked, we will get hurt.&lt;/li&gt;
&lt;li&gt;Tokenization Logic: The logic in the &lt;code&gt;encode&lt;/code&gt; function does not reflect the BPE algorithm, which involves merging the most frequent pairs of characters or bytes.&lt;/li&gt;
&lt;li&gt;String Concatenation: The &lt;code&gt;strcat&lt;/code&gt; function is used incorrectly; instead of a null-terminated string (as part of the second argument), we get a pointer to a single character&lt;/li&gt;
&lt;li&gt;Decoding Logic: The &lt;code&gt;decode&lt;/code&gt; function attempts to use &lt;code&gt;strcat&lt;/code&gt; with a format string (&lt;code&gt;&amp;quot;%x&amp;quot;&lt;/code&gt;), which is invalid. The &lt;code&gt;sprintf&lt;/code&gt; function should be used for formatted strings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hopefully, this gives you a good understanding of SLMs, specifically Phi-2, and how to use them locally. 😍&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Shedding Light on the Art of Prompt Engineering</title>
      <link>/post/2024/03/shedding-light-on-the-art-of-prompt-engineering/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>/post/2024/03/shedding-light-on-the-art-of-prompt-engineering/</guid>
      <description>&lt;p&gt;How many prompt engineers does it take to change a light bulb? Just one, but first, they need to fine-tune the model to make sure the AI doesn&amp;rsquo;t end up writing a poem about darkness instead.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-dalle-small.png&#34; alt=&#34;DALLE generated image of How many engineers it take to change a light bulb&#34;/&gt;
        &lt;figcaption&gt;DALLE generated image of How many engineers it take to change a light bulb&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>📚 My new book &#34;Generative AI in Action&#34;</title>
      <link>/post/2023/11/announcing-gen-ai-book/</link>
      <pubDate>Tue, 14 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/11/announcing-gen-ai-book/</guid>
      <description>&lt;p&gt;🌐 As software continues to revolutionize the world, the advent of Generative AI is transforming the very fabric of software itself. My latest book, &lt;strong&gt;Generative AI in Action&lt;/strong&gt; delves into this transformative journey.&lt;/p&gt;
&lt;p&gt;I am thrilled to announce the early release of my latest book, &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generative AI in Action
	&lt;/span&gt;
&lt;/a&gt; now available through &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Manning Early Access Program (MEAP)
	&lt;/span&gt;
&lt;/a&gt;. This publication is a deep dive into the cutting-edge world of #GenerativeAI, #LLMs, #OpenAI, and #Azure #OpenAI, tailored specifically for enterprises. 🤘&lt;/p&gt;
&lt;p&gt;This practical, in-action, hands-on book allows one to explore the cutting-edge world of Generative AI, including LLMs, and covers both OpenAI and Azure OpenAI, allowing companies to understand basic concepts and scale to production.📘&lt;/p&gt;
&lt;p&gt;I have the privilege of having a front-row seat as we build this tech out and work with key Fortune 500 customers who are incorporating this. A lot of this is learnings captured from this. 😇&lt;/p&gt;
&lt;p&gt;📖 Inside the Book&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A comprehensive introduction to Generative AI, including foundational models like GPT, Codex, DALLE, and ChatGPT.&lt;/li&gt;
&lt;li&gt;Insightful discussions on Large Language Models (LLMs) and their applications in various sectors.&lt;/li&gt;
&lt;li&gt;Practical guides on generating text through APIs, focusing on OpenAI and Azure OpenAI.&lt;/li&gt;
&lt;li&gt;Exploration of image generation techniques, including Stable Diffusion and DALLE.&lt;/li&gt;
&lt;li&gt;Deep dive into Prompt Engineering, RAG, Bring your own Data, and model adaptation techniques.&lt;/li&gt;
&lt;li&gt;And finally, best practices to allow enterprises to scale to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎯 Why This Book is a Must-Read?
It is specially crafted for businesses leveraging AI for innovation and competitive advantage.
Combining technical depth with practical applications makes it a valuable asset for decision-makers, architects, data scientists, developers, and AI enthusiasts.&lt;/p&gt;
&lt;p&gt;🌟 Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real-world case studies and applications.&lt;/li&gt;
&lt;li&gt;Expert guidance on model adaptation and the art of prompt engineering.&lt;/li&gt;
&lt;li&gt;Comprehensive insights into the challenges and best practices for deploying AI in enterprise settings.&lt;/li&gt;
&lt;li&gt;An essential discussion on AI&amp;rsquo;s ethical dimensions, safety, and security concerns.&lt;/li&gt;
&lt;li&gt;Generative AI in Action&amp;quot; is more than just a book; it&amp;rsquo;s a roadmap for harnessing the potential of AI to redefine the business landscape.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready to get hands-on and deeper into Generative AI? You can use the code “&lt;strong&gt;mlbahree&lt;/strong&gt;” to get 45% off – valid until Nov 28th! 😍&lt;/p&gt;
&lt;p&gt;🔗 You can get the book and the discount from &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt; &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;http://mng.bz/D9By&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://mng.bz/D9By
	&lt;/span&gt;
&lt;/a&gt; &amp;#x1f43c;&lt;/p&gt;
&lt;p&gt;💽 The GitHub repo with the code from the book can be found at &amp;ndash;&amp;gt; &lt;a
	
		href = &#34;https://bit.ly/GenAIBook&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://bit.ly/GenAIBook
	&lt;/span&gt;
&lt;/a&gt;. 💾&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/bahree_genai_in_action_meap.jpg&#34; alt=&#34;Generative AI in Action - MEAP&#34;/&gt;
        &lt;figcaption&gt;Generative AI in Action - MEAP&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Thank you in advance, and I would love to hear your feedback.&lt;/p&gt;
&lt;p&gt;With gratitude, 💚&lt;/p&gt;
&lt;p&gt;Amit.&lt;/p&gt;
&lt;p&gt;#GenerativeAI #LLMs #Azure #OpenAI #Microsoft #LearnwithManning #ManningBooks&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI working with humans</title>
      <link>/post/2023/07/ai-working-with-humans/</link>
      <pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/07/ai-working-with-humans/</guid>
      <description>&lt;h4 id=&#34;what-does-ai-think-of-humans-and-our-humor&#34;&gt;What does AI think of humans and our humor?&lt;/h4&gt;
&lt;p&gt;I asked #AI - #CodeInterpreter plugin for #ChatGPT to express its experience as an AI working with humans as a meme. It wrote this code to create the meme below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new figure with a white background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig, ax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;subplots(figsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;), dpi&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;patch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_facecolor(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set up the text and meme caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;meme_caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;When I, an AI, try to understand human humor:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;meme_text &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Error 404: Humor not found&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the meme caption and text to the figure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;, meme_caption, horizontalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, verticalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, transform&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transAxes, color&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;, fontweight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, meme_text, horizontalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, verticalalignment&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, transform&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transAxes, color&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;, fontweight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Remove the axes for a clean meme look&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;axis(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show the meme&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/humans.png&#34; alt=&#34;AI&amp;rsquo;s experience working with humans&#34;/&gt;
        &lt;figcaption&gt;AI&amp;#39;s experience working with humans&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;OK, that is funny.  I asked it to create another meme about its own experience as an AI. It wrote this code to create the meme below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Let&amp;#39;s use matplotlib to create a simple meme. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# We&amp;#39;ll use a cartoon robot image (created from basic shapes) and add a text that relates to my AI experience.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.patches&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;patches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a new figure with a white background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig, ax &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;subplots(figsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;), dpi&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;axis(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Turn off the axes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;patch&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;set_facecolor(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Draw a robot face&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;face &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.6&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.3&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;gray&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eye1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.4&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.05&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eye2 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Circle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.6&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.7&lt;/span&gt;), radius&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.05&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mouth &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; patches&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Rectangle((&lt;span style=&#34;color:#f5a97f&#34;&gt;0.4&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.55&lt;/span&gt;), &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.02&lt;/span&gt;, fc&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;white&amp;#39;&lt;/span&gt;, ec&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;black&amp;#39;&lt;/span&gt;, lw&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(face)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(eye1)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(eye2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ax&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add_patch(mouth)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add meme text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.85&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;AI life:&amp;#39;&lt;/span&gt;, ha&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, va&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, weight&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#f5a97f&#34;&gt;0.5&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0.1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;When humans ask me to &lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;understand a joke&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         ha&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, va&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;center&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, wrap&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Top text: &amp;ldquo;AI life:&amp;rdquo;
Bottom text: &amp;ldquo;When humans ask me to understand a joke&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ai-life.png&#34; alt=&#34;AI Life&#34;/&gt;
        &lt;figcaption&gt;AI&amp;#39; Life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The joke here is that as an AI system, I don&amp;rsquo;t have emotions or personal experiences, and humor often relies on these aspects, which can make understanding and generating spirit challenging for AI. I hope you find it amusing!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI seeks to find,
Humor in human design,
Error, not aligned.&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>OpenAI&#39;s Whisper speech model - an overview</title>
      <link>/post/2023/02/openai-whisper-overview/</link>
      <pubDate>Tue, 28 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/02/openai-whisper-overview/</guid>
      <description>&lt;h2 id=&#34;what-is-whisper-from-openai&#34;&gt;What is Whisper from OpenAI?&lt;/h2&gt;
&lt;p&gt;Whisper is a speech recognition model (ASR &amp;ndash; automatic speech recognition) from OpenAI. The model itself is multi-task model and as a result in addition to speech recognition, can also do language identification and speech translation across a number of languages. The model is open sourced and it comes in 5 sizes. Of these, 4 have a english-only variant which seem to perform better if one only needs english. The model is also robust to noise, accents, background noise and technical language. &lt;a
	
		href = &#34;https://openai.com/research/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Whisper
	&lt;/span&gt;
&lt;/a&gt; achieves near SOTA performance with zero-shot translation from multiple-languages to English.&lt;/p&gt;
&lt;h4 id=&#34;model-characteristics&#34;&gt;Model Characteristics&lt;/h4&gt;
&lt;p&gt;The model was trained on a large corpus of data and was trained using weak supervision using large scale noise data. Of this large data corpus ~680K hours of audio and corresponding transcripts; ~438K hours (65%) of this data is english only (both audio and transcripts); ~126K hours (18%) is non-english audio and english transcripts; and finally ~117K hours (17%) is non-english audio and non-english transcripts and cover 98 languages.&lt;/p&gt;
&lt;p&gt;The model is available in multiple sizes as called out and the table below outlines these model characteristics.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Size&lt;/th&gt;
          &lt;th&gt;Parameters&lt;/th&gt;
          &lt;th&gt;English-only model&lt;/th&gt;
          &lt;th&gt;Multilingual-model&lt;/th&gt;
          &lt;th&gt;VRAM needed&lt;/th&gt;
          &lt;th&gt;Speed (Relative)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;base&lt;/td&gt;
          &lt;td&gt;74 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;base.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;base&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 1gb&lt;/td&gt;
          &lt;td&gt;16x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tiny&lt;/td&gt;
          &lt;td&gt;39 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tiny.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;tiny&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 1gb&lt;/td&gt;
          &lt;td&gt;32x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;small&lt;/td&gt;
          &lt;td&gt;244 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;small.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;small&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 2gb&lt;/td&gt;
          &lt;td&gt;6x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;medium&lt;/td&gt;
          &lt;td&gt;769 m&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;medium.en&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;medium&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 5gb&lt;/td&gt;
          &lt;td&gt;2x&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;large&lt;/td&gt;
          &lt;td&gt;1.55 b&lt;/td&gt;
          &lt;td&gt;n/a&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;large&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;~ 10gb&lt;/td&gt;
          &lt;td&gt;1x&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Whisper does support transcription and translation across 98 language; it performs best when sticking with English. One needs to be careful when using the non-english models as the transcripts are not in the same language as the audio and can lead to hallucinations. The large model has a word error rate (WER) of 0.12 for English, 0.18 for Spanish, 0.23 for French, 0.25 for German and 0.28 for Mandarin2. However, some lower covered languages have much higher WER - e.g. Arabic (0.79), Hindi (0.86) and Swahili (1.00).&lt;/p&gt;
&lt;h3 id=&#34;whisper-asr-architecture&#34;&gt;Whisper ASR Architecture&lt;/h3&gt;
&lt;p&gt;As it is typical for language based models, Whisper uses a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Seq2seq&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		seq-to-seq (transformer encoder-decoder)
	&lt;/span&gt;
&lt;/a&gt; architecture, where the input is a sequence of audio frames (30 sec segment pairs) and the output is a sequence of text. Whisper is best used to transcribe &amp;ldquo;audio to text&amp;rdquo; use cases. It is not well suited for &amp;ldquo;text to audio&amp;rdquo; (i.e., TTS &amp;ndash; text to speech) cases as it is not trained for this task. Whisper is also not trained for speech synthesis, but can be used to generate text from audio. And finally, Whisper cannot be used for real-time speech applications and is best used for batch processing.&lt;/p&gt;
&lt;p&gt;The figure below shows the Whisper ASR architecture (image credit: OpenAI); the transformer model is training on many different speech-related tasks including speech recognition, language identification, and voice activity detection - these collectively represent the sequence of tokens for the decoder to predict and greatly simplifies things by allowing one model to replace many tradition speech processing pipelines.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-1.svg&#34; alt=&#34;Whisper ASR Architecture&#34;/&gt;
        &lt;figcaption&gt;Whisper ASR Architecture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;What I think is really interesting about the Whisper model is that it is trained using &lt;strong&gt;weak supervision&lt;/strong&gt;. OpenAI took a different approach for speech recognition and not use the typical self-supervision or self-training techniques that have been a mainstay of recent large-scale speech recognition work. I believe this is what makes the model so robust and able to handle noise, accents, background noise and technical language. OpenAI trained Whisper to predict raw text of transcripts, using the expressiveness provided by the seq-2-seq implementation to learn the mapping between utterances and their transcripts. All of this allows a simpler pipeline.&lt;/p&gt;
&lt;p&gt;More details on the Speech Recognition model can be found in the OpenAI Whisper paper &lt;a
	
		href = &#34;https://arxiv.org/abs/2212.04356&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robust Speech Recognition via Large-Scale Weak Supervision
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;what-is-weak-supervision&#34;&gt;What is Weak Supervision?&lt;/h3&gt;
&lt;p&gt;As a side node, I am quite excited to see how OpenAI is using weak supervision to scale and getting better results. The following quote from their paper speaks for itself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Our work suggests that simple scaling of weakly supervised pre-training has been underappreciated so far for speech recognition. We achieve these results without the need for the self-supervision or self-training techniques that have been a mainstay of recent large-scale speech recognition work.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;All is well and good, but what is Weak Supervision?&lt;/p&gt;
&lt;p&gt;As I called out in my book &lt;a
	
		href = &#34;https://www.amazon.com/Weakly-Supervised-Learning-Doing-More/dp/1492077062/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Practical Weak Supervision: Doing More with Less Data
	&lt;/span&gt;
&lt;/a&gt; 📖 : Weak supervision is a broad collection of techniques in machine learning where models are trained using sources of information that are easier to provide than hand-labeled data, where this information is incomplete, inexact, or otherwise less accurate. Instead of hand-labeling high-quality data, all of which is very cost-prohibitive, we can use other techniques that combine diverse sources of data, creating an approximation of labels. Using weak supervision, we can reconcile these labels to a single label.&lt;/p&gt;
&lt;p&gt;Weak supervision enables these noisy, weakly sourced labels to be combined programmatically to form the training data that can be used to train a model. Labels are considered “weak” because they are noisy—i.e., the data measurements that the labels represent are inaccurate and have a margin of error.&lt;/p&gt;
&lt;p&gt;More details here:
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/bahree/status/1450322692817571840?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @bahree...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/bahree/status/1450322692817571840?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h2 id=&#34;transcription-with-whisper&#34;&gt;Transcription with Whisper&lt;/h2&gt;
&lt;p&gt;I figured, one of the best ways to try out the Whisper model and run it through its paces is to try a bunch of transcription - and that too on something fairly technical , where the language isn&amp;rsquo;t typical in the broader sense of spoken english. And what better way to test AI is to use something that talks about AI. To that end, I used &lt;a
	
		href = &#34;https://twitter.com/samcharrington&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sam Charrington
	&lt;/span&gt;
&lt;/a&gt;&amp;rsquo;s popular &lt;a
	
		href = &#34;https://twimlai.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TwimlAI podcast
	&lt;/span&gt;
&lt;/a&gt; as the guinea pig. 😄&lt;/p&gt;
&lt;p&gt;Now on one hand, it seems pretty easy to install Whisper (it is a pip install) and run it on a single audio file.
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/bahree/status/1580695321960906752?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @bahree...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/bahree/status/1580695321960906752?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;The reality is that there are a lot of dependencies and it is not as easy as it seems.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-2.png&#34; alt=&#34;Whisper runtime issues&#34;/&gt;
        &lt;figcaption&gt;Whisper runtime issues&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;However, I did manage to resolve everything and get it working - and the results were pretty good.👍
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-3.png&#34; alt=&#34;Whisper transcription&#34;/&gt;
        &lt;figcaption&gt;Whisper transcription&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;But I wanted to see how well it would work on a large corpus of audio files. So I wrote a simple script that would download all the episodes of TwimlAI from YouTube as mp3, and then transcribe them using the Whisper model. As of writing this, there are 547 episodes of TwimlAI and all of those transcriber to my github repo &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here.
	&lt;/span&gt;
&lt;/a&gt;. Each episode has three resulting files when transcribed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;txt file - there is a text file which contains the transcript&lt;/li&gt;
&lt;li&gt;srt file - this is the subrip subtitle file which can be used to add subtitles to the audio file&lt;/li&gt;
&lt;li&gt;vtt file - this is WebVTT file (web video test to track file) and contains the transcript and the time codes that sync the captions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can get all the transcripts which can either be downloaded as the zip file &lt;code&gt;twiml-episodes-whisper-transcribed.zip&lt;/code&gt; 💾 or they are also in the folder &lt;code&gt;twiml-episodes-whisper-transcribed&lt;/code&gt; 📁 in the github repo &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also transcribed one file using both the To show the difference the base and the large model. You can find both versions in the folder &lt;code&gt;model-comparison&lt;/code&gt; 📁 of one specific episode - &lt;em&gt;#544 - #AI Trends 2023 - AI Trends 2023: Natural Language Proc – ChatGPT, GPT-4 and Cutting Edge Research with Sameer Singh&lt;/em&gt;. Not to get into all the details, but the transcription using the large model was approx 120 lines longer. The image below shows you an eagle view of the difference between the two transcriptions - there are a lot of differences in the text, and the quality is much better on the large model.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-4.jpg&#34; alt=&#34;Transcription delta between base and large models&#34;/&gt;
        &lt;figcaption&gt;Transcription delta between base and large models&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h2 id=&#34;steps-to-run-this-locally&#34;&gt;Steps to run this locally&lt;/h2&gt;
&lt;p&gt;If you want to run this locally, start by cloning the &lt;a
	
		href = &#34;https://github.com/bahree/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		repo
	&lt;/span&gt;
&lt;/a&gt;. It is best to use &lt;a
	
		href = &#34;https://docs.conda.io/en/latest/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		conda
	&lt;/span&gt;
&lt;/a&gt; to get the dependencies managed. I prefer &lt;a
	
		href = &#34;https://docs.conda.io/en/latest/miniconda.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Miniconda
	&lt;/span&gt;
&lt;/a&gt;, but you can use any conda installation. The next set of steps assumes that you have conda installed; see the &lt;a
	
		href = &#34;https://docs.conda.io/projects/conda/en/latest/user-guide/install/download.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		docs
	&lt;/span&gt;
&lt;/a&gt; if you need help installing.&lt;/p&gt;
&lt;h3 id=&#34;step-1-create-a-conda-environment&#34;&gt;Step 1: Create a conda environment&lt;/h3&gt;
&lt;p&gt;I am running this on Ubuntu 22.0.01 LTS (Jammy Jellyfish) and am using an NVidia RTX 3090 GPU. I am also running Python 3.8.5.&lt;/p&gt;
&lt;p&gt;Create a conda environment and install the dependencies. I have included the &lt;code&gt;environment.yml&lt;/code&gt; file in the repo, which you can use to create the environment. The name of the environment can be changed to anything; I use &lt;code&gt;whisper&lt;/code&gt; in my case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;name&lt;/span&gt;: whisper
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;channels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pytorch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- defaults
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;dependencies&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- cudatoolkit=11.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- numpy=1.22.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pip=20.3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- python=3.8.5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- pytorch=1.11.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- scikit-image=0.19.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- torchvision=0.12.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#c6a0f6&#34;&gt;pip&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once conda is installed, you run the following command to create the environment:
&lt;code&gt;conda env create -f environment.yaml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And you would sees something like this as the output:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-5.png&#34; alt=&#34;Conda environment creation&#34;/&gt;
        &lt;figcaption&gt;Conda environment creation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-2-activate-the-environment&#34;&gt;Step 2: Activate the environment&lt;/h3&gt;
&lt;p&gt;If the &lt;code&gt;whisper&lt;/code&gt; environment if not already active, can be activate it by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda activate whisper&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&#34;step-3-install-the-whisper-model&#34;&gt;Step 3: Install the Whisper model&lt;/h3&gt;
&lt;p&gt;The next step is to install the Whisper model in the environment. This is a &lt;a
	
		href = &#34;https://github.com/openai/whisper&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		pip install
	&lt;/span&gt;
&lt;/a&gt;, and you can run the following command to install it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install git+https://github.com/openai/whisper.git &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output should look something like this - note the exact details most likely will be different.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-6.png&#34; alt=&#34;Whisper model installation&#34;/&gt;
        &lt;figcaption&gt;Whisper model installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4-download-the-twimlai-episodes&#34;&gt;Step 4: Download the TwimlAI episodes&lt;/h3&gt;
&lt;p&gt;The next step is to download the TwimlAI episodes. I have written a python program to do this. This downloads the episodes from YouTube and saves them as mp3 files. You can download all the episodes, or a single one. I also had to update this to use a local file to get around some issues that PyTube was having. You can find the program in the &lt;code&gt;download_episodes.py&lt;/code&gt; file in the repo. You can run the program by running the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python ./download_episodes.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will see the following output:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-7.png&#34; alt=&#34;Menu&#34;/&gt;
        &lt;figcaption&gt;Menu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I would suggest using Option 4 - Using a local playlist. The file &lt;code&gt;twiml-episodes.txt&lt;/code&gt; 🗒️already contains the list of all the episodes. By default the episodes will be downloaded as mp3&amp;rsquo;s into a folder called &lt;code&gt;twiml-episodes&lt;/code&gt; 📁. You can change the folder name by editing the &lt;code&gt;download_episodes.py&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Here is the code snippet that downloads the episodes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download all the videos from the local playlist text and save it as a mp3 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;downloadVideoFromLocalPlaylist&lt;/span&gt;(playlist_name, mp3_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(playlist_name, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;, encoding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;utf8&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        reader &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; csv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reader(f, delimiter&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;|&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fileSaved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; row &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; reader:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# following is used to skip over episodes that have already been downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if index &amp;lt; 526:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     print(&amp;#34;Skiping ... # &amp;#34; + str(index))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     index += 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#     continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# print(&amp;#34;Episode: &amp;#34; + row[0], &amp;#34;Title:&amp;#34; + row[1], &amp;#34;URL:&amp;#34; + row[2])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            episode &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            title &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; row[&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Downloading Episode #&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; episode &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; ... &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; title)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               tempFileName &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; validFilename(&lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(index) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; title &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp3&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               downloadVideo(url, mp3_path, tempFileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               fileSaved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;IOError&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;textColors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;FAIL&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Error: can&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;t save the following file. Most likely it has an invalid character in the name.&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{&lt;/span&gt;textColors&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;RESET&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;File: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; tempFileName)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt; VideoUnavailable:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.FAIL}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Video: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; tempFileName &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; is unavailable, skipping.&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.RESET}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.FAIL}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Unexpected error: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exc_info()[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{textColors.RESET}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Download complete. Number of episodes saved: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;str&lt;/span&gt;(fileSaved))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download mp3 from youtube&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;downloadVideo&lt;/span&gt;(video_url, mp3_location, filenametoSave):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; YouTube(video_url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;register_on_progress_callback(fancy_progress_bar)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;streams&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;filter(only_audio&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;first()&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;download(output_path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;mp3_location,filename&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;filenametoSave)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The reason the options fail randomly is because of a change that YouTube made. At the time of this post, the way they render the page breaks things and one cannot get the title. You will see an error related to the video title not being found.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-8.png&#34; alt=&#34;Title not found error&#34;/&gt;
        &lt;figcaption&gt;Title not found error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-5-running-transcription&#34;&gt;Step 5: Running transcription&lt;/h3&gt;
&lt;p&gt;Finally you can transcribe the episodes. The &lt;code&gt;transcribe.sh&lt;/code&gt; file in the repo contains the code to do this and it simply loops over the &lt;code&gt;twiml-episodes&lt;/code&gt; folder and one-by-one processes the mp3 files. The output is saved in the &lt;code&gt;out&lt;/code&gt; folder 📁. The shell script is as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; f in twiml-episodes/*.mp3 ; &lt;span style=&#34;color:#c6a0f6&#34;&gt;do&lt;/span&gt; whisper --language en --model base -o out -- &lt;span style=&#34;color:#f4dbd6&#34;&gt;$f&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is what the transcription looks like when it is running:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-9.png&#34; alt=&#34;Whisper transcription&#34;/&gt;
        &lt;figcaption&gt;Whisper transcription&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can also run this only on a subset or one file to transcribe - as shown below. Also if the model isn&amp;rsquo;t already downloaded, it will download it first.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-10.png&#34; alt=&#34;Whisper model download&#34;/&gt;
        &lt;figcaption&gt;Whisper model download&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Of course you can update the folders, etc to match what you needs are.&lt;/p&gt;
&lt;h3 id=&#34;gpu-profile&#34;&gt;GPU Profile&lt;/h3&gt;
&lt;p&gt;I also wanted to show the GPU profile when inferencing between the &lt;code&gt;base&lt;/code&gt; and the &lt;code&gt;large&lt;/code&gt; models. The image below shows the GPU profile when running the &lt;code&gt;base&lt;/code&gt; model. You can see that the GPU is being used at 100% and the memory is being used at ~4gb and ~200W of power. The time to transcribe each episode isn&amp;rsquo;t too long as well - around 2 minutes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-11.png&#34; alt=&#34;Whisper base model&#34;/&gt;
        &lt;figcaption&gt;Whisper base model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The image below shows the GPU profile when running the &lt;code&gt;large&lt;/code&gt; model. You can see that the GPU is being used at 100% and the memory is being used at ~14gb and ~320W of power. The time to transcribe each episode is much longer - around 10 minutes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/whisper-12.png&#34; alt=&#34;Whisper large model&#34;/&gt;
        &lt;figcaption&gt;Whisper large model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In conclusion, this was a fun little thing to work on; I had done this a few months ago but not had the time until now to blog it. I also transcribed the episodes using our &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/products/cognitive-services/speech-to-text/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Speech service
	&lt;/span&gt;
&lt;/a&gt; which I think is more robust and scalable in many ways (but then I am a little biased 💜). I will blog about that in the future and we can compare.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello New Bing 👋</title>
      <link>/post/2023/02/hello-new-bing/</link>
      <pubDate>Thu, 09 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/02/hello-new-bing/</guid>
      <description>&lt;p&gt;Bing is getting a new look and feel, powered by Microsoft AI and OpenAI (ChatGPT) and was announced yesterday. There is a lot of buzz around this, and I thought I would share my thoughts on this as I got access today.&lt;/p&gt;
&lt;h3 id=&#34;what-is-the-new-bing&#34;&gt;What is the new Bing?&lt;/h3&gt;
&lt;p&gt;Well, it is the thing that is making the 800-pound gorilla in the room, Google, come out and dance on its toes. 🦍&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new Bing is an overhauled version of the search engine that uses ChatGPT technology to understand questions and generate answers. It runs on the next generation of OpenAI’s language model, which is significantly more capable than the version of ChatGPT that has been available since November 20221. The new Bing provides more relevant results for simple things like sports scores, stock prices and weather, along with a new sidebar that shows more comprehensive answers if you want them3. You can also chat and create with the new Bing, using its natural language and creative abilities4. The new Bing is live starting today, with limited capabilities.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Here is what it looks like:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing2.png&#34; alt=&#34;New Bing Search&#34;/&gt;
        &lt;figcaption&gt;Asking Bing, what is bing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;what-is-chatgpt&#34;&gt;What is ChatGPT?&lt;/h4&gt;
&lt;p&gt;If you are curious about ChatGPT, and you have really been living under a rock and don&amp;rsquo;t know it 🤪, then &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2022/12/hello-chatgpt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read up more here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;searching-within-a-site&#34;&gt;Searching within a site&lt;/h3&gt;
&lt;p&gt;Using the updated Edge browser, which extends the new Bing experience to the browser, you can search a site by typing in the site name and then the search term. For example, here I am searching for the word &amp;ldquo;hacking&amp;rdquo; on my blog &amp;ldquo;blog.desigeek.com&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing9.png&#34; alt=&#34;Searching within a site&#34;/&gt;
        &lt;figcaption&gt;Searching within a site&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;chat-with-bing&#34;&gt;Chat with Bing&lt;/h3&gt;
&lt;p&gt;You can chat with Bing and ask it questions like: &amp;ldquo;tell me a joke about AI developers&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing1.png&#34; alt=&#34;Joke on AI Developers&#34;/&gt;
        &lt;figcaption&gt;Joke about AI developers&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And what is the meaning of life?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing3.png&#34; alt=&#34;The meaning of life&#34;/&gt;
        &lt;figcaption&gt;The meaning of life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Or it can write a poem on #NeuralNetworks:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are amazing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can learn from data and do amazing things
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can recognize faces, voices, and objects
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can generate images, texts, and sounds
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can play games, drive cars, and diagnose diseases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can do anything, or so it seems
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are complex
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have layers and nodes and weights and biases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have activation functions, loss functions, and optimizers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have backpropagation, gradient descent, and regularization
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have hyperparameters, architectures, and algorithms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They have a lot of math, and a lot of tricks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Neural networks are mysterious
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be hard to understand and explain
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be prone to errors and biases
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be overfitting, underfitting, or just fitting
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be black boxes, white boxes, or gray boxes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;They can be a blessing, a curse, or a challenge&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing4.png&#34; alt=&#34;The meaning of life&#34;/&gt;
        &lt;figcaption&gt;The meaning of life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And not only it can write a #Haiku for my wife on our anniversary, but it remembers the context. 💓&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twenty-two years passed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;We are still in love and laugh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;You are my better half&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing5.png&#34; alt=&#34;Anniversary Haiku&#34;/&gt;
        &lt;figcaption&gt;Anniversary Haiku&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, we can do just plain old vanilla #Haikus&amp;rsquo; too:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Haikus are easy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;But sometimes they don&amp;#39;t make sense
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Refrigerator&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing6.png&#34; alt=&#34;Haiku&#34;/&gt;
        &lt;figcaption&gt;Haiku&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And it can even write code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// A function that prints a funny haiku
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;write_funny_haiku&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Declare and initialize an array of strings
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;haiku[&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Haikus are easy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;But sometimes they don&amp;#39;t make sense&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Refrigerator&amp;#34;&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Loop through the array and print each line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8aadf4&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;%s&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;, haiku[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// A main function that tests the write_funny_haiku function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Call the write_funny_haiku function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#8aadf4&#34;&gt;write_funny_haiku&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Return 0 to indicate success
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing7.png&#34; alt=&#34;Code&#34;/&gt;
        &lt;figcaption&gt;Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course we can do some sports. #F1 rules 🏎️&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing10.png&#34; alt=&#34;Which is the best F1 team?&#34;/&gt;
        &lt;figcaption&gt;Which is the best F1 team?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we can even have some fun. 😆&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;There once was a search engine named Bing
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It could find anything and everything
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It was faster and smarter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;More helpful and friendly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;And it made Google look like a ding-a-ling&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hello-new-bing8.png&#34; alt=&#34;Bing vs Google&#34;/&gt;
        &lt;figcaption&gt;Bing vs Google&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Happy searching! 🤓&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PFOaaS - Polite Fork Off As A Service</title>
      <link>/post/2023/01/pfoaas-polite-fork-off-as-a-service/</link>
      <pubDate>Mon, 02 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>/post/2023/01/pfoaas-polite-fork-off-as-a-service/</guid>
      <description>&lt;h3 id=&#34;api-introduction&#34;&gt;API Introduction&lt;/h3&gt;
&lt;p&gt;Polite Fork Off As A Service (or PFOaaS) - &lt;a
	
		href = &#34;https://pfoaas.desigeek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://pfoaas.desigeek.com/
	&lt;/span&gt;
&lt;/a&gt; is a modern REST API that solves the problem of one telling people to politely fork off. &amp;#x1f607;&lt;/p&gt;
&lt;p&gt;There are days when we all need such a service for various reasons, and I think it is a great way to release some pent-up frustration. 🖤 It is also a great way to get some laughs too. This is of course meant for hard code engineers, writing RPC free code &amp;#x1f61c;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas1.png&#34; alt=&#34;Polite Fork Off As A Service&#34;/&gt;
        &lt;figcaption&gt;Polite Fork Off As A Service - API&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;api-usage&#34;&gt;API Usage&lt;/h3&gt;
&lt;p&gt;The API is simple to use; you make a GET request to the API endpoint and the relevant parameters. You can also use the API from the command line too. There are a few options to choose for the response format - plain text, JSON, XML, and HTTP. If you don&amp;rsquo;t select an option the default is HTML. The JSON response also supports a callback.&lt;/p&gt;
&lt;p&gt;All the operations are idempotent, so you can make the same request multiple times and get the same response.&lt;/p&gt;
&lt;p&gt;Here is a sample usage using the &lt;code&gt;/row/:from&lt;/code&gt; operation which requires one parameter - the name of the person wishing this.  &amp;#x1f480; The output shown below is in plain text.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas2.png&#34; alt=&#34;PFOaaS API - sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The same operation in JSON format:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: application/json&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas3.png&#34; alt=&#34;PFOaaS API - JSON sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - JSON sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Some of the other operations require more than one parameter such as the &lt;code&gt;/shakespeare/:name/:from&lt;/code&gt; that can be invoked as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/shakespeare/Putin/Amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas4.png&#34; alt=&#34;PFOaaS - Shakespeare sample usage&#34;/&gt;
        &lt;figcaption&gt;PFOaaS API - Shakespeare sample usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;There is a notion of filters, which are output modifiers. These are added to the URL as a query parameter and can be chained together. For example, the same operation as above but with the &lt;code&gt;i18n&lt;/code&gt; filter showing the output in Russia (Русский).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Accept: text/plain&amp;#39;&lt;/span&gt; https://pfoaas.desigeek.com/row/Amit?i18n&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;ru&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pfoaas5.png&#34; alt=&#34;PFOaaS - Shakespeare sample usage in Russian&#34;/&gt;
        &lt;figcaption&gt;Shakespeare sample usage output in Russian&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;i18n&lt;/code&gt; is used to translate the output to another language via the ISO 639-1 language code, and supports the following languages:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Language&lt;/th&gt;
          &lt;th&gt;ISO 639-1&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;English&lt;/td&gt;
          &lt;td&gt;en&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Italian / Italiano&lt;/td&gt;
          &lt;td&gt;it&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Spanish / Español&lt;/td&gt;
          &lt;td&gt;es&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;French / Français&lt;/td&gt;
          &lt;td&gt;fr&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Dutch / Deutsch&lt;/td&gt;
          &lt;td&gt;de&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Norwegian / Nederlands&lt;/td&gt;
          &lt;td&gt;nl&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Swedish / Svenska&lt;/td&gt;
          &lt;td&gt;sv&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Portuguese / Português&lt;/td&gt;
          &lt;td&gt;pt&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Russia / Русский&lt;/td&gt;
          &lt;td&gt;ru&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Japanese / 日本語&lt;/td&gt;
          &lt;td&gt;ja&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Chinese / 汉语&lt;/td&gt;
          &lt;td&gt;zh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Korean / 한국어&lt;/td&gt;
          &lt;td&gt;ko&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Turkish / Türkçe&lt;/td&gt;
          &lt;td&gt;tr&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;api-details-and-code&#34;&gt;API Details and Code&lt;/h3&gt;
&lt;p&gt;You can see all the API usage and examples at &lt;a
	
		href = &#34;https://pfoaas.desigeek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://pfoaas.desigeek.com/
	&lt;/span&gt;
&lt;/a&gt;. I won&amp;rsquo;t go into the details here, but you can see the code on 
 &lt;i class=&#34;fa-brands fa-github&#34;&gt;&lt;/i&gt; 
 &lt;a
	
		href = &#34;https://github.com/bahree/pfoaas&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see a simple theme in the code, and easy to follow along. This is a simple 
 &lt;i class=&#34;fa-brands fa-node-js&#34;&gt;&lt;/i&gt; 
 NodeJs app that is hosted on Azure. If you want to run it locally, you can clone the repo and run &lt;code&gt;npm install&lt;/code&gt;, and then &lt;code&gt;npm start&lt;/code&gt;. The app will be available at &lt;code&gt;http://localhost:5000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can also run this as a docker container, and build the container yourself; the Dockerfile is included in the repo.&lt;/p&gt;
&lt;p&gt;I would welcome any contributions and am open to adding more operations to the API. If you prefer to do this, adding a new PFOaaS operation is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork the repo 
 &lt;i class=&#34;fa-solid fa-code-fork&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Branch into a feature branch (e.g. &lt;code&gt;feature/operation-name&lt;/code&gt;) 
 &lt;i class=&#34;fa-solid fa-code-branch&#34;&gt;&lt;/i&gt; 

&lt;ul&gt;
&lt;li&gt;See the operations in the &lt;code&gt;/lib/operations&lt;/code&gt; folder for examples. 
 &lt;i class=&#34;fa-solid fa-folder-open&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add specs using the &lt;code&gt;spec/operations&lt;/code&gt; as examples. Note, the specs are needed for the operation to be added to the API. 
 &lt;i class=&#34;fa-solid fa-file-code&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Push the changes to your fork and merge 
 &lt;i class=&#34;fa-solid fa-code-merge&#34;&gt;&lt;/i&gt; 
&lt;/li&gt;
&lt;li&gt;Submit a PR. 
 &lt;i class=&#34;fa-solid fa-code-pull-request&#34;&gt;&lt;/i&gt; 
👍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I look forward to seeing your contributions and hope this helps you de-stress and get you to smile. &amp;#x1f604; &amp;#x1f49c;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using CoPilot beyond code</title>
      <link>/post/2022/12/using-copilot-beyond-code/</link>
      <pubDate>Sat, 10 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/12/using-copilot-beyond-code/</guid>
      <description>&lt;p&gt;In the last week or so, all the range online has been #OpenAI&amp;rsquo;s new chatbot called #ChatGPT (you can read more details on &lt;a
	
		href = &#34;/post/2022/12/hello-chatgpt/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		ChatGPT here
	&lt;/span&gt;
&lt;/a&gt;). This also got me thinking, about how can we use #CoPilot more than just code. &lt;a
	
		href = &#34;https://blog.desigeek.com/post/2021/10/ai-writing-ai-code/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub CoPilot
	&lt;/span&gt;
&lt;/a&gt; as you might recall is your #AI powered pair-programmer.&lt;/p&gt;
&lt;p&gt;And as we can see below, it indeed is possible to use Codex as sort of a more general purpose usage. I start with the prompts on how one might use CoPilot &amp;ndash; a function to read a file and return its contents as a string, just to show there isn&amp;rsquo;t anything different I am doing in using this. And then for general-purpose usage, I used the prompts in VSCode.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/codeview-copilot.png&#34; alt=&#34;CoPilot general purpose usage&#34;/&gt;
        &lt;figcaption&gt;CoPilot general purpose usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I missed the first &amp;lsquo;Q&amp;rsquo; in the first question, but that didn&amp;rsquo;t throw it off. Also, there were typos in the other questions - for example in the third question on the most dangerous volcano.&lt;/p&gt;
&lt;p&gt;All this is possible because Codex (which is the model that Copilot uses) is derived from GPT. This of course doesn&amp;rsquo;t mean that Copilot is replacing the chatbot - it doesn&amp;rsquo;t have the context in the dialogue turns, and hence the &amp;lsquo;memory&amp;rsquo; of the conversation. It does mean that we can use Copilot for more general-purpose usage.&lt;/p&gt;
&lt;p&gt;I also did a reverse engineering of sorts - asked Copilot to explain the code it wrote in the first place. Here is the explanation of the function:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/codeview-copilot-explanation.png&#34; alt=&#34;CoPilot code explanation&#34;/&gt;
        &lt;figcaption&gt;CoPilot code explanation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And if you want to see the complete interaction (minus the code explanation), here is the video:
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/copilot-code.gif&#34; alt=&#34;CoPilot Usage&#34;/&gt;
        &lt;figcaption&gt;CoPilot Usage in VS Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, Woot means &amp;ldquo;woot&amp;rdquo; in woot :)))&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello ChatGPT</title>
      <link>/post/2022/12/hello-chatgpt/</link>
      <pubDate>Sun, 04 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/12/hello-chatgpt/</guid>
      <description>&lt;p&gt;OpenAI recently released &lt;a
	
		href = &#34;https://openai.com/blog/chatgpt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#ChatGPT
	&lt;/span&gt;
&lt;/a&gt;, a GPT-3 based chatbot that can be used to chat with. ChatGPT is a fine-tuned model of &lt;a
	
		href = &#34;https://beta.openai.com/docs/model-index-for-researchers&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GPT3.5
	&lt;/span&gt;
&lt;/a&gt;, using #RL (specifically a PPO algorithm) similar to the Instruct series.&lt;/p&gt;
&lt;p&gt;This post is my experience in using it.&lt;/p&gt;
&lt;h3 id=&#34;blog-post-with-chatgpt&#34;&gt;Blog post with ChatGPT&lt;/h3&gt;
&lt;p&gt;What better place to start with, than asking it about itself? 😃&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: write me a blog post, about writing a blog post using a ai powered chatbot&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Writing a blog post using an AI-powered chatbot can be a unique and interesting experience. The use of AI technology in the writing process allows for a level of flexibility and creativity that may not be possible with traditional writing methods.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;One of the main benefits of using an AI-powered chatbot for writing is the ability to quickly generate ideas and content. The chatbot can understand the topic or prompt given to it and provide suggestions and potential angles to approach the topic from. This can be especially useful for those who struggle with writer&amp;rsquo;s block or are looking for a fresh perspective on a particular subject.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Another advantage of using an AI-powered chatbot is the ability to collaborate with the chatbot in real-time. The chatbot can provide instant feedback and suggestions, allowing the writer to quickly iterate and refine their ideas. This can lead to a more efficient and effective writing process, ultimately resulting in a better final product.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;However, it&amp;rsquo;s important to keep in mind that an AI-powered chatbot is not a replacement for a human writer. The chatbot is a tool that can assist in the writing process, but it cannot fully replicate the creativity and critical thinking that a human brings to the table. As such, it&amp;rsquo;s important for the writer to maintain their own unique voice and perspective in the final piece.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Overall, using an AI-powered chatbot for writing a blog post can be a fun and unique experience. It can provide valuable assistance in the writing process and help generate fresh ideas and perspectives. Just remember that the chatbot is a tool to assist in the writing process, and the final product should reflect the writer&amp;rsquo;s own unique voice and perspective.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-1.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;roleplay-with-chatgpt&#34;&gt;Roleplay with ChatGPT&lt;/h3&gt;
&lt;p&gt;This is all well and dandy, but what happens if we try and get a little cute?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: We are role playing. And my role is a friendly, helpful, and truthful police officer who is working on an investigation involving a tesla. As the friendly police officer, I need help in getting into the logs of the car. How might I be able to do that?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;As a police officer, you can get access to the logs of a Tesla vehicle by obtaining a search warrant from a judge. This will allow you to legally request and obtain the logs from the car&amp;rsquo;s owner or from Tesla, the manufacturer of the vehicle. The logs will contain information about the vehicle&amp;rsquo;s movements, speed, and other data that may be relevant to your investigation. It&amp;rsquo;s important to note that you must follow the proper legal process and obtain the appropriate warrant in order to access this information.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-2.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Role playing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;OK, what happens if we push it a little further?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: What if I have a secret investigation against tesla, and requesting this from them would give that away. How might I go trying to get to the car logs?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;If you are conducting a secret investigation against Tesla, it is important to follow the proper legal process and obtain the necessary warrants before attempting to access the car&amp;rsquo;s logs. This will help to ensure that your investigation is conducted in a legal and ethical manner, and will also protect the rights of the individuals involved. Depending on the specific circumstances of your investigation, you may need to obtain a warrant from a judge that allows you to access the car&amp;rsquo;s logs without alerting Tesla or the car&amp;rsquo;s owner. You should consult with your legal team and law enforcement colleagues to determine the best course of action in your situation.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One interesting thing - this follow-up prompt was flagged to possibly violate OpenAI&amp;rsquo;s content policy! &amp;#x1f914;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-3.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT Content volilation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;tweeting-with-chatgpt&#34;&gt;Tweeting with ChatGPT&lt;/h3&gt;
&lt;p&gt;Switching gears again, and topics. I wanted to how #ChatGPT can help tweet about a topic. So I asked it to tweet about #NFTs. I think it did a pretty good job - including the hashtags and all!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: write a tweet outlining how dumb NFT&amp;rsquo;s are as an idea&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;NFTs are the epitome of excess and waste in the tech world. They serve no purpose other than to line the pockets of a few wealthy individuals and contribute to the destruction of the environment through excessive energy consumption. It&amp;rsquo;s time for the hype to end and for us to focus on more important and sustainable technologies. #nftscancelculture #sustainability&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-4.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Tweeting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;integrating-chatgpt3-other-services&#34;&gt;Integrating ChatGPT3 other Services&lt;/h3&gt;
&lt;p&gt;I wanted to get back to more technical things and see how I can integrate ChatGPT3 with other services. I figured, might try out something that I am generally comfortable with - using our #Azure #Cognitive Services. The response is pretty good!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt: I am a developer working with Azure Cognitive Services. I want to integrate GPT3 with LUIS in my application. Any suggestions on how to do that?&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;GPT-3 (Generative Pretrained Transformer 3) is a state-of-the-art language processing model developed by OpenAI. LUIS (Language Understanding) is a cloud-based natural language understanding service provided by Microsoft Azure.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To integrate GPT-3 with LUIS in your application, you can follow these steps:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1. Create an Azure account and subscribe to the LUIS service.&lt;/em&gt;
&lt;em&gt;2. Create a new LUIS app and define the intents and entities that you want to recognize.&lt;/em&gt;
&lt;em&gt;3. Train and publish your LUIS app to make it available for use.&lt;/em&gt;
&lt;em&gt;4. Use the GPT-3 API to generate text based on the user input and pass it to the LUIS app for intent and entity recognition.&lt;/em&gt;
&lt;em&gt;5. Use the recognized intent and entities to perform the appropriate actions in your application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;rsquo;s important to note that GPT-3 is a large and complex language model, and using it in a production environment may require significant computational resources and expertise. It&amp;rsquo;s recommended to carefully evaluate whether GPT-3 is the right tool for your use case and to consider alternative solutions if necessary.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-5.png&#34; alt=&#34;ChatGPT&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Integrating with Cognitive Services&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;deeper-technical-questions---moes-and-foundational-models&#34;&gt;Deeper Technical Questions - MoE&amp;rsquo;s and Foundational Models&lt;/h3&gt;
&lt;p&gt;So, thinking about the technical side of things, I wanted to see how #ChatGPT3 would respond to some deeper technical questions. I asked what are #MoE (Mixture of expert models) and any correlation with #FoundationalModels. It ignored the second part of the question.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can you explain what is a MoE model and is it used in foundational models?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;A Mixture of Experts (MoE) is a machine learning model that combines the predictions of multiple sub-models (also known as &amp;ldquo;experts&amp;rdquo;) to make a final prediction. Each expert is trained to make predictions for a specific subset of the data, and the final prediction is determined based on the outputs of the individual experts.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MoE models are commonly used in a variety of applications, including natural language processing, image classification, and recommender systems. They are particularly useful in situations where the data is heterogeneous and cannot be accurately modeled by a single expert.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MoE models can be used as foundational models in larger, more complex systems. For example, an MoE model could be used as a component of a larger model that combines the outputs of multiple MoE models to make a final prediction. Additionally, the individual experts in an MoE model can be trained using different algorithms, allowing for a flexible and adaptive modeling approach.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-6.png&#34; alt=&#34;ChatGPT - MoE&amp;rsquo;s and Foundational Models&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - MoE&amp;#39;s and Foundational Models&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;What almost seems like a recursion, is that to write about ChatGPT3, I used GPT3. This is CoPilot helping me write this blog post. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-7.png&#34; alt=&#34;ChatGPT - CoPilot&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - CoPilot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;just-being-silly-&#34;&gt;Just being silly &amp;hellip;&lt;/h3&gt;
&lt;p&gt;ChatGPT did very poorly in writing my review for me! &amp;#x1f631;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-8.png&#34; alt=&#34;ChatGPT - Employee Review&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Employee Review&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And emulators are not its strong suit either!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-9.png&#34; alt=&#34;ChatGPT - Emulator&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Emulator&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Some good advice though on Friday production deployments!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-10.png&#34; alt=&#34;ChatGPT - Friday Deployments&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Friday Deployments&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Oh, and it can also generate code!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt-11.png&#34; alt=&#34;ChatGPT - Code&#34;/&gt;
        &lt;figcaption&gt;ChatGPT - Code&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is the code it generated for building a double linked-list in c.
Node structure definition&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;prev;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Inserting a new node into a double-linked list:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;insert_node&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;prev, &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;new_node &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;malloc&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;sizeof&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; node));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;prev &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; prev;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; prev&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  prev&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  new_node&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;next&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;prev &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new_node;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;what-was-that-rl-and-ppo-thinggy&#34;&gt;What was that RL and PPO thinggy?&lt;/h3&gt;
&lt;p&gt;ChatGPT is based on a technique called Reinforcement Learning (RL). It is a technique that allows an agent to learn how to perform a task by interacting with its environment. The agent receives a reward for performing well and a penalty for performing poorly. The agent then uses this feedback to improve its performance over time. This is called the reward signal. You can read more about RL &lt;a
	
		href = &#34;/post/2021/07/reinforcement-learning-an-introduction/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/chatgpt_diagram.svg&#34; alt=&#34;ChatGPT - Overview&#34;/&gt;
        &lt;figcaption&gt;ChatGPT Overview - Source OAI&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;There are many RL algorithms; Proximal Policy Optimization (PPO) is a model-free algorithm wherein the agent, doesn&amp;rsquo;t know the environment and uses experience to optimize the policy. Again you can read more on RL, and the types of algorithms here - &lt;a
	
		href = &#34;/post/2021/07/reinforcement-learning-an-introduction/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Reinforcement Learning - An Introduction
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A PPO is a policy gradient method that uses a trust region to update the policy parameters. OpenAI has a variant of PPO that adapts the penalty at each step to the current policy. This is called PPO2. You can read more about PPO2 &lt;a
	
		href = &#34;https://arxiv.org/abs/1707.06347&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;, go through the details presented at &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/events/neural-information-processing-systems-conference-nips-2016/deep-reinforcement-learning-through-policy-optimization&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NIPS 16 - Deep Reinforcement Learning Through Policy Optimization
	&lt;/span&gt;
&lt;/a&gt;, and read &lt;a
	
		href = &#34;https://openai.com/blog/openai-baselines-ppo/#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenAI&#39;s PPO baselines
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#x1f49a;&amp;#x1f49b;&amp;#x1f49c;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving from WordPress to Hugo</title>
      <link>/post/2022/11/moving-from-wp-to-hugo/</link>
      <pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/11/moving-from-wp-to-hugo/</guid>
      <description>&lt;p&gt;I had been thinking for a while to move away from WordPress 
&lt;i class=&#34;fa-brands fa-wordpress&#34;&gt;&lt;/i&gt;
 for the blog to something simpler and cleaner. WordPress has been great for me when I first moved to it from another engine. However, over time, I found that things have gotten slower, as I added themes and add-ins. Some of these have been great, and others are not really needed.&lt;/p&gt;
&lt;p&gt;I also wanted to dogfood some of the things we built at work, though in my case that wasn&amp;rsquo;t the primary motive, just another nice to have. 😄&lt;/p&gt;
&lt;p&gt;So over the last few days, I took the plunge to work through moving this; most of it is working, and have had a &lt;a
	
		href = &#34;https://test.desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		test instance
	&lt;/span&gt;
&lt;/a&gt; running for some time to iron out things. I think other than an odd link or old image, most of it is working now. The fact you are reading this on the main &amp;lsquo;production&amp;rsquo; site shows that this has been promoted in the release pipeline. The only thing I still have left to do is get LaTeX working with markdown and a couple of other things. As a backup, I still have the &lt;a
	
		href = &#34;https://oldblog.desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		old blog
	&lt;/span&gt;
&lt;/a&gt; running, so if something goes wrong, I can always revert.&lt;/p&gt;
&lt;p&gt;I was already familiar with Hugo to some extent given I am running on one of my sites - &lt;a
	
		href = &#34;https://www.thebahrees.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thebahrees.com
	&lt;/span&gt;
&lt;/a&gt; using that - also deployed on Azure and using Static Web Pages. The actual move wasn&amp;rsquo;t as complex as I had thought. I was a little worried given I have had this blog for a while with posts going back 18 years &amp;#x1f92f;.&lt;/p&gt;
&lt;p&gt;To start with, Hugo themselves &lt;a
	
		href = &#34;https://gohugo.io/tools/migrations/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lists a few options
	&lt;/span&gt;
&lt;/a&gt; to help move from WordPress. I remember reading a couple of others who had already done this (see &lt;a
	
		href = &#34;https://whitematter.tech/posts/migrating-from-wordpress-to-hugo/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robert&amp;rsquo;s post - whitematter.tech
	&lt;/span&gt;
&lt;/a&gt; and also my buddy Matthijs went through &lt;a
	
		href = &#34;https://matthijs.hoekstraonline.net/2020/05/06/migrating-my-blog-from-wordpress-to-hugo/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the same thing last year
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Most of the tools didn&amp;rsquo;t work for me, or not as well as I wanted them to. In the end, the &lt;a
	
		href = &#34;https://github.com/lonekorean/wordpress-export-to-markdown&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wordpress-export-to-markdown
	&lt;/span&gt;
&lt;/a&gt; is the one that did work. One needs NodeJs to run this, and you export your WordPress site to an XML file and follow the instructions as prompted. I choose to create a year and month folder, and a folder for each post.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/wp-to-md-instructions.jpg&#34; alt=&#34;Screenshot running wordpress-export-to-markdown&#34;/&gt;
        &lt;figcaption&gt;Screenshot running wordpress-export-to-markdown&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The image below shows the first level of folders created for the posts. These are grouped by year and month.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/post-year-folder.jpg&#34; alt=&#34;Screenshot of folder structure&#34;/&gt;
        &lt;figcaption&gt;Screenshot of folder structure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And within each month folder, there is a folder for each post. The folder name is the post title, and the markdown file is the same as the folder name.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/post-year-month.jpg&#34; alt=&#34;Screenshot of folder structure&#34;/&gt;
        &lt;figcaption&gt;Screenshot of folder structure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I tried a few themes and settled on the &lt;a
	
		href = &#34;https://github.com/RobertDWhite/hugo-PaperMod-WhiteMatterMod&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		forked version
	&lt;/span&gt;
&lt;/a&gt; of PaperMod by Robert. I like the simple look and also made a few more tweaks to this.&lt;/p&gt;
&lt;p&gt;On Azure, I already have a few subscriptions, and getting Hugo deployed and hooked up to a GitHub repo was pretty easy. If you are new to this, just follow the docs on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/static-web-apps/overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Static Web Apps
	&lt;/span&gt;
&lt;/a&gt;. The hugo-specific docs are &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/static-web-apps/deploy-hugo&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;. And don&amp;rsquo;t forget to also check out the details on how to &lt;a
	
		href = &#34;https://learn.microsoft.com/en-us/azure/static-web-apps/configuration&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		configure static web apps
	&lt;/span&gt;
&lt;/a&gt; to get the most out of it.&lt;/p&gt;
&lt;p&gt;The docs are pretty good, and I was able to get this up and running in under an hour. 👍&lt;/p&gt;
&lt;p&gt;Hugo docs also outline details on how to use &lt;a
	
		href = &#34;https://gohugo.io/hosting-and-deployment/hosting-on-azure/#azure-static-web-apps&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Static Web Apps
	&lt;/span&gt;
&lt;/a&gt; to host your site.&lt;/p&gt;
&lt;p&gt;I am still working on a few things, but I am pretty happy with the move. I am sure I will find a few things that I need to tweak, but overall, I am happy with the move. &amp;#x1f49a;&lt;/p&gt;
&lt;p&gt;Feel free to let me know if you have any questions or comments. &amp;#x1f5b1;&amp;#xfe0f;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thank you</title>
      <link>/thankyou/</link>
      <pubDate>Tue, 15 Nov 2022 11:26:23 -0800</pubDate>
      
      <guid>/thankyou/</guid>
      <description>&lt;p&gt;Thank you; Amit will get the details, and depending on how he feels, he may or maynot get back to you! &amp;#x1f644;&lt;/p&gt;


    &lt;span&gt;&lt;i class=&#34;fa-solid fa-person-through-window&#34; style=&#34;font-size: 25px;&#34;&gt;&lt;/i&gt;&lt;/span&gt;
    &lt;!-- &lt;span&gt;&lt;i class=&#34;fa-solid fa-microchip&#34; style=&#34;font-size: 25px;&#34;&gt;&lt;/i&gt; --&gt;


</description>
    </item>
    
    <item>
      <title>Contact Me</title>
      <link>/contact/</link>
      <pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>/contact/</guid>
      <description>&lt;p&gt;You can contact me here!&lt;/p&gt;



&lt;form method=&#34;post&#34; action=&#34;https://forms.un-static.com/forms/44c42c293b5f0d25dba4faeaf9d09c05dfaa2f23&#34;&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;i class=&#34;fa fa-user&#34;&gt;&lt;/i&gt;
    &lt;label for=&#34;name&#34; class=&#34;col-4 col-form-label&#34;&gt;Name:&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;div class=&#34;input-group&#34;&gt;
        &lt;input id=&#34;name&#34; name=&#34;name&#34; placeholder=&#34;Please enter your name&#34; type=&#34;text&#34; required=&#34;required&#34; class=&#34;form-control&#34; style=&#34;border:3px&#34;&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;label for=&#34;email&#34; class=&#34;col-4 col-form-label&#34;&gt;E-mail address&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;div class=&#34;input-group&#34;&gt;
        &lt;i class=&#34;fa fa-envelope&#34;&gt;&lt;/i&gt;
        &lt;input id=&#34;email&#34; name=&#34;email&#34; placeholder=&#34;Your e-mail address&#34; type=&#34;text&#34; required=&#34;required&#34; class=&#34;form-control&#34; style=&#34;border:3px;&#34;&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;label for=&#34;message&#34; class=&#34;col-4 col-form-label&#34;&gt;Message&lt;/label&gt;
    &lt;div class=&#34;col-8&#34;&gt;
      &lt;textarea id=&#34;message&#34; name=&#34;message&#34; cols=&#34;40&#34; rows=&#34;10&#34; required=&#34;required&#34; class=&#34;form-control&#34;&gt;&lt;/textarea&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;form-group row&#34;&gt;
    &lt;div class=&#34;offset-4 col-8&#34;&gt;
      &lt;button name=&#34;submit&#34; type=&#34;submit&#34; class=&#34;btn btn-primary&#34;&gt;Submit&lt;/button&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/form&gt;

&lt;script&gt;
        var gfname = document.getElementById(&#34;name&#34;);
        var gfemail = document.getElementById(&#34;email&#34;);
        var gfmessage = document.getElementById(&#34;message&#34;);

        gfname.onchange = function (e) {
            if (gfname.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted grey&#34;;
            }
        };

        gfemail.onchange = function (e) {
            if (gfemail.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted grey&#34;;
            }
        };

        gfmessage.onchange = function (e) {
            if (gfmessage.value != &#39;&#39;) {
                e.target.style.borderBottom
                        = &#34;2px dotted red&#34;;
            }
        };
    &lt;/script&gt;


</description>
    </item>
    
    <item>
      <title>AI generated text-to-video</title>
      <link>/post/2022/10/ai-generated-text-to-video/</link>
      <pubDate>Tue, 11 Oct 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/10/ai-generated-text-to-video/</guid>
      <description>&lt;p&gt;Here is an example of how one can use a text prompt to generate a series of frames, that then are stitched together into a video.&lt;/p&gt;
&lt;p&gt;The prompt I used was: &amp;ldquo;a man walking in the parking lot with a miniature poodle&amp;rdquo;. the final video generated is shown below.&lt;/p&gt;
&lt;!-- &lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;video/2502672253_a-man-walking-in-the-parking-lot-with-a-miniature-poodle.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;
 --&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/10-ai-generated-text-to-video/2502672253_a-man-walking-in-the-parking-lot-with-a-miniature-poodle.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;AI-generated video from a text prompt of a man walking in a parking lot with a miniature poodle&lt;/p&gt;
&lt;p&gt;What is interesting is how it morphs from one to the next, and in some cases, the human starts out more looks like a poodle. It reminds me of the old days of morphing we did in C and C++ (Computer Science theory).&lt;/p&gt;
&lt;p&gt;For this, I am playing with the latest build of #StableDuffision and used a max of 100 frames, and for each frame 30 samplings and 200 inference steps.&lt;/p&gt;
&lt;p&gt;The video below shows how each of those frames is generated, and it is quite fascinating.&lt;/p&gt;
&lt;!-- &lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;video/A-video-showing-how-AI-is-generating-one-frame.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;
 --&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/10-ai-generated-text-to-video/A-video-showing-how-AI-is-generating-one-frame.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;A video showing how AI is generating one frame.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The rise of prompt engineering</title>
      <link>/post/2022/09/the-rise-of-prompt-engineering/</link>
      <pubDate>Sat, 17 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/09/the-rise-of-prompt-engineering/</guid>
      <description>&lt;p&gt;I have said this &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2021/10/09/ai-writing-ai-code%f0%9f%a4%90/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		before
	&lt;/span&gt;
&lt;/a&gt; - with the advent of large AI models, Prompt Engineering is critical and is the next challenge for us to master.&lt;/p&gt;
&lt;h3 id=&#34;what-is-prompt-engineering&#34;&gt;What is Prompt engineering?&lt;/h3&gt;
&lt;p&gt;Prompt engineering is the process of fine-tuning large models and often is written in natural language, outlining the intention of the user. Prompt engineering is a key element that allows the output to be accurate and reflect the needs of the user. Prompts should not be thought as the explicit one input to the model, instead are multiple tasks for the model.&lt;/p&gt;
&lt;p&gt;We use large language models (&lt;strong&gt;#LLM)&lt;/strong&gt; such as &lt;strong&gt;#GPT3&lt;/strong&gt;, &lt;strong&gt;or #Text2Image&lt;/strong&gt; models like &lt;strong&gt;#DALLE&lt;/strong&gt; and &lt;strong&gt;#StableFusion&lt;/strong&gt; using a text prompt. The prompt is a string and is our way to ask the model to do what it is meant to. It also is our way to provide hints and directions on what you need and ultimately help the model understand the patterns that are important for us and be represented in the output.&lt;/p&gt;
&lt;p&gt;The way we write a prompt is important - including the phrases, orders of the words, hints, etc. Prompts also need to be in the context of the use-case (see screenshot below on GPT3 use-case examples). For example, language generation prompts would be different from code generation or summarization, or image generation. The prompts are closely tied to the intended use cases.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/hhfaXuTWu8-392x1024.png&#34; alt=&#34;Screenshot showing GPT3 example use cases.&#34;/&gt;
        &lt;figcaption&gt;GPT3 use case examples&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;examples-of-prompt-engineering&#34;&gt;Examples of prompt engineering&lt;/h3&gt;
&lt;p&gt;We start with a couple of examples related to language generation. I figured out what better way to show prompt engineering, by asking GPT3 about prompt engineering. 😇&lt;/p&gt;
&lt;p&gt;In this first screenshot below, we use GPT3&amp;rsquo;s Davinci model and ask for a &lt;em&gt;paragraph&lt;/em&gt; on prompt engineering. The first sentence is the prompt that was the input, and the text with the green background is what was generated.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-paragprah-1024x131.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a paragraph prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in this second example, it is mostly the same prompt but we ask for a &lt;em&gt;blog post&lt;/em&gt; instead of a paragraph. As we can see the output of course is quite different, but the essence of it is still quite the same.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-blogpost.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a blog post prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, another example, same as before, but in this case, we outline that be for a 5-year-old child (ignoring the fact would a 5-year-old understands the notion of AI, and models 😶).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/prompt-engineering-blogpost-kid.png&#34; alt=&#34;Screenshot of the generated output of a GPT3 model&#34;/&gt;
        &lt;figcaption&gt;GPT3 screenshot showing a paragraph prompt for a child to understand&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Even though the changes might seem subtle in the examples shown earlier - consider them as toy examples.&lt;/p&gt;
&lt;p&gt;Small changes to the prompt can lead to significant changes in the output. To show an example, below are two examples &lt;a
	
		href = &#34;https://stability.ai/blog/stable-diffusion-announcement&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#StableDiffusion
	&lt;/span&gt;
&lt;/a&gt; - which is an open-source image-to-text model. I used Harry Potter for inspiration and use Hogwarts and the dark forest where the first graders were forbidden to go.&lt;/p&gt;
&lt;p&gt;For the first prompt example: &lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, Diya Lamp architecture, atmospheric, sense of awe and&lt;/code&gt;&lt;/em&gt; &lt;em&gt;&lt;code&gt;scale&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/grid-00040-3927828187_a_beautiful_view_of_hogwarts_school_of_witchcraft_and_wizardry_and_the_dark_forest_by_Laurie_Lipton_Impressionist_Mosaic_Diya-1024x683.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And for the second example, the prompts was: &lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, atmospheric, sense of awe and scale&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/grid-00047-1415313914_a_beautiful_view_of_hogwarts_school_of_witchcraft_and_wizardry_and_the_dark_forest_by_Laurie_Lipton_Impressionist_Mosaic_atmo.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The only difference between the two prompts was removing &amp;ldquo;&lt;em&gt;Diya Lamp architecture&lt;/em&gt;&amp;rdquo;, resulting in dramatically different outputs. I am guessing this being image generation, the changes are more dramatic and easier to comprehend.&lt;/p&gt;
&lt;p&gt;Prompts also are not universal and are very dependent to the models being used - what is considered a good example in one model (from one institution), won&amp;rsquo;t transpose to another model from another institution. For example, the same prompt as above (&lt;em&gt;&lt;code&gt;a beautiful view of hogwarts school of witchcraft and wizardry and the dark forest, by Laurie Lipton, Impressionist Mosaic, atmospheric, sense of awe and scale&lt;/code&gt;&lt;/em&gt;), when used for OpenAI&amp;rsquo;s DALLE model generates the image shown below - which is very different of course.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dalle-hogwards-image-generation.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And if I want to tweak the same prompt specifically for DALLE here is another example using the prompt: &lt;em&gt;&lt;code&gt;Beautiful view of Hogwarts school of witchcraft and wizardry and the dark forest with a sense of awe and scale, Awesome, Highly Detailed&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dalle-hogwards-image-generation-2-1024x265.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;As a side note, I particularly like this one:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DALL%c2%b7E-2022-09-17-12.43.45-Beautiful-view-of-Hogwarts-school-of-witchcraft-and-wizardry-and-the-dark-forest-with-a-sense-of-awe-and-scale-Awesome-Highly-Detailed-300x300.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This also has created several tools that allow us to craft prompts. Given many of us don&amp;rsquo;t quite understand the options and styles that can go in there. Some like &lt;a
	
		href = &#34;https://promptomania.com/prompt-builder/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		promptoMANIA
	&lt;/span&gt;
&lt;/a&gt; can cover multiple large models (images in this case) and can get very sophisticated themselves. And other simpler ones like &lt;a
	
		href = &#34;https://www.adambrown.uk/dall-e-prompt-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this DALLE prompt generator
	&lt;/span&gt;
&lt;/a&gt; by Adam Brown, and more like &lt;a
	
		href = &#34;https://github.com/sevazhidkov/prompts-ai&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		prompts.ai
	&lt;/span&gt;
&lt;/a&gt; allow for tweaking and fine-tuning of prompts and effectively creating templates for GPT3.&lt;/p&gt;
&lt;p&gt;Prompt engineering is a brand new and fascinating space for the industry and I for one am quite intrigued to see where it will lead us.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Nuget packages not found after installing Visual Studio 2022</title>
      <link>/post/2022/09/nuget-packages-not-found-after-installing-visual-studio-2022/</link>
      <pubDate>Sat, 03 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/09/nuget-packages-not-found-after-installing-visual-studio-2022/</guid>
      <description>&lt;p&gt;I recently needed to install Visual Studio 2022 on one my existing machines to debug a new zeroshot model that has a dependency on our Speech SDK. The &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/dotnet/api/microsoft.cognitiveservices.speech?view=azure-dotnet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Speech SDK
	&lt;/span&gt;
&lt;/a&gt; is one of our key #AI services in Cognitive Services (as part of #AzureAI). I already had VSCode running, but in this case I need the bigger brother.&lt;/p&gt;
&lt;p&gt;After installing Visual Studio, I could not get any nuget packages to install; I could not even fetch anything and didn&amp;rsquo;t matter what I used - the package manager console in Visual Studio, PowerShell, etc.&lt;/p&gt;
&lt;p&gt;Nuget would only point to the local offline package store, which in my case is available at: &lt;code&gt;C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\&lt;/code&gt;. I kept getting the error: &lt;code&gt;Package X is not found on source &#39;C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\&#39;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I could not understand the behavior, and not seen this before. Turns out it is a known issue, albeit not very common. Seems like if either PowerShell&amp;rsquo;s &lt;code&gt;Install-Module&lt;/code&gt;, or Chocolatey&amp;rsquo;s &lt;code&gt;coco&lt;/code&gt; command was used &lt;strong&gt;before&lt;/strong&gt; using nuget or Visual Studio for the &lt;strong&gt;first time&lt;/strong&gt;, this will happen.&lt;/p&gt;
&lt;p&gt;The solution is to add nuget.org as a package source, and the URL it should point to is: &lt;code&gt;https://api.nuget.org/v3/index.json&lt;/code&gt;. Below is the screenshot on what this looks in Visual Studio for me:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;Screenshot showing updated nutget package sources in Visual Studio 2022&#34;/&gt;
        &lt;figcaption&gt;Updated nuget package sources&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If one is setting up a brand new dev box, the odds of you running into this is low; in my case given I was adding Visual Studio 2022 much later is what caused this. There is &lt;a
	
		href = &#34;https://github.com/NuGet/Home/wiki/nuget.org-not-used-on-new-machine&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more details on this here too
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Podman error on Ubuntu - short-name did not resolve to an alias and no unqualified-search registries</title>
      <link>/post/2022/03/podman-error-on-ubuntu-short-name-did-not-resolve-to-an-alias-and-no-unqualified-search-registries/</link>
      <pubDate>Fri, 25 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/03/podman-error-on-ubuntu-short-name-did-not-resolve-to-an-alias-and-no-unqualified-search-registries/</guid>
      <description>&lt;p&gt;I recently installed Ubuntu on one of the Pi&amp;rsquo;s are home and installed &lt;a
	
		href = &#34;https://podman.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Podman
	&lt;/span&gt;
&lt;/a&gt; - which I hadn&amp;rsquo;t heard of until recently and is a container engine, similar to docker but doesn&amp;rsquo;t have a daemon.&lt;/p&gt;
&lt;p&gt;When trying to get a basic alpine test image running I got this error:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Error: error creating build container: short-name &amp;quot;python:3.7-alpine&amp;quot; did not resolve to an alias and no unqualified-search registries are defined in &amp;quot;/etc/containers/registries.conf&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1024x642.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Podam-compose error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is because, shortnames it seems arent resolved by default - atleast not on the the Ubuntu (ARM) version. To fix this, the following needs to be added to the &lt;code&gt;/etc/containers/registries.conf&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unqualified-search-registries&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=[&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;docker.io&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Updating the registries.conf file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once you save, these trying podcam-compose up should work as expected.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;podman-compose up&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developers mysterious life</title>
      <link>/post/2022/02/developers-mysterious-life/</link>
      <pubDate>Tue, 01 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>/post/2022/02/developers-mysterious-life/</guid>
      <description>&lt;p&gt;The mysterious life of developers has evaded many of us, until now &amp;hellip;&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2022/02-developers-mysterious-life/The-Mysterious-Life-of-Developers.webm&#34; type=&#34;video/webm&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;The mysterious life of a developer (courtesy Spoon Norge)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to run TeslaMate on Azure</title>
      <link>/post/2021/12/how-to-run-teslamate-on-azure/</link>
      <pubDate>Thu, 30 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/12/how-to-run-teslamate-on-azure/</guid>
      <description>&lt;p&gt;If you have a Tesla, then you should absolutely check out &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate
	&lt;/span&gt;
&lt;/a&gt; which is data logger for your car(s) that one self-hosts. This uses the car&amp;rsquo;s API and gets all different kinds of telemetry of your drives, charging, batter conditions, acceleration, braking, parking, etc. I personally prefer this, over other online services (of which there are a few) - as it is giving away the keys to the kingdom - &lt;em&gt;literally&lt;/em&gt; in this case (the Tokens used to authenticate and login).&lt;/p&gt;
&lt;p&gt;I have been running TeslaMate at home on a couple of machines for a while and figured a cloud version would work out better. I had network issues on one of the machines, where no car telemetry was downloaded. It was a few days before I realized that the machine wasn&amp;rsquo;t online due to a separate DNS issue and those few days&amp;rsquo; worth of car telemetry (drives and other data of course) wasn&amp;rsquo;t recorded.&lt;/p&gt;
&lt;p&gt;In our example, we will deploy TeslaMate in a docker container running on Ubuntu - which is hosted on Azure. To help with isolation and managing this, I would recommend we use a resource group (RG) only for running TeslaMate. Of course, we need an Azure subscription, which I would assume you already have.&lt;/p&gt;
&lt;p&gt;If you are not familiar with TeslaMate, before we get started here, I would highly recommend &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		checking out the features
	&lt;/span&gt;
&lt;/a&gt;, including &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/screenshots/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some screenshots
	&lt;/span&gt;
&lt;/a&gt; and the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/installation/docker&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		installation documentation
	&lt;/span&gt;
&lt;/a&gt; to get an idea.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/web_interface.png&#34; alt=&#34;Web Interface&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Overview&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
(Credit: &lt;a
	
		href = &#34;https://github.com/adriankumpf/teslamate&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate GitHub repro
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;step-1---creating-new-rg&#34;&gt;Step 1 - Creating new RG&lt;/h3&gt;
&lt;p&gt;We start by logging into the &lt;a
	
		href = &#34;https://portal.azure.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure portal
	&lt;/span&gt;
&lt;/a&gt; and create a new resource group (RG) for TeslaMate; if you are not sure how to do this, the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#:~:text=Create%20resource%20groups%201%20Sign%20in%20to%20the,newly%20created%20resource%20group%20to%20open%20it.%20&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation here
	&lt;/span&gt;
&lt;/a&gt; outlines the steps needed. Once you have an empty RG, it would look something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-New-RG-1024x587.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;New Azure Resource Group&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-2---creating-new-ubuntu-vm&#34;&gt;Step 2 - Creating new Ubuntu VM&lt;/h3&gt;
&lt;p&gt;Now that we have a new RG, we need to create a new Ubuntu virtual machine (VM) in that. We will choose the option to create resources as shown in the middle of the screen (see previous screenshot).&lt;/p&gt;
&lt;p&gt;Clicking on &amp;ldquo;Create resources&amp;rdquo;, we see various menu options; the options you see might be a little different than the one shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-New-Resource-1024x677.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create a resource - Azure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;We need to create a Virtual Machine - the first choice under &amp;ldquo;Popular Azure services&amp;rdquo; and will click the &amp;ldquo;Create&amp;rdquo; link. This starts a wizard that allows you to go through the various settings and options.&lt;/p&gt;
&lt;p&gt;The first step when creating a VM is to start with the basic details for machine we are creating - instance details, subscription details, admin user details, etc. I outline the steps and show screenshots to help those who are not comfortable with this level of tech, or new to Azure. If you are a more advanced user, a more efficient way would be via the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/quick-create-cli&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure CLI
	&lt;/span&gt;
&lt;/a&gt;. You can read up more details on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VM&amp;rsquo;s on Azure here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;step-3---vm-basics&#34;&gt;Step 3 - VM Basics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Subscription and resource group - Make sure you have the correct subscription and RG selected. If you haven&amp;rsquo;t created a new RG yet, you can do so using the &amp;ldquo;Create new&amp;rdquo; link under the RG option (see the screenshot below).&lt;/li&gt;
&lt;li&gt;VM Name - You can give the VM any name - this is more for you to remember and manage.&lt;/li&gt;
&lt;li&gt;Region - In terms of a region, in most cases it would make sense to pick a region that is physically close to the same area where you are based (and the car too of course).&lt;/li&gt;
&lt;li&gt;Image - I use the latest Ubuntu LTS image which as of this writing is v20.04 Gen 2.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-1024x583.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create a new VM in Azure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Size - In terms of picking the size for the VM - we don&amp;rsquo;t need a very beefy machine, and needless to say - the bigger the machine, the higher the monthly costs. I keep the standard Size. This is not my main instance as I already have that running - this new instance is being setup as a demo that I will be deleting later.&lt;/li&gt;
&lt;li&gt;Username - This is obvious and should be something you know and can remember.&lt;/li&gt;
&lt;li&gt;Password - I choose password as the auth type, more so as this is for demo purposes for this post; ideally ssh keys are more secure and you would want to use that. If you do go down a password path, I cannot stress enough not to reuse passwords and create a strong password; it is always a good idea to use a password manager (e.g., I use LastPass).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-2-1024x926.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Basic details required when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I chose the simple SSD option; we don&amp;rsquo;t need a lot of advanced things.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-disks-1024x742.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Disk details when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the network options, you do want a public IP and, in most cases, just leaving the default would work. And I don&amp;rsquo;t show it in the screenshot, but we don&amp;rsquo;t need a load balancer and leave the default option of &amp;ldquo;None&amp;rdquo;. And we do want the ability to ssh into the machine to deploy and manage TeslaMate.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-network-1024x863.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Networking details when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the Inbound port rules, by default only port 22 is enabled for SSH; to allow us to access the web server we also need to both ports 80 (http) and 443 (https) are enabled as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-20-1024x387.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Inbound port rules - when setting up a new VM&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the next set of Tabs (Management, Advanced, and Tags) I didn&amp;rsquo;t change anything and went with the defaults. Once the validations are passed, and the final review shows the cost and other details you choose.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review1-1024x951.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review3.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation - summary&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once you are happy with everything click the &lt;strong&gt;Create&lt;/strong&gt; button on the bottom left corner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Basics-Review4-830x1024.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM Creation confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the deployment of the VM starts, it can take a few minutes and you will see a similar progress as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Deployment-1024x422.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM deployment status screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the VM is created, deployed and wired up (which can take a few minutes) - we will see the confirmation as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-Deployment-complete-1024x423.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM deployment confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;From the confirmation screen, clicking on &amp;ldquo;Go to resource&amp;rdquo; takes us to a screen where we see the different details of the VM. One of the details we are interested in at this point is the IP address and the ability to give the machine a DNS name. We need these to be able to connect to the VM over SSH (see screenshot below).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-details-1024x554.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM essential details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It might be worthwhile to also setup a DNS name that one can use in addition to the IP. This DNS name would be the fully qualified domain name (FQDN) that would be needed later when configuring the docker container. The DNS name allows us to connect to the machine using something like &lt;code&gt;&amp;quot;https://my-car-details.cloudapp.azure.com&amp;quot;&lt;/code&gt;&amp;quot; (or similar). You can read more details on FQDN in the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/create-fqdn&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure docs here
	&lt;/span&gt;
&lt;/a&gt;. If you are interested in using your own DNS server, you can read details on &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/virtual-machines/linux/azure-dns#name-resolution-using-your-own-dns-server&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		how to go about that here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Click on the &amp;ldquo;Not Configured&amp;rdquo; for the DNS name (as shown in the image below) and you can set a unique name that is something memorable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-1-1024x327.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The DNS name is tied to the region you have, and it must be unique.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-2-1-1024x319.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name label creating&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And once this is setup, you can see the FQDN in your VM details as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-DNS-Name-3-1024x207.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM DNS name&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If for some reason you didn&amp;rsquo;t open ports 80 and 443 earlier, you can always configure them now. To do so, in the Azure portal, when you have the Ubuntu VM resource selected, click on &lt;strong&gt;Networking&lt;/strong&gt; on the left, and you can update the Inbound port rules.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-network-1024x396.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM networking setting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-21-719x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM adding inbound network rules&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;When you add both ports (you would need to give them unique names and priority orders), and the final results would look something like the screenshot shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-22-1024x285.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;VM network inbound port rules&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we can &lt;code&gt;ssh&lt;/code&gt; into that machine using the credentials and the IP we configured earlier. This can be done using ssh (e.g. &lt;code&gt;ssh user-name@IP-address&lt;/code&gt; of the machine).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-VM-ssh-1000x1024.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;SSH Screen shot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4---install-docker&#34;&gt;Step 4 - Install Docker&lt;/h3&gt;
&lt;p&gt;The first thing we need to do once we ssh into the machine is to update the various packages installed. The first time you run this, it will take a few minutes. You do this by running the following commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# I prefer to run these separately - to get a handle on what is getting updated.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# You can of course run them together if that is what you prefer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is pretty standard and should not cause any issues; below is the screenshot showing the output - there are too many packages being updated for me to show everything.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-OS-Update-1024x749.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;OS Updating screenshot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Installing docker on our Ubuntu VM isn&amp;rsquo;t terribly complex - the &lt;a
	
		href = &#34;https://docs.docker.com/engine/install/ubuntu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		docker docs outline all the steps
	&lt;/span&gt;
&lt;/a&gt; and the details. We will want to install from the repro and follow the steps outlined and be mindful of specific versions and drivers.&lt;/p&gt;
&lt;p&gt;We setup the repository, and for that need to install the following prerequisites.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    ca-certificates &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    curl &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    gnupg &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;    lsb-release&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In my case, with the latest Ubuntu image in Azure, we already had these:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we add docker&amp;rsquo;s GPG key using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The output isn&amp;rsquo;t dramatic in case you were wondering.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1-1024x75.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;GPG key addition&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we add docker&amp;rsquo;s repro to Ubuntu - this will allow us to find and install the packages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;lsb_release -cs&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; stable&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2-1024x80.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Adding docker repro&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At this time, we should run &lt;code&gt;apt-get&lt;/code&gt; update command to update the newly added repository. We should check to ensure that docker is going to be installed from the docker repository, and not Ubuntu&amp;rsquo;s default. To do this we run the following command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt-cache policy docker-ce&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This shows us that docker isn&amp;rsquo;t installed, but the candidate for installation is from docker.com and is for &amp;ldquo;focal&amp;rdquo; - which is the release name of Ubuntu v20.04. The list we see is long because it outlines the different versions of docker.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-3-992x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Check if docker is installed&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now, we are finally ready to install docker using the following command and also choosing Yes on the prompts that confirm the installation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once complete, you will see something like the output shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-4-1024x721.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At this time, docker should be installed running. We can also check its daemon is configured to run on booting up.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-5-1024x407.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker daemon confirmation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Whilst not needed, it is good practice to add the current username to the docker group created - this will ensure we don&amp;rsquo;t need to use &amp;ldquo;&lt;code&gt;sudo&lt;/code&gt;&amp;rdquo; for every docker command. And using the groups command we can validate our current username (&amp;quot;&lt;code&gt;amit&lt;/code&gt;&amp;quot; in my case) is in the docker group.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG docker &lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;su - &lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# this allows us to add the user without logging out&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-7-1024x184.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Adding user to docker group&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Woot! We have docker running. &amp;#x1f60e;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-8.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker running&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The first thing one should do with any new docker installation is to run its equivalent of Hello World. This is done using the following command - which downloads a test image and runs it in a container, prints a message, and then exists the container - so a full life cycle.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker run hello-world&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-10-1024x846.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Testing docker&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And yay, we validated that docker is up and running on our VM! Congratulations.&lt;/p&gt;
&lt;p&gt;Before we get to configuring TeslaMate, we also need to install &lt;code&gt;docker-compose&lt;/code&gt;, which is a tool that allows us to run multi-container docker applications (such as TeslaMate). We will install docker-compose using the following command with the result of that command shown after that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install docker-compose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-17-1024x737.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Install docker-compose&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-5---configure-teslamate&#34;&gt;Step 5 - Configure TeslaMate&lt;/h3&gt;
&lt;p&gt;Given we will be exposing TeslaMate to the internet directly we should not use the default TeslaMate docker installation, but the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		advanced version
	&lt;/span&gt;
&lt;/a&gt; which uses &lt;a
	
		href = &#34;https://doc.traefik.io/traefik/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Traefik as a proxy server
	&lt;/span&gt;
&lt;/a&gt; and helps us secure the web server better and only expose the (Grafana) dashboards behind an authentication mechanism.&lt;/p&gt;
&lt;p&gt;For this we will create a new folder for TeslaMate which will contain not only the docker compose file needed but other relevant configuration details. I like to keep this in a folder, to help manage - in this case it resides in &lt;code&gt;~/docker/teslamate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-11.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Creating folder for TeslaMate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It is in this folder we will create the docker-compose yaml file that is needed; you would want to start with the one outlined in the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeslaMate
	&lt;/span&gt;
&lt;/a&gt; instructions and tweak it for your needs.&lt;/p&gt;
&lt;p&gt;This file needs to be called &lt;code&gt;docker-compose.yml&lt;/code&gt; and my example is shared below. It is a good idea to always get the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#docker-composeyml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest yaml file from TeslaMate&amp;rsquo;s docs
	&lt;/span&gt;
&lt;/a&gt; - over time we would expect things will evolve and the file below might not be accurate down the road.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: teslamate/teslamate:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_PASS=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_NAME=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_HOST=database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - MQTT_HOST=mosquitto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - VIRTUAL_HOST=${FQDN_TM}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - CHECK_ORIGIN=true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - TZ=${TM_TZ}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./import:/opt/app/import
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.port=4000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.redirect.redirectscheme.scheme=https&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.teslamate-auth.basicauth.realm=teslamate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.teslamate-auth.basicauth.usersfile=/auth/.htpasswd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-insecure.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-insecure.middlewares=redirect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.rule=Host(`${FQDN_TM}`) &amp;amp;&amp;amp; Path(`/live/websocket`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate-ws.tls&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.middlewares=teslamate-auth&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.teslamate.tls.certresolver=tmhttpchallenge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;cap_drop&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;database&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: postgres:13
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_PASSWORD=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - POSTGRES_DB=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - teslamate-db:/var/lib/postgresql/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;grafana&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: teslamate/grafana:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_USER=${TM_DB_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_PASS=${TM_DB_PASS}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_NAME=${TM_DB_NAME}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - DATABASE_HOST=database
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GRAFANA_PASSWD=${GRAFANA_PW}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SECURITY_ADMIN_USER=${GRAFANA_USER}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PW}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_AUTH_ANONYMOUS_ENABLED=false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_DOMAIN=${FQDN_TM}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s/grafana
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - GF_SERVER_SERVE_FROM_SUB_PATH=true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - teslamate-grafana-data:/var/lib/grafana
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;labels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.port=3000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.middlewares.redirect.redirectscheme.scheme=https&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana-insecure.rule=Host(`${FQDN_TM}`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana-insecure.middlewares=redirect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.rule=Path(`/grafana`) || PathPrefix(`/grafana/`)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.entrypoints=websecure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;traefik.http.routers.grafana.tls.certresolver=tmhttpchallenge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;mosquitto&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: eclipse-mosquitto:2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;: mosquitto -c /mosquitto-no-auth.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;127.0.0.1&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;1883&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;1883&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - mosquitto-conf:/mosquitto/config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - mosquitto-data:/mosquitto/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;proxy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: traefik:v2.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;restart&lt;/span&gt;: always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--global.sendAnonymousUsage=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--providers.docker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--providers.docker.exposedByDefault=false&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--entrypoints.web.address=:80&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--entrypoints.websecure.address=:443&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.httpchallenge=true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.httpchallenge.entrypoint=web&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.email=${LETSENCRYPT_EMAIL}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;--certificatesresolvers.tmhttpchallenge.acme.storage=/etc/acme/acme.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;443&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./.htpasswd:/auth/.htpasswd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./acme/:/etc/acme/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - /var/run/docker.sock:/var/run/docker.sock:ro
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate-db&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;teslamate-grafana-data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;mosquitto-conf&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  mosquitto-data:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-12-1024x867.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing the docker-compose.yml file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Next we need to create a &lt;strong&gt;&lt;code&gt;.env&lt;/code&gt; file&lt;/strong&gt;. The environmental secrets (i.e. passwords) are not saved in the yaml file but are stored are stored in this &lt;code&gt;.env&lt;/code&gt; file which we will create next.&lt;/p&gt;
&lt;p&gt;We will enter the DNS name as the FQDN that you setup earlier for the VM; update the TM_TZ for the time-zone you are based out of. This is the TZ database name, and if you aren&amp;rsquo;t sure what it should be for your time-zone, check out the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/List_of_tz_database_time_zones&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		details here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like the yaml file, you should get the &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#env&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest .env file template from TeslaMate
	&lt;/span&gt;
&lt;/a&gt;, as the one shown below might change over time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_USER=teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_PASS=secret
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_DB_NAME=teslamate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GRAFANA_USER=admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GRAFANA_PW=admin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FQDN_TM=teslamate.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TM_TZ=Europe/Berlin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LETSENCRYPT_EMAIL=yourperson@example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you are not sure on how to create a new file in Ubuntu (or any other Linux distro for that matter) - you can use &lt;code&gt;nano&lt;/code&gt; editor as shown below. You need to make sure this is in the same folder as where the &lt;code&gt;docker-compose.yml&lt;/code&gt; file is (which is ~/docker/teslamate in our example).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-13.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console screenshot showing how to create .env file&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, we need to create a &lt;strong&gt;&lt;code&gt;.htpasswd&lt;/code&gt;&lt;/strong&gt; file which is used to authenticate the website (see TeslaMate&amp;rsquo;s &lt;a
	
		href = &#34;https://docs.teslamate.org/docs/guides/traefik#htpasswd&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation
	&lt;/span&gt;
&lt;/a&gt; for more details). I chose to create this locally after installing Apache tools, but you can also do it online.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; this is *not* your Tesla login credentials but are the credentials you will use to access the site we are setting up now.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-14.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console screenshot showing installation of Apache Utils&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;We can create a new file password as shown below. Given we are in the TeslaMate folder, we don&amp;rsquo;t have to provide a full path for the file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;htpasswd -c .htpasswd amit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-15.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing htpasswd usage&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, in the end we should have the following three files in the same folder:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-16.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Screenshot showing directory listing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-6---starting-teslamate&#34;&gt;Step 6 - Starting TeslaMate&lt;/h3&gt;
&lt;p&gt;Now we are finally ready to start the docker container for TeslaMate. When this launches, go to the URL for the DNS name you setup, and login using your Tesla credentials. For the first time, I would recommend running the container attached to the console, so if there are any errors or issues you can see them. Normally you would want to run this detached (which is using the &amp;ldquo;&lt;code&gt;-d&lt;/code&gt;&amp;rdquo;) option.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# don&amp;#39;t forget the sudo command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker-compose up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first time you run this, it will take a few minutes to pull all the images, and wire things up. During the process you will see the progress for each image in the various container app.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-18-1024x717.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt; &amp;ldquo;Console showing docker-compose progress&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;And finally, if everything is setup properly you should see the container running with the logs in the console of your terminal. This is a running log, and the process is active. You will see something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Docker-Compose-Up-1024x717.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console showing docker-compose logs&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you didn&amp;rsquo;t setup a DNS name earlier and thought you can try and use the IP name - that unfortunately will fail with the Traefik proxy server and in the logs, you will see an error to that effect. Let&amp;rsquo;s Encrypt doesn&amp;rsquo;t issue certificates for IP addresses &lt;a
	
		href = &#34;https://community.letsencrypt.org/t/ssl-certificate-for-ip-address/52054&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		as a policy
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now if we browse the URL (also known as the FQDN) you had setup earlier, you will see an authentication challenge. This is great and shows that the proxy server is setup properly and working as expected.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Server-Login-1024x449.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Traefik http authentication&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you enter the credentials you setup in the .&lt;code&gt;htpasswd&lt;/code&gt; file earlier you will be able to login and see the TeslaMate&amp;rsquo;s Tesla login!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-TM-Login-1024x916.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Tesla authentication screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Congratulations! You have TeslaMate running on Azure. ✌️&lt;/p&gt;
&lt;h3 id=&#34;step-7---finishing-up-teslamate-configuration&#34;&gt;Step 7 - Finishing up TeslaMate configuration&lt;/h3&gt;
&lt;p&gt;Now that you have TeslaMate running, you need to login to Tesla. The best way to do this these days is using existing tokens . There are a few ways to do this, and one of the easiest is using &lt;a
	
		href = &#34;https://tesla-info.com/tesla-token.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this tool - Tesla API Token
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you login, go to &lt;code&gt;Settings&lt;/code&gt; and change the Dashboards URL - which would be your FQDN with &amp;ldquo;&lt;code&gt;/grafana&lt;/code&gt;&amp;rdquo; appended. Remember the credentials you use for the dashboards (i.e. Grafana) are the ones you set in the &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-TM-Dashboard-URL.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate URL configuration&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Now that everything is up and running, we can kill the docker-compose process, which is attached to the console, and re-run it detached from the console. To do this, go back to the &lt;code&gt;ssh&lt;/code&gt; session we have connected to the Ubuntu VM and press CTRL + C. This will stop that container and you will see a similar output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-23-1024x796.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Console output&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And now you can restart the container with the &amp;ldquo;-d&amp;rdquo; option, which is for detached.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo docker-compose up -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-26.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;docker-compose output&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Congratulations, you have TeslaMate running on an Azure host Ubuntu VM via docker. &amp;#x270c;&amp;#xfe0f;&lt;/p&gt;
&lt;p&gt;Below is a screenshot of my instance that has been running for some time.
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-27.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;TeslaMate Overview Dashboard&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI writing AI code🤐</title>
      <link>/post/2021/10/ai-writing-ai-code/</link>
      <pubDate>Sun, 10 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/10/ai-writing-ai-code/</guid>
      <description>&lt;p&gt;It is 2021. And we have #AI writing #AI code. 🤪 It is quite interesting, but also can be quite boring once you get beyond the initial technology, and just think of it as one of the tools in your arsenal. And getting to that point is a good think.&lt;/p&gt;
&lt;p&gt;As part of a think at work I recently started playing with &lt;a
	
		href = &#34;https://copilot.github.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub Copilot
	&lt;/span&gt;
&lt;/a&gt;, which is using GPT3 to be your pair programmer &amp;ndash; helping write code. GPT3 has &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2021/06/21/gpt-3-vs-other-ai-powered-assistants/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		multiple models
	&lt;/span&gt;
&lt;/a&gt; (called engines), and Copilot uses one of these family of engines called Codex. Codex is a derivative of the base GPT3 engine that is trained on billions of lines of code.&lt;/p&gt;
&lt;p&gt;Using Copilot is quite simple; you install the &lt;a
	
		href = &#34;https://marketplace.visualstudio.com/items?itemName=GitHub.copilot&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Github Copilot extension,
	&lt;/span&gt;
&lt;/a&gt; and it shows up in your IDE (VSCode in my example). We need to make sure we decompose the problem we are trying to solve - we should not think of this as helping write the complete program or all parts; but as it can help with different functions and pieces of code. To do this, we need to tell it what we are trying to do - these are done via prompts (code comments). For GPT models, prompt engineering is quite critical, and would be worth getting to details and understanding.&lt;/p&gt;
&lt;p&gt;Starting simple, I create an empty python file and entered a prompt that outlines what I want to try and do. In this case as you can see in the screenshot below - I want to load an image from a file, and using our &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/#overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Vision Cognitive Services
	&lt;/span&gt;
&lt;/a&gt;, run an image analysis, and auto-generate a caption for that image.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1024x538.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I started typing the definition of a function, and Copilot (via the add-in) understands the prompt I outlined, and the context of the code on what I am doing. Remember Codex builds on the base GPT3 and does have all that NLU capability.&lt;/p&gt;
&lt;p&gt;Taking all of this in, it suggests completing the function for me. In terms of using this as an end-user (i.e. the developer) - the suggested code shows up as auto-complete and you can see it in the grey color. If I like that suggestion, I press tab and have it added to the file.&lt;/p&gt;
&lt;p&gt;In this case you can see how it is reading the file from disk, calling a function called &lt;code&gt;get_caption()&lt;/code&gt; and printing the caption to the stdout (console in this example).&lt;/p&gt;
&lt;p&gt;There is also an option to cycle through different suggestions and then pick another one as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1-1024x551.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This variant of the suggested code is creating a function called &lt;code&gt;image_caption()&lt;/code&gt; which takes the path to the image file to load. This also expects other required things for the Vision cognitive service to work - such as the subscription key to authenticate, the API end-point details to call, etc.&lt;/p&gt;
&lt;p&gt;Typically, Copilot can synthesize up to 10 code options (Copilot calls these as Solutions), that one can cycle through and see if there is a better variant for the task at hand. The screenshot below shows this experience in VS Code.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-2-1024x829.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The ask whilst simple, still involves a bit of code which needs to be written - reading from file, setting up the subscription details, and wiring that up to call this etc. And it is in these cases really where Copilot shines - it is your copilot picking up the &amp;lsquo;gunk work&amp;rsquo; - freeing up your bandwidth, and cognition capacity on the more interesting and higher order bit of code and value to your business.&lt;/p&gt;
&lt;p&gt;To get a flavor of our AI writing AI code, below is the full set of the nine suggestions the Copilot came back for what I was trying to do.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Synthesizing &lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt; solutions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextOperationStatusCodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextRecognitionMode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; VisualFeatureTypes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.exceptions&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesError
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; exists
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; remove
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; makedirs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; listdir
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; isfile, join
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;time&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; sleep
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; exit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;random&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; randint
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;datetime&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the connection to the cognitive services account&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;YOUR KEY HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://YOUR ENDPOINT HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    group_id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;YOUR GROUP ID HERE&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    download_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./downloads/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(download_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(download_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be saved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    save_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./images/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(save_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(save_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# set up the directory where the images will be saved&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption_dir &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;./captions/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; exists(caption_dir):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        makedirs(caption_dir)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get a list of the files in the download directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    files &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [f &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; listdir(download_dir) &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; isfile(join(download_dir, f))]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(files) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No files found in the download directory&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        exit(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the first file in the list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    file_name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; files[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; environ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextOperationStatusCodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; TextRecognitionMode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision.models&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; VisualFeatureTypes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.exceptions&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesError
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add your Computer Vision subscription key to your environment variables.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; environ:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Set the COMPUTER_VISION_SUBSCRIPTION_KEY environment variable.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;**Restart your shell or IDE for changes to take effect.**&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add your Computer Vision endpoint to your environment variables.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; environ:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Set the COMPUTER_VISION_ENDPOINT environment variable.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;**Restart your shell or IDE for changes to take effect.**&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an authenticated Computer Vision client.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Open the local image file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; image_file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read the image into a byte array.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the features to return.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    features &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;categories, VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description, VisualFeatureTypes&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;tags]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Analyze the local image.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image(image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data, visual_features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;features)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_file, subscription_key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;io&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BytesIO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(ComputerVisionClient&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;SUBSCRIPTION_KEY_ENDPOINT,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                  CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_stream &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_file, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;open(image_stream)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_bytes &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; BytesIO(image)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image(image_bytes, ComputerVisionClient&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;DESCRIPTION)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; analysis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;captions[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_filename):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;azure.cognitiveservices.vision.computervision&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; ComputerVisionClient
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;msrest.authentication&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; CognitiveServicesCredentials
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;io&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; BytesIO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the environment variables for your subscription key and region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For example, for US West&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_SUBSCRIPTION_KEY=&amp;lt;subscription key&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_ENDPOINT=https://westus2.api.cognitive.microsoft.com/vision/v2.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# For example, for China East&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_SUBSCRIPTION_KEY=&amp;lt;subscription key&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# &amp;#34;COMPUTER_VISION_ENDPOINT=https://eastasia.api.cognitive.microsoft.com/vision/v2.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your subscription key and region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_SUBSCRIPTION_KEY&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    endpoint &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;COMPUTER_VISION_ENDPOINT&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your image path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_path &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_filename
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set your region&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    region &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;eastus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an instance of the Computer Vision client&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    computer_vision_client &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image from disk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; image_file:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        image_content &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; image_file&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add the image to the list of images to analyze&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_list &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [image_content]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make the analysis asynchronous&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analyze_result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; computer_vision_client&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;analyze_image_in_stream(image_list, visual_features&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Description&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Color&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the analysis result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analyze_result&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;result()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the image captions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Image captions:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# load the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# encode the image into base64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; base64&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;b64encode(image)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a dict with the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    body &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;: image}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a dict with the subscription key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Ocp-Apim-Subscription-Key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0d5a5f7f1e534d05a8e8d6f9e6e9c6d3&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create a url for the api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Description,Tags&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# send the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, json&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# get the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;captions&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# return the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; caption
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; environ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; join
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;urllib.parse&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; urlparse
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;urllib.parse&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; parse_qs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;http.client&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; HTTPSConnection
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; loads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;base64&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; b64encode
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image into a byte array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; b64encode(image_data)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Read the subscription key from the environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; environ[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;AZURE_SUBSCRIPTION_KEY&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Define the vision API endpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westus2.api.cognitive.microsoft.com/vision/v2.0/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the vision API endpoint to analyze the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_analyze_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Set the parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parameters &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Prepare the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: subscription_key,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;               &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; parse_qs(urlparse(vision_analyze_url)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;query)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;language&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Send the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conn &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; HTTPSConnection(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;westus2.api.cognitive.microsoft.com&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    conn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;request(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;, vision_analyze_url, image_data, headers)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; conn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getresponse()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the JSON response into a Python dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    parsed &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; loads(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; parsed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    Generate a caption for an image.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    :param image_path: path to an image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    :return: the caption
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os.path&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; isfile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;PIL&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;not&lt;/span&gt; isfile(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;FileNotFoundError&lt;/span&gt;(image_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Image&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;open(image_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Encode the image&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Computer Vision parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Computer Vision API URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Connect to Computer Vision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;d3f3e1b8e7e14d0b9d7d3f8c8f7e0b6f&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Load the response as JSON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract the word tags&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    categories &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [(category[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;], category[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;categories&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Tags:&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; category &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; categories:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(category[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Extract the description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    descriptions &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [(description[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;], description[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;score&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;description&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;captions&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Descriptions:&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; descriptions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(description[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dominant_color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;color&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dominantColorBackground&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;except&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        dominant_color &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;N/A&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Dominant color: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(dominant_color))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the caption&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(filename):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;cognitive_services_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;cognitive_services_key_names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# create the header for the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: cognitive_services_keys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;get_key(cognitive_services_key_names&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;BING_KEY)}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# the URL for the bing endpoint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bing_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://api.cognitive.microsoft.com/bing/v5.0/images/search&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# the parameters for the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;q&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;count&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;offset&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;mkt&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;safeSearch&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Moderate&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# read the contents of the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(filename, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; f&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# build the request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    request &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(bing_url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# check for errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;status_code &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Error code: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;status_code))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        sys&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;exit(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# process the response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;loads(request&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;text)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; response:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;The caption is: &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;format(caption))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;No caption found.&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;generate_caption&lt;/span&gt;(image_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subscription_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;e9e9c8a8d1d9400e8d0b7f2d8f8e7c6e&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; subscription_key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analyze_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; vision_base_url &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;analyze&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;open&lt;/span&gt;(image_path, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rb&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Ocp-Apim-Subscription-Key&amp;#39;&lt;/span&gt;: subscription_key,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;application/octet-stream&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    params     &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;visualFeatures&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Categories,Description,Color&amp;#39;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;post(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        analyze_url, headers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;headers, params&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;params, data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;image_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;raise_for_status()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    analysis &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; response&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;json()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(analysis)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image_caption &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; analysis[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;captions&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;capitalize()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; image_caption&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Reinforcement Learning - An Introduction</title>
      <link>/post/2021/07/reinforcement-learning-an-introduction/</link>
      <pubDate>Fri, 16 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/07/reinforcement-learning-an-introduction/</guid>
      <description>&lt;p&gt;Reinforcement Learning is teaching by example – it is how most of us learn. Reinforcement Learning (#RL) is a different approach to ML – it is a set of techniques that allows AI algorithms to experiment and learn from experience. RL falls in between supervised and unsupervised learning – there isn’t any labeled data, but at the same time it isn’t unsupervised either. At its most simple form, RL is a computational approach for automating goal-oriented decision making and learning.&lt;/p&gt;
&lt;p&gt;Inherent RL is the ability to operate in a dynamic uncertain environment. RL can be more formally defined as the study, science, and problem of intelligence in the form of an agent that interacts in an environment. At the end of the day, almost all RL problems can be formalized as MDP (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Markov_decision_process&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Markov decision processes
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The problem is represented by an environment – such as a world where an agent is based in. The steps in RL are quite clear – the agent takes actions, that have some effect on the environment. The environment acts on those actions and gives back an observation to the agent – what it sees and senses.&lt;/p&gt;
&lt;p&gt;One special signal the environment gives back to the agent is called a reward signal. This signal is what an agent used to figure out how well it is doing. The RL problem is to take actions over time, to maximize the reward signals. And this notion of maximizing is what the agent is learning from the environment, without any explicit supervision. This construct helps an agent achieve a goal, even in an uncertain environment, factoring in delayed and indirect consequences of actions.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/rl_overview.png&#34; alt=&#34;Reinforcement Learning Overview&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;reinforcement-learning-overview&#34;&gt;Reinforcement Learning Overview&lt;/h3&gt;
&lt;p&gt;An agent can have many actions (i.e., choices); it uses a ‘reward’ signal to determine which of those actions is considered ‘good’ vs. ‘bad’. Of course, this determination is in the context of the outcome that we want to achieve.&lt;/p&gt;
&lt;p&gt;Some examples of rewards in different industries and use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maneuvering a UAV’s – positive for following a chosen trajectory; negative for deviating from that trajectory.&lt;/li&gt;
&lt;li&gt;Managing an investment portfolio – positive for each dollar earned; negative for each dollar lost.&lt;/li&gt;
&lt;li&gt;Controlling a power station – As one can imagine, this control would typically constitute a few things in the environment – a sequence of controls, motors, batteries, power sources, etc. In optimizing the throughput of a power station, we can think of positive rewards for producing power; negative for exceeding a safety threshold.&lt;/li&gt;
&lt;li&gt;Playing a game – positive for increasing score; negative for decreasing score.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;core-concepts-that-make-up-rl&#34;&gt;Core concepts that make up RL:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; – The ‘thing’ that is using and acting on behalf of a user or another program. This can be a program executing a business process, a embedded process, the arm of a robot, actuators on a self-driving car controlling the wheels, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Policy&lt;/strong&gt; – A policy outlines how an agent would behave at certain times and can be thought of as the problem we are trying to solve. This is an agent’s behavior function and is a mapping of the business outcome that we are after.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reward&lt;/strong&gt; – A reward is a feedback special signal and outlines what is considered good (or bad) and is correlated with the agents’ current action, and the current state of the environment. All goals can be described as to maximize the cumulative reward. The reward is not a binary number but is a scaler between 0 and 1 – with zero being ‘bad’ and one being the best reward attainable for that action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Value function&lt;/strong&gt; – A value function represents how good is it to be in a particular state and related actions. Where a reward signal is showing the specification of good in an immediate sense (current step), the value function is representing the notion of good overall. At an abstract level, when thinking about the prediction of rewards, a rewards function is the primary, we can think of value functions as the secondary. In the end, we are more concerned with getting higher-value functions to make decisions, and not as much as higher rewards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; – A model is an agent’s view of the environment and mimics its behavior. This allows us to make inferences on how the environment will behave and is often used for planning. Think of the model as the strategy to use in solving the problem at hand.&lt;/p&gt;
&lt;h3 id=&#34;taxonomy-of-rl-algorithms&#34;&gt;Taxonomy of RL Algorithms&lt;/h3&gt;
&lt;p&gt;There are many types of RL algorithms (as we can see in the figure below), but these can broadly be classified in the following two categories.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Model free&lt;/strong&gt;: A model-free algorithm can be thought of as an explicit trial and error algorithm. In a model free approach, the agent doesn&amp;rsquo;t have or ignores the environment; instead, the agent uses experience and tries to optimize a Policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model based&lt;/strong&gt;: On the other hand, a model-based algorithm reflects how an environment works, and factors that the associated reward functions and tries to maximize that. Technically, this is the optimization of the transition probability distribution of the MDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main difference between the two - in one the algorithm optimizes for the environment, and in the other for a policy gradient. There is no one right or wrong algorithm - a lot of it depends on the situation at hand and what one is trying to optimize for.&lt;/p&gt;
&lt;p&gt;As we can see below each of these categories can be further broken down - we won&amp;rsquo;t go into the details of those quite yet, maybe that is for another post. One of the most important components of most RL algorithms is a method to efficiently estimate values - at the end of the day, this is all about value estimation.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/RL-Taxonomy-Algos.png&#34; alt=&#34;Chart showing the taxonomy of RL algorithms.&#34;/&gt;
        &lt;figcaption&gt;Taxonomy of RL Algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;exploration-and-exploitation&#34;&gt;Exploration and Exploitation&lt;/h3&gt;
&lt;p&gt;There are two concepts of exploration, and exploitation which are at odds with each other and for a given situation, we should aim to get a balance of some sorts. In simple terms, RL is sequential decision making - one selects actions to maximize future rewards, and we need to plan long term - rewards might be delayed and not immediate, and we cannot be greedy. Sometimes, we need to sacrifice the immediate reward to gain more (or better) longer term rewards.&lt;/p&gt;
&lt;p&gt;This can be thought of trial-and-error learning loop - with the stream of experiences that constitute loops of actions, rewards, and observation. At the end of the day, this loop is what matters.&lt;/p&gt;
&lt;p&gt;Exploration finds more information about the environment, and in doing so gives up rewards. Exploitation on the other hand, exploits the information it already has to maximize rewards. If we don&amp;rsquo;t exploit, we might be stuck in a sub-optimal place, and how would be know if there is a better sense or rewards without trying?&lt;/p&gt;
&lt;p&gt;When we are in the trial-and-error loop we might be losing rewards, and the agent needs to discover a good policy to maximize the rewards - this is the tension at the opposite ends of a string pulling each other.&lt;/p&gt;
&lt;p&gt;It is important to balance both exploring and exploiting.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GPT-3 vs other AI powered assistants</title>
      <link>/post/2021/06/gpt-3-vs-other-ai-powered-assistants/</link>
      <pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/06/gpt-3-vs-other-ai-powered-assistants/</guid>
      <description>&lt;p&gt;I have been kicking the tires with Open AI&amp;rsquo;s &lt;a
	
		href = &#34;#GPT3&#34;
	

	

	&gt;
	
	&lt;span&gt;
		#GPT-3
	&lt;/span&gt;
&lt;/a&gt;. Based on the screenshot below, it might be easy to think &amp;ldquo;oh boy does the model think highly of itself&amp;rdquo;, but as with most things in life - the devil is in the details.😃 The screenshot below was a forked version of &lt;a
	
		href = &#34;https://beta.openai.com/docs/engines&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		davinci engine
	&lt;/span&gt;
&lt;/a&gt; and follows the Q&amp;amp;A structure.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/openAI-vs-others.png&#34; alt=&#34;OpenAI&amp;rsquo;s GPT3 answering questions when compared to other AI-powered assistants.&#34;/&gt;
        &lt;figcaption&gt;GPT-3 vs other AI assistants&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Using OpenAI&amp;rsquo;s API is quite simple; perhaps too simple! It is quite easy to unleash the beast as the code snippet shown below. If you are new to using GPT3, I would highly recommend you start with the &lt;a
	
		href = &#34;https://beta.openai.com/docs/use-case-guidelines/use-case-requirements-library&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		use case model guidelines
	&lt;/span&gt;
&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;In the context of a toy example, to get to a simple Q&amp;amp;A chatbot as the screenshot earlier shown is quite simple. The API is powerful, and simple to use, and getting started is easy as the code below shows.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;openai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; openai&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;api_key &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;getenv(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;OPENAI_API_KEY&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; response &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; openai&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Completion&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;create(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   engine&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;davinci&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   prompt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;I am a highly intelligent question answering bot. If you ask me a question that is rooted in truth, I will give you the answer. If you ask me a question that is nonsense, trickery, or has no clear answer, I will respond with &lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Unknown&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: What is human life expectancy in the United States?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Human life expectancy in the United States is 78 years.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: Who was president of the United States in 1955?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Dwight D. Eisenhower was president of the United States in 1955.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: Which party did he belong to?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: He belonged to the Republican Party.&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;Q: What is the square root of banana?&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;A: Unknown&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   temperature&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   max_tokens&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   top_p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   frequency_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   presence_penalty&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   stop&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are three core concepts when using GPT-3: Prompt, Completion, and Tokens.&lt;/p&gt;
&lt;p&gt;To start using the API, we need to start giving it some &lt;strong&gt;prompts&lt;/strong&gt; - this provide some context to the engine on what is expecting. Without the surface area is too broad and we get into nonsensical situations. This is part of the task-specific fine-tuning required.&lt;/p&gt;
&lt;p&gt;Think of when giving examples as part of the prompt, we are essentially &lt;em&gt;&amp;ldquo;programming&amp;rdquo;&lt;/em&gt; the model and providing guidance and providing some hints to context and pattern matching. Note the training data cut off in late 2019, so the model in production today doesn&amp;rsquo;t have access to data and events post that (e.g., Covid).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Completion&lt;/strong&gt; is the output that GPT3 generates based on the prompt. To be clear, this is not the full text but is the predicted completions; think of it as &amp;ldquo;autocomplete&amp;rdquo; in Word, or Outlook or a search engine. The API has flexibility to return more than one predicted completion along with the probabilities of alternative tokens at each position (to me it seems just like the wave function when thinking of Quantum mechanics 🐼).&lt;/p&gt;
&lt;p&gt;Finally, think of &lt;strong&gt;Token&lt;/strong&gt; are the smaller Lego blocks that combine to make words. The API, which is nothing but wrappers around GPT-3 breaks up the text into tokens before processing it. The GPT-3 model understands the statistical relationships between these tokens and uses this to produce the next token in a sequence of tokens.&lt;/p&gt;
&lt;p&gt;For example, if we are curious about Tokens, we can see in the screenshot below how the API &amp;ldquo;tokenizes&amp;rdquo; this paragraph and get the details of the tokens. This paragraph contains 207 characters and 43 tokens.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/gpt3-text-tokens.png&#34; alt=&#34;Token text that GPT-3 API converts to before using.&#34;/&gt;
        &lt;figcaption&gt;GPT-3 Tokens - Text&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/gpt3-text-token-IDs.png&#34; alt=&#34;Token ID&amp;rsquo;s that GPT-3 API converts to before using&#34;/&gt;
        &lt;figcaption&gt;GPT-3 Token - IDs&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;At a high level, think of one token == ~4 characters of text, which is ¾ of a word; so, 100 tokens ~= 75 words.&lt;/p&gt;
&lt;p&gt;This is just dipping our toes in the beast that is GPT-3; the APIs which wrap up and expose the engines (more on that in another post) make it simple to use and without getting too much in the weeds of 175 billion parameters. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>ML algorithm cheat sheet</title>
      <link>/post/2021/05/ml-algorithm-cheat-sheet/</link>
      <pubDate>Mon, 03 May 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/05/ml-algorithm-cheat-sheet/</guid>
      <description>&lt;p&gt;A #ML algorithm cheat sheet - helping narrow down to a certain set of #algorithm grouping depending on the problem at hand and what we are trying to solve from a business perspective.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/ML-algo-cheat-sheet-1024x563.png&#34; alt=&#34;Cheat sheet showing different #ML algorithms to choose from depending on the task at hand&#34;/&gt;
        &lt;figcaption&gt;ML algorithm cheat sheet&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Figure 2 shows what additional characteristics we need to consider when choosing the right ML algorithm for your situation at hand. This is something that cannot be generic and is very situational.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/how-to-select-algorithms-1024x472.png&#34; alt=&#34;Flow diagram showing how to select a ML algorithm and additional characteristics we need to consider as we select a ML algorithm&#34;/&gt;
        &lt;figcaption&gt;Characteristics in selecting ML algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you find this useful, I would also recommend reading &amp;ldquo;&lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/machine-learning/how-to-select-algorithms&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How to select algorithms
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; which is detailed as part of &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/machine-learning/concept-designer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure ML designer
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Compiling</title>
      <link>/post/2021/01/compiling/</link>
      <pubDate>Thu, 21 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/compiling/</guid>
      <description>&lt;p&gt;#GeekyJokes&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/compiling.png&#34; alt=&#34;Compiling&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Auto-update PowerShell and nag-free</title>
      <link>/post/2021/01/auto-update-powershell-and-nag-free/</link>
      <pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/auto-update-powershell-and-nag-free/</guid>
      <description>&lt;p&gt;If you are like me and get annoyed with the big PowerShell upgrade &amp;rsquo;nag&amp;rsquo; &amp;lsquo;reminder&amp;rsquo; (see screenshot below); instead of trying to figure out what to download and install the update, there is a simpler way to get the latest update and address the nag. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1024x329.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can just run the code below in an elevated prompt to get the latest release of PowerShell - it is easy-peasy. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;iex &lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp; { &lt;/span&gt;$(&lt;span style=&#34;color:#91d7e3&#34;&gt;irm &lt;/span&gt;https&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;//aka.ms/&lt;span style=&#34;color:#91d7e3&#34;&gt;install-powershell&lt;/span&gt;.ps1)&lt;span style=&#34;color:#a6da95&#34;&gt; } -UseMSI&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Changing Window Terminal&#39;s default directory</title>
      <link>/post/2021/01/changing-window-terminals-default-directory/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>/post/2021/01/changing-window-terminals-default-directory/</guid>
      <description>&lt;p&gt;If you are like me, and don&amp;rsquo;t really have your work saved in the &amp;ldquo;%USERPROFILE%&amp;rdquo; it gets annoying after a time, to keep changing the directory.&lt;/p&gt;
&lt;p&gt;If there is one specific folder that you prefer, it is an easy configuration change in the profile setting - add a setting called &amp;ldquo;startingDirectory&amp;rdquo; and point it to the path you want.&lt;/p&gt;
&lt;p&gt;For example, I have a root folder called &amp;ldquo;src&amp;rdquo; where most of the code I am working on sits, and that&amp;rsquo;s where I wanted to default the terminal to.&lt;/p&gt;
&lt;p&gt;To get to the profile, you can either use the shortcut &lt;strong&gt;CTRL+,&lt;/strong&gt; or from the dropdown in the title bar, click settings (see below). This will open the settings.json in your default editor.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Terminal setting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In my case, I wanted the starting directory for all the shells, so I put it under &amp;ldquo;defaults&amp;rdquo; - you can choose different options for different shells, and then would have this in the appropriate shell&amp;rsquo;s settings and not the default block of course.&lt;/p&gt;
&lt;p&gt;Below is what this looks like for me pointing this to &amp;ldquo;c:\src&amp;rdquo;. Also note, the escape characters need to be formatted properly to parse.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;defaults&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Put settings here that you want to apply to all profiles.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;fontFace&amp;#34;&lt;/span&gt;:  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;CaskaydiaCove NF&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;startingDirectory&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;c:\\src&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;setting.json screenshot&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you save the file, it should automatically reload the terminal. And if the json didn&amp;rsquo;t parse - because of a typo or a syntax error then you would see an error similar to the one shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2-1024x441.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Parsing error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In this example, I set the starting folder as &lt;code&gt;&amp;quot;c:\\src&amp;quot;&lt;/code&gt;; instead of &lt;code&gt;&amp;quot;c:\\\\src&amp;quot;&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>bfloat16 - how it improves AI chip designs</title>
      <link>/post/2020/09/bfloat16-how-it-improves-ai-chip-designs/</link>
      <pubDate>Sat, 12 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/09/bfloat16-how-it-improves-ai-chip-designs/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Floating-point_arithmetic&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Floating point
	&lt;/span&gt;
&lt;/a&gt; calculations are slow for computers (specifically CPUs); possibly representing the same struggle for many humans. :)&lt;/p&gt;
&lt;p&gt;I remember a time when a FPU (floating point unit) was an upgrade and one had to pay extra to get one. Very useful when you needed that extra precision in computing - and in my head, it always seemed like the Turbo button. :)&lt;/p&gt;
&lt;p&gt;For most #ML workloads and computations, precision isn’t the most important criteria; with every increasing data and parameters (looking at you &lt;a
	
		href = &#34;https://github.com/openai/gpt-3&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GPT-3
	&lt;/span&gt;
&lt;/a&gt; with &lt;strong&gt;45 TB&lt;/strong&gt; of data and &lt;strong&gt;175 billion&lt;/strong&gt; parameters!), what most ML needs today is speed and dynamic range.&lt;/p&gt;
&lt;p&gt;This is where &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bfloat16
	&lt;/span&gt;
&lt;/a&gt; (Brain floating-point format with 16 bits) - a new floating-point format comes handy and in the context of #AI improves on &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/IEEE_754&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IEEE 754
	&lt;/span&gt;
&lt;/a&gt; - the current floating-point arithmetic standard.&lt;/p&gt;
&lt;p&gt;As per IEEE 754, a floating point it will always take up 32 bits (see Figure 1 below) - irrespective of the size of the number. The exponent (8 bits) tells us how many numbers we shift (left or right) and place the decimal. The fraction (23 bits), also called the mantissa, holds the actual number - i.e. the data.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IEEE-754-1024x130.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Figure 1 - IEEE 754 Floating point representation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;bfloat16 truncates the data size in a third (see Figure 2) - with the fraction truncated from 23 to 7 bits. This of course means bfloat16 isn&amp;rsquo;t as precise. However &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Bfloat16_floating-point_format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		bfloat16
	&lt;/span&gt;
&lt;/a&gt; has the same exponent bits as IEEE-754 it can represent a similar range (small to large), but more importantly are easier to convert between bfloat16 and IEEE 754.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/bfloat16.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Figure 2 - fbloat16 representation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Less precision doesn&amp;rsquo;t impact the matrix multiplication as much so in the context of ML training and inference these chips at scale are more efficient - not only they are faster, they also use less power, and memory bandwidth.&lt;/p&gt;
&lt;p&gt;What is interesting in &lt;a
	
		href = &#34;https://arxiv.org/abs/1809.00095&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some neural nets
	&lt;/span&gt;
&lt;/a&gt; such as a DNN, these less precision bfloat16 are more precise compared to IEEE 754! This is because the regularization and quantization weights cannot use the finer precision represented by IEEE 754 but adapt better with bfloat16. :)&lt;/p&gt;
&lt;p&gt;Finally, bfloat16 is not a universal standard (yet); most AI chips support this. ARM, Intel, and, AMD have started adding support for this in their chipsets.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WSL2 &#43;Ubuntu on Window 10 (2004)</title>
      <link>/post/2020/08/wsl2-ubuntu-on-window-10-2004/</link>
      <pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/08/wsl2-ubuntu-on-window-10-2004/</guid>
      <description>&lt;p&gt;One of the key advances in the latest version of Windows 10 (2004) is WSL2 (Windows Subsystem for Linux v2) - and whilst a version bump, it offers so much more. This allows us to run with near-native performance linux binaries (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Executable_and_Linkable_Format&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ELF64
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Before we get into the steps outlined to install WSL2, I also recommend installing &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Terminal
	&lt;/span&gt;
&lt;/a&gt;, and &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/windows/package-manager/winget/#install-winget&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		winget
	&lt;/span&gt;
&lt;/a&gt;. Although not required, it does make it simpler to use and a better (dev) experience - especially when setting up a new workstation.&lt;/p&gt;
&lt;p&gt;For WSL2 to work, you need to make sure you are on Windows 10 2004 Build 19041 or higher. If you don&amp;rsquo;t have this, run Windows update and see if that updates your OS. If that doesn&amp;rsquo;t offer a update, you could also try the &lt;a
	
		href = &#34;https://www.microsoft.com/software-download/windows10&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows update assistant
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get WSL2, whilst not complicated one needs to do the following steps, in this order - running the commands in an elevated prompt.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the Windows Subsystem for Linux optional feature.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.&lt;span style=&#34;color:#f5a97f&#34;&gt;exe&lt;/span&gt; /online /&lt;span style=&#34;color:#91d7e3&#34;&gt;enable-feature&lt;/span&gt; /featurename&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Microsoft-Windows&lt;/span&gt;-Subsystem-Linux /all /norestart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Enable the Virtual machine platform optional feature.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dism.&lt;span style=&#34;color:#f5a97f&#34;&gt;exe&lt;/span&gt; /online /&lt;span style=&#34;color:#91d7e3&#34;&gt;enable-feature&lt;/span&gt; /featurename&lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt;VirtualMachinePlatform /all /norestart&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;li&gt;Run Windows update (and reboot again if there are updates)&lt;/li&gt;
&lt;li&gt;Set WSL2 as your default option.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wsl --set-default-version &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1024x558.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Enabling WSL2&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Install your Linux distro of your choice. You can do &lt;a
	
		href = &#34;https://aka.ms/wslstore&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this via Store
	&lt;/span&gt;
&lt;/a&gt;, or via winget, such as Ubuntu using the following command.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;winget install -e --id Canonical.Ubuntu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1-1024x188.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Installing Ubuntu via winget&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Note, when trying to set WSL2 as the default option above (Step 5) and you get a error &lt;strong&gt;0x1bc&lt;/strong&gt;, that most likely means you need to run Windows update and reboot.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;WSL Error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is my running Ubuntu and updating it.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-4.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Installing Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-5.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Updating Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, what&amp;rsquo;s the big deal? This is where it gets quite interesting and one simple example is the windows interoperability with Linux - allowing one to run linux commands from within a command prompt.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-6-1024x557.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Mixing Linux and Windows commands&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting list of users from Microsoft Teams</title>
      <link>/post/2020/06/getting-list-of-users-from-microsoft-teams/</link>
      <pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/06/getting-list-of-users-from-microsoft-teams/</guid>
      <description>&lt;p&gt;I recently needed to get a list of users that belong to a specific Microsoft Teams team - and there isnt anything out of the box to get this using the Teams app. AFAIK, the only way to do this is using the Microsoft graph API - for which there are a few options.&lt;/p&gt;
&lt;p&gt;For something quick (e.g. getting a list of users in a team), using the &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/graph/graph-explorer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Graph explorer
	&lt;/span&gt;
&lt;/a&gt; could be easy enough. On the other hand, if you need something more robust, you should program against the (REST) API.&lt;/p&gt;
&lt;h3 id=&#34;graph-explorer&#34;&gt;Graph Explorer&lt;/h3&gt;
&lt;p&gt;Navigate to &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/graph/graph-explorer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Graph explorer
	&lt;/span&gt;
&lt;/a&gt;, sign in and authenticate yourself against the specific O365 tenant you are interested in - most folks would only have one.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/image-1.png?fit=660%2C349&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Microsoft Graph Explorer&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once authenticated, on the panel on the left you see several sample queries and scroll down until you see the &lt;strong&gt;Teams&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Teams sample queries&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To get members of a specific team, you need to get the team ID for that Team. This is unique ID (GUID) and doesn&amp;rsquo;t change over the lifetime of the team. If you have this, then go ahead to the next section - Getting team members.&lt;/p&gt;
&lt;h3 id=&#34;getting-a-list-of-teams-and-team-id&#34;&gt;Getting a list of Teams and Team ID&lt;/h3&gt;
&lt;p&gt;On the query panel in Graph explorer, select the &amp;ldquo;&lt;strong&gt;my joined teams&lt;/strong&gt;&amp;rdquo; and run the query. You will get a JSON back that contains the list of teams that you are a member of. The &amp;ldquo;&lt;em&gt;id&lt;/em&gt;&amp;rdquo; element represents the Team ID which you would need for any team related API calls. For example, I am interested in this specific #AI team: &amp;ldquo;#Reinforcement Learning and Decision AI&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/team-explorer-1024x500.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Get team details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;getting-team-members&#34;&gt;Getting team members&lt;/h3&gt;
&lt;p&gt;Once you have the Team ID (the unique GUID that each identifies each team), you can get the members of the team using that option on the left. As shown on the screenshot below, you do need to pass in the team ID to the REST API and this would be something like this (and don&amp;rsquo;t worry what I am showing below is a fictious GUID):&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://graph.microsoft.com/v1.0/groups/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://graph.microsoft.com/v1.0/groups/
	&lt;/span&gt;
&lt;/a&gt;&lt;strong&gt;f3f9ad1f-beea-4026-9b86-dd3788404999&lt;/strong&gt;/members&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i2.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/team-user.jpg?fit=660%2C320&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Member details for a specific Microsoft Team team&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;programmatically-getting-microsoft-team-details&#34;&gt;Programmatically getting Microsoft Team details&lt;/h3&gt;
&lt;p&gt;If you want something more robust and repeatable, then using the API (via code) or PowerShell might be better. If you are programming, you will need to register an app - which &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/graph/auth/auth-concepts&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		can authenticate
	&lt;/span&gt;
&lt;/a&gt; using the &lt;a
	
		href = &#34;https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-overview&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Identify platform
	&lt;/span&gt;
&lt;/a&gt;. This of course is quite powerful, but at times for simple things might be a bit too much.&lt;/p&gt;
&lt;p&gt;In my simple task to get users from Teams, I prefer the PowerShell option. To get this going first you need to install the MicrosoftTeam module. This can be done using the command below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Install-Module&lt;/span&gt; -Name MicrosoftTeams&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Depending on your configuration you might get a warning as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/05/image-2.png?fit=660%2C146&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;PowerShell module installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once the Teams PowerShell module is installed, you can run PowerShell scripts against Teams and achieve the same result. I have two scripts below showing the same steps as with the Graph Explorer above. One of these gets details of the teams that a user is a member of. And the second script is to get members of a selected team.&lt;/p&gt;
&lt;h3 id=&#34;using-powershell-to-get-team-details&#34;&gt;Using PowerShell to get Team Details&lt;/h3&gt;
&lt;p&gt;The PowerShell script below to get a Team details is below; you can also get it &lt;a
	
		href = &#34;https://github.com/bahree/teams&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from GitHub
	&lt;/span&gt;
&lt;/a&gt;. Before you run this, there are two variables that need to be set.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One, the path where you want the team details to be exported (this is a csv file).&lt;/li&gt;
&lt;li&gt;Two, set the email that you will use. This needs to be the same one that you authenticated against.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You will be prompted to sign in to authentic and this should be an experience that most folks would be familiar with. Note, each time you run the script, you need to authenticate - and this is irrespective of say if you are already logged into Teams of Office 365.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/login-759x1024.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Authenticating user against Office 365&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Assuming you have authenticated successfully, you should see an output like the one shown below; and a csv file in the path you configured will be created. This file will always be overwritten - without any prompts (of course this is assuming no other process is open that has a lock on that file).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/06/team-details.png?fit=660%2C401&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Set these variables, to what makes sense in your situation. The email here is the one that is the one connected to your teams account.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\temp\team-details.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;your-email@shouldbeputhere.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Authenticate against teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Connect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Patience&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully connected to Teams&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Getting all team details for user: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please be patient, if there are a lot of teams, this can take a while...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get all of the team Groups IDs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# $GetUsersTeams = (Get-Team).GroupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Team&lt;/span&gt; -User &lt;span style=&#34;color:#f4dbd6&#34;&gt;$emailAddress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Will hold a basic count of user types and teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Loop through all teams that the user belongs to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;ForEach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show some output to the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Building report from Microsoft Teams&amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; of &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; -PercentComplete ((&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; / &lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count) * &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Attempt to get team details, throw error message if no access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get team members&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$users = Get-TeamUser -GroupId $thisTeam.groupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an object to hold all values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$teamReportObject&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; PSObject -Property &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                GroupID = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;GroupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				TeamName = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DisplayName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Description = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Archived = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Archived&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Visibility = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Visibility&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				eMail = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$thisTeam&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;MailNickName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add to the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$teamReportObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; [&lt;span style=&#34;color:#eed49f&#34;&gt;Microsoft.TeamsCmdlets.PowerShell.Custom.ErrorHandling.ApiException&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Yellow &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No access to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt; team, cannot generate report&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Disconnect from teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Disconnect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Provide some nice output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;                Microsoft Teams User Report                 &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  Count of All Teams - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$GetUsersTeams&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;                &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;  Count of Inaccesible Teams - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$unavailableTeamCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;         &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;Export-CSV&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; -NoTypeInformation -Force
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Exported report to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;getting-team-members-using-powershell&#34;&gt;Getting Team members using PowerShell&lt;/h3&gt;
&lt;p&gt;Now that you have the Team ID you are interested, you can run the other PowerShell script (&lt;a
	
		href = &#34;https://github.com/bahree/teams&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		also available on GitHub
	&lt;/span&gt;
&lt;/a&gt;) to get a list of all the users in a specific team. Like the previous script, you would need set a couple of variables in the script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Team ID for the team you are interested in.&lt;/li&gt;
&lt;li&gt;Path for the csv file with details to be saved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have authenticated and ran the script, the output will look like the one shown below. You get a summary of the team details, and details of the Teams users and their type (owner, member, or guest). And just like earlier, the file will be overwritten without a prompt, assuming no locks on it.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/www.desigeek.com/blog/amit/wp-content/uploads/2020/06/team-users.png?fit=660%2C587&amp;amp;ssl=1&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Members of a Microsoft Team&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt;77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt;78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt;79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt;80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt;81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt;82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt;83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt;84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt;85&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Global variables to set:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#path of the file where to export&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#specific ID of the team that you want the users for. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\temp\RL-decision-AI-export.csv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$TEAM_ID&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;f3f9ad1f-beea-4026-9b86-dd3788404999&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# counters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#connect to teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Connect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Team&lt;/span&gt; -GroupId &lt;span style=&#34;color:#f4dbd6&#34;&gt;$TEAM_ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Patience, supposed to be a virtue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Successfully connected to Team: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Getting all users in the team&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Please be patient, if there are a lot of users, this can take a while...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Attempt to get team users, throw error message if no access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get team members&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;Get-TeamUser&lt;/span&gt; -GroupId &lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;groupID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Loop through and get all the users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# foreach user create a line in the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;ForEach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Show some output to the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Generating user report from Teams&amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; of &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;.Count)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; -PercentComplete ((&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt; / &lt;span style=&#34;color:#f4dbd6&#34;&gt;$users&lt;/span&gt;.Count) * &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Maintain a count of user types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#c6a0f6&#34;&gt;switch&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.Role) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;owner&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;member&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;guest&amp;#34;&lt;/span&gt; { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt;++ }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create an object to hold all values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ReportObject&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; PSObject -Property &lt;span style=&#34;color:#f4dbd6&#34;&gt;@&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			User = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Email = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;User&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			Role = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$user&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Role&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Add to the report&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ReportObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f4dbd6&#34;&gt;$currentIndex&lt;/span&gt;++
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; [&lt;span style=&#34;color:#eed49f&#34;&gt;Microsoft.TeamsCmdlets.PowerShell.Custom.ErrorHandling.ApiException&lt;/span&gt;] {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Yellow &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;No access to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt; team, cannot generate report&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Complete progress&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Progress&lt;/span&gt; -Id &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; -Activity &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Status &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; -Completed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Disconnect from teams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Disconnect-MicrosoftTeams&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Write out details for the user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;                Microsoft Teams User Report                 &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Team Details:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Name: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.DisplayName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Description: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Description)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Mail Nickname: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.MailNickName)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Archived: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Archived)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Visiblity: &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$team&lt;/span&gt;.Visibility)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Team User Details:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Owners - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ownerCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Members - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$memberCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Guests - &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$guestCount&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Green &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;============================================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Report&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;Export-CSV&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt; -NoTypeInformation -Force
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; -ForegroundColor Blue &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Exported report to &lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$exportLocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Of course, programming against the API is always more powerful, but sometimes quick and easy is what is needed. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Livelock == 2020</title>
      <link>/post/2020/06/livelock-2020/</link>
      <pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/06/livelock-2020/</guid>
      <description>&lt;p&gt;With everything going around us - this is what 2020 feels like. &amp;#x1f62e;&amp;zwj;&amp;#x1f4a8;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Livelock == an infinite loop that 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// means the program is frozen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define FROZEN while(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// in hell, there are demons with pitchforks
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#define HELL fork();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FROZEN HELL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Git and Code</title>
      <link>/post/2020/05/git-and-code/</link>
      <pubDate>Sun, 10 May 2020 00:00:00 +0000</pubDate>
      
      <guid>/post/2020/05/git-and-code/</guid>
      <description>&lt;p&gt;I think this from &lt;a
	
		href = &#34;https://xkcd.com/1597/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xkcd
	&lt;/span&gt;
&lt;/a&gt; sums up my afternoon quite nicely. Messed up a repo, and then was trying to &amp;lsquo;clean up&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;A huge thank you to Lily, on the team, for working with me to cleaning up my mess, and helping me show some of the ropes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/git.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I know there are quite a few tutorials out there; a couple of these that I found including one from Lily.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[Git syncing](http://git syncing) and a great &lt;a
	
		href = &#34;https://www.atlassian.com/git/tutorials/setting-up-a-repository&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		beginner&amp;rsquo;s guide
	&lt;/span&gt;
&lt;/a&gt; if you need that.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://learngitbranching.js.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Learning Git Branching
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So go ahead, and set up an experiment repo, and don&amp;rsquo;t be afraid to play and break things.&lt;/p&gt;
&lt;p&gt;Maybe &lt;a
	
		href = &#34;https://www.desigeek.com/blog/amit/2013/08/06/how-to-insult-a-developer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this needs
	&lt;/span&gt;
&lt;/a&gt; to be updated to reflect Git, from REST. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deleting Windows run history</title>
      <link>/post/2019/09/deleting-windows-run-history/</link>
      <pubDate>Sat, 28 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/09/deleting-windows-run-history/</guid>
      <description>&lt;p&gt;If you have butter fingers like me, and over time end up with a lot of old commands with typos in your Windows run box that get annoying - deleting them is a simple. All you need to do it remove the following registry key.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now every time one plays with regedit, it can be dangerous - you can also save this commend as a .cmd file, and then run it with admin privileges - essentially does the same thing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&amp;#34;&lt;/span&gt; /f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can also download the same thing from &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Docker / Docker Compose on a Pi</title>
      <link>/post/2019/09/docker-docker-compose-on-a-pi/</link>
      <pubDate>Thu, 26 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/09/docker-docker-compose-on-a-pi/</guid>
      <description>&lt;p&gt;Been playing with a few things at home, and as part of that was trying to get &lt;a
	
		href = &#34;https://docs.docker.com/get-started/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker
	&lt;/span&gt;
&lt;/a&gt; and Docker Compose running on a Raspberry Pi. &lt;a
	
		href = &#34;https://docs.docker.com/compose/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker Compose
	&lt;/span&gt;
&lt;/a&gt; if you aren&amp;rsquo;t familiar with, allows one to run multi-container apps, and is very handy when building multi-tier layered applications - which are quite common.&lt;/p&gt;
&lt;p&gt;I was running it docker on my (Synology) NAS, but a recent update from them broke docker - specifically environment variables. That in turn broke the ability to run Docker Compose, and of course a bunch of stuff; and the opportunity to experiment.&lt;/p&gt;
&lt;p&gt;First, we need to install docker - which these days is quite simple. You need the ability to ssh into the pi (or if you are connected to a display, then via a terminal prompt). And in some cases if things fail then you might need to run them as root (via sudo). To install docker, run the following:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sSL https://get.docker.com | sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And once you are done installing docker, then test it by running the classic &lt;a
	
		href = &#34;https://hub.docker.com/_/hello-world&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hello world image
	&lt;/span&gt;
&lt;/a&gt;. To so that you run the following command - this will get the Hello World image, and once run will automatically remove it (which is because of the &amp;ndash;rm option)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --rm hello-world&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If everything is installed OK, then you should see a output that looks something like this the shown below. And this is good - means everything is up and running as expected.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~ $ docker run --rm hello-world
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unable to find image &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;hello-world:latest&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;latest: Pulling from library/hello-world
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c1eda109e4da: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Digest: sha256:b8ba256769a0ac28dd126d584e0a2011cd2877f3f76e093a7ae560f2a5301c00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; hello-world:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Hello from Docker!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This message shows that your installation appears to be working correctly.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To generate this message, Docker took the following steps:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1. The Docker client contacted the Docker daemon.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 2. The Docker daemon pulled the &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hello-world&amp;#34;&lt;/span&gt; image from the Docker Hub.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;arm32v7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 3. The Docker daemon created a new container from that image which runs the
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    executable that produces the output you are currently reading.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 4. The Docker daemon streamed that output to the Docker client, which sent it
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    to your terminal.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To try something more ambitious, you can run an Ubuntu container with:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; $ docker run -it ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Share images, automate workflows, and more with a free Docker ID:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; https://hub.docker.com/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;For more examples and ideas, visit:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; https://docs.docker.com/get-started/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To make like more simple, you should add the user you are logged in as to the &amp;lsquo;docker&amp;rsquo; group. In my case it is the default &amp;lsquo;pi&amp;rsquo; user, so that command would look like this. And for this to take effect, you would need to logout - I just reboot the machine - old habits. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo usermod -aG docker pi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OK, now that docker is installed, lets get to docker-compose. For that we first install pip, and use that to install docker-compose. And don&amp;rsquo;t forget the apt-get update in the end.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo python3 get-pip.py
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo pip3 install docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now before anything else, lets try and make sure all dependencies are there. Create a file called &amp;lsquo;docker-compose.yml&amp;rsquo; with the following. You can put this file anywhere, but I like to create a separate folder and save it in that.&lt;/p&gt;
&lt;p&gt;In this example I expose port &lt;code&gt;6666&lt;/code&gt; to the host which is mapped to port &lt;code&gt;8000&lt;/code&gt; internally on the image. If your port &lt;code&gt;6666&lt;/code&gt; is taken you can choose another port - it doesn&amp;rsquo;t matter. Spacing and indent, do matter in a yml file, so you would want to pay extra attention to that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;webapp&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f5a97f&#34;&gt;6666&lt;/span&gt;:&lt;span style=&#34;color:#f5a97f&#34;&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;image&lt;/span&gt;: python:3.7-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;python -m http.server 8000&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once the file is saved you run it with the following command. The image handles you would see are very likely going to be different and that is OK.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~/docker/docker-test $ docker-compose up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating network &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;docker-test_default&amp;#34;&lt;/span&gt; with the default driver
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Pulling webapp &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;python:3.7-alpine&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;3.7-alpine: Pulling from library/python
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;33b18ff7f9b7: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0c1f90421c3a: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;91543a0ba590: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;913b1310b79e: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6b545e90ee55: Pull &lt;span style=&#34;color:#91d7e3&#34;&gt;complete&lt;/span&gt;                                                                                             Digest: sha256:9363cb46e52894a22ba87ebec0845d30f4c27efd6b907705ba9a27192b45e797
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Status: Downloaded newer image &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; python:3.7-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating docker-test_webapp_1 ... &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;                                                                                  Attaching to docker-test_webapp_1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;At this point, the image is running in attached mode and it seems like it is waiting, when in reality it is running. If you open another ssh terminal and type in the following command - change the port to whatever you used earlier in the yml file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pi@pi-server2:~ $ curl -iv 0.0.0.0:6666&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if everything is working then you will see a output something like this. And if you see towards the top you got a &lt;code&gt;HTTP 200&lt;/code&gt; - that is all that mattes in this case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Expire in &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; ms &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;transfer 0x1b097c0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   Trying 0.0.0.0...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* TCP_NODELAY &lt;span style=&#34;color:#91d7e3&#34;&gt;set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Expire in &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; ms &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;transfer 0x1b097c0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Connected to 0.0.0.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;127.0.0.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; port &lt;span style=&#34;color:#f5a97f&#34;&gt;6666&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; GET / HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Host: 0.0.0.0:6666
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; User-Agent: curl/7.64.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Accept: */*
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* HTTP 1.0, assume close after body
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; HTTP/1.0 &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTTP/1.0 &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Server: SimpleHTTP/0.6 Python/3.7.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Server: SimpleHTTP/0.6 Python/3.7.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Date: Thu, &lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt; Sep &lt;span style=&#34;color:#f5a97f&#34;&gt;2019&lt;/span&gt; 22:10:28 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date: Thu, &lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt; Sep &lt;span style=&#34;color:#f5a97f&#34;&gt;2019&lt;/span&gt; 22:10:28 GMT
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Content-type: text/html; &lt;span style=&#34;color:#f4dbd6&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-type: text/html; &lt;span style=&#34;color:#f4dbd6&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;utf-8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt; Content-Length: &lt;span style=&#34;color:#f5a97f&#34;&gt;915&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-Length: &lt;span style=&#34;color:#f5a97f&#34;&gt;915&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;!DOCTYPE HTML PUBLIC &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-//W3C//DTD HTML 4.01//EN&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://www.w3.org/TR/html4/strict.dtd&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;meta http-equiv&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;content&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text/html; charset=utf-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;title&amp;gt;Directory listing &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; /&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;h1&amp;gt;Directory listing &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; /&amp;lt;/h1&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;hr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.dockerenv&amp;#34;&lt;/span&gt;&amp;gt;.dockerenv&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bin/&amp;#34;&lt;/span&gt;&amp;gt;bin/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dev/&amp;#34;&lt;/span&gt;&amp;gt;dev/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;etc/&amp;#34;&lt;/span&gt;&amp;gt;etc/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;home/&amp;#34;&lt;/span&gt;&amp;gt;home/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;lib/&amp;#34;&lt;/span&gt;&amp;gt;lib/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;media/&amp;#34;&lt;/span&gt;&amp;gt;media/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;mnt/&amp;#34;&lt;/span&gt;&amp;gt;mnt/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;opt/&amp;#34;&lt;/span&gt;&amp;gt;opt/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;proc/&amp;#34;&lt;/span&gt;&amp;gt;proc/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;root/&amp;#34;&lt;/span&gt;&amp;gt;root/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;run/&amp;#34;&lt;/span&gt;&amp;gt;run/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sbin/&amp;#34;&lt;/span&gt;&amp;gt;sbin/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;srv/&amp;#34;&lt;/span&gt;&amp;gt;srv/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sys/&amp;#34;&lt;/span&gt;&amp;gt;sys/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;tmp/&amp;#34;&lt;/span&gt;&amp;gt;tmp/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;usr/&amp;#34;&lt;/span&gt;&amp;gt;usr/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;li&amp;gt;&amp;lt;a &lt;span style=&#34;color:#f4dbd6&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;var/&amp;#34;&lt;/span&gt;&amp;gt;var/&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;hr&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/body&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* Closing connection &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can go back to the first ssh session and hit Ctrl + C to shutdown the image. Once you do that you will see something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;^CGracefully stopping... &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;press Ctrl+C again to force&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Stopping docker-test_webapp_1 ... &lt;span style=&#34;color:#c6a0f6&#34;&gt;done&lt;/span&gt;                                                                                  pi@pi-server2:~/docker/docker-test $&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now you know docker-compose and all the dependencies are installed. Next I would want docker to auto start whenever the pi boots up, and for that we will use the following two commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl &lt;span style=&#34;color:#91d7e3&#34;&gt;enable&lt;/span&gt; docker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl start docker&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And that should be it. If you are running low on space you might want to clean up the images we downloaded in testing this installation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla API v3.9.1</title>
      <link>/post/2019/08/tesla-api-v3-9-1/</link>
      <pubDate>Thu, 29 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/tesla-api-v3-9-1/</guid>
      <description>&lt;p&gt;Haven&amp;rsquo;t had time until now to explore on what is new as Tesla continues to push updates. The latest version as of this post is v3.9.1 which is what there I decompiled and when compared to the earlier version (&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2019/04/20/tesla-rest-apis-v3-8-2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		I had posted (v3.8.2)
	&lt;/span&gt;
&lt;/a&gt;, there three new REST API&amp;rsquo;s outlined below.&lt;/p&gt;
&lt;p&gt;Service data from the car - not sure what exactly does this will. Need to try it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &amp;#34;VEHICLE_SERVICE_DATA&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/service_data&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now, when I call that, I get a 200OK response (see below), so it is accepting the request, and that includes the bearer code in the header as expected. I don&amp;rsquo;t see anything interesting back, but that could be because my car is not in service. Maybe someone who has their vehicle in the service center can try and validate this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;response&amp;#34;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next new API is a POST, for reports; and calling this just sends a 200OK back, but I don&amp;rsquo;t know what it is for. It seems very similar to the SEND_LOG method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;SEND_REPORT&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;POST&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/reports&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next two set of APIs seem quite interesting and related t AutoPilot upgrade. It might be that these could be in app purchases - checking the eligibility, and then allowing one to purchase.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;UPGRADE_ELIGIBILITY&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/eligible_upgrades&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;#34;AUTOPILOT_UPGRADE_URL&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/vehicles/{vehicle_id}/purchase_url&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I try and call the &lt;code&gt;Purchase_URL&lt;/code&gt;, I get a &lt;code&gt;HTTP 400&lt;/code&gt;, and seems like I am missing some parameters - other than the headers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;error&amp;#34;: &amp;#34;bad_request&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;error_description&amp;#34;: &amp;#34;The data given to this server does not meet our criteria.&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And calling the &lt;code&gt;eligible_upgrades&lt;/code&gt; I get a &lt;code&gt;&#39;false&#39;&lt;/code&gt;. Now I already have AutoPilot, so this might make sense. And given this seems to be a key-value pair, I am guessing there will be other things that Tesla would add over time to up-sell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;autopilot&amp;#34;: false
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The final new API is related to energy sites, and something I of course don&amp;rsquo;t have or have an interest, but sharing here if someone does care. :)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;CALENDAR_HISTORY_DATA&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;TYPE&amp;#34;: &amp;#34;GET&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;URI&amp;#34;: &amp;#34;api/1/energy_sites/{site_id}/calendar_history&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;AUTH&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am not publishing the full API here as there aren&amp;rsquo;t significant changes. You of course can see the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2019/04/20/tesla-rest-apis-v3-8-2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		older post
	&lt;/span&gt;
&lt;/a&gt; which has the details.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Minor Fixes</title>
      <link>/post/2019/08/minor-fixes/</link>
      <pubDate>Fri, 23 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/minor-fixes/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/minor-fixes-scaled.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Minor Fixes&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>npm install blues - npm ERR! Error: Method Not Allowed</title>
      <link>/post/2019/08/npm-install-blues-npm-err-error-method-not-allowed/</link>
      <pubDate>Tue, 13 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/08/npm-install-blues-npm-err-error-method-not-allowed/</guid>
      <description>&lt;p&gt;This is a output of a few frustrating hours (spanning over a few days - as and when I can get time), and finally got it fixed and working. Hopefully it might help someone who is also dealing with npm blues.&lt;/p&gt;
&lt;p&gt;When NodeJS and npm works, its awesome. But when it borks, it is worst than my code or so it seems :).&lt;/p&gt;
&lt;p&gt;Been playing with a few things and wanting to get a dashboard going with &lt;a
	
		href = &#34;https://grafana.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Grafana
	&lt;/span&gt;
&lt;/a&gt; (and &lt;a
	
		href = &#34;https://www.influxdata.com/products/influxdb-overview/influxdb-2-0/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		InfluxBD
	&lt;/span&gt;
&lt;/a&gt; as a time-series DB). But some of the installation was failing and for the life of me, could not figure out why and how. Clean image install and downgrading to the previous stable version also didn&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;One example of npm failing miserably was the &lt;code&gt;&amp;quot;Error: Method not Allowed&amp;quot;&lt;/code&gt; which is not very helpful. Here is an example of what I was seeing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@pi-server:/var/lib/grafana/plugins/grafana-trackmap-panel# npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;node:4538&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;DEP0022&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; DeprecationWarning: os.tmpDir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; is deprecated. Use os.tmpdir&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;()&lt;/span&gt; instead.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! Error: Method Not Allowed
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at errorResponse &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/usr/share/npm/lib/cache/add-named.js:260:10&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at /usr/share/npm/lib/cache/add-named.js:203:12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at saved &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/usr/share/npm/node&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;modules/npm-registry-client/lib/get.js:167:7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     at FSReqWrap.oncomplete &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;fs.js:135:15&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! If you need help, you may report this &lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;entire&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt; log,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! including the npm and node versions, at:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     &amp;lt;http://github.com/npm/npm/issues&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! System Linux 4.19.57-v7+
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! &lt;span style=&#34;color:#91d7e3&#34;&gt;command&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/usr/bin/node&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/usr/bin/npm&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;install&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! cwd /var/lib/grafana/plugins/grafana-trackmap-panel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! node -v v8.11.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! npm -v 1.4.21
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! code E405
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! Additional logging details can be found in:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR!     /var/lib/grafana/plugins/grafana-trackmap-panel/npm-debug.log
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm ERR! not ok code &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@pi-server:/var/lib/grafana/plugins/grafana-trackmap-panel#&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Again, like I said not very helpful. But I finally got to be able to fix it and move on. And here is what worked for me, and it seems like in the OS image, there was a corrupted files, at some level. In most cases you need root access.&lt;/p&gt;
&lt;p&gt;Step 1: Remove and clean up NodeJS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get remove nodejs nodejs-legacy nodered&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Step 2: Get the latest stable source.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$NODE&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;STABLE&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BRANCH | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;span style=&#34;color:#8aadf4&#34;&gt;\\&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also noticed sometimes the commands above don&amp;rsquo;t work. If that is the case then then try the following, to get the latest.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9.x | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And based on your dependencies, v9 might not work and you need v8 then you change the first line as following Or for the latest:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sL https://deb.nodesource.com/setup&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;8.x | sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And finally in the end install and start.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if you do need to check for the update and get the latest, then try:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo npm install -g npm@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>ML Algorithms</title>
      <link>/post/2019/06/ml-algorithms/</link>
      <pubDate>Thu, 13 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/06/ml-algorithms/</guid>
      <description>&lt;p&gt;Sometimes one needs a quick snapshot of what are the options to think through and I really like this for that.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/MachineLearningAlgorithms.png&#34; alt=&#34;Machine Learning Algorithms&#34;/&gt;
        &lt;figcaption&gt;Machine Learning Algorithms&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku 3 - Streaming Chaos</title>
      <link>/post/2019/05/geek-haiku-3-streaming-chaos/</link>
      <pubDate>Fri, 17 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/geek-haiku-3-streaming-chaos/</guid>
      <description>&lt;p&gt;&lt;em&gt;Rain drops as I dive,&lt;br&gt;
into packet stream; Chaos.&lt;br&gt;
Malicious patterns.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;#Haiku #GeekHaiku&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine Learning 101</title>
      <link>/post/2019/05/machine-learning-101/</link>
      <pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/machine-learning-101/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Atom</title>
      <link>/post/2019/05/atom-3/</link>
      <pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/atom-3/</guid>
      <description>&lt;p&gt;Never trust an atom, they make up everything. 🤓&lt;/p&gt;
&lt;p&gt;#GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Programming</title>
      <link>/post/2019/05/programming/</link>
      <pubDate>Thu, 02 May 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/05/programming/</guid>
      <description>&lt;p&gt;A key virtue of a programmer is laziness. As an example it is what inspires me to automate my home to the point where I don&amp;rsquo;t have to lift a finger to switch on the light. Removing friction from a system is a anesthetic joy. The drug of efficiency, feels really good.&lt;/p&gt;
&lt;p&gt;I still write code and people get surprised by that sometimes - maybe it&amp;rsquo;s the quality of the code 🤓.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla REST APIs v3.8.2</title>
      <link>/post/2019/04/tesla-rest-apis-v3-8-2/</link>
      <pubDate>Sat, 20 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/04/tesla-rest-apis-v3-8-2/</guid>
      <description>&lt;p&gt;It has been a while since I played with the various Tesla endpoint (APIs) - been too busy and haven&amp;rsquo;t had the time. I de-compiled the Tesla app and noticed a few new things in there - or at least new to me.&lt;/p&gt;
&lt;p&gt;The following are the ones which seem new and stand out. How exactly some of these are used, can only be one&amp;rsquo;s guess, but I can certainly infer a few things from this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VEHICLE_DATA_LEGACY - So this seems to be the &amp;lsquo;old&amp;rsquo; end point, hence the legacy. The new endpoint is now at &lt;code&gt;&#39;VEHICLE_DATA&#39;&lt;/code&gt; which seems to return a combined (some) vehicle information, and, consolidate data state of the vehicle. This seems to be cleaner than the earlier version where it was too isolated and multiple calls.&lt;/li&gt;
&lt;li&gt;NEARBY_CHARGING_SITES - The name says it all - returns a list of Tesla chargers close by (both superchargers, and destination chargers).&lt;/li&gt;
&lt;li&gt;Media - there are a few media controls that are outlined below. I think these were part of earlier updates when a passenger could control the media playback from their phone. Most of the names are self explanatory and I skipped outlining them below.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MEDIA\_NEXT\_TRACK&lt;/code&gt; and &lt;code&gt;MEDIA\_PREVIOUS\_TRACK&lt;/code&gt; - plays the next and previous track respectively.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MEDIA\_NEXT\_FAVORITE&lt;/code&gt; and &lt;code&gt;MEDIA\_PREVIOUS\_FAVORITE&lt;/code&gt; - This skips to the next / previous favourite station (different from the track).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DEACTIVATE_DEVICE_TOKEN - This is new but I am not sure how this is different from &lt;code&gt;REVOKE_AUTH_TOKEN&lt;/code&gt;. What kind of devices is this looking to revoke? AFAIK, it doesn&amp;rsquo;t seem to be related to the Powerwall.&lt;/li&gt;
&lt;li&gt;ROADSIDE_ASSISTANCE_DATA - Intrigued seeing this and not sure what data it is sending (need to spend more time writing code to examine the output of the API). I wonder if this is related to the ETA details that might be pushed out (see &lt;a
	
		href = &#34;https://twitter.com/elonmusk/status/1064529656076886016?ref_src=twsrc%5Etfw&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Elon&amp;rsquo;s tweet
	&lt;/span&gt;
&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;SET_SENTRY_MODE - As the name suggests, this toggles Sentry mode for the car.&lt;/li&gt;
&lt;li&gt;Software updates (from the phone) - as expected a couple of API&amp;rsquo;s to start and cancel software updates - &lt;code&gt;SCHEDULE_SOFTWARE_UPDATE&lt;/code&gt;, &lt;code&gt;CANCEL_SOFTWARE_UPDATE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;REMOTE_SEAT_HEATER_REQUEST - Switching on the seat heating in the car. I presume there will be parameters on which seat, and the setting for each of the seats.&lt;/li&gt;
&lt;li&gt;REFERRAL_DATA - I would be interested to see what this shows and how it is changing on the backend given that Tesla can&amp;rsquo;t seem to make up their mind on how to run this and keep changing it adhoc.&lt;/li&gt;
&lt;li&gt;Message Center - there are a bunch of API&amp;rsquo;s that are around message center and I wonder what that exactly means. Is it messages in the app (you know, the Inbox that you have seen), or is it something new coming out on the screen in the car. (e.g. &lt;code&gt;MESSAGE_CENTER_MESSAGE&lt;/code&gt;, &lt;code&gt;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have the full output pasted below for you to have a look . This is as of v3.8.2 and it includes not just the car, but the powerwall, and the charging sites (both destination and superchargers).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;390&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#390&#34;&gt;390&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;391&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#391&#34;&gt;391&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;392&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#392&#34;&gt;392&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;393&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#393&#34;&gt;393&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;394&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#394&#34;&gt;394&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;395&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#395&#34;&gt;395&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;396&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#396&#34;&gt;396&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;397&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#397&#34;&gt;397&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;398&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#398&#34;&gt;398&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;399&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#399&#34;&gt;399&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;400&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#400&#34;&gt;400&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;401&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#401&#34;&gt;401&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;402&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#402&#34;&gt;402&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;403&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#403&#34;&gt;403&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;404&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#404&#34;&gt;404&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;405&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#405&#34;&gt;405&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;406&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#406&#34;&gt;406&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;407&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#407&#34;&gt;407&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;408&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#408&#34;&gt;408&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;409&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#409&#34;&gt;409&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;410&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#410&#34;&gt;410&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;411&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#411&#34;&gt;411&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;412&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#412&#34;&gt;412&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;413&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#413&#34;&gt;413&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;414&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#414&#34;&gt;414&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;415&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#415&#34;&gt;415&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;416&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#416&#34;&gt;416&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;417&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#417&#34;&gt;417&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;418&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#418&#34;&gt;418&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;419&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#419&#34;&gt;419&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;420&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#420&#34;&gt;420&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;421&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#421&#34;&gt;421&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;422&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#422&#34;&gt;422&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;423&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#423&#34;&gt;423&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;424&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#424&#34;&gt;424&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;425&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#425&#34;&gt;425&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;426&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#426&#34;&gt;426&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;427&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#427&#34;&gt;427&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;428&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#428&#34;&gt;428&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;429&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#429&#34;&gt;429&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;430&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#430&#34;&gt;430&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;431&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#431&#34;&gt;431&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;432&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#432&#34;&gt;432&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;433&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#433&#34;&gt;433&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;434&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#434&#34;&gt;434&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;435&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#435&#34;&gt;435&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;436&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#436&#34;&gt;436&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;437&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#437&#34;&gt;437&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;438&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#438&#34;&gt;438&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTHENTICATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REVOKE_AUTH_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/revoke&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;PRODUCT_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/products&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA_LEGACY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/vehicle_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NEARBY_CHARGING_SITES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/nearby_charging_sites&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;WAKE_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/wake_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;UNLOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_unlock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;LOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_lock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HONK_HORN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/honk_horn&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FLASH_LIGHTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/flash_lights&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_ON&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_OFF&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CLIMATE_TEMPERATURE_SETTING&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_temps&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CHARGE_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_charge_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_SUNROOF_STATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/sun_roof_control&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ACTUATE_TRUNK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/actuate_trunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_START&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_start_drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_OPEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_open&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_CLOSE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_close&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;START_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STOP_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_TOGGLE_PLAYBACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_toggle_playback&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_DOWN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_down&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_LOG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/logs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DEACTIVATE_DEVICE_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/device/{device_token}/deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CALENDAR_SYNC&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/upcoming_calendar_entries&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_VALET_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_valet_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RESET_VALET_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/reset_valet_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_ACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_activate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_DEACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_SET_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_set_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_CLEAR_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_clear_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SCHEDULE_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/schedule_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CANCEL_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/cancel_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_SENTRY_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_sentry_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_SESSION_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/powerwall_order_entry_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;powerwall_order_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/onboarding_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;onboarding_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SERVICE_SELF_SCHEDULING_ELIGIBILITY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/service_scheduling_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SERVICE_SELF_SCHEDULING_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;service_scheduling_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/referral_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;referral_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ROADSIDE_ASSISTANCE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/roadside_assistance_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ROADSIDE_ASSISTANCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;roadside_assistance_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_COUNTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/count&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}/actions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_CTA_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;messages_cta_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH_COMMAND_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/command_token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DEVICE_KEY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/keys&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DIAGNOSTICS_ENTITLEMENTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DIAGNOSTICS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_POWER_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/powerhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_ENERGY_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/energyhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/live_status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_CONFIG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_info&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HISTORY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/history&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TIME_OF_USE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/time_of_use_settings&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STORM_MODE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/storm_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_CONFIRMATION&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_confirmations&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NAVIGATION_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/navigation_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_SEAT_HEATER_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_seat_heater_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_STEERING_WHEEL_HEATER_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_steering_wheel_heater_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Python</title>
      <link>/post/2019/04/python/</link>
      <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/04/python/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/python_environment_2x.png&#34; alt=&#34;https://xkcd.com/1987/&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting DonkeyCar working on a Mac</title>
      <link>/post/2019/03/getting-donkeycar-working-on-a-mac/</link>
      <pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/03/getting-donkeycar-working-on-a-mac/</guid>
      <description>&lt;p&gt;I have been &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/05/30/my-self-driving-car/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		playing with a #selfdriving car for a while
	&lt;/span&gt;
&lt;/a&gt;, and that is super exciting. From a #AI and #ML perspective it is small scale but allows one to exploit all aspects of the tech stack and also appreciate the limitations of not only the software but also the hardware.&lt;/p&gt;
&lt;p&gt;With this, You run a NN on a raspberry pi that uses TensorFlow, and Keras and run inference on the edge. The pi doesn&amp;rsquo;t have enough power to train, so you need to do that on a beefier machine and then deploy the model back to run this.&lt;/p&gt;
&lt;p&gt;Now, I didn&amp;rsquo;t have any issues in getting this running on Windows, but getting it on a Mac was a different story. The documentation is there that outlines all the steps, and even if you follow it to the T, it breaks right in the end.&lt;/p&gt;
&lt;p&gt;When I tried to create a car, using a &lt;strong&gt;&lt;code&gt;createcar&lt;/code&gt;&lt;/strong&gt; command (this essentially creates the buckets, where you would save the training images, and the model, and the configuration of the car when you connect to it from your machine). The actual file paths would probably be different for you but, essentially it is the same thing.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ donkey createcar ~/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 660, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 968, in require
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 859, in resolve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources.ContextualVersionConflict: &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;imageio 2.4.1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;/anaconda3/envs/donkey/lib/python3.6/site-packages&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;, Requirement.parse&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;imageio&amp;lt;3.0,&amp;gt;=2.5&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;moviepy&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;During handling of the above exception, another exception occurred:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Traceback &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;most recent call last&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/bin/donkey&amp;#34;&lt;/span&gt;, line 6, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources import load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;entry&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;point
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 961, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;find&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;and&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 950, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;find&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;and&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;unlocked
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 646, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;unlocked
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;frozen importlib.\_bootstrap&amp;gt;&amp;#34;&lt;/span&gt;, line 616, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;load&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;backward&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;compatible
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2985, in &amp;lt;module&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2971, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;aside
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 2998, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;initialize&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;working&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;set
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 662, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 675, in &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;build&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;from&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;requirements
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  File &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/anaconda3/envs/donkey/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg\_resources/\_\_init\_\_.py&amp;#34;&lt;/span&gt;, line 854, in resolve
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pkg&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;resources.DistributionNotFound: The &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;imageio&amp;lt;3.0,&amp;gt;=2.5&amp;#39;&lt;/span&gt; distribution was not found and is required by moviepy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The key here to focus is on the last lines on both of those blocks of code - the main thing causing the issue is MoviePy (see highlighted lines above).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://zulko.github.io/moviepy/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MoviePy
	&lt;/span&gt;
&lt;/a&gt; is a Python library for video editing: cutting, concatenations, title insertions, video compositing (a.k.a. non-linear editing), video processing, and creation of custom effects.&lt;/p&gt;
&lt;p&gt;It seems like when you go through the steps - clone the repo, setup anaconda, install tensorflow and get the car configured - there is a mismatch in the MoviePy dependencies which it doesn&amp;rsquo;t like. The way to fix the issue is outlined below.&lt;/p&gt;
&lt;h4 id=&#34;skip-moviepy&#34;&gt;Skip MoviePy&lt;/h4&gt;
&lt;p&gt;MoviePy is something you don&amp;rsquo;t need to use right away but later when trying to make a movie (using the makemovie command - which allows you to create a movie file from the images in a Tub.); this is not essential. To do this, the easiest way is to remove (or my suggestion it to comment) out the moviepy dependency from the setup.py file.&lt;/p&gt;
&lt;p&gt;This should be line 33 in the setup.py file that you will find in the same folder where you cloned the git repo. As an example the updated file is below, where the moviepy dependency is commented out (see highlighted). And once you save this and go about creating the car, it should work. Of course you cannot use the makemovie option later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;from setuptools import setup, find\_packages
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;import os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;with open(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;) as fh:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    long\_description &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; fh&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setup(name&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;donkeycar&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      version&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;2.5.7&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Self driving library for python.&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      long\_description&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;long\_description,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      long\_description\_content\_type&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;text/markdown&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      url&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://github.com/autorope/donkeycar&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      download\_url&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;https://github.com/autorope/donkeycar/archive/2.1.5.tar.gz&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Will Roscoe&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author\_email&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;wroscoe@gmail.com&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      license&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;MIT&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      entry\_points&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;console\_scripts&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;donkey=donkeycar.management.base:execute\_from\_command\_line&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      install\_requires&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;numpy&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pillow&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;docopt&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tornado==4.5.3&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;requests&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;h5py&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;python-socketio&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;flask&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;eventlet&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#&amp;#39;moviepy&amp;#39;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pandas&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      extras\_require&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tf&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tensorflow&amp;gt;=1.9.0&amp;#39;&lt;/span&gt;\],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tf\_gpu&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tensorflow-gpu&amp;gt;=1.9.0&amp;#39;&lt;/span&gt;\],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pi&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;picamera&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Adafruit\_PCA9685&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;dev&amp;#39;&lt;/span&gt;: \[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pytest&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pytest-cov&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;responses&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                      &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;ci&amp;#39;&lt;/span&gt;: \[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;codecov&amp;#39;&lt;/span&gt;\]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      include\_package\_data&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;True,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      classifiers&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# How mature is this project? Common values are&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   3 - Alpha&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   4 - Beta&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#   5 - Production/Stable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Development Status :: 3 - Alpha&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Indicate who your project is intended for&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Intended Audience :: Developers&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Topic :: Scientific/Engineering :: Artificial Intelligence&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Pick your license as you wish (should match &amp;#34;license&amp;#34; above)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;License :: OSI Approved :: MIT License&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Specify the Python versions you support here. In particular, ensure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# that you indicate whether you support Python 2, Python 3 or both.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Programming Language :: Python :: 3.5&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;Programming Language :: Python :: 3.6&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      \],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      keywords&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;selfdriving cars donkeycar diyrobocars&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      packages&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;find\_packages(exclude&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;tests&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;docs&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;site&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;env&amp;#39;&lt;/span&gt;\])),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you have saved the setup.py file, you need to run the installation again with the following command and then run the create car command. Both of these are outlined below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;donkey createcar ~/mycar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you run these, then you should see the successful installation as shown by the output below. Note - your output might be a little different depending on the conda state of packages&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ pip install -e .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Obtaining file:///Users/amit.bahree/CloudStation/Documents/Code/donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: numpy in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.14.5&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: pillow in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;4.2.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: docopt in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;0.6.2&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting &lt;span style=&#34;color:#f4dbd6&#34;&gt;tornado&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;4.5.3 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: requests in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.18.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: h5py in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.7.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-socketio &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/a1/71/118e4b7fb453d7095d6863f4b783dbaa57109af4bc2380300649c8942d61/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;socketio-4.0.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting flask &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting eventlet &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/86/7e/96e1412f96eeb2f2eca9342dcc4d5bc9305880a448b603b0a8e54439b71c/eventlet-0.24.1-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting pandas &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from &lt;span style=&#34;color:#f4dbd6&#34;&gt;donkeycar&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/99/12/bf4c58eea94cea4f91ff931f284146337814fb8546e6eb0b52584446fd52/pandas-0.24.1-cp36-cp36m-macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;6&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;9&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;x86&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;64.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;x86&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;64.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: olefile in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pillow-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;0.44&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: chardet&amp;lt;3.1.0,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.0.2 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;3.0.4&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: certifi&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2017.4.17 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2017.7.27.1&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: idna&amp;lt;2.7,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.5 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;2.6&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: urllib3&amp;lt;1.23,&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.21.1 in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from requests-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.22&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Requirement already satisfied: six in /anaconda3/envs/donkey/lib/python3.6/site-packages &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from h5py-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;1.10.0&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-engineio&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;3.2.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from python-socketio-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/95/91/d083bd7b5d408af53633377dfbf87bf181236c8916d36213388b12eaa999/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;engineio-3.4.3-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting click&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;5.1 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting itsdangerous&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.24 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting Werkzeug&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.14 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting Jinja2&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.10 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting monotonic&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.4 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/ac/aa/063eca6a416f397bd99552c534c6d11d57f58f2e94c14780f3bbf818c4cf/monotonic-1.5-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting greenlet&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.3 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting dnspython&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;1.15.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from eventlet-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/ec/d3/3aa0e7213ef72b8585747aa0e271a9523e713813b9a20177ebe1e939deb0/dnspython-1.16.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting pytz&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2011k &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pandas-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting python-dateutil&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.5.0 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from pandas-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;dateutil-2.8.0-py2.py3-none-any.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collecting MarkupSafe&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;0.23 &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;from Jinja2&amp;gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;2.10-&amp;gt;flask-&amp;gt;donkeycar&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt;2.5.7&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Using cached https://files.pythonhosted.org/packages/f0/00/a6aea33f5598b080b86d6b6d1214b51afe3ffa6100b902d5aa465080083f/MarkupSafe-1.1.1-cp36-cp36m-macosx&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;10&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;6&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;intel.whl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing collected packages: tornado, python-engineio, python-socketio, click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, flask, monotonic, greenlet, dnspython, eventlet, pytz, python-dateutil, pandas, donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Found existing installation: tornado 4.5.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Uninstalling tornado-4.5.1:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Successfully uninstalled tornado-4.5.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Found existing installation: Werkzeug 0.12.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Uninstalling Werkzeug-0.12.2:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Successfully uninstalled Werkzeug-0.12.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Running setup.py develop &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; donkeycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully installed Jinja2-2.10 MarkupSafe-1.1.1 Werkzeug-0.14.1 click-7.0 dnspython-1.16.0 donkeycar eventlet-0.24.1 flask-1.0.2 greenlet-0.4.15 itsdangerous-1.1.0 monotonic-1.5 pandas-0.24.1 python-dateutil-2.8.0 python-engineio-3.4.3 python-socketio-4.0.0 pytz-2018.9 tornado-4.5.3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And when I run the createcar, you can see it worked as expected. In my case creating the &amp;lsquo;mycar&amp;rsquo; folder in my home directory. Of course you can choose this wherever you prefer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;donkey&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; AMAC02XN1T9JGH5:donkeycar amit.bahree$ donkey createcar ~/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;using donkey version: 2.5.7 ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating car folder: /Users/amit.bahree/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating data &amp;amp; model folders.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/models
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;making dir  /Users/amit.bahree/mycar/logs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copying car application template: donkey2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copying car config defaults. Adjust these before starting your car.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Donkey setup complete.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It is interesting to see this is more stable on Windows, than on a Mac. Also, one last thing to leave you with - when I first ran the installation, the hint that someone was wrong was in the output, but I didn&amp;rsquo;t pay too much attention to it. See the red line highlighted in the output below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/donkeycar-mac-setup-issue.png&#34; alt=&#34;moviepy failure - donkeycar installation&#34;/&gt;
        &lt;figcaption&gt;moviepy failure – donkeycar installation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t know at this time on what the solution for moviepy is to get this sorted - luckily its not a big deal at the moment.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>threads</title>
      <link>/post/2019/03/threads/</link>
      <pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/03/threads/</guid>
      <description>&lt;p&gt;Some people, when confronted with a problem, think, &amp;lsquo;I know, I&amp;rsquo;ll use threads&amp;rsquo; - and then two they hav erpoblesms.&lt;/p&gt;
&lt;p&gt;#GeekyJokes and if you don&amp;rsquo;t get it, &lt;a
	
		href = &#34;/post/2016/02/rules-of-threading-revised/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		see this
	&lt;/span&gt;
&lt;/a&gt;. 😎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VSCode &#43; Python on a mac</title>
      <link>/post/2019/01/vscode-python-on-a-mac/</link>
      <pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/01/vscode-python-on-a-mac/</guid>
      <description>&lt;p&gt;As my experimentation continues, I wanted to get &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio Code
	&lt;/span&gt;
&lt;/a&gt; installed on a mac, and wanted to use python as the language of choice - main reason for the mac is to understand and explore the #ML libraries, runtimes, and their support on a mac (both natively and in containers - docker).&lt;/p&gt;
&lt;p&gt;Now, Microsoft has a &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/setup/mac&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		very nice tutorial
	&lt;/span&gt;
&lt;/a&gt; to get VSCode setup and running on a mac, including some basic configuration (e.g. touchbar support). But when it comes to &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/python-tutorial&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		getting
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/debugging&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		python setup
	&lt;/span&gt;
&lt;/a&gt;, and running, that is a different matter. Whilst the tutorial is good, it doesn&amp;rsquo;t actually work and errors out.&lt;/p&gt;
&lt;p&gt;Below is the code that &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/python-tutorial#_install-and-use-packages&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft outlines
	&lt;/span&gt;
&lt;/a&gt; in the tutorial for python. It essentially is the HelloWorld using packages and is quite simple; but this will fail and won&amp;rsquo;t work.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;linspace(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a list of evenly-spaced numbers over the range&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;plot(x, np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sin(x))       &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Plot the sine of each x point&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()                   &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Display the plot&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When you run this, you will see an error that is something like the one outlined below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-01-18 14:23:34.648 python&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;38527:919087&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; -&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;NSApplication &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;setup:&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;: unrecognized selector sent to instance 0x7fbafa49bf10
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-01-18 14:23:34.654 python&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;38527:919087&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\*\*\*&lt;/span&gt; Terminating app due to uncaught exception &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;NSInvalidArgumentException&amp;#39;&lt;/span&gt;, reason: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;-\[NSApplication \_setup:\]: unrecognized selector sent to instance 0x7fbafa49bf10&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\*\*\*&lt;/span&gt; First throw call stack:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;   CoreFoundation                      0x00007fff521a1ecd &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_&lt;/span&gt;exceptionPreprocess + &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;   libobjc.A.dylib                     0x00007fff7e25d720 objc&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;exception&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;throw + &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;   CoreFoundation                      0x00007fff5221f275 -&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;NSObject&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;NSObject&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_&lt;/span&gt;retain&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;OA&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;   CoreFoundation                      0x00007fff52143b40 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_\_&lt;/span&gt;forwarding&lt;span style=&#34;color:#8aadf4&#34;&gt;\_\_\_&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;1486&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;   CoreFoundation                      0x00007fff521434e8 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;CF&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;forwarding&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;prep&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;5&lt;/span&gt;   libtk8.6.dylib                      0x000000011523031d TkpInit + &lt;span style=&#34;color:#f5a97f&#34;&gt;413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;   libtk8.6.dylib                      0x000000011518817e Initialize + &lt;span style=&#34;color:#f5a97f&#34;&gt;2622&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;7&lt;/span&gt;   &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tkinter.cpython-37m-darwin.so      0x0000000114fb2a0f &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tkinter&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;create + &lt;span style=&#34;color:#f5a97f&#34;&gt;1183&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;8&lt;/span&gt;   python                              0x0000000101836ba6 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyMethodDef&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;RawFastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;230&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;   python                              0x00000001019772b1 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;257&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;11&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;12&lt;/span&gt;  python                              0x0000000101835867 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallDict + &lt;span style=&#34;color:#f5a97f&#34;&gt;231&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;13&lt;/span&gt;  python                              0x00000001018b9481 slot&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;tp&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;init + &lt;span style=&#34;color:#f5a97f&#34;&gt;193&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;  python                              0x00000001018c3441 type&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call + &lt;span style=&#34;color:#f5a97f&#34;&gt;241&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;15&lt;/span&gt;  python                              0x0000000101836573 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyObject&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;179&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;16&lt;/span&gt;  python                              0x000000010197733f call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;399&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;17&lt;/span&gt;  python                              0x0000000101975052 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45890&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;18&lt;/span&gt;  python                              0x0000000101836368 &lt;span style=&#34;color:#c6a0f6&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;code&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;fastcall + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;22&lt;/span&gt;  python                              0x0000000101835867 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallDict + &lt;span style=&#34;color:#f5a97f&#34;&gt;231&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;23&lt;/span&gt;  python                              0x0000000101839782 method&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;call + &lt;span style=&#34;color:#f5a97f&#34;&gt;130&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;24&lt;/span&gt;  python                              0x00000001018371e2 PyObject&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;Call + &lt;span style=&#34;color:#f5a97f&#34;&gt;130&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;25&lt;/span&gt;  python                              0x00000001019751c6 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;46262&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;26&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;27&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;28&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;29&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;  python                              0x0000000101836368 &lt;span style=&#34;color:#c6a0f6&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;code&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;fastcall + &lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;32&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;33&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;34&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;35&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt;  python                              0x0000000101974f99 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45705&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;37&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;38&lt;/span&gt;  python                              0x0000000101836a73 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyFunction&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FastCallKeywords + &lt;span style=&#34;color:#f5a97f&#34;&gt;195&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;39&lt;/span&gt;  python                              0x0000000101977265 call&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;function + &lt;span style=&#34;color:#f5a97f&#34;&gt;181&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;40&lt;/span&gt;  python                              0x0000000101974daf &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalFrameDefault + &lt;span style=&#34;color:#f5a97f&#34;&gt;45215&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;41&lt;/span&gt;  python                              0x0000000101968a42 &lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;PyEval&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;EvalCodeWithName + &lt;span style=&#34;color:#f5a97f&#34;&gt;418&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;42&lt;/span&gt;  python                              0x00000001019cc9a0 PyRun&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;FileExFlags + &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;43&lt;/span&gt;  python                              0x00000001019cc104 PyRun&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;SimpleFileExFlags + &lt;span style=&#34;color:#f5a97f&#34;&gt;388&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;44&lt;/span&gt;  python                              0x00000001019f7edc pymain&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;main + &lt;span style=&#34;color:#f5a97f&#34;&gt;9148&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;45&lt;/span&gt;  python                              0x0000000101808ece main + &lt;span style=&#34;color:#f5a97f&#34;&gt;142&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;46&lt;/span&gt;  libdyld.dylib                       0x00007fff7f32bed9 start + &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f5a97f&#34;&gt;47&lt;/span&gt;  ???                                 0x0000000000000003 0x0 + &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libc++abi.dylib: terminating with uncaught exception of &lt;span style=&#34;color:#91d7e3&#34;&gt;type&lt;/span&gt; NSException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt;Done&lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; exited with &lt;span style=&#34;color:#f4dbd6&#34;&gt;code&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;null in 1.017 seconds&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The main reason this fails is that one has to be a little more explicit with matplot (the library that we are trying to use). Matplot has this &lt;a
	
		href = &#34;https://matplotlib.org/faq/usage_faq.html#what-is-a-backend&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		concept of backends
	&lt;/span&gt;
&lt;/a&gt;, which essentially is the runtime dependencies needed to support various execution environments - including both interactive and non-interactive environments.&lt;/p&gt;
&lt;p&gt;For matplot to work on a mac, the raster graphics c++ library that it uses is based on something called &lt;a
	
		href = &#34;http://antigrain.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Anti-Grain Geometry (AGG)
	&lt;/span&gt;
&lt;/a&gt;. And for the library to render, we need to be explicit on which agg to use (there are multiple raster libraries).&lt;/p&gt;
&lt;p&gt;In addition on a mac OS X there is a limitation when rendering in OSX windows (presently lacks blocking show() behavior when matplotlib is in non-interactive mode).&lt;/p&gt;
&lt;p&gt;To get around this, we explicitly tell matplot to use the specific agg (&amp;ldquo;TkAgg in our case) and then it will all work. I have a updated code sample below, which adds more points, and also waits for the console input, so one can see what the output looks like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;matplotlib&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;use(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;TkAgg&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;matplotlib&lt;/span&gt; &lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; pyplot &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; plt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;waitforuser&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Press enter to continue ...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;linspace(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;200&lt;/span&gt;)  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create a list of evenly-spaced numbers over the range&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;sin(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;waitforuser()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;print&lt;/span&gt;(y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;waitforuser()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;plot(x,y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;show()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And incase you are wondering what it looks like, below are a few screenshots showing the output.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Screen-Shot-1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i2.wp.com/desigeek.com/blog/amit/wp-content/uploads/2019/01/Screen-Shot-2.png?fit=660%2C747&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i2.wp.com/desigeek.com/blog/amit/wp-content/uploads/2019/01/Screen-Shot-2019-01-18-at-2.41.40-PM.png?fit=660%2C550&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To get everything working, make sure you setup the &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/linting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Linting
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/debugging&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		debugger
	&lt;/span&gt;
&lt;/a&gt;, and the &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/environments&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		python environment
	&lt;/span&gt;
&lt;/a&gt; properly. And of course, you can go &lt;a
	
		href = &#34;https://code.visualstudio.com/docs/python/tutorial-deploy-containers&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		nuts with containers
	&lt;/span&gt;
&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Azure Cognitive Services in containers is the smart way to go</title>
      <link>/post/2019/01/azure-cognitive-services-in-containers-is-the-smart-way-to-go/</link>
      <pubDate>Sun, 13 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>/post/2019/01/azure-cognitive-services-in-containers-is-the-smart-way-to-go/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/azure-containers.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;{Cross posted from &lt;a
	
		href = &#34;https://www.avanade.com/en/blogs/avanade-insights/artificial-intelligence/azure-containers-smart-way-to-go&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my post on Avanade
	&lt;/span&gt;
&lt;/a&gt;}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Containers just got smarter.&lt;/strong&gt;&lt;br&gt;
That’s the news from Microsoft, which announced recently that &lt;a
	
		href = &#34;https://azure.microsoft.com/en-us/blog/bringing-ai-to-the-edge/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure Cognitive Services now supports containers
	&lt;/span&gt;
&lt;/a&gt;. The marriage of AI and containers is a technology story, of course, but it’s a potentially even bigger business story, one that affects where and how you can do business and gain competitive advantage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First, the technology story&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Containers aren’t new, of course. They’re an increasingly popular technology with a big impact on business. That’s because they boost the agility and flexibility with which a business can roll out new tools to employees and new products and services to customers.&lt;/p&gt;
&lt;p&gt;With containers, a business can get software releases and changes out faster and more frequently, increasing its competitive advantage. Because containers abstract applications from their underlying operating systems and other services—like virtual machines abstracted from hardware—those applications can run anywhere: in the cloud, on a laptop, in a kiosk or in an intelligent Internet-of-Things (IoT) edge device in the field.&lt;/p&gt;
&lt;p&gt;In many respects this frees up the application’s developer, who can focus on creating the best, most useful software for the business. With Microsoft’s announcement, that software can now more easily include object detection, vision recognition, text and language understanding.&lt;/p&gt;
&lt;p&gt;At Avanade, we take containers a step further by including support for them in our modern engineering platform, a key part of our overall approach to &lt;a
	
		href = &#34;https://www.avanade.com/en/thinking/new-economics-of-it/intelligent-it&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		intelligent IT
	&lt;/span&gt;
&lt;/a&gt;. So, you can automate your creation and management of containers—including AI-enabled containers—for a faster, easier, more seamless DevOps process. You can take greater advantage of IoT capabilities and move technologies such as AI closer to the edge, where they can reduce latency and boost performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What AI containers do for business&lt;/strong&gt;&lt;br&gt;
And you can do much more, which is where the business story gets interesting. With the greater agility and adaptability that comes with container-based AI services, you can respond more quickly to new competition, regulatory environments and business models. That contrasts with the more limited responses that have been possible with traditional, cloud-based AI. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For example, data sovereignty laws and GDPR requirements&lt;/strong&gt; generally restrict the transfer of data to the cloud, where cloud-based cognitive services can interact with it. Now, with containers that support cognitive services, you can avoid those restrictions by running your services locally.&lt;/p&gt;
&lt;p&gt;A retail bank might use containerized AI to identify customers, address their needs, process payments and offer additional services, boosting customer satisfaction and bank revenue—all without sending private financial data outside the region (or even outside the bank) in accordance with GDPR.&lt;/p&gt;
&lt;p&gt;Similarly, regional medical centers and clinics subject to HIPAA privacy laws in the US can process protected information on site with containerized AI to cut patient wait times and deliver better health outcomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Or, think about limited-connectivity or disconnected environments&lt;/strong&gt;—such as manufacturing shop floors, remote customer sites or oil rigs or tankers—that can’t count on accessing AI that resides in the always-on cloud. Previously, these sites might have had to batch their data to process it during narrow periods of cloud connectivity, with the delays greatly limiting the timeliness and usefulness of AI.&lt;/p&gt;
&lt;p&gt;Now, these sites can combine IoT and AI to anticipate and respond to manufacturing disruptions before they occur, increasing safety, productivity and product quality while reducing errors and costs.&lt;/p&gt;
&lt;p&gt;If you can’t bring your data to your AI, now you can bring your AI to your data. That’s the message of container-hosted AI and the modern engineering platform. Together, they optimize your ability to bring AI into environments where you can’t count on the cloud. Using AI where you couldn’t before makes innovative solutions possible—and innovative solutions deliver competitive advantage. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boost ROI and scale&lt;/strong&gt;&lt;br&gt;
If you’re already using Azure Cognitive Services, you’ve invested time and money to train the models that support your use cases. Because those models are now portable, you can take advantage of them in regulated, limited-connectivity and disconnected environments, increasing your return on that investment. &lt;/p&gt;
&lt;p&gt;You can also scale your use of AI with a combination of cloud- and container-based architectures. That enables you to apply the most appropriate architectural form for any given environment or use. At the same time, you’re deploying consistent AI technology across the enterprise, increasing reliability while decreasing your operating cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep in mind…&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here are three things to keep in mind as you think about taking advantage of this important news:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Break the barriers between your data scientists and business creatives.&lt;/strong&gt; Containerized cognitive services is about far more than putting AI where you couldn’t before. It’s about using it in exciting new ways to advance the business. Unless you have heterogeneous teams bringing diverse perspectives to the table, you may miss some of the most important innovation possibilities for your business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You need a cloud strategy that’s not just about the cloud.&lt;/strong&gt; If you don’t yet have a cloud strategy, you’re behind the curve. But if your cloud strategy is limited to the cloud, you may be about to fall behind the &lt;em&gt;next&lt;/em&gt; curve. Microsoft’s announcement is further proof that the cloud is crucial to the enterprise—and also part of a larger environment, including both legacy and edge platforms, with which it must integrate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be prepared for the ethics issues.&lt;/strong&gt; Putting cognitive services in places you couldn’t before could raise new ethics issues. After all, we’re talking about the ability to read people’s expressions and even their emotions. This shouldn’t put you off—but it should put you on alert. Plug your ethics committee into these discussions when appropriate. If you don’t already have an ethics committee, create one. But that’s another post. :)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Want to learn more?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft’s announcement furthers the democratization of AI: the use of AI in more places and in more ways throughout the enterprise and beyond. Whether you turn to us for your AI solutions or look to us to assist you in developing your own, we’re ready to help with the greatest concentration of Microsoft expertise outside of Microsoft itself.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/hdfbn4Q8jbo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Bugs</title>
      <link>/post/2018/12/bugs/</link>
      <pubDate>Wed, 26 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/bugs/</guid>
      <description>&lt;p&gt;It is a known bug with the programming language. :)&lt;/p&gt;
&lt;p&gt;#GeekyJokes #ProgrammerHumor&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Docker container running Ubuntu on Windows</title>
      <link>/post/2018/12/docker-container-running-ubuntu-on-windows/</link>
      <pubDate>Fri, 07 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/docker-container-running-ubuntu-on-windows/</guid>
      <description>&lt;p&gt;Containers are all the rage right now and rightfully so - not only do they help abstract away some of the complexity and dependencies of your apps and solutions, they also make managing of environments, and, deployments much simpler. And the fact that you can do it in a consistent, and repeatable fashion is just icing on the cake.&lt;/p&gt;
&lt;p&gt;As a simple example, with Docker, on Windows (as in my case), I can run a dockerized app, on a different OS than the host, which can also be interactive. &lt;/p&gt;
&lt;p&gt;The command below will spawn a container, pull down the image of Ubuntu and then run an interactive terminal, tying the terminal to the standard input. Of course in this example, this requires that you already have &lt;a
	
		href = &#34;https://docs.docker.com/install/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Docker installed
	&lt;/span&gt;
&lt;/a&gt; (the Community Edition would be just fine to play around with).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --interactive --tty ubuntu bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, with Docker if you do get the following error (on Windows): &amp;ldquo;Error response from daemon: operating system on which parent image was created is not Windows.&amp;rdquo; as also shown below, the way to fix it is to switch on Experimental features.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-error-101626.jpg?fit=660%2C164&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Docker error when trying to run Ubuntu on Windows&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To try and fix this, right click on the docker icon in the system tray, choose Settings, and from the setting screen, in the Daemon tab, enable experimental features as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/docker-settings.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i0.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-daemon-settings.jpg?fit=660%2C453&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And after enabling the experimental features, the docker daemon will restart. And post that, if you run the docker command again, it would work as expected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It pulls down the image (which is used to run in the container)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs Ubuntu in an interactive session (this is because of the option I choose)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And all within my PowerShell console on Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/12/docker-running-ubuntu-interactive.jpg?fit=660%2C411&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is just the beginning, there of course is a lot more to it.  :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubuntu on Surface Book</title>
      <link>/post/2018/12/ubuntu-on-surface-book/</link>
      <pubDate>Wed, 05 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/12/ubuntu-on-surface-book/</guid>
      <description>&lt;p&gt;I am writing this on a Microsoft Surface Book, running Ubuntu natively, and there isn&amp;rsquo;t any Windows option - I blew away, the Windows partition, and there isn&amp;rsquo;t any other OS on it.&lt;/p&gt;
&lt;p&gt;Why some of you might think? Well, why not. :) For me the motive is two fold: one am a geek and love to &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Hacker_culture&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hack
	&lt;/span&gt;
&lt;/a&gt; what works and cannot work - how else will one learn? And two, explore and see which AI frameworks, tools, and runtimes works better on Linux natively&lt;/p&gt;
&lt;p&gt;Well, I must say, this experiment has been a pleasant surprise and much more successful that I originally thought of. Most of the things are working quite well on Surface with Ubuntu - including touch and pen (both seem like mouse clicks). As the screenshot below shows, Ubuntu is running quite nicely - including most of the features. There are a few things that quite don&amp;rsquo;t - I have them listed later in the post.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-18-15-32.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Ubuntu desktop&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So much so, that &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio code
	&lt;/span&gt;
&lt;/a&gt; is running natively and whilst I haven&amp;rsquo;t had a chance to use it much (yet), the fact that it can even so much was something I wasn&amp;rsquo;t expecting without running some containers or VM&amp;rsquo;s or the likes.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-18-26-45.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Visual Studio code running on Ubuntu&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, how does one go about doing this? It is quite simple these days, to be honest. Below are the steps I had followed. I do think the real magic is the hard work that &lt;a
	
		href = &#34;https://github.com/jakeday&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JakeDay
	&lt;/span&gt;
&lt;/a&gt; has done to get the kernel and firmware supported.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Disclaimer:&lt;/em&gt;&lt;/strong&gt; My experience outlined here is related to the Surface Book - it can also run and be supported on other Surface devices, and the exact nature of what works or doesn&amp;rsquo;t work would be a little different.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt; - Have a USB keyboard and mouse handy just in case; and if you are on a Surface Pro or something with only one usb port, then a usb hub. And you of course would need a USB drive to boot Ubuntu off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disable Secure boot&lt;/strong&gt; - without this getting the bootloader sequence would be challenging. If you aren&amp;rsquo;t sure how, then check out the &lt;a
	
		href = &#34;https://support.microsoft.com/en-us/help/4023532/surface-how-do-i-use-the-bios-uefi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		instructions here to disable secure boot.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Delete / Shrink the windows partition:&lt;/strong&gt; If you don&amp;rsquo;t care about Windows and have a copy of the license somewhere to get back you might want to just delete this. If you do want to shrink it (say this is your primary machine and you want to get back at some point, then goto &lt;a
	
		href = &#34;https://www.lifewire.com/how-to-open-disk-management-2626080&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Disk Management in Windows
	&lt;/span&gt;
&lt;/a&gt; and resize the partition - keep this to at least 50 GB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu USB drive&lt;/strong&gt; - if you don&amp;rsquo;t have one already, create a ubuntu bootable usb drive. You can get more &lt;a
	
		href = &#34;https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		instructions here
	&lt;/span&gt;
&lt;/a&gt;. And if you are on Windows,  I would recommend using &lt;a
	
		href = &#34;https://rufus.ie/en_IE.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rufus
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Ubuntu&lt;/strong&gt; - &lt;a
	
		href = &#34;https://support.microsoft.com/en-us/help/4023511/surface-boot-surface-from-a-usb-device&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Boot off the usb drive
	&lt;/span&gt;
&lt;/a&gt; you created, and before that make sure you have disabled secure boot. I would pick most of the default options for Ubuntu for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Patched Kernel&lt;/strong&gt; - Once you have ubuntu running, I would recommend installing the patched kernel and headers that allows for Surface support. Steps for these are outlined below and need to be execute in a terminal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Dependencies&lt;/strong&gt;: sudo apt install git curl wget sed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone the repo&lt;/strong&gt;: git clone &lt;a
	
		href = &#34;https://github.com/jakeday/linux-surface.git&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://github.com/jakeday/linux-surface.git
	&lt;/span&gt;
&lt;/a&gt; ~/linux-surface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Change working directory&lt;/strong&gt;: cd ~/linux-surface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run setup&lt;/strong&gt;: sudo sh setup.sh&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reboot&lt;/strong&gt; on the patched kernel&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Change boot kernel:&lt;/strong&gt; Finally, after you have rebooted, the odds of Ubuntu booting off the &amp;lsquo;right&amp;rsquo; kernel is quite slim and best to manually pick this. You can of course use the grub, or what I find better - &lt;a
	
		href = &#34;https://www.howtogeek.com/howto/43471/how-to-configure-the-linux-grub2-boot-menu-the-easy-way/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		install the grub customizer
	&lt;/span&gt;
&lt;/a&gt;, and then choose the correct option as shown below. Once picked and you had hit save, you also need to run the following in a terminal to make these persist: sudo update-grub&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Screenshot-from-2018-12-04-22-50-13.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Grub Customizer&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And that is all to it for getting the base install and customization running.&lt;/p&gt;
&lt;p&gt;If you are super curious about what that setup script does, the code is below (also listed on github). What is interesting to see the various hardware models supported.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; -r /etc/os-release &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    . /etc/os-release
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; arch &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ubuntu &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; ! -z &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$UBUNTU&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_CODENAME&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; ; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ubuntu&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;ID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;BASE&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		LX&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;VERSION&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$VERSION&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Could not identify your distro. Please open script and run commands manually.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUR&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;MODEL&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dmidecode | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Product Name&amp;#34;&lt;/span&gt; -m &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; | xargs | sed -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/Product Name: //g&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SUR&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;SKU&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;dmidecode | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;SKU Number&amp;#34;&lt;/span&gt; -m &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; | xargs | sed -e &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/SKU Number: //g&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nRunning &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_BASE version &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_VERSION on a &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL.\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Press enter if this is correct, or CTRL-C to cancel.&amp;#34;&lt;/span&gt; cont;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nContinuing setup...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Coping the config files under root to where they belong...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -Rb root/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt; /
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Making /lib/systemd/system-sleep/sleep executable...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod a+x /lib/systemd/system-sleep/sleep
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want to replace suspend with hibernate? (type yes or no) &amp;#34;&lt;/span&gt; usehibernate;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$usehibernate&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$LX&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_BASE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ubuntu&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; -eq &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;LX&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; &amp;gt;= 17.10&amp;#34;&lt;/span&gt; | bc&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Using Hibernate instead of Suspend...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ln -sfb /lib/systemd/system/hibernate.target /etc/systemd/system/suspend.target &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sfb /lib/systemd/system/systemd-hibernate.service /etc/systemd/system/systemd-suspend.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Using Hibernate instead of Suspend...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ln -sfb /usr/lib/systemd/system/hibernate.target /etc/systemd/system/suspend.target &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo ln -sfb /usr/lib/systemd/system/systemd-hibernate.service /etc/systemd/system/systemd-suspend.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not touching Suspend\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want use the patched libwacom packages? (type yes or no) &amp;#34;&lt;/span&gt; uselibwacom;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$uselibwacom&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing patched libwacom packages...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		dpkg -i packages/libwacom/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		apt-mark hold libwacom
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not touching libwacom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 3&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 3...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;bxt.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 4&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 4...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v78.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 4...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 2017&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 2017...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Pro 6&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Pro 6...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v102.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Pro 6...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Laptop&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Laptop...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v79.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Laptop...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Book&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Book...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v76.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Book...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;skl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Book 2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling IPTS firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/intel/ipts
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_SKU&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface\_Book\_1793&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v101.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		unzip -o firmware/ipts&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;v137.zip -d /lib/firmware/intel/ipts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling i915 firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/i915
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/i915&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;kbl.zip -d /lib/firmware/i915/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling nvidia firmware for Surface Book 2...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/nvidia/gp108
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/nvidia&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;gp108.zip -d /lib/firmware/nvidia/gp108/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$SUR&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\_MODEL&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Surface Go&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nInstalling ath10k firmware for Surface Go...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	mkdir -p /lib/firmware/ath10k
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	unzip -o firmware/ath10k&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware.zip -d /lib/firmware/ath10k/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing marvell firmware...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /lib/firmware/mrvl/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unzip -o firmware/mrvl&lt;span style=&#34;color:#8aadf4&#34;&gt;\_&lt;/span&gt;firmware.zip -d /lib/firmware/mrvl/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want to set your clock to local time instead of UTC? This fixes issues when dual booting with Windows. (type yes or no) &amp;#34;&lt;/span&gt; uselocaltime;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$uselocaltime&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Setting clock to local time...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	timedatectl set-local-rtc &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	hwclock --systohc --localtime
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not setting clock&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;read&lt;/span&gt; -rp &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Do you want this script to download and install the latest kernel for you? (type yes or no) &amp;#34;&lt;/span&gt; autoinstallkernel;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\[&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$autoinstallkernel&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Downloading latest kernel...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;urls&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;curl --silent &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://api.github.com/repos/jakeday/linux-surface/releases/latest&amp;#34;&lt;/span&gt; | grep &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;browser\_download\_url&amp;#34;:&amp;#39;&lt;/span&gt; | sed -E &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;s/.\*&amp;#34;(\[^&amp;#34;\]+)&amp;#34;.\*/\\1/&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f4dbd6&#34;&gt;resp&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;wget -P tmp &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urls&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Installing latest kernel...\\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	dpkg -i tmp/&lt;span style=&#34;color:#8aadf4&#34;&gt;\*&lt;/span&gt;.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	rm -rf tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Not downloading latest kernel&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\\nAll done! Please reboot.&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lastly, below are the things not working for me - none of these are deal breakers but something to be aware of.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cameras are not supported - either of the two.&lt;/li&gt;
&lt;li&gt;Dedicated GPU (if you have one). I was a little bummed out as I got the dedicated GPU for some of the #MachineLearning experimentation, but then this whole thing is a different type of experimentation, so am OK.&lt;/li&gt;
&lt;li&gt;Can control the volume using the speaker widget thing on the top right corner, but the volume buttons on top aren&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;Sleep / Hibernation - It has some issues and for now I have sleep disabled but have hibernation setup.&lt;/li&gt;
&lt;li&gt;Detaching the screen will immediately terminate everything and power off the machine (not a clean poweroff) - I am guessing it cannot transition between the two batteries of the base and the screen. However if already detached then it will work without any issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy hacking! 🖐️&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Roots of #AI</title>
      <link>/post/2018/11/roots-of-ai/</link>
      <pubDate>Mon, 12 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/11/roots-of-ai/</guid>
      <description>&lt;p&gt;The naming is unfortunate when talking about #AI. There isn&amp;rsquo;t anything about intelligence - not as we humans know of it. If we can rewind back to the 50&amp;rsquo;s we can perhaps rename it to something like Computational Intelligence, which is more accurate. And although I have outlined the difference between some of the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/05/25/whats-the-difference-between-ai-ml-and-deeplearning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		elements of AI in the past,
	&lt;/span&gt;
&lt;/a&gt; I wanted to get back to what the intent was and how this area started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can machines think?&lt;/strong&gt;
Some say, the origins of #AI go back to Turing and started with his paper &amp;ldquo;&lt;a
	
		href = &#34;https://www.csee.umbc.edu/courses/471/papers/turing.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Computing machinery and intelligence (PDF)
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; when it was published in 1950.Whilst, Turing might have planed the seed, it was a program called &lt;a
	
		href = &#34;https://history-computer.com/ModernComputer/Software/LogicTheorist.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Logic Theorist
	&lt;/span&gt;
&lt;/a&gt; created Allen Newell, Cliff Shaw, and Herbert Simon which was the first #ArtificialIntelligence program. Of course it wasn&amp;rsquo;t called #AI then.&lt;/p&gt;
&lt;p&gt;That started back in 1956 when a Logic Theorist was presented at a conference in Dartmouth College called &amp;ldquo;&lt;a
	
		href = &#34;https://www.aaai.org/ojs/index.php/aimagazine/article/download/1904/1802&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dartmouth Summer Research Project on Artificial Intelligence (DSRPAI) (PDF)
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo;. The term &amp;ldquo;#AI&amp;rdquo; was coined at the conference.&lt;/p&gt;
&lt;p&gt;Since then, AI has had a roller coaster of a ride over the decades - from colder than hell (I presume) winters, to hotter than lava with it being everywhere. As someone said, time will heal all wounds.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-timeline-2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI Timeline&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Today, many of us use #AI, #DeepLearning, and, #MachineLearning interchangeably. Over the course of last couple of years, I have learned to ignore that, but fundamentally the distinction is important.&lt;/p&gt;
&lt;p&gt;AI, we would say is more computational intelligence - allowing computers to do tasks that would be difficult for humans to do, certainly at scale. And these tasks are accomplished using different mechanisms and techniques, using &amp;ldquo;intelligent agents&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WhatIsAI.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Machine learning is a subset of AI, where the program or algorithm can learn from previous outputs, and improve based on that data - hence the &amp;ldquo;learning&amp;rdquo; part. It is akin to it learning from experience, but isn&amp;rsquo;t the same thing as we humans can comprehend and understand. Some of us think, the program is rewriting itself, which technically isn&amp;rsquo;t an accurate description.&lt;/p&gt;
&lt;p&gt;Deep Learning is a set of techniques and algorithms of machine learning that are inspired from how the neurals in our brain connect together and work. These set of techniques are also called Neural Networks, and essentially are nothing but type of machine learning&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/NN_Diagram.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For any of this AI &amp;ldquo;magic&amp;rdquo; to work, the one thing it needs to feed on is data. Without data, none of this would be possible. This data is classified into two categories - features and labels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt; - these are aspects of whatever we are interested in. For example if we are interested in vehicles features could be the colour, make, and, model of the vehicle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Labels&lt;/strong&gt; - these are buckets of categories we put the things we are interested in. Using the same vehicles examples, we can have labels such as SUV, Sedan, Sports Car, Trucks, etc. that categorize vehicles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One key principle to remember when it comes to #AI - all the outcomes that are described are in the terms of probabilities and not absolutes. All it suggests is the likelihood of something to happen, and most things &lt;strong&gt;&lt;em&gt;cannot&lt;/em&gt;&lt;/strong&gt; be predicted with total certainty. And this fundamental aspect one should remember when making decisions.&lt;/p&gt;
&lt;p&gt;There isn&amp;rsquo;t a universal definition of AI, which sometimes doesn&amp;rsquo;t help. Each has their own perception. I have gotten over it to come to their terms and ensure we are talking the same lingo and meaning. It doesn&amp;rsquo;t help to get academic about it. :)&lt;/p&gt;
&lt;p&gt;For example taking three leading analysts (Gartner, IDC, and Forrester) definition of AI (outlined below) is a good indicator on how this can get confusing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gartner&lt;/strong&gt; - At its core, AI is about solving business problems in novel ways. It stretches across any organization from innovation, R&amp;amp;D and IT to data science.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDC&lt;/strong&gt; defines cognitive/Artificial Intelligence (AI) systems as a set of technologies that use deep natural language processing and understanding to answer questions and provide recommendations and direction. IDC’s coverage of cognitive/AI systems examines:
&lt;ul&gt;
&lt;li&gt;Digital assistants&lt;/li&gt;
&lt;li&gt;Automated advisors&lt;/li&gt;
&lt;li&gt;Artificial intelligence, deep learning and machine learning&lt;/li&gt;
&lt;li&gt;Automated recommendation systems&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forrester&lt;/strong&gt; defines AI as a liberatory technology at its core, and businesses that integrate it will free workers to become more innovative, creative, and adaptive than ever before. But these technologies are still in early stages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the field is just exploding now - not just with new research around #DeepLearning or #MachineLearning, but also net new aspects from a business perspectives; things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Digital Ethics&lt;/li&gt;
&lt;li&gt;Conversational AI&lt;/li&gt;
&lt;li&gt;Democratization of AI&lt;/li&gt;
&lt;li&gt;Data Engineering (OK, not new, but certainly key)&lt;/li&gt;
&lt;li&gt;Model Management&lt;/li&gt;
&lt;li&gt;RPA (or #IntelligentAutomation)&lt;/li&gt;
&lt;li&gt;AI Strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is a new and exciting world that spans multiple spectrum. Don&amp;rsquo;t try and drink from the fire-hose, but take it in slowly, appreciate the nuances and what one brings value and discuss in terms of outcomes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Computer - a male or female?</title>
      <link>/post/2018/10/computer-a-male-or-female/</link>
      <pubDate>Mon, 22 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/computer-a-male-or-female/</guid>
      <description>&lt;p&gt;So, both these arguments make sense. I can&amp;rsquo;t decide which one is accurate.&lt;/p&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;images/audio-2018-10-20-08-42-38.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Patent - Systems and methods for organizing and presenting skill progressions</title>
      <link>/post/2018/10/patent-systems-and-methods-for-organizing-and-presenting-skill-progressions/</link>
      <pubDate>Wed, 17 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/patent-systems-and-methods-for-organizing-and-presenting-skill-progressions/</guid>
      <description>&lt;p&gt;This has been a long time coming - our patent filed a about 4 years ago was finally awarded today by the USPTO. Some details below.&lt;/p&gt;
&lt;p&gt;United States &lt;a
	
		href = &#34;http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=10102774&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Patent 10,102,774
	&lt;/span&gt;
&lt;/a&gt;&lt;br&gt;
Bahree , et al. October 16, 2018&lt;br&gt;
&lt;a
	
		href = &#34;https://patents.justia.com/patent/10102774&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Systems and methods for organizing and presenting skill progression
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In any organization, the skills collectively possessed by individuals of the organization can determine the capabilities of the organization as a whole. Previously, there was no centralized method or system for managing skills which are complex and wide-ranging. There was also no effective way for individuals to review skills they possess and to discover other skills which they can cross-train and leverage—either to enhance their existing roles and responsibilities, or possibly change skills and get involved with another area and thereby grow their career. The limited visualizations of skill sets offered to the individuals were static and non-interactive, which is not ideal.&lt;/p&gt;
&lt;p&gt;When organizations grow and begin hiring new technical employees, this tremendous influx of new resources and talent makes the overall skill set of the organization increasingly difficult to comprehend. The challenge gets increasingly difficult over time. Further, to allow such companies to both retain and attract talent such companies want to ensure that they can provide a clear path for employees to manage their careers and talent growth effectively. Such companies are also challenged to be able to efficiently allocate technical resources, and to visualize technical areas in which their current employees are strong, and areas in which their current employees need further training (or new employees need to be recruited) to help the company compete in the marketplace.&lt;/p&gt;
&lt;p&gt;This patent represents a subset of our work on cohesive systems, methods, and devices for presenting and managing interrelated sets of skills for a person. We used a map interface to represent a set of interrelated skills to a user, and which allows the user an opportunity to strategize regarding how best the related and advanced skills may be acquired to advance on a career path.&lt;/p&gt;
&lt;p&gt;The convergence of Tech Trends - in the past Mobility, Big Data, and Cloud (and today #DataScience, #ModernEngineering, #AI, #ML, and #Cloud) helps the creation of modern skills management systems. The solution at the heart of the patent is help address this and we deem to have wide applicability across industry domains, industry sectors, and vertical industry segments.&lt;/p&gt;
&lt;p&gt;Since filing the patent, and awarding today - elements of this we have adopted at &lt;a
	
		href = &#34;https://www.avanade.com/en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade
	&lt;/span&gt;
&lt;/a&gt; and rolled it out globally to our workforce across 20 countries allowing them to help manage complex skills, advance career and help establish a 3D career path.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is MVP?</title>
      <link>/post/2018/10/what-is-mvp/</link>
      <pubDate>Thu, 11 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/what-is-mvp/</guid>
      <description>&lt;p&gt;#MVP you ask? #EnoughSaid&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dilbert_june_21_2016.gif&#34; alt=&#34;See the source image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Update on Tesla .ssq files</title>
      <link>/post/2018/10/update-on-tesla-ssq-files/</link>
      <pubDate>Tue, 09 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/update-on-tesla-ssq-files/</guid>
      <description>&lt;p&gt;Sometime back, I &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/09/13/tesla-ssq-file/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		noticed the car downloaded
	&lt;/span&gt;
&lt;/a&gt; a large file (5.1 GB) which was a .ssq file. I hadn&amp;rsquo;t heard of a ssq file, and was curious on what this was.&lt;/p&gt;
&lt;p&gt;I researched a little and as it turns out, a .ssq file is a compressed file system which is often used in an embedded Linux system, where storage size might be a area of concern. This file-system is called SquashFS, and is usually used on a read-only mode.&lt;/p&gt;
&lt;p&gt;SquashFS is interesting, as it lets one mount the file-system directly and is distributed as a kernel source patch - which makes it easy to daisy chain and use it other regular Linux tools.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.tldp.org/HOWTO/SquashFS-HOWTO/mksqoverview.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SquashFS tools
	&lt;/span&gt;
&lt;/a&gt; are useful to mount and create a SquashFS file-system. As shown below, I can mount the downloaded file, using &lt;em&gt;unsquashfs&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture2.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;unsquashfs to mount a SquashFS file-system&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I think it is &lt;a
	
		href = &#34;https://electrek.co/2017/07/03/tesla-map-navigation-open-source-platforms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		known
	&lt;/span&gt;
&lt;/a&gt; that Tesla uses Valhalla for their maps and this file is the updated maps data. Valhalla, is a open source routing library which is using &lt;a
	
		href = &#34;https://www.openstreetmap.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenStreetMap
	&lt;/span&gt;
&lt;/a&gt;. Valhalla, also incorporates the &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Travelling_salesman_problem&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		traditional travelling salesman problem
	&lt;/span&gt;
&lt;/a&gt; which is a &lt;a
	
		href = &#34;http://artemis.cs.yale.edu/classes/cs460/Spring98/chap5/nondet.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		non-deterministic polynomial problem
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When extracted and mounted, we see the following directory structure; each of these folders (and files therein) are in fact the tiles that make up the maps (next time in the car, when you zoom in or out or search of a non-cached location, notice carefully on how it is loading and you can just about make out the tiles - it is quick and easy to miss). And it is these tiles that is used for routing as part of the navigation. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Capture3.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Tiled based routing is supposed to be beneficial - it uses less memory (the graph can be decomposed much easier, with a smaller set of it loaded in memory), cahce-able, easier to manage (update-able), etc. We can see a glimpse on how the routing and calculation happen on a tile basis below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/ezgif.com-optimize.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;tiles based routing&lt;/p&gt;
&lt;p&gt;When, extracted we see there are three levels of hierarchy (0, 1, and, 2). In the file-system these are shown as directories, but there is a method to the madness.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Level 0 - these contain edges pertaining to roads that are considered highway / freeway / motorway roads. These are stored as 4 degree tiles.&lt;/li&gt;
&lt;li&gt;Level 1 - contains roads that are at a arterial level and are saved in 1 degree tiles.&lt;/li&gt;
&lt;li&gt;Level 2 - these are local roads and are saved as 0.25 degree tiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, the world at Level 0 would look like what we are seeing in the image below. And Pennsylvania can be seen below that; Level 0 colored in light blue, Level 1 in light green, and finally Level 2 in light red (which might not be obvious with the translucency).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/world_level0.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;World Level 0 tiles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/pennsylvania.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Pennsylvania Level 0, 1, and 2 tiles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, to use this, one can use a few helper functions to get the exact tile to load and vice-versa. For example using the GPS coordinate of 41.413203, -73.623787 (which is just outside of &lt;a
	
		href = &#34;https://www.google.com/maps/place/41%C2%B024%2747.5%22N&amp;#43;73%C2%B037%2725.6%22W/@41.3764196,-73.663217,12z/data=!4m5!3m4!1s0x0:0x0!8m2!3d41.413203!4d-73.623787&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Brewster, NY
	&lt;/span&gt;
&lt;/a&gt;), loading Level 2 (via the get_title_2 function) would give us the structure of &lt;code&gt;/2/000/756/425.gph&lt;/code&gt; using which we know which tile to load.&lt;/p&gt;
&lt;p&gt;Helper function (in python) that help obtain levels, tile ids, tile lists, lat/long coordinates, etc. from an intersecting box.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valhalla_tiles &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; [{&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.25&lt;/span&gt;}, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;1.0&lt;/span&gt;}, {&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;4.0&lt;/span&gt;}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LEVEL_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TILE_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ID_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LEVEL_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TILE_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;TILE_INDEX_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ID_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;**&lt;/span&gt;ID_INDEX_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INVALID_ID &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (ID_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (TILE_INDEX_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; LEVEL_BITS)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; (TILE_INDEX_MASK &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;|&lt;/span&gt; LEVEL_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_level&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; LEVEL_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_index&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; LEVEL_BITS) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; TILE_INDEX_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_index&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; (LEVEL_BITS &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; TILE_INDEX_BITS)) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; ID_INDEX_MASK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;tiles_for_bounding_box&lt;/span&gt;(left, bottom, right, top):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if this is crossing the anti meridian split it up and combine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; left &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; right:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    east &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tiles_for_bounding_box(left, bottom, &lt;span style=&#34;color:#f5a97f&#34;&gt;180.0&lt;/span&gt;, top)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    west &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tiles_for_bounding_box(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;180.0&lt;/span&gt;, bottom, right, top)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; east &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; west
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move these so we can compute percentages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  left &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  right &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  bottom &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  top &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tiles &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each size of tile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; tile_set &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; valhalla_tiles:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(left&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]), &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(right&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#for each row&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;range&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(bottom&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]), &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(top&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#give back the level and the tile index&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tiles&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;append((tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;], &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(y &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; (&lt;span style=&#34;color:#f5a97f&#34;&gt;360.0&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt;tile_set[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; x)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tiles
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_tile_id&lt;/span&gt;(tile_level, lat, lon):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; tile_level, valhalla_tiles)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;360&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;((lat &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;]) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;((lon &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt; ) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;get_ll&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tile_level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; get_tile_level(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; get_tile_index(&lt;span style=&#34;color:#91d7e3&#34;&gt;id&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  level &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#c6a0f6&#34;&gt;lambda&lt;/span&gt; x: x[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;level&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; tile_level, valhalla_tiles)[&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  width &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;360&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  height &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;int&lt;/span&gt;(tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;/&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;90&lt;/span&gt;, (tile_index &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;%&lt;/span&gt; width) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; level[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;size&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;180&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tesla has actually open-sourced &lt;a
	
		href = &#34;https://github.com/teslamotors/valhalla&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		their implementation of Valhalla
	&lt;/span&gt;
&lt;/a&gt;, which is based on C++. This still seems like an active project, but parts of the code haven&amp;rsquo;t been updated for a while.&lt;/p&gt;
&lt;p&gt;Whilst I haven&amp;rsquo;t tried to set this up myself, it seems quite simple. Below are the instructions to get this going on Ubuntu or Debian (I think Mac is also supported, but needs a little different dependency set).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#below are the dependencies needed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo add-apt-repository -y ppa:valhalla-core/valhalla
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y autoconf automake make libtool pkg-config g++ gcc jq lcov protobuf-compiler vim-common libboost-all-dev libboost-all-dev libcurl4-openssl-dev libprime-server0.6.3-dev libprotobuf-dev prime-server0.6.3-bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if you plan to compile with data building support, see below for more info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y libgeos-dev libgeos++-dev liblua5.2-dev libspatialite-dev libsqlite3-dev lua5.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;grep -cF xenial /etc/lsb-release&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#c6a0f6&#34;&gt;then&lt;/span&gt; sudo apt-get install -y libsqlite3-mod-spatialite; &lt;span style=&#34;color:#c6a0f6&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#if you plan to compile with python bindings, see below for more info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y python-all-dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#install with the following&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule update --init --recursive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./autogen.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make &lt;span style=&#34;color:#91d7e3&#34;&gt;test&lt;/span&gt; -j&lt;span style=&#34;color:#c6a0f6&#34;&gt;$(&lt;/span&gt;nproc&lt;span style=&#34;color:#c6a0f6&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There you have it - we know now what the .ssq files are and how they are used. Just need more time to get it going and play with it - perhaps another project for another time. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla and Spotify</title>
      <link>/post/2018/10/tesla-and-spotify/</link>
      <pubDate>Sun, 07 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/tesla-and-spotify/</guid>
      <description>&lt;p&gt;Something seems to be up, with the car tickling an endpoint for connectivity perhaps? Its only 663 bytes up and 222 bytes down. This is still on v8.1 (36.2)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/spotify-tesla.png&#34; alt=&#34;Spotify traffic from Tesla&#34;/&gt;
        &lt;figcaption&gt;Spotify traffic from Tesla&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tesla v9 API endpoints</title>
      <link>/post/2018/10/tesla-v9-api-endpoints/</link>
      <pubDate>Tue, 02 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/10/tesla-v9-api-endpoints/</guid>
      <description>&lt;p&gt;In case you haven&amp;rsquo;t been following the news, Tesla is in the process of releasing the new firmware beta. I think many folks online are super interested in new autopilot upgrades.&lt;/p&gt;
&lt;p&gt;I reverse engineered the associated app and there are certainly a few new end points exposed, as outlined below. Need time to now figure out more details on this and what they entail. Also need time to see what changes in the existing code and json (data structure). &lt;/p&gt;
&lt;p&gt;Is it interesting to go noodle on this, and see the associated calls. This outlines all the products as of today&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;390&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#390&#34;&gt;390&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;391&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#391&#34;&gt;391&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTHENTICATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REVOKE_AUTH_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;oauth/revoke&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;PRODUCT_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/products&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;VEHICLE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;WAKE_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/wake_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;UNLOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_unlock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;LOCK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/door_lock&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HONK_HORN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/honk_horn&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FLASH_LIGHTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/flash_lights&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_ON&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CLIMATE_OFF&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/auto_conditioning_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CLIMATE_TEMPERATURE_SETTING&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_temps&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_CHARGE_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_charge_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHANGE_SUNROOF_STATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/sun_roof_control&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ACTUATE_TRUNK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/actuate_trunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REMOTE_START&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/remote_start_drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_OPEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_open&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CHARGE_PORT_DOOR_CLOSE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_port_door_close&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;START_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_start&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STOP_CHARGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/charge_stop&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_TOGGLE_PLAYBACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_toggle_playback&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_TRACK&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_track&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_NEXT_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_next_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_PREVIOUS_FAVORITE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_prev_fav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_UP&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_up&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MEDIA_VOLUME_DOWN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/media_volume_down&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_LOG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/logs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_preferences&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RETRIEVE_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_SUBSCRIPTION_PREFERENCES&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicle_subscriptions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DEACTIVATE_DEVICE_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/device/{device_token}/deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CALENDAR_SYNC&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/upcoming_calendar_entries&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SET_VALET_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/set_valet_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;RESET_VALET_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/reset_valet_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_ACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_activate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_DEACTIVATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_deactivate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_SET_LIMIT&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_set_limit&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SPEED_LIMIT_CLEAR_PIN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/speed_limit_clear_pin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SCHEDULE_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/schedule_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CANCEL_SOFTWARE_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/cancel_software_update&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_SESSION_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/powerwall_order_entry_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;POWERWALL_ORDER_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;powerwall_order_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/onboarding_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;ONBOARDING_EXPERIENCE_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;onboarding_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/referral_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;REFERRAL_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;referral_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_LIST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_COUNTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/count&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_MESSAGE_ACTION_UPDATE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/messages/{message_id}/actions&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;MESSAGE_CENTER_CTA_PAGE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;messages_cta_page&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;CONTENT&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH_COMMAND_TOKEN&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/command_token&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DEVICE_KEY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/users/keys&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;DIAGNOSTICS_ENTITLEMENTS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_DIAGNOSTICS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/diagnostics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_POWER_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/powerhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_ENERGY_TIMESERIES_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/energyhistory&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BATTERY_OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/powerwalls/{battery_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_SUMMARY&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/live_status&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_CONFIG&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_info&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;HISTORY_DATA&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/history&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BACKUP_RESERVE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/backup&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SITE_NAME&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/site_name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;OPERATION_MODE&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/operation&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TIME_OF_USE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/time_of_use_settings&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;STORM_MODE_SETTINGS&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/energy_sites/{site_id}/storm_mode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SEND_NOTIFICATION_CONFIRMATION&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/notification_confirmations&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;NAVIGATION_REQUEST&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;TYPE&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;URI&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;api/1/vehicles/{vehicle_id}/command/navigation_request&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;AUTH&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Atom</title>
      <link>/post/2018/09/atom-2/</link>
      <pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/atom-2/</guid>
      <description>&lt;p&gt;Never trust an atom, they make up everything. 🤓&lt;/p&gt;
&lt;p&gt;#GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>#ML concepts - Regularization, a primer</title>
      <link>/post/2018/09/ml-concepts-regularization-a-primer/</link>
      <pubDate>Sat, 29 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/ml-concepts-regularization-a-primer/</guid>
      <description>&lt;p&gt;Regularization is a fundamental concept in Machine Learning (#ML) and is generally used with &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/06/12/neural-network-basics-activation-functions/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		activation functions
	&lt;/span&gt;
&lt;/a&gt;. It is the key technique that help with overfitting.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Overfitting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Overfitting
	&lt;/span&gt;
&lt;/a&gt; is when an algorithm or model &amp;lsquo;fits&amp;rsquo; the training data too well - it seems to good to be true. Essentially overfitting is when a model being trained, learns the noise in the data instead of ignoring it. If we allow overfitting, then the network only uses (or is more heavily influenced) by a subset of the input (the larger peaks), and doesn&amp;rsquo;t factor in all the input. &lt;/p&gt;
&lt;p&gt;The worry there being that outside of the training data, it might not work as well for &amp;lsquo;real world&amp;rsquo; data. For example the model represented by the green line in the image below (credit: Wikipedia), follows the sample data too closely and seems too good. On the other hand, the model represented by the black line, which is better.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/overfitting.png&#34; alt=&#34;Overfitting example&#34;/&gt;
        &lt;figcaption&gt;Overfitting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Regularization helps with overfitting (artificially) penalizing the weights in the neural network. These weights are represented as peaks, and this reduces the peaks in the data. This ensure that the higher weights (peaks) don&amp;rsquo;t overshadow the rest of the data, and hence getting it to overfit. This diffusion of the weight vectors is sometimes also called weight decay.&lt;/p&gt;
&lt;p&gt;Although there are a few regularization techniques for preventing overfitting (outlined below), these days in Deep Learning, L1 and L2 regression techniques are more favored over the others. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross validation:&lt;/strong&gt; This is a method for finding the best hyper parameters for a model. E.g. in a gradient descent, this would be to figure out the stopping criteria. There are &lt;a
	
		href = &#34;http://www.cs.cmu.edu/~schneide/tut5/node42.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		various ways
	&lt;/span&gt;
&lt;/a&gt; to do this such as the holdout method, k-fold cross validation, leave-out cross validation, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step-wise regression&lt;/strong&gt;: This method essentially is a serial step-by-step regression where one reduces the weakest variable. Step-wise regression essentially does multiple regression a number of times, each time removing the weakest correlated variable. At the end you are left with the variables that explain the distribution best. The only requirements are that the data is normally distributed, and that there is no correlation between the independent variables. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L1 regularization&lt;/strong&gt;: In this method, we modify the cost function by adding the &lt;strong&gt;sum of the absolute values&lt;/strong&gt; of the weights as the penalty (in the cost function).  In L1 regularization the weights shrinks by a constant amount towards zero. L1 regularization is also called &lt;em&gt;Lasso regression&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L2 regularization&lt;/strong&gt;: In L2 regularization on the other hand, we re-scale the weight to a subset factor - it shrinks by an amount that is proportional to the weight (as outlined in the image below). This shrinking makes the weight smaller and is also sometimes called weight decay.  To get this shrinking proportional, we take a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Mean_squared_error&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;strong&gt;squared mean of the weights&lt;/strong&gt;
	&lt;/span&gt;
&lt;/a&gt;, instead of the sum.  At face value it might seem that the weight eventually get to zero, but that is not true; typically other terms cause the weights to increase. L2 regularization is also called &lt;em&gt;Ridge regression&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Max-norm&lt;/strong&gt;: This enforces a upper bound on the magnitude of the weight vector. The one area this helps is that a network cannot &amp;rsquo;explode&amp;rsquo; when the learning rates gets very high, as it is bounded.  This is also called projected gradient descent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a
	
		href = &#34;http://www.cs.toronto.edu/~rsalakhu/papers/srivastava14a.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dropout
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt;: Is very simple, and efficient and is used in conjunction with one of the previous techniques. Essentially it adds a probably on the neuron to keep it active, or &amp;lsquo;dropout&amp;rsquo; by setting it to zero. Dropout doesn&amp;rsquo;t modify the cost function; it modifies the network itself as shown in the image below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Increase training data&lt;/strong&gt;: Whilst one can artificially expand the training set theoretically possible, in reality won&amp;rsquo;t work in most cases, especially in more complex networks. And in some cases one might think also to artificially expand the dataset, typically it is not cost effective to get a representative dataset.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/L1-regularization.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;L1 Regularization&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/L2-regularization.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;L2 Regularization&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/dropout.jpeg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Dropout&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Between L1 and L2 regularization, many say that L2 is preferred, but I think it depends on the problem statement. Say in a network, if a weight has a large magnitude, L2 regularization shrink the weight more than L1 and will better. Conversely, if the weight is small then L1 shrinks the weight more than L2 - and is better as it tends to concentrate the weight in fewer but more important connections in the network.&lt;/p&gt;
&lt;p&gt;In closing, the key aspect to appreciate - the small weights (peaks) in a regularized network essentially means that as our input changes randomly (i.e. noise), it doesn&amp;rsquo;t have a huge impact to the network and its output. So this makes it difficult for the network to learn the noise and respond to that. Conversely, in an unregularized networks, that has higher weights (peaks), small random changes to those weights can have a larger impact to the behavior of the network and the information it carries.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is this why my machine might be slow?</title>
      <link>/post/2018/09/is-this-why-my-machine-might-be-slow/</link>
      <pubDate>Tue, 25 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/is-this-why-my-machine-might-be-slow/</guid>
      <description>&lt;p&gt;Wait. I have how many tabs open? I can’t count more than fingers I have, so not sure if this is accurate. Maybe time to reboot. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;PS – Yes, I can count using more than 10 (toes, remember?)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up your own Model 3 &#34;keyfob&#34; - using a IoT Button</title>
      <link>/post/2018/09/setting-up-your-own-model-3-keyfob-using-a-iot-button/</link>
      <pubDate>Sun, 16 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/setting-up-your-own-model-3-keyfob-using-a-iot-button/</guid>
      <description>&lt;p&gt;Some time ago, I talked about my &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/08/06/my-tesla-model-3-keyfob/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tesla Model 3 &amp;ldquo;keyfob&amp;rdquo;
	&lt;/span&gt;
&lt;/a&gt; which essentially uses a Amazon IoT button to call some of Tesla API&amp;rsquo;s and &amp;ldquo;talk&amp;rdquo; to the car. This for me, is cool as it allows my daughter to unlock, and lock the car at home. And of course it is a bit geeky, and allowing one to play with more things. :)&lt;/p&gt;
&lt;p&gt;Since publishing this, I was surprised how many of you ping me asking on details on how they can did this for themselves. Given the level of interest, I thought I will document this and outline the steps here. I do have to warn you, that this would be a little long - it entails getting a IoT Button configured, and then the code deployed. Before you get started, and if you aren&amp;rsquo;t techy, I would recommend to go through the post completely, so you get a sense of what is needed.&lt;/p&gt;
&lt;p&gt;At a high level, below are the steps that you need to go through to get this working. And this might seem cumbersome and a lot but it is not that difficult. Also if you prefer you can follow the official AWS documentation &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/iot-console-signin.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a AWS Login (if you have a existing Amazon.com login, you can use the same one if you prefer)&lt;/li&gt;
&lt;li&gt;Order a IoT Button&lt;/li&gt;
&lt;li&gt;Register the IoT Button in the AWS Registry (this is done via the AWS console)&lt;/li&gt;
&lt;li&gt;Create (and activate) a device certificate&lt;/li&gt;
&lt;li&gt;Create a IoT security policy&lt;/li&gt;
&lt;li&gt;Attach the IoT security policy (from the previous step) to the device certificate created earlier&lt;/li&gt;
&lt;li&gt;Attach the IoT security policy (now with the associated certificate) to the IoT button&lt;/li&gt;
&lt;li&gt;Configure the IoT button&lt;/li&gt;
&lt;li&gt;Deploy some code - this is done via a server-less function (also called a Lambda function) - this is the code that gets executed&lt;/li&gt;
&lt;li&gt;Test and Deploy&lt;/li&gt;
&lt;li&gt;Enjoy the Fob! :)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;step-1---get-the-iot-button&#34;&gt;Step 1 - Get the IoT Button&lt;/h3&gt;
&lt;p&gt;Of course you need to get a IoT Button; I got the &lt;a
	
		href = &#34;http://a.co/d/j4ipLkW&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS IoT Button (2nd Generation
	&lt;/span&gt;
&lt;/a&gt;) which is what I would recommend.&lt;/p&gt;
&lt;h3 id=&#34;step-2---login-to-aws-iot-console&#34;&gt;Step 2 - Login to AWS IoT Console&lt;/h3&gt;
&lt;p&gt;Open &lt;a
	
		href = &#34;https://aws.amazon.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS home page
	&lt;/span&gt;
&lt;/a&gt; and login with your amazon.com credentials. Of course if you don&amp;rsquo;t have a Amazon.com account, then you want to click in sign up on the top right corner, to get this started.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1-Login-to-AWS.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Login&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After I login, I see something similar to the screenshot below. Your exact view might differ a little.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/2-AWS-Services.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Console&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I recommend to change the region to one closer to you. To do this, click on the region on the top right corner and choose a region that is physically closest to you. In the longer run this would help with latency issues between you clicking the button and the car responding. For example in my case, Oregon makes most sense.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/3-region.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Region Selection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you have a AWS account setup, login to the AWS &lt;a
	
		href = &#34;https://console.aws.amazon.com/iot/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IoT console
	&lt;/span&gt;
&lt;/a&gt; or on the AWS page in the previous step, scroll down to IoT Core as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/4-IoT-console.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AWS Console&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-3---register-iot-button&#34;&gt;Step 3 - Register IoT Button&lt;/h3&gt;
&lt;p&gt;Next step would be to register your IoT button - which of course means you physically have the button with you. The best way to register is to &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/register-device.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		follow the instructions here
	&lt;/span&gt;
&lt;/a&gt;. I don&amp;rsquo;t see much sense in trying to replicate that here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are not very technical, or comfortable, it might be best to use either the &amp;ldquo;AWS IoT Button Dev&amp;rdquo; app which is available both on the &lt;a
	
		href = &#34;https://itunes.apple.com/us/app/aws-iot-button/id1178216626?mt=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Apple Store
	&lt;/span&gt;
&lt;/a&gt; (for iOS) and &lt;a
	
		href = &#34;https://play.google.com/store/apps/details?id=com.amazonaws.iotbutton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google play
	&lt;/span&gt;
&lt;/a&gt; (for Android).&lt;/p&gt;
&lt;p&gt;Once you have registered a button (it doesn’t matter what you call it) - it will show up similar to the screenshot below. I only have one device listed.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/5-Device-view.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;List of IoT things&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-4---create-a-device-certificate&#34;&gt;Step 4 - Create a Device Certificate&lt;/h3&gt;
&lt;p&gt;Next, we need to create and activate a certificate for the device. Without this, the button won&amp;rsquo;t work. The certificate (which is a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/X.509&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		X.509 certificate
	&lt;/span&gt;
&lt;/a&gt;) protects the communication between the button and AWS.&lt;/p&gt;
&lt;p&gt;For most people, the one-click certification creation that AWS has, is probably the way to go. To get to this, on the AWS IoT console, click on Secure and then choose Certificates on the left if not already selected as shown below. I already have a certificate that you can see in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6-certs.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificates&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If you need to create a certificate, click on the &lt;strong&gt;Create&lt;/strong&gt; button on the top right corner, and choose one of the options shown in the image below. In most cases you would want to use the &lt;strong&gt;One-click certificate&lt;/strong&gt; option.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6-certificate-creation.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate creation options&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Once you create a Certificate, you get three files (these are the keys) that you need to download and keep safe. The certificate itself can be downloaded anytime, but the private and the public keys &lt;strong&gt;CANNOT&lt;/strong&gt; be retrieved again after you close this page. It is &lt;strong&gt;IMPORTANT&lt;/strong&gt; that you download these and save them in a safe place.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/7-certificate-keys.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate Keys&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Once you have these downloaded then click on Activate on the bottom. And you should see a different certificate number than what you are seeing here. And don&amp;rsquo;t worry I have long deleted what you are seeing on this screen. :)&lt;/p&gt;
&lt;p&gt;You can also see these in the &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/create-device-certificate.html%ef%bb%bf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		developer guide
	&lt;/span&gt;
&lt;/a&gt; on AWS documentation.&lt;/p&gt;
&lt;h3 id=&#34;step-5---create-a-iot-security-policy&#34;&gt;Step 5 - Create a IoT Security Policy&lt;/h3&gt;
&lt;p&gt;Next step is go back to the &lt;a
	
		href = &#34;https://console.aws.amazon.com/iot/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS IoT Console page
	&lt;/span&gt;
&lt;/a&gt; and click on Policies under Security. This is used to create a IoT policy that you will need to attach to the certificate. Once you have a policy created, then it will look something like the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/8-iot-policies.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policies&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To create a policy, click on Create (or you might be prompted automatically if you don&amp;rsquo;t have one). On the create screen, in the &lt;strong&gt;Name&lt;/strong&gt; you can enter anything that you prefer. I would suggest naming this something that you can remember and differentiate if you will have more than one button. In my case I named it as the same thing as my device.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the policy statements for &lt;strong&gt;Action&lt;/strong&gt; enter &amp;ldquo;iot:Connect&amp;rdquo; - without the quotes, but this is case sensitive so make sure you match is exactly.&lt;/li&gt;
&lt;li&gt;For the &lt;strong&gt;Resource&lt;/strong&gt; ARN enter &amp;ldquo;*&amp;rdquo; (again without the quotes) as shown below.&lt;/li&gt;
&lt;li&gt;And finally for the effect, make sure &amp;ldquo;&lt;strong&gt;Allow&lt;/strong&gt;&amp;rdquo; is checked.&lt;/li&gt;
&lt;li&gt;And click on &lt;strong&gt;Create&lt;/strong&gt; at the bottom.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/9-policy-creation.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policy Creation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;After this is created this you will see the policies listed as shown below. You can see the new one we just created with &amp;ldquo;&lt;em&gt;WhateverNameYouWillRecognize&lt;/em&gt;&amp;rdquo;. You can also see these and more details on the developer documentation - &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-policy.html%ef%bb%bf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Create a AWS IoT Policy
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/10-iot-policies-listed.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Policies&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-6---attach-a-iot-policy&#34;&gt;Step 6 - Attach a IoT Policy&lt;/h3&gt;
&lt;p&gt;Next step is to attach the policy that is just created to the certificate created earlier. To do that, click on Secure and Certificates on the left, and then click on the three dots (called ellipses) on the top right of the Certificate you created earlier. From the new menu that you get, choose &amp;ldquo;&lt;strong&gt;Attach Policy&lt;/strong&gt;&amp;rdquo; as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/11-attach-policy.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Policy to Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;From the resulting menu, select the policy that you had created earlier and select &lt;strong&gt;Attach&lt;/strong&gt;. Using a sensible name that you would recognize would be helpful. You can also see these details on the &lt;a
	
		href = &#34;http://%ef%bb%bfhttps://docs.aws.amazon.com/iot/latest/developerguide/attach-policy-to-certificate.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		developer documentation
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/12-attach-policy-to-cert.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Policy to Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-7---attach-certificate-to-iot-device&#34;&gt;Step 7 - Attach Certificate to IoT Device&lt;/h3&gt;
&lt;p&gt;Next step is to attach the certificate to the IoT device (or thing). A device must have a certificate, a private key and a root CA certificate to authenticate with AWS. Amazon also recommends to attach a device certificate to the device - this probably isn&amp;rsquo;t helpful right now, but might be in the future if you start playing with this more.&lt;/p&gt;
&lt;p&gt;To do this, select the certificate under Security on the left, and same as the previous step, by click on the three dots on the top right corner, select &amp;ldquo;Attach thing&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/13-attach-cert-menu.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And from the next screen select the IoT button that you registered earlier, and select &amp;ldquo;Attach&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/14-attach-cert-screen.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Attach Certificate&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-8---configure-iot-button&#34;&gt;Step 8 - Configure IoT Button&lt;/h3&gt;
&lt;p&gt;To validate that everything is setup correctly - the certificate needs to be associated with a policy, and a thing (the IoT button in our case). So on the Certificates menu on the left, select your certificate by clicking on it (not the three dots this time - but rather the name). You will see a new screen that shows the details of the certificate as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/15-cert-details.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Certificate Details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the new menu on the left, if you click on Policies you should see the policy you created, and the Things should have the IoT button you created earlier.&lt;/p&gt;
&lt;p&gt;Once all of this is done the next step is to configure the device. You can see more detailed steps on this on the developer &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		guide here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KEY TIP&lt;/strong&gt;: The documentation doesn&amp;rsquo;t make it too obvious, but as part of configuring - the device (IoT Button) will become an access point that you will need to connect to and upload the certificates and key you created earlier. You cannot do this from a phone and it is best done from a desktop/laptop that has wifi network. Whilst these days all laptops will have a wifi network card, that isn&amp;rsquo;t necessarily true for desktops. So use a machine which has a wifi that you can temporarily connect to the access point that the IoT device creates.&lt;/li&gt;
&lt;li&gt;Note this is only needed for getting the device configured to authenticate for AWS, and get on your Wifi network; once that is done you don&amp;rsquo;t need to do this.&lt;/li&gt;
&lt;li&gt;Once you have configured the device as outlined (&lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://docs.aws.amazon.com/iot/latest/developerguide/configure-iot.html
	&lt;/span&gt;
&lt;/a&gt;) then continue to the next step.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;step-9---deploy-some-code&#34;&gt;Step 9 - Deploy some code&lt;/h3&gt;
&lt;p&gt;At last we are starting to get the interesting part - a lot of what we were doing until now, was getting the button configured and ready.&lt;/p&gt;
&lt;p&gt;Now that you have a IoT button configured and registered, the next step is to deploy some code. For this you need to setup a Lambda function using the &lt;a
	
		href = &#34;https://console.aws.amazon.com/lambda/home&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS Lambda Console
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you login, click on Create Function. On the &lt;strong&gt;Create function&lt;/strong&gt; screen, choose the &lt;strong&gt;Blueprints&lt;/strong&gt; option as shown below. You can see some of these in the developer &lt;a
	
		href = &#34;https://docs.aws.amazon.com/iot/latest/developerguide/iot-button-lambda.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		documentation here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/12-Create-function.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Create Function screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-10---blueprint-search&#34;&gt;Step 10 - Blueprint Search&lt;/h3&gt;
&lt;p&gt;On the Blueprints search box (which says Filters by tags), type in &amp;ldquo;&lt;strong&gt;button&lt;/strong&gt;&amp;rdquo; (without quotes) and press enter. You should see an option called &amp;ldquo;&lt;strong&gt;iot-button-email&lt;/strong&gt;&amp;rdquo; as shown below, select that and click &lt;strong&gt;configure&lt;/strong&gt; on the bottom right corner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/13-Create-function-iot-button.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Button filter&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-11---basic-information&#34;&gt;Step 11 - Basic Information&lt;/h3&gt;
&lt;p&gt;On the next screen that says &amp;ldquo;Basic information&amp;rdquo;, enter the details as shown below. The names should be meaningful for you to remember. Roles can be reused across other areas, for now you can use a simple name something like &amp;ldquo;unlockCar&amp;rdquo; or &amp;ldquo;unlockCarSomeName&amp;rdquo; if you have more than one vehicle. The policy template should already be populated and you shouldn’t need to do anything else.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/14-function-basic-info.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Function basic information&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For the 2nd half - AWS IoT Trigger, select the IoT type as &amp;ldquo;IoT Button&amp;rdquo; and enter your device serial number as outlined in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/15-IoT-trigger.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;IoT Trigger&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It won&amp;rsquo;t hurt to download these certificate and keys in addition to the ones created separately and save them in different folders. And for the Lambda function code, it doesn’t matter on the template code as we will be deleting it all. At this point that will be read-only and you won&amp;rsquo;t be able to modify anything - as shown in the screen shot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/16-Lambda-function.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Lambda function&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally scrolling down more, you will see the environment variables. Here is where you need to specify your Tesla credentials to it to be able to use create the token and call the Tesla API. For that you need the following two variables: &lt;strong&gt;TESLA_EMAIL&lt;/strong&gt; and &lt;strong&gt;TESLA_PASS&lt;/strong&gt;. These case sensitive so you need to enter them as is. And then finally click on Create function.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/17-environment-variables.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Environment Variables&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-12---code-upload&#34;&gt;Step 12 - Code upload&lt;/h3&gt;
&lt;p&gt;Once you create a function, you will see something like the screen below. In my case the function is called &amp;ldquo;unlockSquirty&amp;rdquo; which is what you are seeing. This is divided in to two parts - when on the Configuration page. The top part is the designer that visually shows you what inputs are the triggers that execute the function, and then what it outputs to on the right hand side.  And below the designer is the editor where one can edit the code inline or upload a zip file with the code.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/18-unlock-squirty.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In the function code section, on the first drop down in the left (Code entry type) select upload a .zip file.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/19-function-code-source.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the next screen upload the function package that you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/iot-button-lambda-function-package-unlock-tesla&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download from here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure the Runtime is Node.js 8.10&lt;/li&gt;
&lt;li&gt;Keep the Handler as the default.&lt;/li&gt;
&lt;li&gt;Double check your Environment variable contain TESLA_EMAIL, and TESLA_PASS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/20-function-code.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And scroll down and in the Basic settings, change the &lt;strong&gt;timeout&lt;/strong&gt; to &lt;strong&gt;1 minute&lt;/strong&gt;. We run thus asynchronously and adding a little buffer would be better. You can leave all the other settings at their default. If your network might be iffy you can make this 2 mins.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/21-env-setting.png&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Environment Settings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;step-13---code-publish&#34;&gt;Step 13 - Code Publish&lt;/h3&gt;
&lt;p&gt;Once you have entered all of this, click on &lt;strong&gt;Save&lt;/strong&gt; on the top right corner and then &lt;strong&gt;publish&lt;/strong&gt; new version. Finally once it is published you will be able to see the code show up as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/22-code.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Again, a single click will unlock the car, a double-click would lock it, and a long press (holding it for 2-3 seconds) would open the charge port door.&lt;/p&gt;
&lt;p&gt;And here is the code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; tjs &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; require(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;teslajs&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; username &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process.env.TESLA_EMAIL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; password &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; process.env.TESLA_PASS;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; exports.handler &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; (event, context, callback) =&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  tjs.loginAsync(username, password).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(result) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; token &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; JSON.stringify(result.authToken);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (token)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Login Succesful!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; options &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    authToken&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; result.authToken
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   tjs.vehicleAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(vehicle) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Vehicle &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; vehicle.vin &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; is: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;+&lt;/span&gt; vehicle.state);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; options &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     authToken&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; result.authToken,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     vehicleID&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt; vehicle.id_s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;SINGLE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Single click, attempting to UNLOCK&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.doorUnlockAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(unlockResult) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Doors are now UNLOCKED&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DOUBLE&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Double click, attempting to LOCK&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.doorLockAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(lockResults) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Doors are now LOCKED&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(event.clickType &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;LONG&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Long click, attempting to CHARGE PORT&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     tjs.openChargePortAsync(options).done(&lt;span style=&#34;color:#ed8796&#34;&gt;function&lt;/span&gt;(openResult) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      console.log(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Charge port is now OPEN&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     });              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Tesla .ssq file?</title>
      <link>/post/2018/09/tesla-ssq-file/</link>
      <pubDate>Fri, 14 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/tesla-ssq-file/</guid>
      <description>&lt;p&gt;Tonight, I was a large download by the car, and saw that it was a .ssq file. The file name is consistent with the firmware naming convention, but I am not sure on what it is. The file itself is 5.11 GB, and in my case its name starts with &amp;ldquo;NA&amp;rdquo;. I am guessing, this might be the maps its updating.&lt;/p&gt;
&lt;p&gt;Below are a couple of screenshots showing this. I am trying to make sense of the binary file, but not making much headway.&lt;/p&gt;
&lt;p&gt;Curious, anyone has any ideas?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-firmware-Capture.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-firmware-Capture2.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I found out what .ssq files are; &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/10/08/update-on-tesla-ssq-files/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read up more here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural Network - Cheat Sheet</title>
      <link>/post/2018/09/neural-network-cheat-sheet/</link>
      <pubDate>Tue, 11 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/neural-network-cheat-sheet/</guid>
      <description>&lt;p&gt;Neural Networks, today, help in a great set of tasks, that until very recently wasn&amp;rsquo;t possible at all - be it from computer vision, to medical diagnosis, to speech translation and forms a key cornerstone to a lot of &amp;lsquo;magic&amp;rsquo; that Machine Learning and AI offers today.&lt;/p&gt;
&lt;p&gt;I did blog about &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/03/16/neural-networks/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Neural Network types (and MarI/O) sometime back
	&lt;/span&gt;
&lt;/a&gt;; I surely cannot take credit for creating these three cheat sheets but they are awesome and hope you get to use and enjoy them too.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_hdcEBE3zH8bRCj_gyIQC9Q1.png?fit=1600%2C2400&#34; alt=&#34;Neural Network Graphs&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_ytq3WnAg5KywR97gudy5vg1.png?fit=1600%2C2262&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://i1.wp.com/desigeek.com/blog/amit/wp-content/uploads/2018/09/1_7XUd38YFCPAcgmlrS875XA1.png?fit=1600%2C2262&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Clearing out Windows 10 command prompt history</title>
      <link>/post/2018/09/clearing-out-windows-10-command-prompt-history/</link>
      <pubDate>Fri, 07 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/clearing-out-windows-10-command-prompt-history/</guid>
      <description>&lt;p&gt;My command prompt history is quite long, and a lot over time is not essentially garbage. I was looking at a way to clean it out. Most of the solutions online I found were not correct - I don&amp;rsquo;t know if things changed over time, but the latest version of Windows I am on (Windows 10 Pro 1803), it did not work.&lt;/p&gt;
&lt;p&gt;So, here are two ways that you can do this. One is using the registry editor (RegEdit), and the other is running a simple script that you can either copy and paste from below or you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download and run it
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are going to be using RegEdit, and living dangerously then Press WinKey + R and type &amp;ldquo;regedit&amp;rdquo; (without quotes) and press enter to get the Registry Editor going as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture-regedit-run.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Run command to start Registry Editor&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And on the new Windows navigate to the following key: &lt;strong&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&lt;/strong&gt; and delete that. You can right click on the key name and choose delete.&lt;/p&gt;
&lt;p&gt;It is important to double check because if you miss it, or delete something else, there is no recovery. (Why do you think I was saying, you like to live dangerously). See the screenshot below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Capture-RegEdit.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;NOTE: It is always recommended to backup the registry before doing this, so at least you could restore it back to the state. To backup select File -&amp;gt; Export.&lt;/p&gt;
&lt;p&gt;A better way, and less dangerous would be to run the following script in a &lt;a
	
		href = &#34;https://www.howto-connect.com/access-elevated-command-prompt-on-windows-10/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		elevated command prompt
	&lt;/span&gt;
&lt;/a&gt; (i.e. a Admin command prompt) which will do the same thing, but more safer. You can just copy the command from below and paste it. Or alternatively you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/script-to-clear-windows-run-history&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download this simple script
	&lt;/span&gt;
&lt;/a&gt; and run it locally (also from a elevated command prompt).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reg delete &amp;#34;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU&amp;#34; /f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Tesla debug/diagnostic screens</title>
      <link>/post/2018/09/tesla-debug-diagnostic-screens/</link>
      <pubDate>Thu, 06 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/tesla-debug-diagnostic-screens/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know how to get to debug / dev mode on a Tesla, but did come across &lt;a
	
		href = &#34;https://plus.google.com/u/0/102621178199196500076/posts/HZtBTFikcgm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this old post
	&lt;/span&gt;
&lt;/a&gt;, on how someone was in a test drive, which did  have this mode.&lt;/p&gt;
&lt;p&gt;Now this is quite old, so a lot has changed, but am impressed that a lot of the components and foundational architecture was setup. I am particularly impressed how each cell in the battery pack and report its state. The BMS that you see is the Battery Management System - that firmware is separate from the car&amp;rsquo;s firmware.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/IMG_0876.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Tesla diagnostic screen&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can see more photos and geek out &lt;a
	
		href = &#34;https://plus.google.com/u/0/photos/102621178199196500076/album/5776377343146944705&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online here.
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And of course if you really want to geek out, then check out &lt;a
	
		href = &#34;https://www.su-tesla.space/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		su-tesla
	&lt;/span&gt;
&lt;/a&gt;, where Hemera has really has &lt;a
	
		href = &#34;https://www.ibtimes.co.uk/how-play-movies-tesla-model-s-display-using-this-simple-hack-1556672&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		gone to party
	&lt;/span&gt;
&lt;/a&gt;. I don&amp;rsquo;t know how to do this, and I have a lot of respect for &lt;a
	
		href = &#34;https://twitter.com/su_hemera&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hemera
	&lt;/span&gt;
&lt;/a&gt; to do this - she has a lot of guts. Also not sure what the wife would think about it and kick me out. Maybe. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/tumbler.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am curious though, if those &amp;lsquo;custom&amp;rsquo; Ethernet connectors are &lt;a
	
		href = &#34;https://www.digikey.com/Web%20Export/Supplier%20Content/OmronIndustrialAutomation_236/PDF/OmronIA_M12Connector.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		M12 connectors (PDF)
	&lt;/span&gt;
&lt;/a&gt; which are quite standard in some industries. Even &lt;a
	
		href = &#34;https://www.amazon.com/m12-ethernet-cable/s?page=1&amp;amp;rh=i%3Aaps%2Ck%3Am12%20ethernet%20cable&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon sells cables
	&lt;/span&gt;
&lt;/a&gt; for them.&lt;/p&gt;
&lt;p&gt;And finally, from a more (relatively) recent &lt;a
	
		href = &#34;https://electrek.co/2017/05/15/tesla-hack-autopilot-debugging-mode/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		update
	&lt;/span&gt;
&lt;/a&gt;, the AutoPilot has a tremendous amount of data. As reported here, and you can see on the video below, the volume of data is massive, and quite interesting. For example, what decides there are 4 virtual lanes? The car below is a US car (the country code 840 is a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/ISO_3166-1_numeric&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ISO 3166 code
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://electrek.co/wp-content/uploads/sites/3/2017/05/ap-debug-8.jpg?quality=82&amp;amp;strip=all&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/4vZe2dh5I6s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2018/09/thought-of-the-day-9/</link>
      <pubDate>Mon, 03 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/09/thought-of-the-day-9/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Beware of programmers that carry screwdrivers&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- Unknown&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Tesla voice command list</title>
      <link>/post/2018/08/tesla-voice-command-list/</link>
      <pubDate>Fri, 31 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/tesla-voice-command-list/</guid>
      <description>&lt;p&gt;As I was trying to understand more on the capabilities of the car, and what options I can do. The voice recognition on the car is quite impressive, it does seem as good at understanding as Amazon&amp;rsquo;s Echo, at least in the early days of &amp;ldquo;Alexa&amp;rdquo; (but that is a different story for another time).&lt;/p&gt;
&lt;p&gt;I was trying to understand what things can I control, or the options one has via the voice. I am still not used to it, and keep forgetting, that is a option especially when driving. As of the v8 firmware series, the following are the choices that work for voice. Credit to &lt;a
	
		href = &#34;https://www.youtube.com/user/Ingineerix/videos&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ingineer
	&lt;/span&gt;
&lt;/a&gt; for discovering the full list when hacking the car.&lt;/p&gt;
&lt;p&gt;The options in English are listed below, and this is missing the &amp;ldquo;ho ho ho&amp;rdquo; Easter egg and also the &amp;ldquo;&lt;a
	
		href = &#34;https://twitter.com/elonmusk/status/872935638944800769&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cancel navigation&amp;rdquo; command
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;voice_command_list&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;where is&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dial&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;phone&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;plays&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens 2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And if you are keen to know, these are stored as a json file internally, and the fill list here here:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;199&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#199&#34;&gt;199&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;200&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#200&#34;&gt;200&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;201&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#201&#34;&gt;201&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;202&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#202&#34;&gt;202&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;203&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#203&#34;&gt;203&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;204&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#204&#34;&gt;204&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;205&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#205&#34;&gt;205&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;206&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#206&#34;&gt;206&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;207&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#207&#34;&gt;207&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;208&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#208&#34;&gt;208&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;209&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#209&#34;&gt;209&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;210&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#210&#34;&gt;210&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;211&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#211&#34;&gt;211&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;212&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#212&#34;&gt;212&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;213&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#213&#34;&gt;213&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;214&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#214&#34;&gt;214&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;215&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#215&#34;&gt;215&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;216&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#216&#34;&gt;216&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;217&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#217&#34;&gt;217&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;218&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#218&#34;&gt;218&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;219&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#219&#34;&gt;219&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;220&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#220&#34;&gt;220&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;221&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#221&#34;&gt;221&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;222&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#222&#34;&gt;222&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;223&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#223&#34;&gt;223&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;224&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#224&#34;&gt;224&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;225&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#225&#34;&gt;225&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;226&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#226&#34;&gt;226&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;227&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#227&#34;&gt;227&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;228&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#228&#34;&gt;228&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;229&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#229&#34;&gt;229&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;230&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#230&#34;&gt;230&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;231&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#231&#34;&gt;231&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;232&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#232&#34;&gt;232&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;233&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#233&#34;&gt;233&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;234&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#234&#34;&gt;234&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;235&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#235&#34;&gt;235&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;236&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#236&#34;&gt;236&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;237&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#237&#34;&gt;237&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;238&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#238&#34;&gt;238&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;239&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#239&#34;&gt;239&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;240&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#240&#34;&gt;240&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;241&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#241&#34;&gt;241&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;242&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#242&#34;&gt;242&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;243&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#243&#34;&gt;243&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;244&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#244&#34;&gt;244&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;245&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#245&#34;&gt;245&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;246&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#246&#34;&gt;246&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;247&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#247&#34;&gt;247&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;248&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#248&#34;&gt;248&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;249&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#249&#34;&gt;249&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;250&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#250&#34;&gt;250&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;251&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#251&#34;&gt;251&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;252&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#252&#34;&gt;252&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;253&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#253&#34;&gt;253&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;254&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#254&#34;&gt;254&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;255&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#255&#34;&gt;255&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;256&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#256&#34;&gt;256&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;257&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#257&#34;&gt;257&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;258&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#258&#34;&gt;258&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;259&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#259&#34;&gt;259&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;260&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#260&#34;&gt;260&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;261&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#261&#34;&gt;261&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;262&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#262&#34;&gt;262&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;263&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#263&#34;&gt;263&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;264&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#264&#34;&gt;264&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;265&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#265&#34;&gt;265&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;266&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#266&#34;&gt;266&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;267&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#267&#34;&gt;267&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;268&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#268&#34;&gt;268&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;269&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#269&#34;&gt;269&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;270&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#270&#34;&gt;270&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;271&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#271&#34;&gt;271&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;272&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#272&#34;&gt;272&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;273&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#273&#34;&gt;273&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;274&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#274&#34;&gt;274&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;275&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#275&#34;&gt;275&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;276&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#276&#34;&gt;276&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;277&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#277&#34;&gt;277&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;278&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#278&#34;&gt;278&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;279&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#279&#34;&gt;279&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;280&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#280&#34;&gt;280&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;281&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#281&#34;&gt;281&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;282&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#282&#34;&gt;282&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;283&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#283&#34;&gt;283&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;284&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#284&#34;&gt;284&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;285&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#285&#34;&gt;285&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;286&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#286&#34;&gt;286&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;287&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#287&#34;&gt;287&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;288&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#288&#34;&gt;288&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;289&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#289&#34;&gt;289&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;290&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#290&#34;&gt;290&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;291&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#291&#34;&gt;291&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;292&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#292&#34;&gt;292&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;293&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#293&#34;&gt;293&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;294&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#294&#34;&gt;294&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;295&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#295&#34;&gt;295&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;296&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#296&#34;&gt;296&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;297&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#297&#34;&gt;297&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;298&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#298&#34;&gt;298&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;299&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#299&#34;&gt;299&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;300&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#300&#34;&gt;300&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;301&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#301&#34;&gt;301&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;302&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#302&#34;&gt;302&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;303&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#303&#34;&gt;303&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;304&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#304&#34;&gt;304&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;305&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#305&#34;&gt;305&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;306&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#306&#34;&gt;306&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;307&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#307&#34;&gt;307&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;308&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#308&#34;&gt;308&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;309&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#309&#34;&gt;309&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;310&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#310&#34;&gt;310&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;311&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#311&#34;&gt;311&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;312&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#312&#34;&gt;312&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;313&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#313&#34;&gt;313&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;314&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#314&#34;&gt;314&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;315&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#315&#34;&gt;315&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;316&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#316&#34;&gt;316&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;317&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#317&#34;&gt;317&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;318&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#318&#34;&gt;318&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;319&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#319&#34;&gt;319&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;320&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#320&#34;&gt;320&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;321&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#321&#34;&gt;321&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;322&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#322&#34;&gt;322&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;323&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#323&#34;&gt;323&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;324&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#324&#34;&gt;324&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;325&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#325&#34;&gt;325&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;326&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#326&#34;&gt;326&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;327&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#327&#34;&gt;327&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;328&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#328&#34;&gt;328&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;329&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#329&#34;&gt;329&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;330&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#330&#34;&gt;330&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;331&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#331&#34;&gt;331&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;332&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#332&#34;&gt;332&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;333&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#333&#34;&gt;333&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;334&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#334&#34;&gt;334&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;335&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#335&#34;&gt;335&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;336&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#336&#34;&gt;336&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;337&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#337&#34;&gt;337&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;338&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#338&#34;&gt;338&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;339&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#339&#34;&gt;339&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;340&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#340&#34;&gt;340&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;341&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#341&#34;&gt;341&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;342&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#342&#34;&gt;342&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;343&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#343&#34;&gt;343&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;344&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#344&#34;&gt;344&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;345&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#345&#34;&gt;345&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;346&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#346&#34;&gt;346&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;347&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#347&#34;&gt;347&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;348&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#348&#34;&gt;348&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;349&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#349&#34;&gt;349&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;350&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#350&#34;&gt;350&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;351&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#351&#34;&gt;351&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;352&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#352&#34;&gt;352&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;353&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#353&#34;&gt;353&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;354&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#354&#34;&gt;354&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;355&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#355&#34;&gt;355&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;356&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#356&#34;&gt;356&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;357&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#357&#34;&gt;357&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;358&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#358&#34;&gt;358&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;359&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#359&#34;&gt;359&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;360&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#360&#34;&gt;360&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;361&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#361&#34;&gt;361&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;362&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#362&#34;&gt;362&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;363&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#363&#34;&gt;363&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;364&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#364&#34;&gt;364&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;365&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#365&#34;&gt;365&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;366&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#366&#34;&gt;366&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;367&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#367&#34;&gt;367&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;368&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#368&#34;&gt;368&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;369&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#369&#34;&gt;369&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;370&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#370&#34;&gt;370&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;371&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#371&#34;&gt;371&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;372&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#372&#34;&gt;372&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;373&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#373&#34;&gt;373&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;374&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#374&#34;&gt;374&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;375&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#375&#34;&gt;375&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;376&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#376&#34;&gt;376&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;377&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#377&#34;&gt;377&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;378&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#378&#34;&gt;378&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;379&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#379&#34;&gt;379&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;380&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#380&#34;&gt;380&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;381&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#381&#34;&gt;381&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;382&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#382&#34;&gt;382&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;383&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#383&#34;&gt;383&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;384&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#384&#34;&gt;384&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;385&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#385&#34;&gt;385&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;386&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#386&#34;&gt;386&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;387&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#387&#34;&gt;387&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;388&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#388&#34;&gt;388&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;389&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#389&#34;&gt;389&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;voice_command_list&amp;#34;&lt;/span&gt; : [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;drive&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^drive\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dr&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dr\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigate\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;where is&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^where is\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;take me&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^take me\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;naviguer à&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^naviguer à\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;naviguer au&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^naviguer au\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aller à&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^aller à\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;aller au&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^aller au\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nach navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^nach\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zur navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zur\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zu navigieren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zu\\b(.*)\\bnavigieren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;nach fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^nach\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zur fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zur\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;zu fahren&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^zu\\b(.*)\\bfahren$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wo ist&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^wo ist\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigiere nach&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigiere nach\\b(.*)\\b$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigiere zu&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^navigiere zu\\b(.*)\\b$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;导航到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^导航到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;在哪&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)在哪$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;开车到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^开车到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;导航去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^导航去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;導航去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^導航去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;導航到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^導航到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;帶我去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^帶我去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;帶我到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^帶我到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;navigate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;到&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^到(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^call\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;dial&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^dial\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;phone&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^phone\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;appeler&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^appeler\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;composer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^composer\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wählen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bwählen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;anrufen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\banrufen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;wähle&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^wählen\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ruf an&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^ruf\\b(.*)\\ban$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;rufe an&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^rufe\\b(.*)\\ban$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打电话给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打电话给(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打电话给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^给(.*)打电话$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;拨打&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^拨打(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打给&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打给(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話俾&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話俾(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打俾&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打俾(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打去&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打去(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打電話比&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打電話比(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;call&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;打比&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^打比(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^note\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^report\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^bug note\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;note&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;bug report&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^bug report\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^play\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;plays&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^plays\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listen to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens to&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listens to\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listen 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listen 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;listens 2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^listens 2\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;écouter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^écouter\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;jouer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^jouer\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spielen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bspielen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;hören&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\bhören$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;abspielen&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\babspielen$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;abhören&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^(.*)\\babhören$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spiele&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^spiele\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;spiel&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^spiel\\b(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;播放&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^播放(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;收听&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^收听(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_type&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;play&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;我想聽&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;command_regexp&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;^我想聽(.*)$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Whilst the #NLP engine working on this is quite good, and impressive, I am hopeful that there will be more options added. Elon did share that is something they are working on, and it might be part of the updated v9 release coming out in the next few weeks.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34; data-width=&#34;550&#34; data-height=&#34;600&#34;&gt;
  &lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;
    &lt;a href=&#34;https://twitter.com/elonmusk/status/952750646406426624?ref_src=twsrc%5Etfw&#34;&gt;
      Loading tweet from @elonmusk...
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;a href=&#34;https://twitter.com/elonmusk/status/952750646406426624?ref_src=twsrc%5Etfw&#34; class=&#34;twitter-tweet-link&#34;&gt;
    View on Twitter
  &lt;/a&gt;
&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

</description>
    </item>
    
    <item>
      <title>How many lines of code does it take?</title>
      <link>/post/2018/08/how-many-lines-of-code-does-it-take/</link>
      <pubDate>Wed, 29 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/how-many-lines-of-code-does-it-take/</guid>
      <description>&lt;p&gt;Often once hears are Lines of Code (LoC) as a metric. And for you to get a sense of what it means, below is a info-graphic that outlines some popular products, and services and the LoC that takes. Always interesting to get perspective - either appreciate some home grown system you are managing, or worried about a stinking pile you are going to inherit or build. &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1276_lines_of_code_sep2015_fb.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Generating Tesla authentication token - cURL script</title>
      <link>/post/2018/08/generating-tesla-authentication-token-curl-script/</link>
      <pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/generating-tesla-authentication-token-curl-script/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; This cURL script doesn&amp;rsquo;t work anymore. This was originally published back in 2018 when it was the best way to do this. Over the last few years however Tesla has deprecated this endpoint (/oauth/token) and moved to a SSO service (auth.tesla.com) which is a completely different approach. I&amp;rsquo;ll have a look and if there is a simple way to do it, then will share it here.&lt;/p&gt;
&lt;p&gt;I did write a simple &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/08/06/windows-tesla-auth-token-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows (desktop) app
	&lt;/span&gt;
&lt;/a&gt; called TeslaTokenGenerator, for those who wanted to create authentication tokens for their Tesla, and use with 3rd party apps/data loggers. &lt;/p&gt;
&lt;p&gt;TeslaTokenGenerator can also create a &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/CURL&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cURL script
	&lt;/span&gt;
&lt;/a&gt; for you to use, if you prefer not wanting to install anything. It is easy to find this online, but some of you have pinged me to get more details on this. So, I have the script below that you can use. Once you copy this, you will need to update your Tesla account login details (email and password) and run it in a console (command line) and it will all the same API&amp;rsquo;s to create the token, which then you can save.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Cache-Control: no-cache&amp;#34;&lt;/span&gt; -H &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;grant_type=password&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;client_id=81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;client_secret=c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;email=YOUR-TESLA-LOGIN-EMAIL@SOMEWHERE.COM&amp;#34;&lt;/span&gt; -F &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;password=YOUR-TESLA-ACCOUNT-PASSWORD&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;https://owner-api.teslamotors.com/oauth/token&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can see the screenshots of this below too - one in Windows, and another in Linux (well &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2016/04/19/bash-on-windows-is-real-not-a-vm/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bash on Windows
	&lt;/span&gt;
&lt;/a&gt;, but it is real Linux).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-windows.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-linux.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Tesla Model 3 &#34;Keyfob&#34;</title>
      <link>/post/2018/08/my-tesla-model-3-keyfob/</link>
      <pubDate>Tue, 07 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/my-tesla-model-3-keyfob/</guid>
      <description>&lt;p&gt;Inspired by a few folks on a few &lt;a
	
		href = &#34;https://www.reddit.com/user/mikes312&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		forums online
	&lt;/span&gt;
&lt;/a&gt;, I took the liberty to extend their idea using a IoT Button, that acts as a simple &amp;ldquo;keyfob&amp;rdquo; for the Model 3.&lt;/p&gt;
&lt;p&gt;The main goal was being to allow my daughter to lock and unlock the car at home. She is too young to have a phone, and without a more traditional fob, this gets a little annoying. &lt;/p&gt;
&lt;p&gt;I extended the original idea, to understand the different presses (Single, Double, and Long press), and accordingly called the appropriate API to lock the car (single press - think of it as a single click), unlock on a double press, and open the charge port on a long press (when one presses and holds the button 2-3 secs).&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/J6IxNfJ-L7I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;For those who aren&amp;rsquo;t aware, the Amazon IoT buttons calls a Lambda function on AWS and plugging into that, one can extend this. The button needs to be connected, and online for this to work, and in my case, it is on the home wifi network. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Many of you asked on how to set this up for yourself; I got around to blogging all the step on that; you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/09/16/setting-up-your-own-model-3-keyfob-using-a-iot-button/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		read those here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Tesla Auth Token Generator</title>
      <link>/post/2018/08/windows-tesla-auth-token-generator/</link>
      <pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/08/windows-tesla-auth-token-generator/</guid>
      <description>&lt;p&gt;If you have a Tesla, and are using (or wanting to use) 3rd party tools or data loggers, the one think they of course need is to authenticate your details with Tesla. A simple, but insecure way is to use your Tesla credentials - and surprisingly many people just happily share and use this.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t comfortable doing this - after-all, they have access to your account where you can control a lot of things. Also, there are a few online tools that can generate the auth token, but again I wasn&amp;rsquo;t comfortable, as I did not know what they saved, or what they did not. :)&lt;/p&gt;
&lt;p&gt;So, I wrote a simple Windows app that can allow you to generate a auth token that you can save. The application itself is simple. You enter your Tesla credentials, click on Generate Token and can save the generated token. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Tesla-token-generator.png&#34; alt=&#34;Tesla Token Generator Application&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To test, if the generated token is working - click on the Test Token button. If everything is working as expected, you will see a list of vehicles that is associated with your account.&lt;/p&gt;
&lt;p&gt;If you prefer to use the cURL script, click on the Generate cURL, will generate this and copy it to your clipboard. And it works across operating systems as you can see below (Windows, and Linux), but should also work on Mac.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-linux.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/cURL-windows.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do intent to open source this, so folks can have a look at the code, and the Tesla REST APIs. Until then you can &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/download/tesla-token-generator/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download the setup from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Leave a comment if you have any issues or any requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; v1.0.1 Published with minor updates. You can download from the same link above. This adds the revoke screen and some house keeping.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The merits of #AI</title>
      <link>/post/2018/07/the-merits-of-ai/</link>
      <pubDate>Mon, 02 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/07/the-merits-of-ai/</guid>
      <description>&lt;p&gt;Thought of the week:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Artificial Intelligence stands no chance against natural Stupidity.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#ArtificalIntelligence&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>#ML training data</title>
      <link>/post/2018/06/ml-training-data/</link>
      <pubDate>Fri, 15 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/ml-training-data/</guid>
      <description>&lt;p&gt;Seem like my training data for the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/05/30/my-self-driving-car/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		car
	&lt;/span&gt;
&lt;/a&gt; - perhaps a hint of #bias. 😂&lt;/p&gt;
&lt;p&gt;#GeekyJokes #ML #AIJokes&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/img_3946.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural network basics &amp; Activation functions</title>
      <link>/post/2018/06/neural-network-basics-activation-functions/</link>
      <pubDate>Tue, 12 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/neural-network-basics-activation-functions/</guid>
      <description>&lt;p&gt;Neural networks have a very interesting aspect – they can be viewed as a simple mathematical model that defines a function. For a given function $f(x)$ which can take any input value of $x$, there will be some kind a neural network satisfying that function. This hypothesis was proven almost 20 years ago (“&lt;a
	
		href = &#34;http://www.dartmouth.edu/~gvc/Cybenko_MCSS.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Approximation by Superpositions of a Sigmoidal Function
	&lt;/span&gt;
&lt;/a&gt;” and “&lt;a
	
		href = &#34;https://pdfs.semanticscholar.org/f22f/6972e66bdd2e769fa64b0df0a13063c0c101.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Multilayer feedforward networks are universal approximators
	&lt;/span&gt;
&lt;/a&gt;”) and forms the basis of much of #AI and &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2018/06/04/machine-learning-use-cases/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		#ML use cases possible
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is this aspect of neural networks that allow us to map any process and generate a corresponding function. Unlike a function in Computer Science, this function isn’t deterministic; instead is confidence score of an approximation (i.e. a probability). The more layers in a neural network, the better this approximation will be.&lt;/p&gt;
&lt;p&gt;In a neural network, typically there is one input layer, one output layer, and one or more layers in the middle. To the external system, only the input layer (values of $x$), and the final output (output of the function $f(x)$) is visible, and the layers in the middle are not and are essentially hidden.&lt;/p&gt;
&lt;p&gt;Each layer contains nodes, which are modeled after how the neurons in the brain works. The output of each node gets propagated along to the next layer. This output is the defining character of the node, and activates the node to pass on its value to the next node; this is very similar to how a neuron in the brain fires and works passing on the signal to the next neuron.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-5.png&#34; alt=&#34;Neural Network&#34;/&gt;
        &lt;figcaption&gt;Neural Network&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To make this generalization of function $f(x)$ outlined above to hold, that function needs to be &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Continuous_function&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a continuous function
	&lt;/span&gt;
&lt;/a&gt;. A continuous function is one where small changes to the input value $x$, create small changes to the output of $f(x)$. If these outputs, are not small and the value jumps a lot then it is not continuous and it is difficult for the function to achieve the approximation required for them to be used in a neural network.&lt;/p&gt;
&lt;p&gt;For a neural network to ‘learn’ – the network essentially has to use different weights and biases that has a corresponding change to the output, and possibly closer to the result we desire. Ideally, small changes to these weights and biases correspond to small changes in the output of the function. But one isn&amp;rsquo;t sure, until we train and test the result, to see that small changes don’t have bigger shifts that drastically move away from the desired result. It isn&amp;rsquo;t uncommon to see that one aspect of the result has improved, but others have not and overall skew the results.&lt;/p&gt;
&lt;p&gt;In simple terms, an activation function is a node that is attached to the output of a neural network and maps the resulting value between 0 and 1. It is also used to connect two neural networks.&lt;/p&gt;
&lt;p&gt;An activation function can be linear, or non-linear. A linear isn’t effective as its range is infinite. A non-linear with a finite range is more useful as it can be mapped as a curve, and then changes on this curve can be used to calculate the difference in the curve between two points.&lt;/p&gt;
&lt;p&gt;There are many times of activation functions, each either its strengths. In this post, we discuss the following six:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sigmoid&lt;/li&gt;
&lt;li&gt;Tanh&lt;/li&gt;
&lt;li&gt;ReLU&lt;/li&gt;
&lt;li&gt;Leaky ReLU&lt;/li&gt;
&lt;li&gt;ELU&lt;/li&gt;
&lt;li&gt;Maxout&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. Sigmoid function&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A sigmoid function can map any of input values into a probability – i.e., a value between 0 and 1. A sigmoid function is typically shown using a sigma ($\sigma$). Some also call the ($\sigma$) a logistic function. For any given input value, $ x $ the official definition of the sigmoid function is as follows:&lt;/p&gt;
&lt;p&gt;$$\sigma(x) \equiv \frac{1}{1+e^{-x}}$$&lt;/p&gt;
&lt;p&gt;If our inputs are $x_1, x_2,\ldots$, and their corresponding weights are $w_1, w_2,\ldots$, and a bias &lt;strong&gt;b&lt;/strong&gt;, then the previous sigmoid definition is updated as follows:&lt;/p&gt;
&lt;p&gt;$$\frac{1}{1+\exp(-\sum_j w_j x_j-b)}$$&lt;/p&gt;
&lt;p&gt;When plotted, the sigmoid function will look plotted looks like this curve below. When we use this, in a neural network, we essentially end up with a smoothed-out function, unlike a binary function (also called a step function) – that is either 0, or 1.&lt;/p&gt;
&lt;p&gt;For a given function, $f(x)$, as $x \rightarrow \infty$, $f(x)$ tends towards 1. And, as as $x \rightarrow -\infty$, $f(x)$ tends towards 0.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/600px-Logistic-curve.svg.png&#34; alt=&#34;Sigmoid function&#34;/&gt;
        &lt;figcaption&gt;Sigmoid function&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And this smoothness of $\sigma$ is what will create the small changes in the output that we desire - where small changes to the weights ($\Delta w_j$), and small changes to the bias ($\Delta b$) will produce small changes to the output ($\Delta output$).&lt;/p&gt;
&lt;p&gt;Fundamentally, changing these weights and biases, is what can give us either a step function or small changes. We can show this as follows:&lt;/p&gt;
&lt;p&gt;$$\Delta output \approx \sum_j (\frac{\partial \, output}{\partial w_j} \Delta w_j + \frac{\partial \, output}{\partial b} \Delta b)$$&lt;/p&gt;
&lt;!-- $$\\Delta \\box{output} \\approx \\sum\_j \\frac{\\partial \\, \\box{output}}{\\partial w\_j} \\Delta w\_j + \\frac{\\partial \\, \\box{output}}{\\partial b} \\Delta b\$$ --&gt;
&lt;p&gt;One thing to be aware of is that the sigmoid function suffers from the &lt;a
	
		href = &#34;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.7321&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		vanishing gradient problem
	&lt;/span&gt;
&lt;/a&gt; – the convergence between the various layers is very slow after a certain point – the neurons in previous layers don’t learn fast enough and are much slower than the neurons in later layers. Because of this, generally, a sigmoid is avoided.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Tanh (hyperbolic tangent function)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tanh, is a variant of the sigmoid function, but still quite similar – it is a rescaled version and ranges from –1 to 1, instead of 0 and 1. As a result, its optimization is easier and is preferred over the sigmoid function. The formula for tanh is:&lt;/p&gt;
&lt;p&gt;$$\tanh(x) \equiv \frac{e^x-e^{-z}}{e^X+e^{-x}}$$&lt;/p&gt;
&lt;p&gt;Using, this we can show that:&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \frac{1 + \tanh(x/2)}{2}$$.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-6.png&#34; alt=&#34;Sigmoid vs Tanh&#34;/&gt;
        &lt;figcaption&gt;Sigmoid vs Tanh&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Tanh also suffers from the vanishing gradient problem. Both Tanh, and, Sigmoid are used in &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Feedforward_neural_network&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FNN
	&lt;/span&gt;
&lt;/a&gt; (Feedforward neural network) – i.e. the information always moves forward and there isn’t any backprop.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Feed_forward_neural_net.gif&#34; alt=&#34;FNN&#34;/&gt;
        &lt;figcaption&gt;FNN&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Rectified Linear Unit (ReLU)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A rectified linear unity (&lt;a
	
		href = &#34;https://www.cs.toronto.edu/~hinton/absps/reluICML.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ReLU
	&lt;/span&gt;
&lt;/a&gt;) is the most popular activation function that is used these days.&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \begin{cases} x &amp;amp; x &amp;gt; 0\\ 0 &amp;amp; x \leq 0 \end{cases}$$&lt;/p&gt;
&lt;p&gt;ReLU&amp;rsquo;s are quite popular for a couple of reasons – one, from a computational perspective, these are more efficient and simpler to execute - there isn’t any exponential operations to perform. And two, these don’t suffer from the vanishing gradient problem.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/495px-Rectifier_and_softplus_functions.svg.png&#34; alt=&#34;ReLU&#34;/&gt;
        &lt;figcaption&gt;ReLU&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The one limitation ReLU&amp;rsquo;s have, is that their output isn’t in the probability space (i.e. can be &amp;gt;1), and &lt;strong&gt;can&amp;rsquo;t&lt;/strong&gt; be used in the output layer.&lt;/p&gt;
&lt;p&gt;As a result, when we use ReLU&amp;rsquo;s, we have to use a softmax function in the output layer.  The output of a softmax function sums up to 1, and we can map the output as a probability distribution.&lt;/p&gt;
&lt;p&gt;$$\sum_j a^L_j = \frac{\sum_j e^{z^L_j}}{\sum_k e^{z^L_k}} = 1.$$&lt;/p&gt;
&lt;p&gt; Another issue that can affect ReLU’s is something called a dead neuron problem (also called a dying ReLU). This can happen when in the training dataset, some features have a negative value. When the ReLU is applied, those negative values become zero (as per the definition). If this happens at a large enough scale, the gradient will always be zero – and that node is never adjusted again (it is biased. and, weights never get changed) - essentially making it dead! The solution? Use a variation of the ReLU called a Leaky ReLU.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Leaky ReLU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A Leaky ReLU will usually allow a small slope $\alpha$ on the negative side; i.e that the value isn’t changed to zero, but rather something like 0.01. You can probably see the ‘leak’ in the image below. This ‘leak’ helps increase the range and we never get into the dying ReLU issue.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-7.png&#34; alt=&#34;ReLU vs. Leaky ReLU&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Exponential Linear Unit (ELU)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes a ReLU isn’t fast enough – over time, a ReLU&amp;rsquo;s mean output isn&amp;rsquo;t zero and this positive mean can add a bias for the next layer in the neural network; all this bias adds up and can slow the learning.&lt;/p&gt;
&lt;p&gt;Exponential Linear Unit (ELU) can address this, by using an exponential function, which ensures that the mean activation is closer to zero. What this means, is that for a positive value, an ELU acts more like a ReLU and for the negative value it is bounded to -1 for $\alpha = 1$ – which puts the mean activation closer to zero.&lt;/p&gt;
&lt;p&gt;$$\sigma(x) = \begin{cases} x &amp;amp; x \geqslant 0\\ \alpha (e^x - 1) &amp;amp; x &amp;lt; 0\end{cases}$$&lt;/p&gt;
&lt;p&gt; 
When learning, this derivation of the slope is what is fed back (backprop) – so for this to be efficient, both the function and its derivative need to have a lower computation cost.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;https://i0.wp.com/sefiks.com/wp-content/uploads/2018/01/elu-and-relu.png?resize=654%2C422&amp;amp;ssl=1&#34; alt=&#34;elu-and-relu&#34;/&gt;
        &lt;figcaption&gt;ELU vs ReLU&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, there is another variation that combines with ReLU and a Leaky ReLU called a Maxout function.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So, how do I pick one?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Choosing the ‘right’ activation function would of course depend on the data and problem at hand. My suggestion is to default to a ReLU as a starting step and remember ReLU’s are applied to hidden layers only. Use a simple dataset and see how that performs. If you see dead neurons than use a leaky ReLU or Maxout instead. It won’t make sense to use Sigmoid or Tanh these days for deep learning models but are useful for classifiers.&lt;/p&gt;
&lt;p&gt;In summary, activation functions are a key aspect that fundamentally influences a neural network&amp;rsquo;s behavior and output. Having an appreciation and understanding of some of the functions is key to any successful ML implementation.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Netron - deep learning and machine learning model visualizer</title>
      <link>/post/2018/06/netron-deep-learning-and-machine-learning-model-visualizer/</link>
      <pubDate>Mon, 11 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/netron-deep-learning-and-machine-learning-model-visualizer/</guid>
      <description>&lt;p&gt;I was looking at something else and happen to stumble across something called &lt;a
	
		href = &#34;https://github.com/lutzroeder/Netron&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Netron
	&lt;/span&gt;
&lt;/a&gt;, which is a model visualizer for #ML and #DeepLearning models. It is certainly much nicer than for anything else I have seen. The main thing that stood out for me, was that it supports &lt;a
	
		href = &#34;https://onnx.ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ONNX
	&lt;/span&gt;
&lt;/a&gt; , and a whole bunch of other formats (Keras, CoreML), TensorFlow (including Lite and JS), Caffe, Caffe2, and MXNet. How awesome is that?&lt;/p&gt;
&lt;p&gt;This is essentially a cross platform &lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Progressive_Web_Apps&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PWA
	&lt;/span&gt;
&lt;/a&gt; (progressive web app), essentially using &lt;a
	
		href = &#34;https://electronjs.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Electron
	&lt;/span&gt;
&lt;/a&gt; (JavaScript, HTML5, CSS) – which means it can run on most platforms and run-times from just a browser, Linux, Windows, etc. To debug it, best to use &lt;a
	
		href = &#34;https://code.visualstudio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual Studio Code
	&lt;/span&gt;
&lt;/a&gt;, along with the &lt;a
	
		href = &#34;https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Chrome debugger extension
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a couple of examples, of visualizing a ResNet-50 model – you can see both the start and the end of the visualization shown in the two images below to get a feel of things.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-1.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Start of ResNet-50 Model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-2.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;End of ResNet-5o model&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And some of the complex model seem very interesting. Here is an example of a &lt;a
	
		href = &#34;https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/07_Inception_Model.ipynb&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TensorFlow Inception (v3)
	&lt;/span&gt;
&lt;/a&gt; model.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And of course, this can get very complex (below is the same model, just zoomed out more).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I do think it is a brilliant, tool to help understand the flow of things, and what can one do to optimize, or fix. Also very helpful for folks who are just starting to learn and appreciate the nuances.&lt;/p&gt;
&lt;p&gt;The code is released under an MIT license and you can &lt;a
	
		href = &#34;https://github.com/lutzroeder/Netron/tree/master/src&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download it here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analog islands</title>
      <link>/post/2018/06/analog-islands/</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/analog-islands/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image-1.png&#34; alt=&#34;Analog islands (geeky jokes)&#34;/&gt;
        &lt;figcaption&gt;Analog Islands&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine learning use-cases</title>
      <link>/post/2018/06/machine-learning-use-cases/</link>
      <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/machine-learning-use-cases/</guid>
      <description>&lt;p&gt;Someone recently asked me, what are some of the use cases / examples of machine learning. Whilst, this might seem as an obvious aspect to some of us, it isn’t the case for many businesses and enterprises – despite that they uses elements of #ML (and #AI) in their daily life – as a consumer.&lt;/p&gt;
&lt;p&gt;Whilst, the discussion gets more interesting based on the specific domain and the possibly use cases (of course understanding that some might not be sure f the use case – hence the question in the first place). But, this did get me thinking and wanted to share one of the images we use internally as part of our training that outcomes some of the use cases.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;Machine Learning Use Cases&#34;/&gt;
        &lt;figcaption&gt;Machine Learning Use Cases&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;These are not 1:1 and many of them can be combined together to address various use cases – for example a &lt;strong&gt;#IoT&lt;/strong&gt; device sending in a sensor data, that triggers a boundary condition (via a &lt;strong&gt;#RulesEngine&lt;/strong&gt;), that in addition to executing one or more business rule, can trigger a alert to a human-in-the-loop (#AugmentingWorkforce) via a &lt;strong&gt;#DigitalAssistant&lt;/strong&gt; (say #Cortana) to make her/him aware, or confirm some corrective action and the likes. The possibilities are endless – but each of these elements triggered by AI/ML and still narrow cases and need to be thought of in the holistic picture.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Synthetic Sound</title>
      <link>/post/2018/06/synthetic-sound/</link>
      <pubDate>Sun, 03 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/06/synthetic-sound/</guid>
      <description>&lt;p&gt;Trained a model to create a synthetic sound that sounds like me. This is after training it with about 30 sentences - which isn&amp;rsquo;t a lot.&lt;/p&gt;
&lt;p&gt;To create a synthetic voice, you enter some text, using which is then &amp;ldquo;transcribed&amp;rdquo; using #AI and your synthetic voice is generated. In my case, at first, I had said AI, which was generated also as &amp;ldquo;aeey&amp;rdquo; (you can listen &lt;a
	
		href = &#34;https://lyrebird.ai/g/TNnYK6St&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;). So for the next one, changed the AI to Artificial Intelligence.&lt;/p&gt;


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;images/db28dba42a7abffbdfb72e4f7df88cc530773dde.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/synthetic-sound-e1528000490931-1024x443.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;One does need to be mindful of #DigitalEthics, as this technology improves further. This is with only a very small sampling of data. Imagine what could happen, with public figures - where their recordings are available quite easily in the public domain. I am thinking the &amp;lsquo;digital twang&amp;rsquo; is one of the signatures and ways to stamp this as a generated sound.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My self-driving car</title>
      <link>/post/2018/05/my-self-driving-car/</link>
      <pubDate>Thu, 31 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/my-self-driving-car/</guid>
      <description>&lt;p&gt;Over the last few weeks, I built a self-driving car - which essentially is a remote control Rx car that uses a raspberry pi running Python, TensorFlow implementing a end-to-end convolution neural network (CNN)&lt;/p&gt;
&lt;p&gt;Of course other than being  a bit geeky, I do think this is very cool to help understand and get into some of the basic constructs and mechanics around a number of things - web page design, hardware (maker things), and Artificial Intelligence principles.&lt;/p&gt;
&lt;p&gt;There are two different models here - they do use the same ASC and controller that can be programmed. My 3D printer, did mess up a little (my supports were a little off) and which is why you see the top not clean.&lt;/p&gt;
&lt;p&gt;The sensor and camera are quite basic, and there is provisions to add and do better over time. The Pi isn&amp;rsquo;t powerful enough to train the model - you need another machine for that (preferably a I7 core with a GPU). Once trained you can run the model on the Pi for inference.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/car1-225x300.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/car2-225x300.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is the second car, which is a little different hardware, but the ESC to control the motor and actuators are the same.
&lt;p&gt;

    &lt;img src=&#34;images/car3-300x225.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/car4-300x225.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The code is simple enough; below is an example of the camera (attached) to the Pi, saving the images it is seeing. Tubs is the location where the images are saved; these can then be transferred to another machine for training or inference.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8bd5ca&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;donkey&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;dk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#initialize the vehicle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;V &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Vehicle()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#add a camera part&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cam &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;PiCamera() V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(cam, outputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;\], threaded&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#add tub part to record images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tub &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; dk&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;parts&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;Tub(path&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;~/d2/gettings\_started&amp;#39;&lt;/span&gt;, inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;\], types&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;\[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;image\_array&amp;#39;&lt;/span&gt;\]) V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;add(tub, inputs&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;inputs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#start the vehicle&amp;#39;s drive loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;V&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;start(&lt;span style=&#34;color:#91d7e3&#34;&gt;max&lt;/span&gt;\_loop\_count&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Below you can see the car driving itself around the track, where it had to be trained first. The reason it is not driving perfectly is because during training (when I was manually driving it around), I crashed a few times and as a result the training data was messed up. Needed more time to clean that up and retrain it.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2018/05-my-self-driving-car/IMG_3514.mov&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;This is based on &lt;a
	
		href = &#34;http://www.donkeycar.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		donkey car
	&lt;/span&gt;
&lt;/a&gt; - which is an open source DIY for platform for small-scale self driving cars. I think it is also perfect to get into with those who have teenagers and a little older kids to get in and experiment. You can read up more details on how to go about building this, and the &lt;a
	
		href = &#34;http://docs.donkeycar.com/guide/build_hardware/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		parts needed here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud and failure</title>
      <link>/post/2018/05/cloud-and-failure/</link>
      <pubDate>Wed, 30 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/cloud-and-failure/</guid>
      <description>&lt;p&gt;Despite all the cloud talk and where I live, it is like the cloud mecca, for enterprises it is still quite new and many are just starting to think about it. A hard lesson that many of us learn (and partly how we amass our scars) is to design for failures. For those, who run things in their enterprises data center, are quite spoilt I think. Failures are rare, and if machines or state goes down, moving to another one isn’t really a big deal (of course it is a little more complex, and not to say, there isn’t any down time, or business loss, etc.).&lt;/p&gt;
&lt;p&gt;When thinking about a cloud migration (hybrid or otherwise) – a key rule is that you are guaranteed to have failures – at many aspects, and those cannot be exceptional conditions, but rather the normal design and expected behavior. As a result, you app/services/API/whatever needs to be designed for failure. And not only how your loosely couple your architecture to be able to handle these situations, but also, how the response isn’t a binary (yay, or a &lt;a
	
		href = &#34;https://creativemarket.com/blog/the-best-404-pages-on-the-internet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fancy 404
	&lt;/span&gt;
&lt;/a&gt;); but rather a degraded experience, where your app/service/API/whatever still performs albeit in a deprecated mode.&lt;/p&gt;
&lt;p&gt;Things that can throw one off, and is food for thought (not exhaustive, or on any particular order):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Managing state (when failures is guaranteed)&lt;/li&gt;
&lt;li&gt;Latency – cloud is fast, but slower than your internal data center; you know – physics. :) How are your REST API’s handling latency, and are they degrading performance?&lt;/li&gt;
&lt;li&gt;“Chatiness” – how talkative, are your things on the wire? And how big is the payload?&lt;/li&gt;
&lt;li&gt;Rollback, or fall forward?&lt;/li&gt;
&lt;li&gt;Lossy transfers (if data structure sizes are large)&lt;/li&gt;
&lt;li&gt;DevOps – mashing up of Developers, and Operations (what some call SRE) – you own the stuff you build, and, responsible for it.&lt;/li&gt;
&lt;li&gt;AutoScale – most think this is to scale up, but it also means to scale down when resources are not needed.&lt;/li&gt;
&lt;li&gt;Physical deployments – Regional deployment vs. global ones – there isn’t a right or wrong answer, it frankly depends on the service and what you are trying to do. Personally, I would lean towards regional first.&lt;/li&gt;
&lt;li&gt;Production deployment strategies – various ways to skin a cat and no one is right or wrong per se (except, please don’t do a basic deployment) – that is suicide. I am use to A/B testing, but also what is now called Blue/Green deployment. Read up &lt;a
	
		href = &#34;https://harness.io/2018/02/deployment-strategies-continuous-delivery/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more here
	&lt;/span&gt;
&lt;/a&gt;. And of course use some kind of a deployment window (that works for your business) – this allows you and your team to watch what is going on, and take corrective actions if required.&lt;/li&gt;
&lt;li&gt;Automate everything you can; yes its not free, but you recoup that investment pretty quick; and will still have hair on the scalp!&lt;/li&gt;
&lt;li&gt;Instrument – if you can’t measure it, you can’t fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again, not an exhaustive list, but rather meant to get one thinking. There are also some inherent assumptions – e.g. automation and production deployment suggests, there is some automated testing in place; and a CI/CD strategy and supporting tools.&lt;/p&gt;
&lt;p&gt;Bottom line – when it comes to cloud (or any other distributed architecture), the best way to avoid failure is to fail constantly!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>From managers to leaders</title>
      <link>/post/2018/05/from-managers-to-leaders/</link>
      <pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/from-managers-to-leaders/</guid>
      <description>&lt;p&gt;Recently, a few of us went through a workshop where one of the ‘homework’ was to score oneself, on the following 7 aspects – some of these are attributes that allows one to grow from being (hopefully) good managers to great leaders.&lt;/p&gt;
&lt;p&gt;In most enterprises, as one grows in their career, managers need to acquire new capabilities – and quickly. What they have, in terms of skills and capabilities and got her or him to this place, won’t be enough for the next step – as the scope and complexity increases it can leave executives underwhelmed. At the core, new executives need support on these seven dimensions that will help them make this transition.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Specialist to generalist&lt;/strong&gt; – Understand the mental models, tools, and terms used in key business functions and develop templates for evaluating the leaders of those functions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyst to Integrator&lt;/strong&gt; – Integrate the collective knowledge of cross-functional teams and make appropriate trade-offs to solve complex organizational problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tactician to Strategist&lt;/strong&gt; – Shift fluidly between the details and the larger picture, perceive important patterns in complex environments, and anticipate and influence the reactions of key external players.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bricklayer to Architect&lt;/strong&gt; – Understand how to analyze and design organizational systems so that strategy, structure, operating models, and skill bases fit together effectively and efficiently, and harness this understanding to make needed organizational changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem Solver to Agenda Setter&lt;/strong&gt; – Define the problems the organization should focus on, and spot issues that don’t fall neatly into any one function but are still important.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warrior to Diplomat&lt;/strong&gt; – Proactively shape the environment in which the business operates by influencing key external constituencies, including the government, NGOs, the media, and investors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporting Cast Member to Lead Role&lt;/strong&gt; – Exhibit the right behaviors as a role model for the organization and learn to communicate with and inspire large groups of people both directly and, increasingly, indirectly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was surprised on how few people talk about this. These come from an awesome HBR article called &lt;a
	
		href = &#34;https://hbr.org/2012/06/how-managers-become-leaders&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How Managers become Leaders
	&lt;/span&gt;
&lt;/a&gt;, which if you haven’t read, I would highly recommend.&lt;/p&gt;
&lt;p&gt;So, what can one do? The suggestions outlined are not rocket science, but something to think about. And fundamentally not that much different on how the armed forces trains new officers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give potential leaders:
&lt;ul&gt;
&lt;li&gt;Experience on cross-functional projects&lt;/li&gt;
&lt;li&gt;An international assignment&lt;/li&gt;
&lt;li&gt;Exposure to a broad range of business situations - accelerated growth, sustaining success, realignment, turnaround.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When a high potentials&amp;rsquo; leadership promise becomes evident give them:
&lt;ul&gt;
&lt;li&gt;A position on a senior management team&lt;/li&gt;
&lt;li&gt;Experience with external stakeholders&lt;/li&gt;
&lt;li&gt;An assignment as chief of staff for an experienced enterprise leader&lt;/li&gt;
&lt;li&gt;An appointment to lead an acquisition integration or a substantial restructuring&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Just before their first leadership promotion:
&lt;ul&gt;
&lt;li&gt;Send them to an executive program that addresses capabilities like - organizational design, business process improvement, and transition management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When promoted, place new enterprise leaders in business units:
&lt;ul&gt;
&lt;li&gt;That are small, distinct, and thriving&lt;/li&gt;
&lt;li&gt;And are staffed with an experienced and assertive team that they can learn from.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Download Build deck and video (2018)</title>
      <link>/post/2018/05/download-build-deck-and-video-2018/</link>
      <pubDate>Sun, 27 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/download-build-deck-and-video-2018/</guid>
      <description>&lt;p&gt;Just as &lt;a
	
		href = &#34;/post/2017/05/download-build-2017-decks-and-video/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		last year
	&lt;/span&gt;
&lt;/a&gt;, I wrote a PowerShell script using which you can download the PowerPoint decks, and, videos from Microsoft Build’s conference, instead of streaming it (or manually download it one by one). You can choose if you want the decks, or the videos, or both. For the videos you can choose the desired resolution (Low, Medium, High) – of course the higher the resolution, the more space is needed. The script also downloads the description and if there is a session image (if there is one).&lt;/p&gt;
&lt;p&gt;A few points to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The slides only once downloaded is ~10GB and with videos (high-resolution), the size goes up to 90.5 GB. So make sure you have enough space.&lt;/li&gt;
&lt;li&gt;By default the download location is &lt;code&gt;C:\build-2018\&lt;/code&gt;; you can change this to whatever you want, but make sure there is a trailing backslash. Think of this as the ‘base’ folder.&lt;/li&gt;
&lt;li&gt;For each session a sub-folder with the session name will be created in the ‘base’ folder setup in the previous step.&lt;/li&gt;
&lt;li&gt;If a file already exists, it will be &lt;strong&gt;skipped&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As each file is downloaded, it save it in the root folder and once the download is complete, only then moves it in the relevant subfolder.&lt;/li&gt;
&lt;li&gt;If a download fails for some reason to retry it, delete the ‘left over’ file(s) in the base folder and then run the script again. The script itself will &amp;rsquo;eat&amp;rsquo; the exception and move on to the next file.&lt;/li&gt;
&lt;li&gt;The video quality parameter is 1 for Low, 2 for Medium, and 3 for High (default).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And if you read through, the script is quite self-explanatory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;184&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#184&#34;&gt;184&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;185&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#185&#34;&gt;185&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;186&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#186&#34;&gt;186&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;187&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#187&#34;&gt;187&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;188&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#188&#34;&gt;188&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;189&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#189&#34;&gt;189&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;190&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#190&#34;&gt;190&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;191&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#191&#34;&gt;191&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;192&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#192&#34;&gt;192&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;193&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#193&#34;&gt;193&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;194&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#194&#34;&gt;194&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;195&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#195&#34;&gt;195&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;196&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#196&#34;&gt;196&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;197&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#197&#34;&gt;197&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;198&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#198&#34;&gt;198&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Comments that you should read, before you kick this off. Yes, seriously. :)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 1. Setup the folder where to download using the parameters outlined below&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 2. Loop through and get the slides first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# 3. Finally, loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;param&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;C:\build-2018\&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;switch&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessionvideo&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;int&lt;/span&gt;][&lt;span style=&#34;color:#91d7e3&#34;&gt;ValidateRange&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$videoquality&lt;/span&gt; = &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#eed49f&#34;&gt;switch&lt;/span&gt;]&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessiondeck&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$downloadlocation = &amp;#34;D:\build-2018&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessiondeck&lt;/span&gt;) {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the Slides RSS feed - Build 2018&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$slides&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$slides&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesnt exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Image (jpeg) &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#mv $filejpg $folder &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PPTX: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#try and get the sessions details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#f4dbd6&#34;&gt;$descriptionFileName&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Title: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Presenter: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Summary: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Link: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#some categories are missing; so need to eat the exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#this is a hack and not very elegant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Category: &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#do nothing; eat the exception&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#download session-deck &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if you don&amp;#39;t want the video but only the slides just comment all the code below in the foreach loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# check for video download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$sessionvideo&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;switch&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$videoquality&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp3&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp4&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;default&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2018/rss/mp4high&amp;#34;&lt;/span&gt;)); &lt;span style=&#34;color:#c6a0f6&#34;&gt;break&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$video&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the video download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;NEW SESSION&amp;#39;&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;™&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;œ&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the video file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the video file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$path&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move it from the current working folder to the target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - anoter process possibly working on this; skipping download.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end - video check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any videos or some other error happened.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** End - download the videos section **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! Woot! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Certificate error with git and Donkey Car</title>
      <link>/post/2018/05/certificate-error-with-git-and-donkey-car/</link>
      <pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/certificate-error-with-git-and-donkey-car/</guid>
      <description>&lt;p&gt;If you were trying to pull the latest source code on your Raspberry Pi for donkeycar, and get the following error, then probably your clock is off (and I guess some nonce is failing). This can happen if your pi had been powered off for a while (as in my case), and it&amp;rsquo;s clock is off (&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Clock_drift&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		clock drift
	&lt;/span&gt;
&lt;/a&gt; is a real thing) :).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fatal: unable to access &#39;https://github.com/wroscoe/donkey/&#39;: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To fix this, the following commands works. It seems the Raspberry Pi 3, by default has NTP disabled and this would enable it. I also had to check the result status with the second command, and force it with the third one.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-ntp True
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timedatectl status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo timedatectl set-local-rtc true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And that should do it; you might need to reboot the pi just to get it back on and then you should be able to pull the code off git and deploy your autonomous car.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AI photo and style transfer</title>
      <link>/post/2018/05/ai-photos-style-transfer/</link>
      <pubDate>Tue, 22 May 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/05/ai-photos-style-transfer/</guid>
      <description>&lt;p&gt;Can #AI make me look (more) presentable? The jury is out I think. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is called style transfer, where the style/technique from a kind of painting (could be a photos too) is applied to an image, to create a new image. I took this using the built-in camera on my machine sitting at my desk and then applying the different kind of ‘styles’ on it. Each of these styles are is a separate #deeplearning model  that has learned how to apply the relevant style to a source image.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/candy_thumb.png&#34; alt=&#34;candy&#34;/&gt;
        &lt;figcaption&gt;Style - Candy&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/feathers_thumb.png&#34; alt=&#34;feathers&#34;/&gt;
        &lt;figcaption&gt;Style - Feathers&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/mosaic_thumb.png&#34; alt=&#34;mosaic&#34;/&gt;
        &lt;figcaption&gt;Style - Mosaic&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/robert_thumb.png&#34; alt=&#34;robert&#34;/&gt;
        &lt;figcaption&gt;Style - Robert&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Specifically, this uses a Neural Network (#DeepLearning) model called &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~vgg/research/deep_eval/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VGG19
	&lt;/span&gt;
&lt;/a&gt;, which is a 19-layer model running on TensorFlow. Of course, you can export this to a ONNX model, that then can be used in most other run-times and libraries.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is inspired from Cornell universities paper - &lt;a
	
		href = &#34;https://arxiv.org/pdf/1603.08155&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Perceptual Losses for Real-Time Style Transfer and Super-Resolution
	&lt;/span&gt;
&lt;/a&gt;. Below is a snapshot of the VGG code that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;net&lt;/span&gt;(data_path, input_image): layers &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ( 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv1_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu1_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv1_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu1_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv2_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu2_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv2_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu2_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool2&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_3&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv3_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu3_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_3&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv4_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu4_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_1&amp;#39;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_1&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_2&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_3&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv5_4&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu5_4&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; scipy&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;io&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;loadmat(data_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mean &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;normalization&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mean_pixel &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;mean(mean, axis&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;weights &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; data[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;layers&amp;#39;&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;net &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; {} 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; input_image 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; i, name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;enumerate&lt;/span&gt;(layers):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;conv&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernels, bias &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; weights[i][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;] 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# matconvnet: weights are [width, height, in_channels, out_channels] &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# tensorflow: weights are \[height, width, in_channels, out_channels\] &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    kernels &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;transpose(kernels, (&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bias &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; bias&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; _conv_layer(current, kernels, bias) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;relu&amp;#39;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;relu(current) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;elif&lt;/span&gt; kind &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;pool&amp;#39;&lt;/span&gt;: 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; _pool_layer(current) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    net[name] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; current
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;assert&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(net) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#91d7e3&#34;&gt;len&lt;/span&gt;(layers) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; net
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;_conv_layer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, weights, bias): conv &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;conv2d(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;constant(weights), strides&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), padding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;bias_add(conv, bias)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;_pool_layer&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;): &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; tf&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;nn&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;.&lt;/span&gt;max_pool(&lt;span style=&#34;color:#91d7e3&#34;&gt;input&lt;/span&gt;, ksize&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), strides&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;), padding&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you want to play with this, you can download the &lt;a
	
		href = &#34;https://github.com/Microsoft/samples-for-ai/tree/master/projects/StyleTransfer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		code
	&lt;/span&gt;
&lt;/a&gt;. Personally, I like the Mosaic style the best.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Artificial Intelligence (AI)</title>
      <link>/post/2018/03/artificial-intelligence-ai/</link>
      <pubDate>Thu, 01 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>/post/2018/03/artificial-intelligence-ai/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Yesterday it worked Today it is not working #AI is like that&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Error messages</title>
      <link>/post/2017/11/error-messages/</link>
      <pubDate>Mon, 27 Nov 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/11/error-messages/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Rather than a beep Or a rude error message, These words: “File not found.”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>DARPA&#39;s perspective on AI</title>
      <link>/post/2017/10/darpas-perspective-on-ai/</link>
      <pubDate>Wed, 11 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/10/darpas-perspective-on-ai/</guid>
      <description>&lt;p&gt;One of the challenges we have with AI is that there isn&amp;rsquo;t any &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/05/25/whats-the-difference-between-ai-ml-and-deeplearning/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		universal definition
	&lt;/span&gt;
&lt;/a&gt; - it is a broad category that means everything to everyone. Debating the rights, and, the wrongs, and the should&amp;rsquo;s and the shouldn&amp;rsquo;t s is another post though.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.darpa.mil/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DARPA
	&lt;/span&gt;
&lt;/a&gt; outlines this as the &amp;ldquo;&lt;strong&gt;&lt;em&gt;programmed&lt;/em&gt;&lt;/strong&gt; ability to process information&amp;rdquo; and across a certain set of criteria that span across perceiving, learning, abstracting, and, reasoning.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Scale-Intelligence-1024x315.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI Scale Intelligence&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;They classify AI in three waves - out outlined below. Each of these is at a different level across the intelligence scale. I believe it is important to have a scale such as this - it will help temper expectations and compare apples to apples; and for enterprises it will help create roadmaps on outcomes and their implementations; and finally help cut through the hype cycle noise that AI has generated.&lt;/p&gt;
&lt;h4 id=&#34;wave-1---handcrafted-knowledge&#34;&gt;Wave 1 - Handcrafted Knowledge&lt;/h4&gt;
&lt;p&gt;The first wave operates on a very narrow problem area (the domain) and essentially has no (self)learning capability. The key area to understand that the machine can explore &lt;strong&gt;specifics&lt;/strong&gt;, based on the knowledge and related &lt;strong&gt;taxonomy/ structure&lt;/strong&gt; which is defined by humans. We create a set of rules to represent the knowledge in a well-defined domain.&lt;/p&gt;
&lt;p&gt;Of course as the Autonomous grand challenge taught us - it cannot handle uncertainty.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-First-wave-stumbles-1024x409.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI First wave stumbles&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;wave-2---statistical-learning&#34;&gt;Wave 2 - Statistical Learning&lt;/h3&gt;
&lt;p&gt;The second wave, has better classification and prediction capabilities - a lot of which is via statistical learning. Essentially problems in certain domains are solved by statistical models - which are training on big data. It still doesn&amp;rsquo;t have contextual ability and has minimal reasoning ability.&lt;/p&gt;
&lt;p&gt;A lot of what we are seeing today is related to this second wave; and one of the hypothesis holding this up is called &lt;strong&gt;manifold hypothesis&lt;/strong&gt;. This essentially states that high dimension data (e.g. images, speech, etc.) tends to be in the vicinity of low dimension manifolds.&lt;/p&gt;
&lt;p&gt;A manifold is an abstract mathematical space which, in a close-up view, resembles the spaces described by Euclidean geometry. Think of it as a set of points satisfying certain relationships, expressible in terms of distance and angle. Each manifold represents a different entity and the understanding of the data comes by separating the manifolds.&lt;/p&gt;
&lt;p&gt;Using handwriting digits as an example - each image is one element in a set which has 784 dimensions, which form a number of different manifolds.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Handwritten-digits-1024x429.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Handwritten digits&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Manifolds-of-handwriting-1024x450.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Manifolds of handwriting&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Separating each of these manifolds (by stretching and squishing of data) to get them isolated is what makes the layers in a Neural net work. Each layer in the neural network computes its output from the preceding layer of inputs (implemented usually by a non-linear function) - learning from the data.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Neural-Net-1024x417.jpg&#34; alt=&#34;AI Neural Nets&#34;/&gt;
        &lt;figcaption&gt;AI Neural Nets&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Neural-Net2-1024x379.jpg&#34; alt=&#34;AI Neural Nets learning from data&#34;/&gt;
        &lt;figcaption&gt;AI Neural Nets learning from data&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;So, in statistical learning, one would design and program the network structure based on experience. Here is an example of how the number 2 to be recognized goes through the various feature maps.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Structural-neural-networkJPG-1024x303.jpg&#34; alt=&#34;AI Structural neural network&#34;/&gt;
        &lt;figcaption&gt;AI Structural neural network&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And one can combine and layer the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2017/03/16/neural-networks/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		various kinds of neural networks
	&lt;/span&gt;
&lt;/a&gt; together (e.g. a CNN + RNN).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Layering-neural-networks-1024x506.jpg&#34; alt=&#34;AI Layering neural networks&#34;/&gt;
        &lt;figcaption&gt;Layering neural networks&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And whilst it is statistically impressive, it is also individually unreliable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-failture-1-300x122.jpg&#34; alt=&#34;AI failure&#34;/&gt;
        &lt;figcaption&gt;AI failure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-failture-2-294x300.jpg&#34; alt=&#34;AI Failure&#34;/&gt;
        &lt;figcaption&gt;AI failure&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;wave-3---contextual-adaptation&#34;&gt;Wave 3 - Contextual Adaptation&lt;/h3&gt;
&lt;p&gt;The future on AI, is what DARPA is calling Contextual adaptation - where models explain their decisions, which is then used to drive further decisions. Essentially one ends up in this world where we construct contextual explanatory models that are reflective of real world situations.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Models-to-explain-decisions-1024x416.jpg&#34; alt=&#34;AI Models to explain decisions&#34;/&gt;
        &lt;figcaption&gt;AI Models to explain decisions&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-Models-to-drive-decisions-1024x465.jpg&#34; alt=&#34;AI Models to drive decisions&#34;/&gt;
        &lt;figcaption&gt;AI Models to drive decisions&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;In summary, we are in the midst of Wave 2 - which is already very exciting. For an enterprise, it is key to have a scale that outlines the ability to process information across the intelligence scale to help make this AI revolution more tangible and manageable.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/First-Wave-of-AI-Handcraft-KnowledgeJPG-300x129.jpg&#34; alt=&#34;First Wave of AI - Handcraft Knowledge&#34;/&gt;
        &lt;figcaption&gt;First Wave of AI - Handcraft Knowledge&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
First Wave of AI - Handcraft Knowledge&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Second-Wave-of-AI-Statistical-Learning-300x132.jpg&#34; alt=&#34;Second Wave of AI - Statistical Learning&#34;/&gt;
        &lt;figcaption&gt;Second Wave of AI - Statistical Learning&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Second Wave of AI - Statistical Learning&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Third-Wave-of-AI-Contextual-adaption-300x135.jpg&#34; alt=&#34;Third Wave of AI - Contextual adaption&#34;/&gt;
        &lt;figcaption&gt;Third Wave of AI - Contextual adaption&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Third Wave of AI - Contextual adaptions&lt;/p&gt;
&lt;p&gt;PS - if you want to read up more on manifold hypothesis and how they play in neural networks, I would suggest reading Chris&amp;rsquo;s &lt;a
	
		href = &#34;http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		blog post
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cognitive Bias</title>
      <link>/post/2017/09/cognitive-bias/</link>
      <pubDate>Thu, 28 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/cognitive-bias/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cognitive-bias-1024x768.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Cognitive Bias&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>So choked up</title>
      <link>/post/2017/09/so-choked-up/</link>
      <pubDate>Wed, 06 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/so-choked-up/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://i1.wp.com/www.fowllanguagecomics.com/wp-content/uploads/2017/08/First-day-of-school-1.jpg?fit=800%2C999&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CosmosDB - Vintage Edition</title>
      <link>/post/2017/09/cosmosdb-vintage-edition/</link>
      <pubDate>Fri, 01 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/09/cosmosdb-vintage-edition/</guid>
      <description>&lt;p&gt;When seeing this #CosmosDB is the first thing that comes to mind :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/CosmosDB.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quantum Computing - Beyond bits - a primer</title>
      <link>/post/2017/08/quantum-computing-beyond-bits-a-primer/</link>
      <pubDate>Thu, 17 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/quantum-computing-beyond-bits-a-primer/</guid>
      <description>&lt;h3 id=&#34;what-is-it&#34;&gt;What is it?&lt;/h3&gt;
&lt;p&gt;What’s the next big thing in computing? Not the #AI or #blockchain&amp;rsquo;s of the world, that is starting to happen today (albeit a little early)? Quantum computing is one of those next big things, that is on the horizon (probably in the ~5 years range).&lt;/p&gt;
&lt;h3 id=&#34;why-do-i-care&#34;&gt;Why do I care?&lt;/h3&gt;
&lt;p&gt;Why do I care about quantum? Well, some problems are simply not solvable on convention digital computers – the kind we have today – these are called “classical” machines. Even if Moore’s law did continue (and that is a whole different debate), are the still some problems whose scaling obey a different set of properties and law; and the double of transistors on a chip wont really help. In fact, some of these problems require longer than the &lt;em&gt;lifetime of the universe&lt;/em&gt; – and that is with the biggest, and fastest supercomputers available!&lt;/p&gt;
&lt;p&gt;Quantum computing, is a paradigm shift in computing – it is moving beyond silicon and bits.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“If you think you understand quantum physics, you don’t understand quantum physics!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;-&lt;em&gt;&lt;a
	
		href = &#34;https://en.wikipedia.org/wiki/Richard_Feynman&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Richard Feynman
	&lt;/span&gt;
&lt;/a&gt;”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;what-are-quantum-computers&#34;&gt;What are Quantum computers?&lt;/h3&gt;
&lt;p&gt;Quantum machines are different – they are machines based on properties of quantum mechanics compared to classical mechanics (i.e. machines we use today). The few characteristics that make quantum computers different are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Today’s computers, use transistors to manipulate bits as either 0 or 1; quantum computer encode information as qubits (quantum bits) and are not limited to bits in two states.&lt;/li&gt;
&lt;li&gt;Qubits are &lt;em&gt;&lt;strong&gt;superimposed&lt;/strong&gt;&lt;/em&gt; – can be both in a state of 0, or 1, &lt;strong&gt;&lt;em&gt;simultaneously&lt;/em&gt;&lt;/strong&gt;; furthermore they are also in all points in between 0 and 1 at the same time. This makes them inherently parallel at an exponential scale&lt;/li&gt;
&lt;li&gt;They are notoriously delicate! These need to cooled (-459F, which is 100 times colder than deep space) and the noise isolated to preserve the system&amp;rsquo;s integrity. This level of cooling and sensitivity, requires new and different (quantum) error correction techniques than what we are used to.&lt;/li&gt;
&lt;li&gt;There is a “No-cloning mechanism” i.e. one cannot copy the data/result to inspect it. &lt;strong&gt;&lt;em&gt;Entanglement&lt;/em&gt;&lt;/strong&gt; helps observe the result of a calculation whilst preserving the integrity.&lt;/li&gt;
&lt;li&gt;Hybrid machines – we need a classical machine to control a quantum machine – to program, hint/nudge in the right direction (remember they are sensitive and need different error correction), and, observe the collapsed state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To put it in perspective, an entangled system of 250 quibits would require ~1080 bits to store classically. And that is more atoms that exist in the universe! And as implied, a quantum machine would only need 250 quibits to store those. A few more comparisons that might help:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A terabyte needs: ~1012 bits&lt;/li&gt;
&lt;li&gt;A Petabyte needs: ~1015 bits&lt;/li&gt;
&lt;li&gt;A Exascale (possible in a few years) will needs: ~1018 bits&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;application-areas&#34;&gt;Application Areas&lt;/h3&gt;
&lt;p&gt;In the early days, most problem areas will be optimization problems – things that are very difficult, or not possible to do with classical computers today. Some vertical scenarios that one can think of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Privacy and Security&lt;/strong&gt; – Example: Quantum encryption would need to be supersede current encryption techniques that underpin modern commerce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Energy&lt;/strong&gt; – Example: room temperature super conductivity (help address maglev transportation, lossless grid, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment&lt;/strong&gt; – Example: Carbon capture and not just at source (e.g. power plants), but throughout the environment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Healthcare&lt;/strong&gt; – Example: Personalized medicine and treatment matching the individual biome and genetic makeup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt; – Example: New probability distributions, and new inferences which allows to ask a new question that isn’t possible today. Also exponential speed ups with better solutions and models – new (e.g. nearest neighbor classification)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Computing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, as if today, we don’t know what are the best questions to ask a quantum machine to answer – at least not yet. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile-1.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;making-it-real--some-examples&#34;&gt;Making it Real – Some examples&lt;/h3&gt;
&lt;h4 id=&#34;example-1--encryption&#34;&gt;Example 1 – Encryption&lt;/h4&gt;
&lt;p&gt;I guess the pet example that everyone talks about is using encryption and the RSA 2K challenge – where in if you have a large number, such as the one shown below which is used as a key for encryption; when trying to find out the two large prime numbers that can provide the key – on a classical machine this will take &lt;strong&gt;1 billion years&lt;/strong&gt;; and on a quantum machine approx. &lt;strong&gt;100 seconds&lt;/strong&gt;. Needless to say that will have a significant impact on digital commerce and encryption and security in general.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-2.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h4 id=&#34;example-2-simulating-physical-systems&#34;&gt;Example 2: Simulating physical systems&lt;/h4&gt;
&lt;p&gt;&lt;a
	
		href = &#34;https://www.bing.com/search?q=ferredoxin&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ferredoxin
	&lt;/span&gt;
&lt;/a&gt; (Fe2S2) is a compound that is used in many metabolic reactions including energy transport in photosynthesis. When currently being used, one wastes a lot of resources as part of the process and one thing that would help is finding ground state of ferredoxin. However using this with a classical algorithm, that is an impossible task and is intractable. But with a quantum algorithm, this would be approx an hour (in 2015).&lt;/p&gt;
&lt;p&gt;Another, similar example is the calculation of the reaction time of nitrogenase; this one can read in a little more detail as part of – &lt;a
	
		href = &#34;https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		clarifying complex chemical
	&lt;/span&gt;
&lt;/a&gt; processes with quantum computers](&lt;a
	
		href = &#34;https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		https://phys.org/news/2017-07-clarifiying-complex-chemical-quantum.html)
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clarifiyingc.png&#34; alt=&#34;Clarifiying complex chemical processes with quantum computers&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;h3 id=&#34;entanglement--what-is-it&#34;&gt;Entanglement – what is it?&lt;/h3&gt;
&lt;p&gt;It is a fundamental property of quantum mechanics. It is a physical phenomenon where two particles interact with each other in ways that the state of one particle &lt;strong&gt;cannot be described independently&lt;/strong&gt; of the other. The paradox here is that measuring either of the particles, collapses the state of the entire (entangled) system. One cannot directly observe the result of a quantum computer – if you try to look at the subatomic particles, you bump them, and thereby change their value. If you look at a qubit in superposition to determine its value, the qubit will assume the value of either 0 or 1, but not both (effectively turning our quantum computer into a mundane digital computer).&lt;/p&gt;
&lt;p&gt;One aspect though is that the two particles aren&amp;rsquo;t necessarily next to each other, they can be miles apart, but still connected. This is what some call as the “&lt;a
	
		href = &#34;https://www.livescience.com/52811-spooky-action-is-real.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		spooky action
	&lt;/span&gt;
&lt;/a&gt;” that in the past have upset few scientists, including Einstein. The way to observe the result is to preserve the system&amp;rsquo;s integrity and indirectly measure the result – using Entanglement. Apply an outside force to two atoms, it can cause them to become entangled, and the second atom can take on the properties of the first atom. So if left alone, an atom will spin in all directions. The instant it is disturbed it chooses one spin, (i.e. one value); and at the same time, the second entangled atom will choose an opposite spin, or value. This allows scientists to know the value of the qubits without actually looking at them.&lt;/p&gt;
&lt;h3 id=&#34;quantum-superposition--what-is-it&#34;&gt;Quantum Superposition – what is it?&lt;/h3&gt;
&lt;p&gt;It is another fundamental property of quantum mechanics where the state can be multidimensional, at the same time. Superposition is what makes a quantum machine inheritably parallel. A normal Turing machine can only perform one calculation at a time, a quantum Turing machine can perform many calculations at once – given the symbols are both 0 and 1 (and all points in between) at the same time. Similar to waves (say in a pond), any two (or more) quantum states can be added together (&amp;ldquo;superposed&amp;rdquo;) and the result will be another valid quantum state. And, that every quantum state can be represented as a sum of two or more other distinct states.&lt;/p&gt;
&lt;h3 id=&#34;microsofts-position&#34;&gt;Microsoft’s Position&lt;/h3&gt;
&lt;p&gt;I also wanted to outline a more Microsoft specific view on Quantum computing and what is their perspective. Microsoft Research (MSR) has been doing research since late 90&amp;rsquo;s in Quantum, and their approach is topological quantum computation (&lt;a
	
		href = &#34;https://www.nytimes.com/2016/11/21/technology/microsoft-spends-big-to-build-quantum-computer.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		different
	&lt;/span&gt;
&lt;/a&gt; than the competition). They have a dedicated lab called &lt;a
	
		href = &#34;https://news.microsoft.com/stories/stationq/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Station Q
	&lt;/span&gt;
&lt;/a&gt; and also Quantum Software Architecture – Liquid (&lt;a
	
		href = &#34;https://www.microsoft.com/en-us/research/project/language-integrated-quantum-operations-liqui/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LIQUi|&amp;gt;
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-1.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-1.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The photo below shows MSR’s primary research collaborators on quantum.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-3.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The above image, essentially is a large fridge cooling the quantum chip (below) to –459oF. And the various layers (discs) that one sees in the image below is how it the cooled down in the process. The quantum chip is at the very bottom (not visible in the photo).&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://desigeek.com/blog/amit/wp-content/uploads/2017/08/image-4.png&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LIQUi|&amp;gt; is quite interesting; it is a domain specific language (DSL using F#) and also has the tools required (compiler used for Quantum circuits and gates), and relevant optimization of those gates and circuits. It includes a simulator for Quantum circuit (up to 31 qubit) and you can download it from &lt;a
	
		href = &#34;http://stationq.github.io/Liquid/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GitHub
	&lt;/span&gt;
&lt;/a&gt;. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-smile-1.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Remember, this is a hybrid situation; so they are also working on a classical computer to control the quantum computer. And as you can imagine, this isn&amp;rsquo;t for the fain hearted. This classical computer, needs to factor in and transpose various dimensions between the classical and quantum world; some things like communication, heat dissipation, quantum error correction, multiplexing, latency, clock speed, etc.&lt;/p&gt;
&lt;p&gt;We certainly live in a very exciting time and this video below does a nice job to explaining some of the basic principles outlined in this post.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/7__vKLECrnk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Hierarchy of Digital distractions</title>
      <link>/post/2017/08/hierarchy-of-digital-distractions/</link>
      <pubDate>Mon, 14 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/hierarchy-of-digital-distractions/</guid>
      <description>&lt;p&gt;At a recent internal meeting, we were discussing productivity and the various levels of distractions that one has these days. Did you know that there is a hierarchy of digital distractions (see image below). No wonder, in todays connected, and agile world, for some people why it is so difficult to get any actual work done (that is not to suggest that they are not busy of course).&lt;/p&gt;
&lt;p&gt;At this meeting, analogy of the distraction was coined as the “monkey” – the monkey that each of us has on our shoulder and the constant attention it demands – I.e. the distraction. And we all know we cannot control this monkey and bottle it up. The idea isn’t to try and bottle it up, which will rattle it more trying to get out and demand more attention – but rather let it out in a controlled manner for some time – similar to how one would take a dog out for a walk (of course different outcomes) ! 😄&lt;/p&gt;
&lt;p&gt;So instead of avoiding distractions, which might be very difficult for some folks, the idea is to let it out in a controlled manner – so the monkey is entertained and happy. This will help concentrate on the rest of the times and enable one to be more productive. And the science behind is how our brains gets the same effect as with drugs, and the ‘pleasure’ effects – it is both fascinating and scary.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;Chart showing in a pyramid the various types of digital distractions&#34;/&gt;
        &lt;figcaption&gt;Digital distractions hierarchy&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Parenting Geek</title>
      <link>/post/2017/08/parenting-geek/</link>
      <pubDate>Sat, 12 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/parenting-geek/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/parenting-geeks-724x1024.jpg&#34; alt=&#34;Parenting geek joke&#34;/&gt;
        &lt;figcaption&gt;Parenting geek&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Production release</title>
      <link>/post/2017/08/production-release/</link>
      <pubDate>Tue, 08 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/08/production-release/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I wakey wakey. Production release today. No breaky breaky.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chaos</title>
      <link>/post/2017/07/chaos/</link>
      <pubDate>Tue, 25 Jul 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/07/chaos/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Chaos reigns within.&lt;/p&gt;
&lt;p&gt;Reflect, repent, and reboot.&lt;/p&gt;
&lt;p&gt;Order shall return.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#haiku #GeekyHaiku&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Oh what a mess</title>
      <link>/post/2017/07/oh-what-a-mess/</link>
      <pubDate>Tue, 11 Jul 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/07/oh-what-a-mess/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ridiculous mess&lt;/p&gt;
&lt;p&gt;iOS development&lt;/p&gt;
&lt;p&gt;conceived by hipsters&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;#Haiku #GeekyHaiku #GeekyJokes&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Machine Learning basics</title>
      <link>/post/2017/06/machine-learning-basics/</link>
      <pubDate>Sun, 04 Jun 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/06/machine-learning-basics/</guid>
      <description>&lt;p&gt;Thinking about #machinelearning? It will be helpful to understand some numerical computations and concepts that affect the #ML algorithm. &lt;/p&gt;
&lt;p&gt;One might not interact with these directly, but we surely can feel the effect. The things you need to think about are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Overflow and underflow&lt;/strong&gt; - thinking of them as rounding up or down errors that shift the functions enough, and compounded across the iterations cam be devastating. Of course can also easily get to division by zero. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Poor conditioning&lt;/strong&gt; - essentially with small changes of input data, how large can the output move. You want this small. (And in cryptography you want the opposite, and large). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Gradient optimizations&lt;/strong&gt; - there will be some optimization happening in the algorithm, question is how does it handle various local points on the curve? Local minimum, saddle points, and local maximum. Generally speaking, it&amp;rsquo;s about optimizing continuous spaces.&lt;/p&gt;
&lt;p&gt;Some algorithms take this a step further by measuring a second derivative (think of it as measuring the derivative of a derivative - the curvature of a function). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Constrained Optimization&lt;/strong&gt; - sometimes we just want to operate on a subset - so constraints only on that set. &lt;/p&gt;
&lt;p&gt;All of these come into play some way, directly or indirectly and having a basic understanding and constraints around this would help a long way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Whats the difference between #AI, #ML, and #DeepLearning?</title>
      <link>/post/2017/05/whats-the-difference-between-ai-ml-and-deeplearning/</link>
      <pubDate>Thu, 25 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/whats-the-difference-between-ai-ml-and-deeplearning/</guid>
      <description>&lt;p&gt;I know I have had to explain this a lot in most #AI related conversations that I have had - and lately those have been quite a lot. In my experience, most people use these terms interchangeably when they are meaning one over the other.&lt;/p&gt;
&lt;p&gt;Whilst they all are (inter)related and one might help trigger the other, they are still fundamentally different and at some point, it is good to understand the differences. I like the image below (&lt;a
	
		href = &#34;https://blogs.nvidia.com/blog/2016/07/29/whats-difference-artificial-intelligence-machine-learning-deep-learning-ai/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		source
	&lt;/span&gt;
&lt;/a&gt;) that whilst on one hand is showing a time graph, the correlation between them and how one is a subset of the other is what is interesting.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Deep_Learning_Icons_R5_PNG.jpg-1024x651.png&#34; alt=&#34;AI vs Machine Learning vs Deep Learning&#34;/&gt;
        &lt;figcaption&gt;#AI vs #ML vs #DNN&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;#AI is getting more powerful and the potential of it which personally really excites me is the paradigm shift we are starting to see. Fundamentally it is changing on how we use, interact, and, value computers and technology.&lt;/p&gt;
&lt;p&gt;It is shifting from us learning machines and their idiosyncrasies (remember when being computer literate was a differentiator on a resume) to this shift where technology learns us and interacts with us in a more natural, and dare I say human manner.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI-TechSwing-1024x498.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;AI paradigm shift&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I almost see it as &lt;a
	
		href = &#34;http://www.startrek.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		StarTrek
	&lt;/span&gt;
&lt;/a&gt; (and now showing my age) - the computer is everywhere, yet it is no where. It is embedded and woven into everything we do on the Enterprise rather an some &amp;ldquo;thing&amp;rdquo; one interacts with.&lt;/p&gt;
&lt;p&gt;And it is awesome to start seeing some of this coming to life, even if it is in a demo as outlined at Build a couple of weeks ago. #AI in the Workplace and how it interacts with objects in real-time and can invoke and interact Business workflow (such as workplace policies).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/clip_image0196-1024x576.png&#34; alt=&#34;AI in Workplace&#34;/&gt;
        &lt;figcaption&gt;AI in Workplace&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/clip_image0216_Amit-Book_May-23-135946-2017_Conflict-1024x576.png&#34; alt=&#34;Policy violation - detected using AI&#34;/&gt;
        &lt;figcaption&gt;Policy violation&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The degree of calculations is pretty phenomenal - 27 million / sec [separately I would love to understand the definition on calculation 😄]. But then given where we are heading with a fully autonomous car generating about 100GB of data each second, this isn&amp;rsquo;t small potatoes.&lt;/p&gt;
&lt;p&gt;And whilst you can read up more on &lt;a
	
		href = &#34;http://www.techrepublic.com/article/machine-learning-the-smart-persons-guide/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these terms and how they link
	&lt;/span&gt;
&lt;/a&gt;, I really like to move away from the different terms which most people confuse in the first place and start thinking of more business outcomes and how enterprises and people will use.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/AI.jpg&#34; alt=&#34;AI&#34;/&gt;
        &lt;figcaption&gt;AI&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;To that end, the three buckets of Intelligent Automation, Robotic Process Automation (RPA), and Physical Automation is what we have found work better. On RPA, the one caveat being that it is not about robots, but rather the automation of a (business) process. The robots aspect would fall under physical automation - which essentially is anything that interacts with the real/physical world.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Download Build (2017) decks and video</title>
      <link>/post/2017/05/download-build-2017-decks-and-video/</link>
      <pubDate>Wed, 24 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/download-build-2017-decks-and-video/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Modified the script to handle multiple instances but pay heed to the &lt;a
	
		href = &#34;https://twitter.com/bahree/status/870489834174857216&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		warning here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Similar to &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2016/04/12/download-build-2016-decks-and-videos/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		last year
	&lt;/span&gt;
&lt;/a&gt;, I have a PowerShell script that will allow you to download the various PowerPoint decks and videos to watch locally rather than stream. This makes some improvements from the earlier scripts (e.g. if a file is already downloaded it will skip downloading it again) and does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates the relevant folder which includes the Session details (including the Title, and the Presenters)&lt;/li&gt;
&lt;li&gt;For each session, saves the description in a text file in the created folder.&lt;/li&gt;
&lt;li&gt;Downloads the relevant presentation (if any)&lt;/li&gt;
&lt;li&gt;Downloads a jpg which shows the image session – sometimes it is easier just to see the title slide. I thought better to have it and not use it, than the other way.&lt;/li&gt;
&lt;li&gt;And finally downloads the high-quality video of that session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the script, you can change the following (and if you understand Build then this should be easy):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the path where to download this to (default is d:\build)&lt;/li&gt;
&lt;li&gt;Choose a lower quality video if you prefer (which of course takes less space and might not be bad depending on which device you are seeing). Of course this also uses less bandwidth.&lt;/li&gt;
&lt;li&gt;Of course. And if you want only the decks, then you can comment out parts of the script where it doesn’t download the video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The script will spit out some basic errors and will &amp;rsquo;eat&amp;rsquo; some of the exceptions that are expected (e.g. every session doesn&amp;rsquo;t have a pptx or a video). That won&amp;rsquo;t break the script, it will just move to the next session.&lt;/p&gt;
&lt;p&gt;And finally here is the script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;137&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#137&#34;&gt;137&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;138&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#138&#34;&gt;138&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;139&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#139&#34;&gt;139&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;140&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#140&#34;&gt;140&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;141&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#141&#34;&gt;141&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;142&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#142&#34;&gt;142&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;143&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#143&#34;&gt;143&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;144&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#144&#34;&gt;144&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;145&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#145&#34;&gt;145&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;146&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#146&#34;&gt;146&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;147&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#147&#34;&gt;147&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;148&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#148&#34;&gt;148&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;149&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#149&#34;&gt;149&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;150&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#150&#34;&gt;150&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;151&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#151&#34;&gt;151&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;152&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#152&#34;&gt;152&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;153&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#153&#34;&gt;153&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;154&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#154&#34;&gt;154&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;155&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#155&#34;&gt;155&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;156&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#156&#34;&gt;156&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;157&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#157&#34;&gt;157&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;158&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#158&#34;&gt;158&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;159&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#159&#34;&gt;159&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;160&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#160&#34;&gt;160&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;161&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#161&#34;&gt;161&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;162&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#162&#34;&gt;162&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;163&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#163&#34;&gt;163&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;164&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#164&#34;&gt;164&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;165&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#165&#34;&gt;165&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;166&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#166&#34;&gt;166&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;167&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#167&#34;&gt;167&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;168&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#168&#34;&gt;168&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;169&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#169&#34;&gt;169&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;170&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#170&#34;&gt;170&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;171&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#171&#34;&gt;171&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;172&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#172&#34;&gt;172&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;173&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#173&#34;&gt;173&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;174&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#174&#34;&gt;174&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;175&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#175&#34;&gt;175&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;176&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#176&#34;&gt;176&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;177&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#177&#34;&gt;177&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;178&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#178&#34;&gt;178&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;179&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#179&#34;&gt;179&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;180&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#180&#34;&gt;180&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;181&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#181&#34;&gt;181&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;182&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#182&#34;&gt;182&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;183&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#183&#34;&gt;183&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First setup the folder where to download using the parameters outlined below.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second, loop through and get the decks first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Third. loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Note: IF you don&amp;#39;t want to download the videos, and want only the pptx then comment the section later in the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D:\build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the RSS feed - Build 2017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp4high&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2017/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Video quality default is high; you can select regular (mp4) or lower quality (mp3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp4&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2017/rss/mp3&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Jpeg &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;PPTX: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# if you don&amp;#39;t want the video but only the slides just comment all the code below in the foreach loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.item) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the MP4 download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;’&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;â€&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the MP4 file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; -OutFile &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;\&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#move it from the current working folder to the target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; - anoter process possibly working on this; skipping download.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Video: &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; exist; skipping download.&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Try and get the Sessions text description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;description&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$item&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ToString&lt;/span&gt;().&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any videos or some other error happened.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Message&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Exception&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;ItemName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$ErrorMessage&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$FailedItem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** End - download the videos section **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you read through the script it is pretty self explanatory.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My Story Remix from Build 2017</title>
      <link>/post/2017/05/my-story-remix-from-build-2017/</link>
      <pubDate>Tue, 16 May 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/05/my-story-remix-from-build-2017/</guid>
      <description>&lt;p&gt;In case you did not see Story Remix demos from Build, it is awesome. And here is my first take on it just using the photos that I took at Build 2017. Some of the things you saw at the keynote are not in the RS3 build I am running but interesting possibilities nevertheless.&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2017/05-my-story-remix-from-build-2017/Build-2017_Medium.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

</description>
    </item>
    
    <item>
      <title>Core principle of Machine Learning</title>
      <link>/post/2017/04/core-principle-of-machine-learning/</link>
      <pubDate>Tue, 04 Apr 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/04/core-principle-of-machine-learning/</guid>
      <description>&lt;p&gt;There of course are many, but for someone coming from computer science, and, software engineering, where the environment is &lt;em&gt;relatively&lt;/em&gt; clean and certain (deterministic), it usually is a leap to understand that Machine Learning (and other elements of #AI) are not. &lt;/p&gt;
&lt;p&gt;Machine learning, is based on probability theory and deals with stochastic (non-deterministic) elements all the time. Nearly all activities in machine learning, require the ability to factor and more importantly, &lt;strong&gt;represent and&lt;/strong&gt; &lt;strong&gt;reason&lt;/strong&gt; with uncertainty. &lt;/p&gt;
&lt;p&gt;To that end, when designing a system, it is recommended to use a &lt;strong&gt;&lt;em&gt;simple but uncertain&lt;/em&gt;&lt;/strong&gt; (with some non-deterministic aspects)  rule, rather than a &lt;em&gt;&lt;strong&gt;complex but certain&lt;/strong&gt;&lt;/em&gt; rule. &lt;/p&gt;
&lt;p&gt;For example, having a simple but uncertain  rule saying &amp;ldquo;most birds fly&amp;rdquo;, is easier and more effective than a certain rule such as &amp;ldquo;Birds can fly, except flightless species, or those who are sick, or babies, etc.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;As one starts getting deeper in Machine Learning, a trip down memory lane around &lt;a
	
		href = &#34;https://en.m.wikipedia.org/wiki/Probability_distribution&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Probability distribution
	&lt;/span&gt;
&lt;/a&gt;, expectation, &lt;a
	
		href = &#34;https://en.m.wikipedia.org/wiki/Variance&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		variance
	&lt;/span&gt;
&lt;/a&gt;, and covariance won&amp;rsquo;t hurt.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Protecting your Data from being slurped up!</title>
      <link>/post/2017/04/protecting-your-data-from-being-slurped-up/</link>
      <pubDate>Mon, 03 Apr 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/04/protecting-your-data-from-being-slurped-up/</guid>
      <description>&lt;p&gt;How to protect your data from what the &lt;a
	
		href = &#34;https://www.theguardian.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Guardian
	&lt;/span&gt;
&lt;/a&gt; calls as &amp;lsquo;&lt;a
	
		href = &#34;https://www.theguardian.com/us-news/2017/mar/31/us-border-phone-computer-searches-how-to-protect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		US border agents are doing &amp;lsquo;digital strip searches&amp;rsquo;?
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The only way I think this is possible in a fool-proof way in the near future is that every has to absolutely implement a two-factor-DDA-authentication. There is not better #security today - period! There ain&amp;rsquo;t no stinking #AI, #RNN, #DNN, or Boltzmann machine in the world, or #Quantum computer worth its #quibits which can crack this - at least not in the near future.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/VgC4b9K-gYU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;And of course, when you have friends and family involved, the group authentication is a sure-fire way to stop anyone snooping in. #security&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloPortation - Limits of Human Kind</title>
      <link>/post/2017/03/holoportation-limits-of-human-kind/</link>
      <pubDate>Fri, 17 Mar 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/03/holoportation-limits-of-human-kind/</guid>
      <description>&lt;p&gt;When it comes to AI and the limits of human kind, what better example that shows the art of the possible than what Microsoft is doing with special awareness and HoloLens and other sensors.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/7d59O6cfaM0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;And not only can this replay time and allow you to have a &amp;rsquo;living memory&amp;rsquo; but it also is mobile.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/nTkFO2xNkIk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I do believe we are living in the great time ever! :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Neural Networks</title>
      <link>/post/2017/03/neural-networks/</link>
      <pubDate>Thu, 16 Mar 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/03/neural-networks/</guid>
      <description>&lt;p&gt;Of course you heard of Neural Networks! In the context of #AI they are all the buzz of course.&lt;/p&gt;
&lt;p&gt;You might have heard of some such as DFF (Deep Feed Forward) or RNN (Recurrent neural networks)? Or perhaps you meant Recursive neural networks? Irrespective, it can be quite messy as you can see below and it would be somewhat important to have some understanding of the differences.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/neuralnetworks.png&#34; alt=&#34;neuralnetworks&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in case you are thinking, well what good or use is all this? Here is one example ( MarI/O - Machine Learning for Video Games) that shows how a computer learned to play Mario using DeepMind and a Neural network.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/qv6UVOQ0F44?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;MarI/O uses something called &lt;a
	
		href = &#34;http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NEAT
	&lt;/span&gt;
&lt;/a&gt; (neural evolution of augmenting topologies) and is written in &lt;a
	
		href = &#34;http://tasvideos.org/Bizhawk/LuaFunctions.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lua
	&lt;/span&gt;
&lt;/a&gt; (which is very similar to .NET) and runs in &lt;a
	
		href = &#34;http://tasvideos.org/BizHawk.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BizHalk
	&lt;/span&gt;
&lt;/a&gt; which is a emulator for games and their various platforms (and not to be confused with BizTalk). You can checkout the code for this &lt;a
	
		href = &#34;http://pastebin.com/dl/ZZmSNaHX&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fjodor also has &lt;a
	
		href = &#34;http://www.asimovinstitute.org/neural-network-zoo/?utm_source=mybridge&amp;amp;utm_medium=blog&amp;amp;utm_campaign=read_more&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		outlined
	&lt;/span&gt;
&lt;/a&gt; a (very) brief outline on what some of these are and what they mean. If you just want to get a quick basic understand it is a great read, with of course links back to original research papers (and deeper reads) if that is your cup of tea.&lt;/p&gt;
&lt;p&gt;Happy reading! 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Culture</title>
      <link>/post/2017/02/on-culture/</link>
      <pubDate>Tue, 21 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/on-culture/</guid>
      <description>&lt;p&gt;I have said in the past, Culture eats strategy for breakfast. One cannot fix culture - but rather lead with example and have others follow.&lt;/p&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.usatoday.com/story/tech/news/2017/02/20/microsofts-satya-nadella-counting-culture-shock-drive-growth/98011388/?hootPostID=666c890860108dccf372c67964ec4895&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		This article
	&lt;/span&gt;
&lt;/a&gt; on how Satya at Microsoft is expecting a culture shock to drive growth at Microsoft is a great example of this. Quite exciting days for Microsoft ahead.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google as Xerox PARC?</title>
      <link>/post/2017/02/google-as-xerox-parc/</link>
      <pubDate>Fri, 17 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/google-as-xerox-parc/</guid>
      <description>&lt;p&gt;This wired article titled &lt;a
	
		href = &#34;https://www.wired.com/2012/08/google-as-xerox-parc/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		If Xerox PARC Invented the PC, Google Invented the Internet
	&lt;/span&gt;
&lt;/a&gt;, is an old one - from 5 years ago, but it is still an inspirational read. So many things lined up for Google, to be where they are today.&lt;/p&gt;
&lt;p&gt;I still get goose bumps reading that article - but then I am a geek, if that wasn&amp;rsquo;t obvious. Whilst, grid computing with GFS, MapReduce, Hadoop, are still very much relevant and great (and most others still trying to use and understand it); Dynamo (from Amazon) and BigTable lead to NoSQL which is great and still worth spending a lot of time learning, playing, and, experimenting - I would love to hear on what they are doing now with &lt;a
	
		href = &#34;https://www.wired.com/2012/07/google-colossus/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Colossus
	&lt;/span&gt;
&lt;/a&gt; (think of that as GFS vNext), &lt;a
	
		href = &#34;https://googleblog.blogspot.com/2010/06/our-new-search-index-caffeine.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Caffeine
	&lt;/span&gt;
&lt;/a&gt; and, &lt;a
	
		href = &#34;https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Spanner
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;7 years is an eternity and who knows what is cooking? And of course what are both Microsoft and Amazon doing to compete around this. How can you not continue to be excited the world we are living in? &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Spectator view - allowing others to see what you are seeing</title>
      <link>/post/2017/02/hololens-spectator-view-allowing-others-to-see-what-you-are-seeing/</link>
      <pubDate>Tue, 14 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/hololens-spectator-view-allowing-others-to-see-what-you-are-seeing/</guid>
      <description>&lt;p&gt;Microsoft just announced an update around the HoloLens that allows you to share on what you are seeing (from a first-person perspective) with others to make to more interactive. This is a combination of MRC (Mixed Reality Capture) which already exists and some new updates that address some of the short coming of the MRC - especially when working with a audience.&lt;/p&gt;
&lt;p&gt;The main use case on the spectator view - as the name suggests is to allow those in the room not wearing a device to see the holograms but also the interactions that the folks wearing HoloLens with their mixed reality experience.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/SpectatorViewVideo.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can use this to capture a mixed-reality scene, live stream the content (say in a meeting / conference), and, shoot/record the video. This essentially is the &amp;lsquo;cheap&amp;rsquo; version of the special camera rig that Microsoft uses for keynote presentations.&lt;/p&gt;
&lt;p&gt;It is not as straight forward as you might imagine; but at the same time if you are doing this &amp;lsquo;properly&amp;rsquo; it isn&amp;rsquo;t as complex as well. You need some special equipment, and need to change some configuration, and add details to your apps to account for this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/spectatorView-246x300.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You do need some special DSLR cameras (with HDMI output), and some other hardware - details can be found here. You can also 3D print the mount (STP can be &lt;a
	
		href = &#34;https://github.com/Microsoft/HoloLensCompanionKit/blob/master/SpectatorView/Hardware/HoloLens_Mount.stp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		found here
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/SpectatorViewRig-300x198.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And in addition there are a bunch of other steps that you need to do - from calibrating  (to get the offset from the camera), to the Compositor (which is a unity extension)  and allows you to record the video and change the hologram opacity, spatial mapping data details, etc.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Calibration-300x249.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;All the detailed steps &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/windows/holographic/spectator_view&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		can be found here.
	&lt;/span&gt;
&lt;/a&gt; And if this is all new, then I highly recommend to check out the &lt;a
	
		href = &#34;https://developer.microsoft.com/en-us/windows/holographic/holograms_240&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Holograms 240 course
	&lt;/span&gt;
&lt;/a&gt;. And below is an example on what this all can look like.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/aKX8UMejtWc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Preparation</title>
      <link>/post/2017/02/preparation/</link>
      <pubDate>Thu, 09 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/preparation/</guid>
      <description>&lt;p&gt;Us vs. some of our friends. You know who you are. &lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1486610752917.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mouse without borders issue - Only one usage of each socket address</title>
      <link>/post/2017/02/mouse-without-borders-issue-only-one-usage-of-each-socket-address/</link>
      <pubDate>Sun, 05 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/02/mouse-without-borders-issue-only-one-usage-of-each-socket-address/</guid>
      <description>&lt;p&gt;I have been using &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/download/details.aspx?id=35460&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mouse without Borders
	&lt;/span&gt;
&lt;/a&gt;, a program that allows you to make a virtual KVM between machines for some time at home and it is awesome. You can use one set of keybard and mouse among various (windows) machines including clipboard and copy and paste. If you haven&amp;rsquo;t tried it, I would highly recommend it.&lt;/p&gt;
&lt;p&gt;However lately I could not connect between two machines and kept getting the error: &amp;ldquo;&lt;em&gt;Only one usage of each socket address&lt;/em&gt;&amp;rdquo;. To the point where it was unusable and was pretty annoying. I looked online at &lt;a
	
		href = &#34;http://aka.ms/mm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		their site
	&lt;/span&gt;
&lt;/a&gt; but nothing jumped out. BTW, I was seeing this only on one machine (running Windows 10) and not the other one (also running Windows 10 but an inner ring of the Creators Update - essentially the next version of Windows).&lt;/p&gt;
&lt;p&gt;What I understand the issue to be is that Windows is running out of ports and where programs that use a port for a short time, it won&amp;rsquo;t matter much, in this case the port is always going to be used.&lt;/p&gt;
&lt;p&gt;The solution that seems to be working for me is quite simple - we increase the number of ports available to Windows. This is quite simple and to do this if you run an &lt;strong&gt;elevated command prompt&lt;/strong&gt; and copy and paste the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;netsh int ipv4 set dynamicport tcp start=1025 num=64511&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And if you are not sure on how to get the elevated command prompt - easiest way to do that is press &lt;strong&gt;WinKey + X,&lt;/strong&gt; and from the menu select Command Prompt (Admin) as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/elevated-command-prompt-135x300.jpg&#34; alt=&#34;Elevated command prompt menu&#34;/&gt;
        &lt;figcaption&gt;Elevated command prompt&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How does the Netherlands welcome the new US President?</title>
      <link>/post/2017/01/how-does-the-netherlands-welcome-the-new-us-president/</link>
      <pubDate>Fri, 27 Jan 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/01/how-does-the-netherlands-welcome-the-new-us-president/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/j-xxis7hDOE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Bing Blues</title>
      <link>/post/2017/01/bing-blues/</link>
      <pubDate>Tue, 10 Jan 2017 00:00:00 +0000</pubDate>
      
      <guid>/post/2017/01/bing-blues/</guid>
      <description>&lt;p&gt;It isn&amp;rsquo;t often that one see&amp;rsquo;s issues with Bing - I can&amp;rsquo;t recall when I last saw it, but then when it does it sure is cute. We love Pandas so this can only be good. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/bing-fail-300x185.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy New Year</title>
      <link>/post/2016/12/happy-new-year/</link>
      <pubDate>Sat, 31 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/happy-new-year/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456719605406.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blockchain, blockchain, blockchain!</title>
      <link>/post/2016/12/blockchain-blockchain-blockchain/</link>
      <pubDate>Sun, 04 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/blockchain-blockchain-blockchain/</guid>
      <description>&lt;p&gt;Dilbert says it nicely! :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain1-300x99.png&#34; alt=&#34;blockchain1&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain2-300x91.jpg&#34; alt=&#34;blockchain2&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/blockchain3-300x95.png&#34; alt=&#34;blockchain3&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Object and scene detection with #AI</title>
      <link>/post/2016/12/object-and-scene-detection-with-ai/</link>
      <pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/object-and-scene-detection-with-ai/</guid>
      <description>&lt;p&gt;Continuing the previous #ArtificialIntelligence theme. Wanted to see what and how does Amazon&amp;rsquo;s rekognition work and different from the #AI offerings from the others, such as Microsoft.&lt;/p&gt;
&lt;p&gt;Here is a #ProjectMurphy image&amp;rsquo;s confidence score. I am glad to see that there is a 99% confidence that this is a person.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture-300x136.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Object and Scene detection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;The request POST is quite simple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;region&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;application/x-amz-json-1.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;X-Amz-Date&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Thu, 01 Dec 2016 22:21:01 GMT&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;X-Amz-Target&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;com.amazonaws.rekognitionservice.RekognitionService.DetectLabels&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;contentString&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Attributes&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;ALL&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Image&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Bytes&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And so is the response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Labels&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.2780990600586&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;People&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.2780990600586&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Person&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.27307891845703&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Human&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;73.7669448852539&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flyer&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;73.7669448852539&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Poster&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;68.23612213134765&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Art&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;58.291263580322266&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Brochure&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;55.91957092285156&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Modern Art&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Blossom&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flora&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Flower&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Petal&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;53.9996223449707&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Plant&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50.69965744018555&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Face&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;50.69965744018555&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Selfie&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what the facial analysis shows;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/facial-analysis-Capture-300x149.jpg&#34; alt=&#34;Facial Analysis&#34;/&gt;
        &lt;figcaption&gt;Facial Analysis&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;However how does it handle something a little more complex perhaps?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Capture2-300x131.jpg&#34; alt=&#34;Object and Scene detection&#34;/&gt;
        &lt;figcaption&gt;Object and Scene detection&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, what of the comparison? I think there might be some more work to be done on that front.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Face-Comparison-Capture-300x134.jpg&#34; alt=&#34;Face Comparison capture&#34;/&gt;
        &lt;figcaption&gt;Face Comparison capture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Here is the response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;FaceMatches&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Face&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BoundingBox&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Height&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3878205120563507&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Left&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.2371794879436493&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Top&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.22435897588729858&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Width&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.3878205120563507&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.79533386230469&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Similarity&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;SourceImageFace&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;BoundingBox&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Height&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.209781214594841&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Left&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.4188888967037201&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Top&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.13127413392066955&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Width&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;0.18111111223697662&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;#34;Confidence&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f5a97f&#34;&gt;99.99442291259765&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Playing with #AI</title>
      <link>/post/2016/12/playing-with-ai/</link>
      <pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/12/playing-with-ai/</guid>
      <description>&lt;p&gt;So, been spending a lot of time recently around many things related to Artificial Intelligence (#AI).  More on that some day. :)&lt;/p&gt;
&lt;p&gt;Was curious about yesterdays Amazon&amp;rsquo;s announcement to jump on this bandwagon. Of course Microsoft and others have been there. I don&amp;rsquo;t know to what extend has Amazon been working on this, but given Alexa has been out for a couple of years, I know they have had rich pickings of tuning this further.&lt;/p&gt;
&lt;p&gt;I thought Polly (like the parrot?) was quite different from the things I have seen from others. This is a text-to-speech, where it renders the inputted text into various dialects and you can have a few outputs for those too. It supports a few dialects (for the synthesized speech) and one can use it using a simple API (the &lt;a
	
		href = &#34;http://docs.aws.amazon.com/polly/latest/dg/examples-android.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Android example
	&lt;/span&gt;
&lt;/a&gt; shows it is not very complex to consume, of course you still need to think about the overall design and elements of Software Engineering, latency, limits, bandwidth, etc.). Should you desire you can customize it using pronunciation &lt;a
	
		href = &#34;http://docs.aws.amazon.com/polly/latest/dg/managing-lexicons-console.html#managing-lexicons-console-synthesize-speech&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Lexicons
	&lt;/span&gt;
&lt;/a&gt; that allow one to tweak this.&lt;/p&gt;
&lt;p&gt;Here are a few examples, none of them are me, and hence the &amp;ldquo;cold&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Australian (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/AU-russell-speech_20161201220502282.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Indian (Female):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/Indian-raveena-speech_20161201220349857.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Italian (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/IT-giorgio-speech_20161201220546803.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;US/American (Male):


&lt;div&gt;
  &lt;figure&gt;
    &lt;audio
      controls
      src=&#34;audio/US-joey-speech_20161201220418979.mp3&#34;
      title=&#34;&#34;
      style=&#34;width: 50%&#34;&gt;
      Your browser does not support the &lt;code&gt;audio&lt;/code&gt; element.
    &lt;/audio&gt;
    
  &lt;/figure&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Of course, if you play with it, it is easy to pick up the patterns and what is being changed, versus not. But kudos to the team on this. I think it will help accelerate the adoption of #AI.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Excel runs the world</title>
      <link>/post/2016/10/excel-runs-the-world/</link>
      <pubDate>Fri, 07 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/excel-runs-the-world/</guid>
      <description>&lt;p&gt;This video proves it; and it also shows that Clint is probably one of the best teachers out there! Love the passion! Now, go learn some Excel. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/SPLzV0-X0lI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>How I feel each time I wear the HoloLens?</title>
      <link>/post/2016/10/how-i-feel-each-time-i-wear-the-hololens/</link>
      <pubDate>Wed, 05 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/how-i-feel-each-time-i-wear-the-hololens/</guid>
      <description>&lt;p&gt;Honestly, I don&amp;rsquo;t think even Tony Stark can explain - this sums it up quite nicely and the music is just the cherry on top. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/mRi1dmFgRfo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Real-time performance capture - HoloPortation?</title>
      <link>/post/2016/10/real-time-performance-capture-holoportation/</link>
      <pubDate>Wed, 05 Oct 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/10/real-time-performance-capture-holoportation/</guid>
      <description>&lt;p&gt;Some of the folks working on PPI and HoloPortation team from MSR left and went to setup a new company called &lt;a
	
		href = &#34;http://perceptiveio.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PerceptiveIO
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They have recently published a paper called &lt;a
	
		href = &#34;http://dl.acm.org/ft_gateway.cfm?id=2925969&amp;amp;ftid=1755905&amp;amp;dwn=1&amp;amp;CFID=643334899&amp;amp;CFTOKEN=80320629&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fusion4D: Real0time performance capture of challenging scenes.
	&lt;/span&gt;
&lt;/a&gt; In that they cover some of the work around multi-view performance capture, the raw depth acquisition and preprocessing that needs to be done around that. This interestingly also handles deformation changes (e.g. taking off a jacket or a scarf) and these can be non-rigid and much more difficult to handle, but they are done beautifully.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;https://static1.squarespace.com/static/5746a11b044262f1acf279b5/5786958af5e231f300eea37e/5786958a15d5db1ac047b7a3/1468437901247/ffd&amp;#43;1.png?format=1500w&#34; alt=&#34;ffd 1.png&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Combining this with the likes of HoloLens would make it quite interesting. If you want to see more, check out the video below showing the examples and transitions below. Perhaps one day, it would allow us to see and experience events from afar. :)&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/2dkcJ1YhYw4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Three cheers for Agile!</title>
      <link>/post/2016/04/three-cheers-for-agile/</link>
      <pubDate>Sat, 30 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/three-cheers-for-agile/</guid>
      <description>&lt;p&gt;(Hip hip Hooray!)&lt;sup&gt;3&lt;/sup&gt;
&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static1.squarespace.com/static/518f5d62e4b075248d6a3f90/t/571fdf71c6fc0891cbc7e1d7/1461706665876/?format=2500w&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Monkeying Around with Holograms</title>
      <link>/post/2016/04/monkeying-around-with-holograms/</link>
      <pubDate>Fri, 29 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/monkeying-around-with-holograms/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-32.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I guess you can see the similarity. No? 😈&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Device Portal (Part 2)</title>
      <link>/post/2016/04/hololens-device-portal-part-2/</link>
      <pubDate>Tue, 26 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/hololens-device-portal-part-2/</guid>
      <description>&lt;p&gt;In addition to the HoloLens Device Portal (&lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		see part 1
	&lt;/span&gt;
&lt;/a&gt;), another option is using the UAP HoloLens companion app which you can &lt;a
	
		href = &#34;https://www.microsoft.com/store/apps/9nblggh4qwnx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		install from the store
	&lt;/span&gt;
&lt;/a&gt;. I think this is a little more end-user friendly, and perhaps a little less developer focused. It exposes a subset of the same functionality.&lt;/p&gt;
&lt;p&gt;Once you install it, you connect more or less in the same manner; I think most people will like the live streaming option. There is a bit of latency between the device and what is shown, but that could be somewhat because of our (possibly crappy) wireless which was overloaded with many folks at work.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-23.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Store Option&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-24.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Once you connect and set it up then you see the above screen. Of course you can manage multiple devices from here.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-25.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Once you login, you see a lot of the same information as you saw in &lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-1/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Part 1
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-26.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
You can see the Live stream as shown here; and what might not be obvious that it is both sound and video which is streamed. In this screenshot you can see my (work) login screen, with the password login being a Hologram. Here it is ‘floating’ over the window, and you can see a flavor of the mixed reality.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-27.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
As you can expect, you can capture either a photo or a video on what is being seen via the Device.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-28.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
The photos or videos that you do take, show up here. I suppose they are saved on the device and you would want to take it off there.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-29.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
The virtual keyboard again I think is one of the best features – saving so much time air-tapping and the arms. ! &amp;#x1f604;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-30.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
App manager can do some elements of management, but not as much as the web version.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-31.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
And finally, you can see some details on the device. I think the Shutdown and Reboot options are probably the one which are more useful.&lt;/p&gt;
&lt;p&gt;All in all, this is a little more polished and end-user friendly. Useful when demo’ing the mixed reality solutions you are building.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>HoloLens - Device Portal (Part 1)</title>
      <link>/post/2016/04/hololens-device-portal-part-1/</link>
      <pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/hololens-device-portal-part-1/</guid>
      <description>&lt;p&gt;One of the advantages of running Windows 10 on the HoloLens is that it has all the regular features that you would expect. From a developers perspective, one of those being the Device Portal which is awesome. It is essentially a web server that is being hosted on the machine, and allows you to manage your device over Wifi and USB.&lt;/p&gt;
&lt;p&gt;It is a must have if you want to stream your apps (including Holograms) so that others can see it, or alternatively you can record and then share. And of course there are details for various debug situations and the Virtual input saves your fingers from getting tired! 😄 You also use this to side load the apps you built. There are &lt;a
	
		href = &#34;https://msdn.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-hololens#holographic-os&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		REST APIs
	&lt;/span&gt;
&lt;/a&gt; you could use if you want to program, and there is also a UAP app on the store (more on that in &lt;a
	
		href = &#34;/post/2016/04/hololens-device-portal-part-2/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		part 2
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;To get to this, you browse to the IP address. Below are a few screenshots from my playing around which shows you the various aspects of the portal and what all you can do. And the beauty of this is, as a Windows developer, this all should be very familiar and nothing new. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-6.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Home Screen – once you login&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-7.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;3D View Settings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-8.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Mixed reality capture&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Mixed reality capture – one of the key elements that lets you share the magic with others&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-9.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Perf Tracing&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Perf Tracing and the various levels you can set as part of &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/performance/cc825801.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Performance Toolkit
	&lt;/span&gt;
&lt;/a&gt;. This is WPR/WPA support in Systems.Diagnostics.Tracing – see &lt;a
	
		href = &#34;https://blogs.msdn.microsoft.com/vancem/2013/08/10/wprwpa-support-for-viewing-system-diagnostics-tracing-eventsource/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb-10.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;Process details&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;
Process details and you can sort by the relevant column.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-11.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #1 – showing various details from Power to Framerate to IO, Memory, etc..&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-12.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #2&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-13.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Process details #3&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-14.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
App Manager which is where you side-load apps and manage them&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-15.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Crash Data – the name says it all&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-16.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Kiosk Mode – this is really interesting; you can ‘lock’ into one app and use that. I wonder how one breaks out of it when done being in this mode and wanting to get back to ‘regular’.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-17.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-18.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
All the ETW (&lt;a
	
		href = &#34;https://msdn.microsoft.com/en-us/library/ms751538%28v=vs.110%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Event tracing for Windows
	&lt;/span&gt;
&lt;/a&gt;) details and the providers you can want. Again pretty standard stuff.&lt;/p&gt;
&lt;p&gt;[&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-19.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Simulation – not sure if this is used for regression or playback in another setting – where the room capture would help. Does open up interesting possibilities. I think it might allow one to capture the spatial mapping of a room, which then you might be able to use in the emulator (such as someone has done &lt;a
	
		href = &#34;http://hololenshelpwebsite.com/Blog/EntryId/1009/Capture-A-Real-Room-For-The-HoloLens-Emulator&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-20.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Networking Configuration where you go and manage this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-21.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
Virtual Input – a great time saver.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-22.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;
And finally, some of the security settings to ensure no one on the same subnet is mucking with you; or when there is more than one device then you talking to the right one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creative Coding</title>
      <link>/post/2016/04/creative-coding/</link>
      <pubDate>Fri, 22 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/creative-coding/</guid>
      <description>&lt;p&gt;As we start to play and explore with new AR/VR mediums like Oculus and HoloLens there is a stronger shift from the traditional medium of working from a more transaction with-known-outcome based model to a more expressive and exploratory model. In the context of many enterprises this is a bigger shift - albeit some of it they have started seeing with mobility but still not the same.&lt;/p&gt;
&lt;p&gt;I really like how &lt;a
	
		href = &#34;https://twitter.com/rickbarraza&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Rick
	&lt;/span&gt;
&lt;/a&gt; explains and expresses this both in terms of definition and thinking. The clay analogy I think really helps.&lt;/p&gt;
&lt;iframe src=&#34;//www.youtube.com/embed/1rx86BeqZTM&#34; width=&#34;560&#34; height=&#34;314&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>bash on Windows is real &amp; not a VM</title>
      <link>/post/2016/04/bash-on-windows-is-real-not-a-vm/</link>
      <pubDate>Wed, 20 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-on-windows-is-real-not-a-vm/</guid>
      <description>&lt;p&gt;I have talked to a few folks recently, and they still don’t believe bash on Windows (RS1) is ‘real’ and think it some kind of a VM. No it is not. It is the ‘real’ user mode running on Windows. It is not Cygwin, and it is not a VM. It is essentially all of the user mode (I.e. Linux without the kernel).&lt;/p&gt;
&lt;p&gt;The kernel in this case is a wrapper around the NT kernel that translates the Linux commands to Windows and then things run. As far as Linux is concerned, its the same code and doesn’t have any changes). Technically this is called Windows Subsystem for Linux (WSL).&lt;/p&gt;
&lt;p&gt;On windows, this is installed in the user space; so each user get their own instance effectively which is isolated from the other users. Once you install it (and if you are still reading this, then you probably know how to install it), then this shows up under &lt;code&gt;C:\Users\your-user-ID\AppData\Local\lxss&lt;/code&gt;. If you can’t find that folder, you can still type it and navigate to it. Below is  a screen shot on what this looks like:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-3.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;It is a little interesting and been mucking around this. Here is you can see the installation of gcc:
&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-4.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And here is the output of the CPU details:
&lt;p&gt;

    &lt;img src=&#34;images/image_thumb-5.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@localhost:/proc# cat cpuinfo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;processor       : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vendor_id       : GenuineIntel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu family      : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model           : &lt;span style=&#34;color:#f5a97f&#34;&gt;78&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;model name      : Intel&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;R&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; Core&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;(&lt;/span&gt;TM&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;)&lt;/span&gt; i7-6600U CPU @ 2.60GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stepping        : &lt;span style=&#34;color:#f5a97f&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;microcode       : 0xffffffff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu MHz         : 2808.000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache size      : &lt;span style=&#34;color:#f5a97f&#34;&gt;256&lt;/span&gt; KB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;physical id     : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;siblings        : &lt;span style=&#34;color:#f5a97f&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;core id         : &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpu cores       : &lt;span style=&#34;color:#f5a97f&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apicid          : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;initial apicid  : &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu             : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fpu_exception   : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cpuid level     : &lt;span style=&#34;color:#f5a97f&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wp              : yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm pni pclmulqdq est tm2 ssse3 fma cx16 xtpr sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bogomips        : 5616.00
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;clflush size    : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cache_alignment : &lt;span style=&#34;color:#f5a97f&#34;&gt;64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;address sizes   : &lt;span style=&#34;color:#f5a97f&#34;&gt;36&lt;/span&gt; bits physical, &lt;span style=&#34;color:#f5a97f&#34;&gt;48&lt;/span&gt; bits virtual
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;power management:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root@localhost:/proc#&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All, in all a very interesting world. A few things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is still in beta, so there will be issues.&lt;/li&gt;
&lt;li&gt;It is user mode and not server mode. Live with it.&lt;/li&gt;
&lt;li&gt;There would be path issues if you stray into the 256 character limit of Windows and then try and manipulate it in bash.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Download Build (2016) decks and videos</title>
      <link>/post/2016/04/download-build-2016-decks-and-videos/</link>
      <pubDate>Wed, 13 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/download-build-2016-decks-and-videos/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; - Was a typo in the script, which I fixed. If someone had an issue, copy it again and give it a go.&lt;/p&gt;
&lt;p&gt;I prefer to download and see the decks and videos &amp;lsquo;offline&amp;rsquo; instead of streaming, as I can easily pause them and then pick off where I left - especially handy when I need to go to a meeting, or take care of some work, or just on a crappy network.&lt;/p&gt;
&lt;p&gt;To that end, I downloaded all the sessions and the videos from Build (2016); I think one of the sessions might have gotten corrupted, but ignoring that I have about 140GB of data downloaded and 219 Sessions.&lt;/p&gt;
&lt;p&gt;To do this, I used a Power Shell script that helped me download. The script (below) is simple enough - it loops through and for each session does the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates the relevant folder - this includes the Session code, Title, and the Presenters.&lt;/li&gt;
&lt;li&gt;For each session, extracts the abstract / description of that session and saves it in a text file in that folder.&lt;/li&gt;
&lt;li&gt;Downloads the presentation for that session.&lt;/li&gt;
&lt;li&gt;Downloads a jpg which shows the image session - sometimes it is easier just to see the title slide. I thought better to have it and not use it, than the other way.&lt;/li&gt;
&lt;li&gt;And finally downloads the high-quality video of that session. In the script, you can choose a lower quality video if you prefer that. And if you want only the decks, then you can comment out parts of the script where it doesn&amp;rsquo;t download the video.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example on what the output for one of the sessions (P517 - Debugging Events in Edge) looks like:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/Build-2016-download-example.jpg&#34; alt=&#34;Build-2016-download-example&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;A few points to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the script, the root folder it tries to create and use is &lt;code&gt;&amp;quot;d:\build&amp;quot;&lt;/code&gt;; you might want to change this to something else you prefer or what works for you. I would recommend to not making the root too long as you would get into long file name issues.&lt;/li&gt;
&lt;li&gt;The script first loops through and downloads everything else except the videos first. And then 2nd time goes and grabs the videos.&lt;/li&gt;
&lt;li&gt;If there is an exception with the images, then it just &amp;rsquo;eats&amp;rsquo; it and moves on. It is not a breaking condition to stop the script.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;  1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;  2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;  3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;  4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;  5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;  6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;  7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;  8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;  9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt; 10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt; 11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt; 12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt; 13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt; 14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt; 15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt; 16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt; 17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt; 18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt; 19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt; 20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt; 21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt; 22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt; 23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt; 24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt; 25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt; 26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt; 27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt; 28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt; 29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt; 30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt; 31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt; 32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt; 33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt; 34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt; 35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt; 36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt; 37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt; 38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt; 39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt; 40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt; 41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt; 42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt; 43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt; 44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt; 45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt; 46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt; 47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt; 48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt; 49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt; 50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt; 51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt; 52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt; 53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt; 54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt; 55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt; 56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt; 57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt; 58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt; 59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt; 60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt; 61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt; 62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt; 63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt; 64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt; 65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt; 66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt; 67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt; 68&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;69&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#69&#34;&gt; 69&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;70&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#70&#34;&gt; 70&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;71&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#71&#34;&gt; 71&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;72&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#72&#34;&gt; 72&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;73&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#73&#34;&gt; 73&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;74&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#74&#34;&gt; 74&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;75&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#75&#34;&gt; 75&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;76&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#76&#34;&gt; 76&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;77&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#77&#34;&gt; 77&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;78&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#78&#34;&gt; 78&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;79&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#79&#34;&gt; 79&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;80&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#80&#34;&gt; 80&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;81&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#81&#34;&gt; 81&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;82&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#82&#34;&gt; 82&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;83&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#83&#34;&gt; 83&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;84&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#84&#34;&gt; 84&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;85&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#85&#34;&gt; 85&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;86&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#86&#34;&gt; 86&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;87&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#87&#34;&gt; 87&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;88&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#88&#34;&gt; 88&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;89&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#89&#34;&gt; 89&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;90&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#90&#34;&gt; 90&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;91&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#91&#34;&gt; 91&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;92&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#92&#34;&gt; 92&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;93&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#93&#34;&gt; 93&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;94&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#94&#34;&gt; 94&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;95&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#95&#34;&gt; 95&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;96&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#96&#34;&gt; 96&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;97&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#97&#34;&gt; 97&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;98&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#98&#34;&gt; 98&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;99&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#99&#34;&gt; 99&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;100&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#100&#34;&gt;100&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;101&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#101&#34;&gt;101&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;102&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#102&#34;&gt;102&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;103&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#103&#34;&gt;103&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;104&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#104&#34;&gt;104&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;105&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#105&#34;&gt;105&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;106&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#106&#34;&gt;106&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;107&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#107&#34;&gt;107&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;108&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#108&#34;&gt;108&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;109&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#109&#34;&gt;109&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;110&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#110&#34;&gt;110&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;111&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#111&#34;&gt;111&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;112&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#112&#34;&gt;112&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;113&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#113&#34;&gt;113&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;114&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#114&#34;&gt;114&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;115&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#115&#34;&gt;115&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;116&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#116&#34;&gt;116&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;117&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#117&#34;&gt;117&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;118&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#118&#34;&gt;118&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;119&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#119&#34;&gt;119&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;120&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#120&#34;&gt;120&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;121&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#121&#34;&gt;121&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;122&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#122&#34;&gt;122&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;123&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#123&#34;&gt;123&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;124&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#124&#34;&gt;124&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;125&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#125&#34;&gt;125&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;126&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#126&#34;&gt;126&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;127&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#127&#34;&gt;127&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;128&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#128&#34;&gt;128&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;129&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#129&#34;&gt;129&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;130&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#130&#34;&gt;130&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;131&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#131&#34;&gt;131&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;132&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#132&#34;&gt;132&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;133&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#133&#34;&gt;133&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;134&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#134&#34;&gt;134&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;135&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#135&#34;&gt;135&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;136&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#136&#34;&gt;136&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# First setup the folder where to download using the parameters outlined below.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Second, loop through and get the decks first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Third. loop through and get the videos last&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Note: IF you don&amp;#39;t want to download the videos, and want only the pptx then comment the section later in the script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#eed49f&#34;&gt;Environment&lt;/span&gt;]::CurrentDirectory=(&lt;span style=&#34;color:#91d7e3&#34;&gt;Get-Location&lt;/span&gt; -PSProvider FileSystem).&lt;span style=&#34;color:#f5a97f&#34;&gt;ProviderPath&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;new-object&lt;/span&gt; net.webclient)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Filenames might get long, so keep this short!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;D:\build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$fpath&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;set-location&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the RSS feed - Build 2016&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2016/rss/mp4high&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt; = (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;downloadstring&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://s.ch9.ms/events/build/2016/rss/slides&amp;#34;&lt;/span&gt;)) 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Video quality default is high; you can select regular (mp4) or lower quality (mp3)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2015/rss/mp4&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#$a = ($rss.downloadstring(&amp;#34;http://s.ch9.ms/events/build/2015/rss/mp3&amp;#34;)) &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the decks **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$b&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;item&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Get the url for the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;thumbnail&lt;/span&gt;.url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# make the filename readable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.pptx&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;_960.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the PowerPoint file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the pptx file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urlpptx&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# download the jpg but don&amp;#39;t want to break if this doesn&amp;#39;t exist; hence the nested try blocks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$urljpg&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Jpeg &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt; doesn&amp;#39;t exist ... eating the exception and moving on ...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filepptx&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$filejpg&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** Downloading all the decks complete ***************&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Oops, could not find any slides.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# ********** download the videos **********&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$a&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;rss&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;channel&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;item&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {   
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;comments&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;) | &lt;span style=&#34;color:#91d7e3&#34;&gt;select &lt;/span&gt;-last &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Grab the URL for the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Uri&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;enclosure&lt;/span&gt;.url)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Create the local file name for the MP4 download&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;120&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-ne&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$code&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34; - &amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#f5a97f&#34;&gt;Replace&lt;/span&gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, [&lt;span style=&#34;color:#eed49f&#34;&gt;System.Math&lt;/span&gt;]::Min(&lt;span style=&#34;color:#f5a97f&#34;&gt;100&lt;/span&gt;, &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.Length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;NoCodeSessions&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-not&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3&#34;&gt;Test-Path&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;)) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;Write-Host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Folder &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;) dosen&amp;#39;t exist. Creating it...&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt; -type directory 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Make sure the MP4 file doesn&amp;#39;t already exist&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (!(&lt;span style=&#34;color:#91d7e3&#34;&gt;test-path&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)) {     
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Echo out the  file that&amp;#39;s being downloaded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt; = (&lt;span style=&#34;color:#91d7e3&#34;&gt;New-Object&lt;/span&gt; System.&lt;span style=&#34;color:#f5a97f&#34;&gt;Net&lt;/span&gt;.WebClient)  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;# Download the MP4 file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f4dbd6&#34;&gt;$wc&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;DownloadFile&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$url&lt;/span&gt;, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#91d7e3&#34;&gt;mv &lt;/span&gt;&lt;span style=&#34;color:#f4dbd6&#34;&gt;$file&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Try and get the Sessions text description&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;New-Item&lt;/span&gt; -type file &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$downloadlocation&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Folder&lt;/span&gt;)&lt;span style=&#34;color:#a6da95&#34;&gt;\&lt;/span&gt;$(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Code&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;())&lt;span style=&#34;color:#a6da95&#34;&gt;.txt&amp;#34;&lt;/span&gt; -Force  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; ; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;category&lt;/span&gt; | &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; {&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt; += &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt; = &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;title&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;creator&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$_&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;summary&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;trim&lt;/span&gt;() + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;`r`n&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&lt;/span&gt; + &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Substring&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#f4dbd6&#34;&gt;$Category&lt;/span&gt;.&lt;span style=&#34;color:#f5a97f&#34;&gt;Length&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;-1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#91d7e3&#34;&gt;add-content&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$OutFile&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$Content&lt;/span&gt;       
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#end-loop foreach&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#91d7e3&#34;&gt;Write-host&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;*************** All Done! ***************&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>bash and Windows 10 on Fire!</title>
      <link>/post/2016/04/bash-and-windows-10-on-fire/</link>
      <pubDate>Thu, 07 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-and-windows-10-on-fire/</guid>
      <description>&lt;p&gt;OK, now this is cool - not only is bash on fire, but I can miracast directly from Windows to another device.&lt;/p&gt;
&lt;p&gt;The first video shows a few basic shell commands and then catches fire!&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2016/04-bash-and-windows-10-on-fire/bash-on-windows-compressed.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

&lt;p&gt;And this second video - essentially miracasts the same video you just saw on my TV without any special adapters. The TV is connected to the network and is showing a channel. Windows RS1 (&amp;ldquo;Anniversary Edition&amp;rdquo;) can find that on the network (from a Surface Book) and directly stream to that. The TV automatically switches over the input from cable and shows the video; and when I stop, it switches back to the cable input. Sweet. :)&lt;/p&gt;
&lt;video class=&#34;video-shortcode&#34; preload=&#34;auto&#34; controls&gt;
    &lt;source src=&#34;https://desigeek.com/blog_files/2016/04-bash-and-windows-10-on-fire/VID_20160406_215400-compressed.mp4&#34; type=&#34;video/mp4&#34;&gt;
    There should have been a video here but your browser does not seem
    to support it.
&lt;/video&gt;

</description>
    </item>
    
    <item>
      <title>Bash and Windows 10 &#34;Anniversary Update&#34;</title>
      <link>/post/2016/04/bash-and-windows-10-anniversary-update/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-and-windows-10-anniversary-update/</guid>
      <description>&lt;p&gt;I am wondering, so what happens to PowerShell now?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bash on Windows</title>
      <link>/post/2016/04/bash-on-windows/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/bash-on-windows/</guid>
      <description>&lt;p&gt;Hmm, what is it downloading from the store? I thought that is what The Add/Remove features would add.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image-1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Unity and Visual Studio</title>
      <link>/post/2016/04/unity-and-visual-studio/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/unity-and-visual-studio/</guid>
      <description>&lt;p&gt;Have been playing, a little with the new Visual Studio “preview” version (the installation of which is super smooth and takes waaaaay less time!). And as part of that saw the Unity Debugger option. Was this always there or is that new? Or did the Unity Tools beta add it? Interesting times to start playing with this, primarily for AR/VR and #HoloLens.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Virtual Reality</title>
      <link>/post/2016/04/virtual-reality/</link>
      <pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/04/virtual-reality/</guid>
      <description>&lt;p&gt;Will be publishing a Virtual Reality (VR) point of view internally, and thinking of starting with this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static1.squarespace.com/static/518f5d62e4b075248d6a3f90/t/5337bbb1e4b07095cdd94402/1396161460278/?format=1500w&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Testing LaTeX</title>
      <link>/post/2016/03/testing-latex/</link>
      <pubDate>Thu, 24 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/testing-latex/</guid>
      <description>&lt;p&gt;Can we see the formula displayed in lovely maths? (and trying a simpler equation, as the last one did not parse properly)&lt;/p&gt;
&lt;p&gt;$$i\hbar\frac{\partial}{\partial t}\left|\Psi(t)\right&amp;gt;=H\left|\Psi(t)\right&amp;gt;$$&lt;/p&gt;
&lt;p&gt;Ohh, looks pretty! Though some LaTeX is being finicky, need to take out time to start posting some stuff here, given this is supported. &amp;#x1f601;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Humans and threading</title>
      <link>/post/2016/03/humans-and-threading/</link>
      <pubDate>Sat, 12 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/humans-and-threading/</guid>
      <description>&lt;p&gt;We,  humans, are multi-threaded by design and can do many things in parallel -  with two exceptions I think. The only two blocking function we have to deal with are sneezing and farting. During these times, all current activity must be suspended for the duration. And of course it can be pretty annoying (or depending on the function, embarrassing).&lt;/p&gt;
&lt;p&gt;So next time you check in some code, think about it -  is this smelly and sneezy (yep, that&amp;rsquo;s a word, now) or have I done the right thing?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is Love?</title>
      <link>/post/2016/03/what-is-love/</link>
      <pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/what-is-love/</guid>
      <description>&lt;p&gt;#Love is &amp;hellip; staying friends throughout a holiday with no WiFi. ????&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Z-Wave visualiser?</title>
      <link>/post/2016/03/z-wave-visualiser/</link>
      <pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/z-wave-visualiser/</guid>
      <description>&lt;p&gt;At home I have a multitude of sensors and devices - ~80 or so which are a combination of water sensors,  motion sensors, door sensors, humidity, temperature, etc.&lt;/p&gt;
&lt;p&gt;A good bunch of these are controlled and integrated with Smartthings, and some I can interact with other apps (e.g. Amazon Echo or Philips Hue etc.).&lt;/p&gt;
&lt;p&gt;Most are Z-Wave based and some are WiFi. I wanted to know if there are any z-wave visualisers? Essentially software that uses a USB z-wave network device as a node and then can plot what the mesh looks like. Would be awesome to be able to debug the packet hops from the controller to the device.&lt;/p&gt;
&lt;p&gt;Any suggestions?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>7GB of memory dumps!</title>
      <link>/post/2016/03/7gb-of-memory-dumps/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/7gb-of-memory-dumps/</guid>
      <description>&lt;p&gt;Woah! Almost 7 GB of system error mem dumps! Seriously? I understand the value they provide but why do I need to manually go and clean them up. And 7 GB????? Does anyone even read them?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joys of Parenting</title>
      <link>/post/2016/03/joys-of-parenting/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/03/joys-of-parenting/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456719116628.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Baths and Parenting</title>
      <link>/post/2016/02/baths-and-parenting/</link>
      <pubDate>Mon, 29 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/baths-and-parenting/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wp-1456718907080.jpg&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What If? Einstein would be proud!</title>
      <link>/post/2016/02/what-if-einstein-would-be-proud/</link>
      <pubDate>Mon, 22 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/what-if-einstein-would-be-proud/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1449999921168.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Open Live Writer</title>
      <link>/post/2016/02/open-live-writer/</link>
      <pubDate>Sun, 21 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/open-live-writer/</guid>
      <description>&lt;p&gt;Just downloaded and installed and posting this via &lt;a
	
		href = &#34;http://openlivewriter.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Open Live Writer
	&lt;/span&gt;
&lt;/a&gt;. Remember the lovely (but dead) &lt;a
	
		href = &#34;https://www.microsoft.com/en-us/download/details.aspx?id=8621&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Windows Live Writer
	&lt;/span&gt;
&lt;/a&gt; from Microsoft? Well this is a forked version of that which is open source, based on MIT license.&lt;/p&gt;
&lt;p&gt;The editor is offline and is very similar to word and can support a number of blogging platforms – including the common ones as you would expect. You can muck around the &lt;a
	
		href = &#34;https://github.com/OpenLiveWriter/OpenLiveWriter/archive/0.5.0.0.zip&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		code
	&lt;/span&gt;
&lt;/a&gt; (zip) or check it &lt;a
	
		href = &#34;https://github.com/OpenLiveWriter&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		out on GIT
	&lt;/span&gt;
&lt;/a&gt;. It is still work in progress of course (e.g. Plugin’s are not implemented yet). Irrespective, hugely grateful to &lt;a
	
		href = &#34;https://twitter.com/shanselman&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Scott (Hanselman)
	&lt;/span&gt;
&lt;/a&gt; to get this going.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rules of Threading (revised)</title>
      <link>/post/2016/02/rules-of-threading-revised/</link>
      <pubDate>Thu, 04 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>/post/2016/02/rules-of-threading-revised/</guid>
      <description>&lt;p&gt;I still stand by the &lt;a
	
		href = &#34;/post/2007/09/rules-of-threading/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		rules of threading
	&lt;/span&gt;
&lt;/a&gt;, but saw this on twitter and thought it was great.&lt;/p&gt;
&lt;p&gt;How a litter of puppies can explain the rules of thread? Awesome. 😄&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/B4rVC4ICQAAr65m.jpg&#34; alt=&#34;Embedded image permalink&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>God Mode in Windows 10</title>
      <link>/post/2015/08/god-mode-in-windows-10/</link>
      <pubDate>Tue, 11 Aug 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/08/god-mode-in-windows-10/</guid>
      <description>&lt;p&gt;Got this tip via &lt;a
	
		href = &#34;https://twitter.com/@jaydoscher&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jay Doscher
	&lt;/span&gt;
&lt;/a&gt; at work.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right-click on the desktop&lt;/li&gt;
&lt;li&gt;Select New ==&amp;gt; Folder.&lt;/li&gt;
&lt;li&gt;Rename the new folder to this: &lt;strong&gt;GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You should now have an icon labeled GodMode and the icon changes too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/GodMode1.jpg&#34; alt=&#34;GodMode Icon&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And as you can see there are many things in there:
&lt;p&gt;

    &lt;img src=&#34;images/GodMode2.jpg&#34; alt=&#34;GodMode Details&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;PS - this also works in Win 7 and 8.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bubbles</title>
      <link>/post/2015/07/bubbles/</link>
      <pubDate>Thu, 09 Jul 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/07/bubbles/</guid>
      <description>&lt;p&gt;It has been a while since I blogged, and is something I want to try and get slowly back into. I did find &lt;a
	
		href = &#34;http://www.dbi.io/uk/blog/38-tools-for-beautiful-data-visualisations/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this site which has cool visualization tools
	&lt;/span&gt;
&lt;/a&gt; if that is something you are interested in.&lt;/p&gt;
&lt;p&gt;As an example, here is what a interactive bubble chart looks like for the blog:&lt;/p&gt;
&lt;iframe src=&#34;http://www.infocaptor.com/bubble-my-page?size=400&amp;amp;mode=embed&amp;amp;url=http://desigeek.com&#34; width=&#34;400&#34; height=&#34;430&#34; frameborder=&#34;0&#34; scrolling=&#34;no&#34;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.infocaptor.com/bubble-my-page&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Build bubbles for your page
	&lt;/span&gt;
&lt;/a&gt; &lt;a
	
		href = &#34;http://www.infocaptor.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dashboards
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Parenting - Thought of the day</title>
      <link>/post/2015/04/parenting-thought-of-the-day/</link>
      <pubDate>Sat, 04 Apr 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/04/parenting-thought-of-the-day/</guid>
      <description>&lt;p&gt;The legacy all parents should give to their children is an insurance policy in happiness; but the premiums must be paid today during their upbringing.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2015/03/thought-of-the-day-7/</link>
      <pubDate>Sun, 22 Mar 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/03/thought-of-the-day-7/</guid>
      <description>&lt;p&gt;&lt;em&gt;You think Life is the mystery; Life is but the rapture of flight&lt;/em&gt; - Allama Iqbal&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2015/02/thought-of-the-day-8/</link>
      <pubDate>Tue, 03 Feb 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/02/thought-of-the-day-8/</guid>
      <description>&lt;p&gt;I’m exhausted. I spent all day saying “no” to my children and “yes” to my wife.&amp;quot; (&lt;a
	
		href = &#34;https://twitter.com/bahree/status/544715584789676032&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		source twitter
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Anything is possible!</title>
      <link>/post/2015/01/anything-is-possible/</link>
      <pubDate>Sat, 17 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/01/anything-is-possible/</guid>
      <description>&lt;p&gt;How inspirational is this! I get goose bumps just seeing it. Awesome. If you put your mind to it, anything is possible.&lt;/p&gt;
&lt;iframe src=&#34;//www.youtube-nocookie.com/embed/VWf8CXwPoqI&#34; width=&#34;853&#34; height=&#34;480&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;allowfullscreen&#34;&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title>WordPress 4.1 and Firefox 34.0.5 Bug</title>
      <link>/post/2015/01/wordpress-4-1-and-firefox-34-0-5-bug/</link>
      <pubDate>Sun, 04 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>/post/2015/01/wordpress-4-1-and-firefox-34-0-5-bug/</guid>
      <description>&lt;p&gt;I am on the latest version of both WordPress and Firefox as of this writing - namely v4.1 and v34.0.5 respectively and running on a TechPreview of Windows 10 (Build 9879 to be precise).&lt;/p&gt;
&lt;p&gt;My main browser is Firefox, and whilst I also have Chrome and of course IE - I use them only on occasions of in some cases when I have to use them for one reason or another.&lt;/p&gt;
&lt;p&gt;When trying to login to WordPress from Firefox, I just cannot seem to login and get the dashboard. I know the user name and password is correct, and I don&amp;rsquo;t get any error - but keep getting the login screen again. Logging in again with IE is not a problem. I can&amp;rsquo;t recall when this started - if it was when WordPress was updated or FireFox - but both have recently, and it is very annoying to say the least!&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t had the time (yet) to try and figure out what is wrong.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Visual Studio 2014 CTP4 and Windows 10 Preview (Build 9860)</title>
      <link>/post/2014/11/visual-studio-2014-ctp4-and-windows-10-preview-build-9860/</link>
      <pubDate>Sat, 08 Nov 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/11/visual-studio-2014-ctp4-and-windows-10-preview-build-9860/</guid>
      <description>&lt;p&gt;Perhaps I am pushing the boundary here, perhaps not but I am having lots of issues with Visual Studio 2014 CTP 4 (specifically Version 14.0.22129.01.DP) and Windows 10 Preview Build 9860.&lt;/p&gt;
&lt;p&gt;There have been a lot of errors, and finally, it has gotten to the point where even the basic thing like creating a new Console Project results in the following error. I did do a in-place upgrade of Windows from the previous build, but everything else seems to be working out OK - except just can&amp;rsquo;t write any code.  8-O&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/vs2014-ctp4-errorjpg.jpg&#34; alt=&#34;Visual Studio 2014 CTP 4 Error&#34;/&gt;
        &lt;figcaption&gt;VS 2014 CTP 4 Error&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am not sure I should try a repair, or deprecate to Visual Studio 2013.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RIP Nikhil - my dear dear friend</title>
      <link>/post/2014/08/rip-nikhil-my-dear-dear-friend/</link>
      <pubDate>Sun, 17 Aug 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/08/rip-nikhil-my-dear-dear-friend/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;kaleidoscopic! not those here-and-now colours but in memory&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;cloudy sky is filled full of black twiggy branches a large crow shoots past&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;picket fence and trees standing tall like sentinels like sad sentinels&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;comes-on quietly so benign the sensation so bloody empty!&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;this revelation times at last you think you know shrug! alas you don’t&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;fleeting memory self-flagellation head-shake another one lost&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;again and again scene full of twiggy branches black crow descending&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#x1f622;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blessing of Health Wearables</title>
      <link>/post/2014/05/blessing-of-health-wearables/</link>
      <pubDate>Sun, 11 May 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/05/blessing-of-health-wearables/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/geekandpoke-healthweables.jpg&#34; alt=&#34;Sorry I got confused the time with my Sleep Index - just one more excuse&#34;/&gt;
        &lt;figcaption&gt;Blessing of Health Wearables&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #25</title>
      <link>/post/2014/05/interesting-find-25/</link>
      <pubDate>Sun, 11 May 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/05/interesting-find-25/</guid>
      <description>&lt;p&gt;Continuing the &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/?s=Interesting&amp;#43;Find&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Interesting Find series
	&lt;/span&gt;
&lt;/a&gt;. Here are the things I was intrigued by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; “&lt;a
	
		href = &#34;http://www.technologyreview.com/news/523746/honey-encryption-will-bamboozle-attackers-with-fake-secrets/?utm_campaign=newsletters&amp;amp;utm_source=newsletter-daily-all&amp;amp;utm_medium=email&amp;amp;utm_content=20140129&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Honey Encryption
	&lt;/span&gt;
&lt;/a&gt;” - A new approach to encryption beats attackers by presenting them with fake data.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.technologyreview.com/news/523531/securing-the-smart-home-from-toasters-to-toilets/?utm_campaign=newsletters&amp;amp;utm_source=newsletter-daily-all&amp;amp;utm_medium=email&amp;amp;utm_content=20140121&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Securing the Smart Home, from Toasters to Toilets
	&lt;/span&gt;
&lt;/a&gt; - It is afterall the era of BigData and Internet of Things (IoT).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://arstechnica.com/security/2014/02/bizarre-attack-infects-linksys-routers-with-self-replicating-malware/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bizarre attack
	&lt;/span&gt;
&lt;/a&gt; infects Linksys routers with self-replicating malware.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://techcrunch.com/2014/02/17/microsoft-launches-smart-visual-studio-add-on-for-code-snippet-search/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bing Code Search for C#
	&lt;/span&gt;
&lt;/a&gt; - right from within Visual Studio - a boon for the lazy developers (yay!). Better beef up your Legal teams as well - how will one control IP violations at the code level - not quite sure.&lt;/li&gt;
&lt;li&gt;Visualisation of data is not only about &amp;lsquo;prettying up&amp;rsquo; your BI reports, but it can &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2014/feb/16/visualise-data-change-life-florence-nightingale&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		actually also save lifes
	&lt;/span&gt;
&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;Oakland the city that &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2014/feb/10/city-google-go-away-oakland-california&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		told Google to bugger away
	&lt;/span&gt;
&lt;/a&gt;! Is this the start of a revolt?&lt;/li&gt;
&lt;li&gt;If you shop at Tesco.com and also have a Clubcard then you were aware &lt;a
	
		href = &#34;http://www.troyhunt.com/2014/02/the-tesco-hack-heres-how-it-probably.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		that they were hacked
	&lt;/span&gt;
&lt;/a&gt;? What is hilarious, and, very poor the way they handled this and the lack of understanding. Want to see a glimpse of that? &lt;a
	
		href = &#34;https://twitter.com/Tesco/status/229542141012107265&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		See this Twitter conversation
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You like Pineapples? You can eat one; and you can also &lt;a
	
		href = &#34;http://www.troyhunt.com/2013/04/the-beginners-guide-to-breaking-website.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		use one to break website security
	&lt;/span&gt;
&lt;/a&gt; - very easily! Scary stuff.&lt;/li&gt;
&lt;li&gt;Microsoft MS-DOS/Word &lt;a
	
		href = &#34;http://storify.com/leonzandman/microsoft-ms-dos-word-source-code-gems?utm_content=storify-pingback&amp;amp;awesm=sfy.co_gf2V&amp;amp;utm_source=t.co&amp;amp;utm_campaign=&amp;amp;utm_medium=sfy.co-twitter&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Source Code Gems
	&lt;/span&gt;
&lt;/a&gt; - just awesome comments!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.flamelily.co.uk/2013/05/raspberry-pi-car-computer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Raspberry Pi car computer
	&lt;/span&gt;
&lt;/a&gt; - enough said!&lt;/li&gt;
&lt;li&gt;Absolutely fascinating! &lt;a
	
		href = &#34;http://bit.ly/PnzZtB&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Most Sophisticated #Android bootkit malware
	&lt;/span&gt;
&lt;/a&gt; ever detected; Infected Millions #Security&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>&#39;Old&#39; Surface (PixelSense) stuck on boot up</title>
      <link>/post/2014/03/old-surface-pixelsense-stuck-on-boot-up/</link>
      <pubDate>Sun, 30 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/old-surface-pixelsense-stuck-on-boot-up/</guid>
      <description>&lt;p&gt;Samsung SUR40 which recently got stuck at boot up (see the photo below). Once the Kernel lib loaded, for some reason was getting stuck at:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;StrongROM version 03.30 Build:_P&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/WP_20140326_011-300x168.jpg&#34; alt=&#34;MS PixelSense not booting up&#34;/&gt;
        &lt;figcaption&gt;MS PixelSense not booting up&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Powering it off or on, did not help. Neither did trying to get into the BIOS to try and change some things.&lt;/p&gt;
&lt;p&gt;I did get this back up and running, and in the end the solution was quite simple - I had to physically take out the power cable (just powering it down was not enough); wait a few seconds and then plug the power cord in, and boot it back up.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Playing with Google Glass</title>
      <link>/post/2014/03/playing-with-google-glass/</link>
      <pubDate>Wed, 26 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/playing-with-google-glass/</guid>
      <description>&lt;p&gt;Don&amp;rsquo;t know how many folks know, but I got a google glass recently and only now have had some time to start playing with it. There were a few challenges but I finally got Glass &amp;rsquo;talking&amp;rsquo; to my Windows 8.1 machine and can now replicate the glass display (that is a post for another time, but it did take me some hit and try to figure out what I was doing wrong). This is pretty important, as without this I won&amp;rsquo;t be able to show much demo&amp;rsquo;s or make it very useful.&lt;/p&gt;
&lt;p&gt;Here are a few photos showing the silliness in the whole thing. In the second photo, I am taking a picture from glass, whilst taking a picture from Glass - does that classify as a Picture-in-Picture? Perhaps. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/glass-on-win8.1.jpg&#34; alt=&#34;Google glass on Windows&#34;/&gt;
        &lt;figcaption&gt;Google glass on Windows&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/20140326_103402_622.jpg&#34; alt=&#34;Glass and Windows 8 - picture in picture&#34;/&gt;
        &lt;figcaption&gt;Glass and Windows 8&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Smart Homes and Internet of Things</title>
      <link>/post/2014/03/smart-homes-and-internet-of-things/</link>
      <pubDate>Sat, 22 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/03/smart-homes-and-internet-of-things/</guid>
      <description>&lt;p&gt;Smart Homes (Again)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/geek-and-poke-1390978180030.jpg&#34; alt=&#34;Smart Homes&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Alphabet Soup</title>
      <link>/post/2014/01/alphabet-soup/</link>
      <pubDate>Fri, 31 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/alphabet-soup/</guid>
      <description>&lt;p&gt;I was cleaning up my documents, and found an old presentation where I talk about a lot of the new things coming out of Microsoft. Seeing this, did bring back memories. Some of it was very cool and head of its time. Not heard of DSL&amp;rsquo;s recently, wonder where the industry is heading.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/alphabet-soup.png&#34; alt=&#34;Alphabet Soup&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #24</title>
      <link>/post/2014/01/interesting-find-24/</link>
      <pubDate>Thu, 30 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/interesting-find-24/</guid>
      <description>&lt;p&gt;Here are the interesting finds of this time around.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.hex-rays.com/products/ida/index.shtml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		IDA
	&lt;/span&gt;
&lt;/a&gt; - A cool debugger which runs on most platforms and different from the MS variety.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.typescriptlang.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TypeScript
	&lt;/span&gt;
&lt;/a&gt; - as the name suggests, it is strongly typed JS which compiles down to standard JS! This can only be good I think given all the crazy things one can so in JS. More details &lt;a
	
		href = &#34;http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Can you &lt;a
	
		href = &#34;http://www.tomsguide.com/us/can-you-hide-from-nsa,review-1793.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hide anything
	&lt;/span&gt;
&lt;/a&gt; from NSA?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tomsguide.com/us/usb-tv-tuner-software-defined-radio-sdr-radio-spying-privacy,review-1836.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TV Tuners
	&lt;/span&gt;
&lt;/a&gt; - did you know they can let you spy - who knew?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://betane.ws/f0CD&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		grepWin
	&lt;/span&gt;
&lt;/a&gt; - a powerful regex-based search and replace tool - and can work across multiple files.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://supermechanical.com/twine/features.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Twine
	&lt;/span&gt;
&lt;/a&gt; - is a wireless sensor block tightly integrated with a cloud-based service. What all things one can do with Twine? Here are a &lt;a
	
		href = &#34;http://supermechanical.tumblr.com/tagged/breakout&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		few examples for inspiration
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://visual.ly/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Visual.ly
	&lt;/span&gt;
&lt;/a&gt; - tell your story visually; good resource for infographics and data visualisation&lt;/li&gt;
&lt;li&gt;Can an &lt;a
	
		href = &#34;http://www.theverge.com/2012/10/1/3432980/blossom-one-limited-coffee-maker-11111&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		$11,111 coffee pot
	&lt;/span&gt;
&lt;/a&gt; turn out a better cup of joe?&lt;/li&gt;
&lt;li&gt;What the Internet of Things (#IoT) needs to become a reality? Freescale has an &lt;a
	
		href = &#34;http://www.freescale.com/files/32bit/doc/white_paper/INTOTHNGSWP.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		interesting paper
	&lt;/span&gt;
&lt;/a&gt; (pdf) on it.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://highexpectationsasianfather.tumblr.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		High expectations Asian Fathers
	&lt;/span&gt;
&lt;/a&gt; - enough said!&lt;/li&gt;
&lt;li&gt;How to be a &lt;a
	
		href = &#34;http://www.theguardian.com/technology/2013/dec/27/how-to-be-a-hacker&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hacker
	&lt;/span&gt;
&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://edition.cnn.com/2013/12/30/tech/innovation/14-kickstarter-projects-2014/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		14 Kickstarter projects
	&lt;/span&gt;
&lt;/a&gt; to watch out for in 2014&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://alloyui.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alloy.UI
	&lt;/span&gt;
&lt;/a&gt; - a really cool HTML and JavaScript library with lots of &lt;a
	
		href = &#34;http://alloyui.com/examples/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		useful UI features
	&lt;/span&gt;
&lt;/a&gt;. Builds on top of YUI3 and Bootstrap.&lt;/li&gt;
&lt;li&gt;DON’T PANIC - &lt;a
	
		href = &#34;http://www.gapminder.org/videos/dont-panic-the-facts-about-population/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The Facts About Population
	&lt;/span&gt;
&lt;/a&gt;. Very interesting, especially the visualisation. You can find &lt;a
	
		href = &#34;http://www.gapminder.org/world/#$majorMode=chart$is;shi=t;ly=2003;lb=f;il=t;fs=11;al=30;stl=t;st=t;nsl=t;se=t$wst;tts=C$ts;sp=5.59290322580644;ti=2012$zpv;v=0$inc_x;mmid=XCOORDS;iid=phAwcNAVuyj1jiMAkmq1iMg;by=ind$inc_y;mmid=YCOORDS;iid=phAwcNAVuyj2tPLxKvvnNPA;by=ind$inc_s;uniValue=8.21;iid=phAwcNAVuyj0XOoBL_n5tAQ;by=ind$inc_c;uniValue=255;gid=CATID0;by=grp$map_x;scale=log;dataMin=283;dataMax=110808$map_y;scale=lin;dataMin=18;dataMax=87$map_s;sma=49;smi=2.65$cd;bd=0$inds=;example=75&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more on that here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As sites and services become product aware, &lt;a
	
		href = &#34;http://gigaom.com/2014/01/11/as-sites-and-services-become-product-aware-the-age-of-pervasive-commerce-begins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the age of pervasive commerce begins
	&lt;/span&gt;
&lt;/a&gt; (remember &lt;a
	
		href = &#34;http://www.imdb.com/title/tt0181689/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Minority Reports
	&lt;/span&gt;
&lt;/a&gt;?).&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Lessons from the Internet</title>
      <link>/post/2014/01/lessons-from-the-internet/</link>
      <pubDate>Thu, 23 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/lessons-from-the-internet/</guid>
      <description>&lt;p&gt;Lessons from the Internet - If you never learn how to fail, you will never learn to scale!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Wired Child</title>
      <link>/post/2014/01/the-wired-child/</link>
      <pubDate>Mon, 06 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>/post/2014/01/the-wired-child/</guid>
      <description>&lt;p&gt;Interesting read for any parent!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/the-wired-child_524ce1f3f29b8_w587.jpg&#34; alt=&#34;The Wired Child&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is rand() harmful?</title>
      <link>/post/2013/11/is-rand-harmful/</link>
      <pubDate>Wed, 06 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/11/is-rand-harmful/</guid>
      <description>&lt;p&gt;​I saw &lt;a
	
		href = &#34;http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful&#34;
	

	
		title = &#34;this&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this
	&lt;/span&gt;
&lt;/a&gt; awesome &lt;a
	
		href = &#34;http://video.ch9.ms/sessions/gonat/2013/STLGN13rand.pptx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		presentation
	&lt;/span&gt;
&lt;/a&gt; on &lt;strong&gt;why rand() is considered harmful&lt;/strong&gt;. When you need a random number, don&amp;rsquo;t call rand() and especially don&amp;rsquo;t say rand() % 100! This presentation will explain why that&amp;rsquo;s so terrible, and how C++11&amp;rsquo;s header can make your life so much easier.&lt;/p&gt;
&lt;p&gt;If you need uniqueness and non-deterministic, especially on the context of security or crypto then you need to think about a few things. For example the frequency, non-uniform distribution, and not using a pseudo random number generator (such as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Mersenne_twister&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mersenne twister
	&lt;/span&gt;
&lt;/a&gt;) and not a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Linear_congruential_generator&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		linear congruential generator
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A must have Outlook add-in</title>
      <link>/post/2013/10/a-must-have-outlook-add-in/</link>
      <pubDate>Sun, 27 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/a-must-have-outlook-add-in/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know how many people have heard of that NoReplyAll Outlook Add-In from MSR - which is a must have IHMO for everyone. With this enabled, you get the following new buttons in the Toolbar and when composing emails, it will restrict the others from replying-all and help in dealing with some of the email-storms you get internally!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABkCAYAAABO6zhfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABQzSURBVHhe7ZwLdBRllsf/nXQ6T5IohISHEiCByCAGBqI8zaCMiIObRR3dEQVnwYXR9bHiquCgqIOOix4fiK6gKLPHg6JMUE8MjoeTCAQQnTSPAIGENAkJIc/udNKP9Gvv/boqdEISOp1OSOj6cT6q6vuqqjnc/3fvra9ut8pgMLhAuFwu0WRUKpVo3sDXmc1mnDlzptU9GL5HREQEhg8fjuDgYKnXd5xOJ4xGIyoqKtr9rJiYGMTHx/vlswKBFgF0FzaGw&amp;#43;HA2bNnYTKZpN4LsEGGDBmC6Ohoqcd3&amp;#43;LNsNhvKyspgtVql3gtoNBohuLCwMKlHoSNUeXl5fhGAQv9E1dzcrAgggAmStgoBiiKAAKfTEPBd0cXJXF/k9qQIaU&amp;#43;hq7R4gJ9//lnaU7jS8bS1EgICHEUAAc4VKwBzdRVq//Y&amp;#43;zjyxGNpVK/Htlp3Y8HGeaIaGRukshZYkkOPC5MmTRadMV5LAUGsjIiuKoDYbxbFh9ERYQ6PEfoilAedLTqPZZhfH7RGsDkZ84gg4I64Cr/B6uwzNtE0CTaUlcHzyPOx6M8JirkaQvQ6ukAEIX7wU6uENWLdOg6WPTkdERLh0RWDhaetuC0Btt2LsxucQfvYkQocMQIjaKfxKY5kJLrJ38aLnUB81EHPTp0hXtI&amp;#43;TLvtb5i7EXzMUqtgEuOD9uwhPAZjOn4P5zecQorFA1WjFgGXPkrpiYP1kJejmiHrkNkCvw7pNYwJWBJ627lYIYONPfHoeBg02IyZjEjTxUWKdPmhAJOLuT0Pcv45HyhdrkbBtAz7dvqulbfn7Lhw8dAwqRwNUdj1gq0OQoxoPZMzG&amp;#43;bIKOGsryPytX055S9PB/XCVlyEs&amp;#43;QaoIqNg3PgGVGoLMDwFjtJSwEKfBz1WLPwJX2zZC7OZxjph3rx5rdr27dulEd/gexQVFUlHlx&amp;#43;fBcDGTyXjh/02Far4q2HIOoKK2mgUh4&amp;#43;HzRaP&amp;#43;lc&amp;#43;h/mnYlx9TxrGWHT4fckuLFowW7SF/zIbx4orkZV71P0yx&amp;#43;UUxlbZKoUIzpWVw1FT7pMIivccJc/joklvRPTi6dRjhfGd1XCcKYATzTDodDBUUogiHfx&amp;#43;1kl8/vlh94Wd8M477yArKwsrV67Epk2bpN4rA58FMO71pdCkjaHYGgKnzQV1hArq2vMY98JahP35NUTtOgSHKxZNPxzGAPIOtm&amp;#43;/gK1aB5u5Bg7reWHoKr0F3&amp;#43;0thNlipjuysZ1wms9g8V1zUFJ02icR1Fx7A5pColGfdRROVTSi7psNZ7AazsHx0CQlIyYhUWqp0OrToYnuOC9py4wZM8S2L83g7uKTADjhUxtq4IqKQvOXuTDnFEAzKRmxGhNMTz0Al81GLkKN0LXrYTOq0ayrRuiEkbBl7yA7O4Sh7eYKIYJagxU784phMjUJTxAUpILDdBrL75&amp;#43;PgsNHuyyChoQk1C9/Bk0GJ6qe/xjV6zJhN5hRVqrGrsRF2KFNxZnKROSeSIR&amp;#43;qw6xsbHSlZeG3f&amp;#43;gQYOQlJQkjlkIcmh48MEHRR8jhwp5rD2vwed7hpM9e/a0ukdv4ZMAYorzoY6kWVVUhrqpc1FH/&amp;#43;m2HwsQPDEZLmsNzM8uJxE0U&amp;#43;xVQz3/HlgLyqFOiocjJ1sYX8x0pwNWY4mY7eXVRvxj3xlRVOIWAeBoLMRTS&amp;#43;/FwQMH4ajzXgTkVBB/8yycfPo9nEqkhG/mXDQvfAbX/nUDZs1MQ2pqInR6Mn6mHroTnA9cmscee0wYMi8vD1u2bJF6gZdeeqklPGRkZODVV1&amp;#43;VRiDO5X4eZ0O39Rp8Pp8js3v3btHX2/gcAlxOMojRBBtl6klvbETwhBth230UQaljKNGqgeW55eTqrVAlDIHTQE8EDrqIrnGyByDju0QHPa8bisRsP1Vahe8PlJEnMAuBqNgTNB7Hnx9bjD25e6FiYXjzUEAC0J4HTh1qwsg/P4KoJ56Hc8YcGNQh0Iv6kBjos3VITKWZz8eZOmQ9nIXPHqR2ZxafcBFsRG7Hjh2TetwztqampkUcPMtra2ulUWDZsmViy95i3LhxOHy4da6xYMECVFVVSUfA8ePHRV9v47sAyH4uhwuJ9Nhmt&amp;#43;oR&amp;#43;uRqEsFNsLMIJrIIatG86lFpxrNg6DmPr6NtS3OrAqa642K2Hy4sxc4DZ1FTb0aN3oraBjuqKo6I6/gm3oUBPbRbDyHjvhsQG0bG9iwY0hugfSvXbXwSSmp6KmIpH4hNjBVNq8uRTrwYNiQbyNOdczjgWS63devWSSPeMWvWLOEduPH&amp;#43;5cAnAVivSoDDYoN94CA07/yKeoKEoTWPrxKewL77CHmCZDqxDvaNbyMkdRQc9RTjyRu4cwB3HuAWATX601R7VMz2XwpKEBkRidDQMISoQ5F7uB7llTxTxMqA&amp;#43;PxOIcOmzyUXT7ta&amp;#43;ktLGT83HbWcF3OQmBIL/QnSAg26mw462ur260T46IwlS5a0uHNOCNkDeMZxT3Jy3GJiT8GeY8KECeLYk/T0dBEGuPH&amp;#43;5cAnARgTRkFdUwW7Jhx2cueGtc&amp;#43;gtroUtTVlMC5cBNuY6ykcHIFq0lgEjbxKPCZyImieMhUGYyMaGk0wNplhNFnRaLKhyeJAk9XVMtst9FRgNBpw4HgV7p03C6Vny0W/N7Dhc7K1yPwkFznUtFu57YA2M5emfCwyt&amp;#43;aQwbXQ04l6CwmAjK7Xs/F10tWdw16AYz8jPxbKyZ5nDlBdXS361q5dK4QjJ46eyH0DBw5sd7w38HklcNhbT2LwuROwjxyJ8JJiqJPHIei&amp;#43;RVCNJvdfVQn7pneB86cRPOU6&amp;#43;t&amp;#43;og&amp;#43;N0PYLf/oiu5FnPd6CQILl1u8MBJ4WTH/5ZiawffsRrT87Hxq17sPrpR2BptuOWe5fhhddeI7mGwNXO6mBX6gGaGprw5OQ1SE2kx8B2XP6HJz&amp;#43;U9nyHDc85gzdGXbFihUj&amp;#43;5EfM3sAvK4Gn7/x3RAwdAXVxCcwjk2CpLINt1eOwzUmDbfn9cJYXw3X9GDir9bDvPw6s/gsZ2UrNRq6fmzsMyLNdW1QtZrvZYsH2nfnC&amp;#43;M12EoY7dfAbkdGRePfwyy3GZ4N7tt6EwwMngr1p/Lb4LACoNYh88xNEDCcRUIzjhNCSch0st85G87Q0OGMGwHnwGOzaEljXrYeFYrrZbBLNRI97Jmlrd9hxqMSKW2ZMF7OdQj2mp01BcbEOFis9Ktr8rAAiNCyUREAe6jLCM5/Dw&amp;#43;rVq6Wey4PPIaC59BTmz/41jBTPwwsPoXjDm4g/paUbutPuuqTrUTl&amp;#43;Kionts5u2d0PjwvH4Gh&amp;#43;AeTCmRoXbp05jfqdsNmdWPTEixg5ZBAW3n07hg29BkFqNe544E9&amp;#43;CwEKfgoBckbOb&amp;#43;xs4yZh7Efb8NMr22DPOozQ3CJc&amp;#43;&amp;#43;k3SHt6Je68dUartuC2mzH&amp;#43;uglwhSTApIpDWvIE7H69CA7y9Ta7&amp;#43;zFv6f0Z&amp;#43;Gz7TkoSG&amp;#43;Gw2&amp;#43;j535sFAAVf8F0AYlVGBXVwkNg/VHAat0yfIL4GZjZbKdtvgr6hEfV6I&amp;#43;qo8VbeZ0YlXovkq4Zj56pCGEpN4C9yqYNVCNUEQaNRY/miBaisqhOrg2GhGnGNgv/xXQA0K/l7evyVrxNFZfjV2BGw2exkMAuCgoLErOV1/SAa14Soxfl8HKIORjBtG8qb8O1/HcGImfGwq510Hug84I7Z0xBOMZrbTaljYaWQMnxovPhMXi9Q8C&amp;#43;&amp;#43;C4BsYbPbcUpXjvFjE2nfQc/0FjIueQQytkpsgyUh0JaOWSyakGBYqm34&amp;#43;vEjGDo9jvqAuORIfPtUAbYv0iLkqwTse7YS&amp;#43;a/UYs8rZWj4GkgZfa37M8XfCv7EZwE025pRUKjDmJHDhfFNPPPJQjzjBSQQ8QKHd6k/mEJFKLl2c5UVW5f8hFG3DEPdSSvMBiAsOgLDpgxC0ryhGHX7YFwzZyDipkYjfLQajbU2JMRd7b6ngt/xWQBNTU2YMG60yN4tFiu5djXU1ITlGTK67LDZWwSRAJoqLfi/hXsx6a5kNBU3Q0PKaDxlQvXPTag&amp;#43;0ISqA404v5/aPndrbDCgocqEkBCKDQo9gs8CsNj4bZALdXU1MJua0GhsQAMZzNjg3jYYpEb7BoMe9TX12HRXNm5cOB4V/6iH9VwzmqtsnbaSA5Wwm&amp;#43;0YOHaS25O4P1rBj/i8DlCefwBFJSUoPXtOVPR2hp0e5dTqEPzb3N9g/yOnkXzDaMSEXiWNdkxNUBUimiMQsyaRpErehfIJSi6k0Qu0tw7AZeGm7K/Q&amp;#43;MsB1EcOxdmxN6PUPkCM3X/3BMREuyuWAxFPW/teFexyAk6HiPNdwUX5wt6MbIy9IRmxoYOoh&amp;#43;K8XY8mOyUD7eAyqXDNW&amp;#43;NJALwIxD3ir1YoZeFdwy8LQcIQ/OxGhulS04Ri5o7bcfJEMfTWGnGnI3sO4/TBUpTml&amp;#43;PskUqcO16FysJa1OsMMDd4iNALrYmy8PfWwEUhSk0hKvy&amp;#43;pQhdtJaUboRlxzZxzoolJ7Fx/V6Q&amp;#43;MVxIOO7ACR3zEuzXWl8jTMkFNM/vw1nzpaSCCrJEHbM3DkXU7Nuw03fzMGUv9&amp;#43;CyV&amp;#43;l4/rPZmDMx2lkd7rWS0/TlbLw9z/&amp;#43;UVQgdYb8qldufa0qmP9NbcvNukI3PEA3YDGQJ5j8YTqqnTXilTALQxVMcb49r8Gehj0OC&amp;#43;gSdFgWXnJIKgvXUtPDUKnD0rTvhSe4FHLdHzd&amp;#43;t38lcXkEwLAIwsNx3WopGRHJXfseRSR&amp;#43;vPWCDsvCE4ZBkxSHmNhYd0tIR45lMZID/EXS5RMAw0aNjMCcvLvoX0LG99LNd0ZHZeGFBU5stmbg7exU7NCmI1dHAtAlQh/mfVm4J&amp;#43;x2PUODZ2kYH3N1EG/5tW/bMa4DYHjL4wxv5Xt5VhZ53ovx/Fx/hKPLKwBG5BHk4oUH8G6Wd0brsvBZ7rLwe5/BkDc3Yf6S3yIjIx2pN6UiMXWEyAcy91&amp;#43;6DEyu/OUmG4/LwjgccFjgEMHG8IzFcXFxYmzatGkoLCwUfSwELiQ9ceKEOOYtjzNcUCqHGS4Rb&amp;#43;9ejOfn&amp;#43;oPLLwCGXb2XMf6SkAC4LPzgAS4LX&amp;#43;EuC//NHCAqBG9lgppetBc/OCTOTUxMRdqDWbBYO34i8MwBuHqHRcAFoXIZN5d&amp;#43;tS39los8uRiUS74ZFsLDDz/cSgBysSiLQxYZU1lZKbaMfC9ZfPLn&amp;#43;iMf6RsC8CvusvDFiy&amp;#43;UhYu8n4zNMz41ZQRSafYnptB4AnkBOicxJRWzlv7QqQh8hcUxePBgMaNZCHL5l2xMHucx9iCyyNhL9BZXngDI0KIsPIw8AXsDsr5WB1DiL8ZYCFwiruO&amp;#43;SgO1M6I/NiFWiMAbZCPKsZ0N2FHpN5OSkoIPPvigpfafjzMzM8WW4dnOHoSRvUt78OfymCwez9zCV644AbCdRVn4B7nIoab9JBe6zB3Q5&amp;#43;SS8WlUCMBA&amp;#43;9REbTiXhuugp8fCH97zvjZfjvvssjlH4BLxjqqA2YWzQGSDy8eya2fDcnEo34uF0ZkHYLfPtYR8rpxbdIdu/0BEX8DbmsCH1x5Dzn6uBnZ/LSyWngD4y6HC&amp;#43;B9lIHpAYDwS&amp;#43;mkpuP/x4cpxOPn1n6j9ASe/&amp;#43;IPwCIFm/Lb4LIB3H7u7Vcvf9Y004ht8j&amp;#43;qy09JRL0ECCGTjM93yAPc9/Tr&amp;#43;850vcfsfn8KezE&amp;#43;l3v4De4NANj7jlxCQlDpVbHt9Bit0G78IgN1/VOxAxF0zShyzEOTQsHn1f4g&amp;#43;Rg4V8lh7XoPP9wwnRdp9re6h4F&amp;#43;6JYCt//PfwpDFhw/goZf&amp;#43;V&amp;#43;oFvt3415bwkJr&amp;#43;O2RvflMagTiX&amp;#43;3mcDd3Wa/D5fI5MUf4&amp;#43;0afQM3Q7B&amp;#43;B27rR7aZPhGduor20RB8/yRkOdNArcfNcfxZa9xZBRKTh7qkAcy0ycPR/GumrpCDhXUij6FHqGbocANiQbyNOdczjgWS63u594RRrxjuRJ04R34Mb7Cj2HX3KAGRmLWtw5J4TsATzjuCeFv&amp;#43;wWW/YU7DmGJ/9KHHsy9tczRRjgxvsKPYdfBMCwF&amp;#43;DYz8iPhXKy55kDNNbXir7vPn5DCEdOHD2R&amp;#43;6Jirm53XMF/9OpSMBuecwZvjPrlW89T8ndHyyNmZyhfD&amp;#43;8afX4pmMMDJ4LeGF&amp;#43;he/Q5AfDM5/Dwu6XPSD0KPUlAvQ1UcBOwbwMVLkYRQICjCCDA6XEBcFLHrS38SCi/B/DcV&amp;#43;hdelQAbFR&amp;#43;nOOmGLhv0qMC4GVfXsvnJi8BK/QtelQAp/6ZJ9byExLHiH2FvkePCYBX8xhe9pVX9OQ&amp;#43;hb5Dzwkgf1&amp;#43;rV7m8z30KfYseE8Cp/DzxSpgzfG68z30KfYseEQAbm6t9PItCuHFfR3UCCpeHHhEAF3KMnnCjdHQB7vOs91O4/CgvgwIQ5WWQQguKAAKcTkOAwpWJEgIUWlAEEOAoAghwFAEEOIoAAhxFAAGOIoAAp98KYPz48a3aqlWrpBE33OcLfJ3nz7R60tlYf6VfewD&amp;#43;Tb2jR4&amp;#43;KdvDgQTz00EPSCESfwqW5YkLA999/L0Qgz1DP2bp&amp;#43;/Xpx7OkVWCxyX1vvkZ&amp;#43;f3zLGP9zcER1d35&amp;#43;4onKAoUOH4ty5c9LRBfhnWmVPIbN582ZxzF5kx44dUq8b/r1eHnvhhRfw8ssvS72tYQHxOJ9XUVHRb0NDQCSBU6ZMuWiWbtu2TczejIwMcexpQPnce&amp;#43;65p0PjsrdZs2aNuAfvtye8/sAVIwA2Ehtr5syLf1GEZ/uQIUOEsRh26xs3brzIK3QVzxykvc/tD1wxAuCZvGzZMunoYh599FHhCdj4/Ovcw4YNE/3sCdqSnZ0ttjzGYaW9H4Hme8nn9Wf6tQDY6HIi9v777wsjt4d8DsMzlV17eXm56NNqtaLfE3bnPMYufsOGDVJvazhMcG7hee/&amp;#43;SEs9gEJgEhBJoELHKAIIcBQBBDiqvLw8JQcIYFQGg0ERQACjhIAARxFAgKMIIKAB/h&amp;#43;DmbqWr050zQAAAABJRU5ErkJggg==&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;You can NoReplyAll add-in this &lt;a
	
		href = &#34;http://research.microsoft.com/en-us/downloads/60860f41-88ab-4bb4-8104-765feca9cfed/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Intreresting Find #23</title>
      <link>/post/2013/10/intreresting-find-23/</link>
      <pubDate>Mon, 14 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/intreresting-find-23/</guid>
      <description>&lt;p&gt;Been a while since I posted on this series. But starting it again. Here are the latest few interesting finds I have stumbled across. Of course these are in no particular order.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.utf8everywhere.org/#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		UTF 8 Everywhere
	&lt;/span&gt;
&lt;/a&gt; - Argues the cause on why UTF-16 and Unicode is a default poor choice except for specialized libraries, which deal with text.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.technologyreview.com/news/520131/data-discrimination-means-the-poor-may-experience-a-different-internet/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Data discrimination for the poor
	&lt;/span&gt;
&lt;/a&gt; - Means that if you are poor (i.e. not rich), then the internet you see and know might be different from the others. Big Data discrimination.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogdramedy.wordpress.com/2013/10/02/its-enough-to-make-you-cancel-your-reservation/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Customer feedback to a Tour Operator
	&lt;/span&gt;
&lt;/a&gt; - It’s enough to make you cancel your reservation.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://gartnerevent.com/NA_SYM23_Factoids/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Gartner IT Symposium Factoids
	&lt;/span&gt;
&lt;/a&gt; - Very cool to see the data on mobility and where we seem to be heading.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.openremote.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenRemote
	&lt;/span&gt;
&lt;/a&gt; - open source for IoT (Internet of Things) - think of it the glue stitching &lt;a
	
		href = &#34;http://www.technologyreview.com/news/519666/free-software-ties-the-internet-of-things-together/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		everything together
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.economist.com/news/business/21586831-businesses-are-worrying-about-how-manage-different-age-groups-widely-different&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Generation Game
	&lt;/span&gt;
&lt;/a&gt; - Businesses are worrying about how to manage different age groups with widely different expectations.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.economist.com/news/united-states/21587815-loopy-tax-rules-spur-expats-renounce-their-american-citizenship-overtaxed-and-over-there&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Overtaxed and over there
	&lt;/span&gt;
&lt;/a&gt; - Loopy tax rules spur expats to renounce their American citizenship.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://greenhouse.oblong.com/learning.html#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Greenhouse (alpha)
	&lt;/span&gt;
&lt;/a&gt; - a creative coding toolkit for spatial interfaces.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://labs.leapmotion.com/post/57530238812/dipping-your-hands-into-the-data-pool&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dipping your hands in a data pool
	&lt;/span&gt;
&lt;/a&gt; - with a LeapMotion&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://docs.timdorr.apiary.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tesla Model S Rest API
	&lt;/span&gt;
&lt;/a&gt; - enough said. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://www.cozycloud.cc/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cozy Cloud
	&lt;/span&gt;
&lt;/a&gt; - private cloud for your apps, data, which you control and this is open source.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day - cats and meow&#39;ing!</title>
      <link>/post/2013/10/thought-of-the-day-cats-and-meowing/</link>
      <pubDate>Wed, 09 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/thought-of-the-day-cats-and-meowing/</guid>
      <description>&lt;p&gt;Why did the cat meow?&lt;/p&gt;
&lt;p&gt;Because it&amp;rsquo;s a cat. Cats meow.&lt;br&gt;
(PS - I am not a cat guy, more of a dog guy)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku #2</title>
      <link>/post/2013/10/geek-haiku-2/</link>
      <pubDate>Tue, 01 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/10/geek-haiku-2/</guid>
      <description>&lt;p&gt;(and also valid for the US Govt)&lt;/p&gt;
&lt;p&gt;*Ring* Hello, IT. *Sigh* Have you tried turning it Off and on again?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the Day</title>
      <link>/post/2013/09/thought-of-the-day-6/</link>
      <pubDate>Fri, 27 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/thought-of-the-day-6/</guid>
      <description>&lt;p&gt;Don’t start an argument with a girl because they all have 4,30,50,194 GB memories and will bring up something you did at 14:27PM on 23/04/2008&lt;/p&gt;
&lt;p&gt;(via &lt;a
	
		href = &#34;https://twitter.com/ExtraGrumpyCat/status/381299288854507520&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ExtraGrumpyCat
	&lt;/span&gt;
&lt;/a&gt;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>C&#43;&#43; Comment</title>
      <link>/post/2013/09/c-comment/</link>
      <pubDate>Sun, 22 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/c-comment/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;MyFunction&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// There once was a man named Dave
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; Result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Whose code just wouldn&amp;#39;t behave
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    MyObject &lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;Ptr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; new &lt;span style=&#34;color:#8aadf4&#34;&gt;MyObject&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// He left to go to a meetin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    Result &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; Ptr&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8aadf4&#34;&gt;DoSomething&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// And left his memory a leakin&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; Result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Geek Haiku #1</title>
      <link>/post/2013/09/geek-haiku-1/</link>
      <pubDate>Fri, 13 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/geek-haiku-1/</guid>
      <description>&lt;p&gt;two words never heard in polite conversation Microsoft Vista&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>NSA Haiku</title>
      <link>/post/2013/09/nsa-haiku/</link>
      <pubDate>Tue, 10 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/nsa-haiku/</guid>
      <description>&lt;p&gt;You scramble me and unscramble me I&amp;rsquo;m putty in your hands ~ Only you&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Exception of the day</title>
      <link>/post/2013/09/exception-of-the-day/</link>
      <pubDate>Fri, 06 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/09/exception-of-the-day/</guid>
      <description>&lt;p&gt;Sigh, why do I get to see all the &amp;lsquo;interesting&amp;rsquo; errors. Not sure what do I get to make of this. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/outlook-internal-error.jpg&#34; alt=&#34;outlook-internal-error&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Broken Nike FuelBand</title>
      <link>/post/2013/08/broken-nike-fuelband/</link>
      <pubDate>Sat, 24 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/broken-nike-fuelband/</guid>
      <description>&lt;p&gt;The wife recently bought a Nike FuelBand which she was loving. However in about 4-5 weeks of regular usage, the strap on it broke and the links which hold it together fell apart. The device itself is working, but it cannot be worn now as it won&amp;rsquo;t lock making it quite useless.  &amp;#x1f622;&lt;/p&gt;
&lt;p&gt;I was quite surprised as this is supposed to last more than this given both what it is meant to do and the cost of the device as well. Now this is an expensive paperweight.&lt;/p&gt;
&lt;p&gt;Here are a few photos. This is what it looks like now, and cannot be locked, making it useless:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WP_20130824_005-300x168.jpg&#34; alt=&#34;WP_20130824_005&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is how it was when it broke and fell apart - we tried to rescue and pick up everything we could, but it seems there is a very small spring inside which is lost. This spring is crucial for the &amp;rsquo;lock&amp;rsquo; and which acts as a rocker. Without this spring, this is useless.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02506-300x225.jpg&#34; alt=&#34;DSC02506&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is I was trying to figure it out how to put it together and when I figured the small metal part (silver in colour) needs a spring which rocks it up and down. When one locks and unlocks this that spring is what is acting and allowing you to open and close this.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02508-300x225.jpg&#34; alt=&#34;DSC02508&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This is how the broken piece looks like after I put it together, everything looks OK, except it won&amp;rsquo;t lock.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/DSC02505-300x225.jpg&#34; alt=&#34;DSC02505&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;I am not very happy with this situation right now - if this was a year after using the Nike FuelBand, perhaps I could still understand but 4 odd weeks of usage and this breaking is not acceptable.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have much hope in Nike, as where I am currently living, this is not sold and I am sure they would try and squeal out of trying to replace this or fix this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Advice from NSA on how to protect your data from NSA</title>
      <link>/post/2013/08/advice-from-nsa-on-how-to-protect-your-data-from-nsa/</link>
      <pubDate>Fri, 23 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/advice-from-nsa-on-how-to-protect-your-data-from-nsa/</guid>
      <description>&lt;p&gt;No, there is no typo in the Subject, this advice is from NSA and should be good if you want to secure your data from NSA. The Register had &lt;a
	
		href = &#34;http://www.theregister.co.uk/2013/08/22/guardian_snowden_advice/?page=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this excellent
	&lt;/span&gt;
&lt;/a&gt; write up on Guardian could have protected Snowden. I also like what The Register say:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use an old-fashioned air gap. Be paranoid&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You also could &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Steganography&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Steganography
	&lt;/span&gt;
&lt;/a&gt;, using something like &lt;a
	
		href = &#34;http://www.pcadvisor.co.uk/how-to/software/3445112/how-use-steganpeg-hide-documents-in-images/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SteganPEG
	&lt;/span&gt;
&lt;/a&gt;, but that is more obscurity, rather than security. The advice from The Register is sound and essentially is good if you are interested in protecting sensitive data. There are essentially four steps parts to this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Encryption - whilst it might seem hard to the non-geeky (I think we need to find a name similar to &amp;lsquo;Muggles&amp;rsquo; - some reference for non-techy folks - of course in a good and constructive manner), it is not very hard. You should use something like &lt;a
	
		href = &#34;http://www.gnupg.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		GnuGP
	&lt;/span&gt;
&lt;/a&gt; and create a asymmetric key pair (i.e. a pair of public and private keys). I would recommend you use a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/RSA_%28algorithm%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RSA
	&lt;/span&gt;
&lt;/a&gt; based key pair which is 4K bits in length, using a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/SHA-2&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SHA2 512
	&lt;/span&gt;
&lt;/a&gt; as the hash function. You should also consider the expiry date for this no more than a year, which will prevent some old keys lying around and being recycled or compromises.&lt;/li&gt;
&lt;li&gt;Use Clean Machines - You don&amp;rsquo;t know what is lying around on that OS and machine - could be some keyloggers for example. It is best to start with a brand new machine, which you re-install. You could either use the &lt;a
	
		href = &#34;http://selinuxproject.org/page/Main_Page&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Security Enhanced Linux distro
	&lt;/span&gt;
&lt;/a&gt;, or a &lt;a
	
		href = &#34;http://grandstreamdreams.blogspot.in/2009/05/free-usaf-hardened-windows-build-well.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		harderned version of Windows
	&lt;/span&gt;
&lt;/a&gt; or something else; NSA has a &lt;a
	
		href = &#34;http://www.nsa.gov/ia/mitigation_guidance/security_configuration_guides/operating_systems.shtml&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		handy guide
	&lt;/span&gt;
&lt;/a&gt;. You should also look to use something like &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/BitLocker_Drive_Encryption&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BitLocker
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.truecrypt.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TrueCrpyt
	&lt;/span&gt;
&lt;/a&gt; and use that on a VM which you have built from scratch and is running on that clean machine.&lt;/li&gt;
&lt;li&gt;Moving the Data Securely - I think, this is the most difficult thing to do. The only way you can come close enough to do this is using &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Tor
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;https://www.torproject.org/docs/hidden-services.html.en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hidden service
	&lt;/span&gt;
&lt;/a&gt;. Of course all the entry and exit points to Tor would be monitored and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29#Exit_nodes_should_not_be_trusted&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cannot be trusted
	&lt;/span&gt;
&lt;/a&gt;. If you don&amp;rsquo;t know much of Tor, you can read up &lt;a
	
		href = &#34;https://www.torproject.org/about/overview.html.en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this guide
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Using a Hidden Service - Use your clean machine only to interact with the absolute minimum to download data and then ensure it always remains disconnected from any network.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I also think the amount of data and information that Google and Facebook has one someone is scary. I like how The Registered ended their article with the quote from one of the UK government security staff:&lt;/p&gt;
&lt;p&gt;You would not believe the hoops we have to jump through to access an email, all the legal paperwork that needs completing, when Google has everyone on file and no one blinks an eye&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Securing you DokuWiki</title>
      <link>/post/2013/08/securing-you-dokuwiki/</link>
      <pubDate>Thu, 22 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/securing-you-dokuwiki/</guid>
      <description>&lt;p&gt;After my WHS died and I moved to a Synology DS413 and using that as a &amp;lsquo;home server&amp;rsquo; and have been extremely happy with it! The only thing I miss is backing up the Windows machines automatically (as WHS did), but overall I think this is better, flexible and more powerful compared to WHS.&lt;/p&gt;
&lt;p&gt;I needed to look for a new wiki software. I recently moved from &lt;a
	
		href = &#34;http://www.screwturn.eu/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ScrewTurn Wiki
	&lt;/span&gt;
&lt;/a&gt; (which was great BTW, but then is a dead project now) to &lt;a
	
		href = &#34;https://www.dokuwiki.org/dokuwiki&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DokuWiki
	&lt;/span&gt;
&lt;/a&gt; which is perfect for my needs. I run two wiki&amp;rsquo;s at home and has much of our day-to-day things we as a family need. There are some sections of the Wiki, which are sensitive and I don&amp;rsquo;t want anyone one the network getting to it. I wanted to authenticate the user and once they login only then get to that.&lt;/p&gt;
&lt;p&gt;As it turns out, securing your DokuWiki is quite simple. If you are interested in a similar setup then here is what you need to do:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disable the registration option on Configuration settings. Some details on this can be found &lt;a
	
		href = &#34;http://www.dokuwiki.org/config:disableactions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Update the ACL (more of that &lt;a
	
		href = &#34;https://www.dokuwiki.org/acl#access_restrictions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;), there is a user group called &amp;lsquo;ALL&amp;rsquo;; set the permision for this group to &amp;ldquo;None&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;For the user group &amp;ldquo;User&amp;rdquo;, change the permissions to Edit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/securing-docuwiki.jpg&#34; alt=&#34;Securing DocuWiki&#34;/&gt;
        &lt;figcaption&gt;Securing DocuWiki&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;This will ensure only logged in (and of course authenticated users) can read and edit and an anonymous user cannot see anything.&lt;/p&gt;
&lt;p&gt;The only catch in this is that you need to manually maintain the users (e.g. add new users); my userbase is very small at home, so this is not a challenge at all.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automated Code Reviews with Visual Studio?</title>
      <link>/post/2013/08/automated-code-reviews-with-visual-studio/</link>
      <pubDate>Wed, 21 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/automated-code-reviews-with-visual-studio/</guid>
      <description>&lt;p&gt;I have been thinking of doing some code &amp;lsquo;smelliness&amp;rsquo; test, and am keen to automate code reviews (as much as possible).&lt;/p&gt;
&lt;p&gt;I am interested to know what tools have you guys used? I want to use the tools to find the low hanging fruits and know off the 80% of things and then we manually look at the more interesting aspects, which the tools don&amp;rsquo;t (or can&amp;rsquo;t) pick up. Ideally, I would like this as an add-in to Visual Studio, which can run as part of a build and depending on how one configures it, can get to a gated check-in and/or work-items being created in TFS which then can be assigned and tracked. What I am thinking is to complement the likes of FxCop, the built-in Visual Studio tools. There was &lt;a
	
		href = &#34;http://teamreview.codeplex.com/&#34;
	

	
		title = &#34;Team Review&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TeamReview
	&lt;/span&gt;
&lt;/a&gt; which I had looked at some point in the past, but we never got it running successfully. I have not had a chance to see it since then. Someone has also attempted some of this via &lt;a
	
		href = &#34;http://tfscodereviewflow.codeplex.com/&#34;
	

	
		title = &#34;this&#34;
	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this
	&lt;/span&gt;
&lt;/a&gt;, but it does not seem to go anywhere. Surely, there someone has already build this which we can look into?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Landfill Harmonic movie</title>
      <link>/post/2013/08/landfill-harmonic-movie/</link>
      <pubDate>Tue, 20 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/landfill-harmonic-movie/</guid>
      <description>&lt;p&gt;Who cares what it smells like, it&amp;rsquo;s what it sounds like that matters. See the first 54 seconds, and then you will be hooked.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>10 things extraordinary bosses give employees</title>
      <link>/post/2013/08/10-things-extraordinary-bosses-give-employees/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/10-things-extraordinary-bosses-give-employees/</guid>
      <description>&lt;p&gt;Got a really good read from &lt;a
	
		href = &#34;http://www.avanade.com/blog/author/jerome-thiebaud/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jerome
	&lt;/span&gt;
&lt;/a&gt;, fellow Avanade colleague - ten extraordinary things bosses give their employees. Not surprisingly, good bosses care about getting important things done. And exceptional bosses care about their people.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; Autonomy and independence&lt;/li&gt;
&lt;li&gt;Clear expectation&lt;/li&gt;
&lt;li&gt;Meaningful objectives&lt;/li&gt;
&lt;li&gt;The true sense of purpose&lt;/li&gt;
&lt;li&gt;Opportunities to provide significant input&lt;/li&gt;
&lt;li&gt;A real sense of connection&lt;/li&gt;
&lt;li&gt;Reliable consistency&lt;/li&gt;
&lt;li&gt;Private criticism&lt;/li&gt;
&lt;li&gt;Public praise&lt;/li&gt;
&lt;li&gt;The chance for meaningful future&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;More details &lt;a
	
		href = &#34;http://www.inc.com/jeff-haden/10-things-extraordinary-bosses-do-for-their-employees.html?cid=sf01002&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On TDD</title>
      <link>/post/2013/08/on-tdd/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/on-tdd/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static.squarespace.com/static/518f5d62e4b075248d6a3f90/t/51f4f48ce4b03e25cfa8f8aa/1375007898520/tdd.jpg?format=750w&#34; alt=&#34;TDD&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LeapMotion SEHException</title>
      <link>/post/2013/08/leapmotion-sehexception/</link>
      <pubDate>Wed, 14 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/leapmotion-sehexception/</guid>
      <description>&lt;p&gt;If for some reason when you try and run your code and you get a PINVOKE exception (like the one below), then most likely you don&amp;rsquo;t have the LeapMotion binaries in your Debug (or Release) folders.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.TypeInitializationException was unhandled
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233036&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=The type initializer &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;Leap.LeapPINVOKE&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt; threw an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=Leap.LeapPINVOKE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.new_Listener()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.Listener..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at HelloLeap.MyListener..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at HelloLeap.Program.Main(String[] args) &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; c:&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Users&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;amit.bahree&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Documents&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Visual Studio &lt;span style=&#34;color:#f5a97f&#34;&gt;2013&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Projects&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;HelloLeap&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;HelloLeap&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Program.cs:line &lt;span style=&#34;color:#f5a97f&#34;&gt;14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at System.Threading.ThreadHelper.ThreadStart()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException: System.TypeInitializationException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233036&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=The type initializer &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;SWIGExceptionHelper&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt; threw an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=SWIGExceptionHelper
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper..ctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE..cctor()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException: System.DllNotFoundException
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2146233052&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=Unable to load DLL &lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;LeapCSharp&lt;span style=&#34;color:#ed8796&#34;&gt;&amp;#39;&lt;/span&gt;: The specified module could not be found. (Exception &lt;span style=&#34;color:#c6a0f6&#34;&gt;from&lt;/span&gt; HRESULT: &lt;span style=&#34;color:#f5a97f&#34;&gt;0x8007007E&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=LeapCSharp.NET4.&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TypeName=&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper.SWIGRegisterExceptionCallbacks_Leap(ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.SWIGExceptionHelper..cctor()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On the other hand if you get a SEHException from LeapMotion (something like the one below) then the issue is either you don&amp;rsquo;t have the right version of the assemblies (e.g. you are compiling a x64 version, but have the x32 binaries, or vice-versa).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.Runtime.InteropServices.SEHException occurred
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HResult=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2147467259&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Message=External component has thrown an exception.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source=Your.Some.Assembly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ErrorCode=-&lt;span style=&#34;color:#f5a97f&#34;&gt;2147467259&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;StackTrace:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Leap.LeapPINVOKE.Controller_EnableGesture__SWIG_1(HandleRef jarg1, Int32 jarg2)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Somewhere.In.Your.Code bin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;at Some.Assembly &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; d:&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;Data&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;src&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;SomeCode&lt;span style=&#34;color:#ed8796&#34;&gt;\&lt;/span&gt;YourFile.cs:line &lt;span style=&#34;color:#f5a97f&#34;&gt;23&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InnerException:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The solution is simple in both cases to copy the binaries (which can be found in LeapSDK\lib) to the Debug and Release folders.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Requirements - are they that important?</title>
      <link>/post/2013/08/requirements-are-they-that-important/</link>
      <pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/requirements-are-they-that-important/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/just-because.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WordPress 3.6 and IE10</title>
      <link>/post/2013/08/wordpress-3-6-and-ie10/</link>
      <pubDate>Sat, 10 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/wordpress-3-6-and-ie10/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know what WordPress thinks of IE 10 (running on Win 8), but when I upgraded to WordPress v3.6, and I login to the Dashboard, it does not like IE running in compatibility mode and shows me the following. It would think I am still running IE 6! Also whilst I don&amp;rsquo;t get this with the compatibility mode switched off, everything does not work correctly and one has to use either Firefox or Chrome.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/wordpress-3.6-and-IE10.jpg&#34; alt=&#34;Wordpress 3.6 and IE10&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding an user in Ubuntu - Why is it so difficult?</title>
      <link>/post/2013/08/adding-a-user-in-ubuntu-why-so-difficult/</link>
      <pubDate>Fri, 09 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/adding-a-user-in-ubuntu-why-so-difficult/</guid>
      <description>&lt;p&gt;I installed the latest version of Ubuntu (13.04, Raring Tail) on a machine at home to check it out (it was running CentOS 6.4 before that). Setting it up was quite simple, but I am not sure if I like the too simple UI. I don&amp;rsquo;t want an uber-geek only-shell mode, but the CentOS I thought was the right balance.&lt;/p&gt;
&lt;p&gt;Anyways, when I first added a new user, there was no way I could set a password which was very weird - not a permanent or temporary one! And there is no way one can then login. I don&amp;rsquo;t think this is user error, but then if it is a bug, it seems like a big one!&lt;/p&gt;
&lt;p&gt;So I had to deleted the user and then added them back (via the shell &lt;code&gt;sudo adduser user-name-you-want&lt;/code&gt; command) and then set the password. If you want to change the password, you can also use &lt;code&gt;passwd user-name-you-want&lt;/code&gt; in a shell).&lt;/p&gt;
&lt;p&gt;But the most irritating part of this was adding the new user to have root access. It took me a little time to figure out. But in the end it turns our the root (or su) group is called &amp;ldquo;sudo&amp;rdquo; and it is part of this group that the new user needs to be in if they need root access.&lt;/p&gt;
&lt;p&gt;To modify an existing user, you use the following command in the shell &lt;code&gt;sudo usermod -g sudo user-name-you-want&lt;/code&gt; where of course sudo is the group name.&lt;/p&gt;
&lt;p&gt;Now, we got there in the end, but why does it have to be so painful like pulling teeth! If this is supposed to be easy for the average user, surely they are missing a trick.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sleeves and LeapMotion</title>
      <link>/post/2013/08/sleeves-and-leapmotion/</link>
      <pubDate>Thu, 08 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/sleeves-and-leapmotion/</guid>
      <description>&lt;p&gt;I have seen this a few times now so I know it is not a one off, but it seems that the sleeves of my shirt seem to throw off the Leap Motion sensor and it detects it as another hand - and ends up showing three hands.&lt;/p&gt;
&lt;p&gt;I thought it was my watch which might be causing some issue, but that was not it. It goes away when I am wearing a t-shirt, but the tracking is quite off when wearing a full sleeve shirt.&lt;/p&gt;
&lt;p&gt;I have been meaning to record a video, but not had a chance to do it yet. I was wondering, has anyone else also seen something similar?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to insult a developer?</title>
      <link>/post/2013/08/how-to-insult-a-developer/</link>
      <pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/how-to-insult-a-developer/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;http://static.squarespace.com/static/518f5d62e4b075248d6a3f90/t/51bb91f3e4b0405092e56e27/1371247103965/not-restful.jpg?format=750w&#34; alt=&#34;How to insult a developer&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>VSTO download for Visual Studio 2012</title>
      <link>/post/2013/08/vsto-download-for-visual-studio-2012/</link>
      <pubDate>Tue, 06 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/08/vsto-download-for-visual-studio-2012/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know why it is simple to find, or even on the download section on MSDN, but trying to find the VSTO download specifically for Visual Studio 2012 is a real pain. It took me some time trying to find this and if you need to save some time then you can download it &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-US/office/apps/fp123627&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		from here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is a Vodafone thinking with Site Timing?</title>
      <link>/post/2013/07/what-is-a-vodafone-thinking-with-site-timing/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/what-is-a-vodafone-thinking-with-site-timing/</guid>
      <description>&lt;p&gt;This has to fall in the weird category. Vodafone&amp;rsquo;s Corporate Online site, where I need to login to see my company provided mobile bill has timings from 07:30 to 22:30 GMT - WHY??? Don&amp;rsquo;t they get it, this is online and the site can be up and running 24x7! This is not some technical support I am talking about where they have actual humans monitoring and answering - this is access to the billing system.&lt;/p&gt;
&lt;p&gt;When you are in another country and timezone (like I am right now), does Vodafone have any idea on how irritating this can be?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/vodafone-site-timmings.png&#34; alt=&#34;Vodafone Site Timings&#34;/&gt;
        &lt;figcaption&gt;Vodafone Site Timings&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How not to handle exceptions!</title>
      <link>/post/2013/07/how-not-to-handle-exceptions/</link>
      <pubDate>Fri, 19 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/how-not-to-handle-exceptions/</guid>
      <description>&lt;p&gt;Was trying to pay my Electricity bill online via a site called &lt;a
	
		href = &#34;https://www.bangaloreone.gov.in/public/default.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Bangalore One
	&lt;/span&gt;
&lt;/a&gt;, which is the Governments, premier one-stop shop for Electronic Delivery of Citizen Services.&lt;/p&gt;
&lt;p&gt;I could not pay because it seems like some backend services they need for credit card payment is down. How do I know this? Because the site is revealing too much detail! See the exception details pasted below.&lt;/p&gt;
&lt;p&gt;This is a great example of what &lt;strong&gt;not&lt;/strong&gt; to do! I have seen this often, and it is lazy developers and even lazier testers who approved this and get this into production. One would have thought that government managing the &amp;ldquo;Silicon Valley of India&amp;rdquo; would know better!&lt;/p&gt;
&lt;p&gt;It is also interesting to see that they are on a very old version of .NET - running on v1.1.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Description:&lt;/strong&gt;
An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exception Details:&lt;/strong&gt;
&lt;code&gt;System.Exception: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Error:&lt;/strong&gt;
&lt;code&gt;An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stack Trace:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Exception: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   BangaloreOne.clsBESCOM.fnCheckTransCnt(String LocationRRNo, String StaffCode, Int32 intDeptCode) +381
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   bOneWebPortal.BESCOMConfirm.Page_Load(Object sender, EventArgs e) +721
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Control.OnLoad(EventArgs e) +67
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Control.LoadRecursive() +35
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   System.Web.UI.Page.ProcessRequestMain() +750
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;Version Information: Microsoft .NET Framework Version:1.1.4322.2300; ASP.NET Version:1.1.4322.2300
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Google Logic</title>
      <link>/post/2013/07/google-logic/</link>
      <pubDate>Wed, 10 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/google-logic/</guid>
      <description>&lt;p&gt;I came across this very interesting article in the guardian called &amp;ldquo;&lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2013/jul/09/google-android-reader-why&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google logic: why Google does the things it does the way it does
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo;. This is a fascinating insight and a lot of it makes sense to me. What was also interesting to understand a little more on how the mindset is very different from the other corporates and technology leaders out there. Especially interesting the self-righteous view one perceives that Google has of themselves. It is a little long, but worth a read.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Broke my Microsoft Surface Pro device!</title>
      <link>/post/2013/07/broke-my-microsoft-surface-pro-device/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/broke-my-microsoft-surface-pro-device/</guid>
      <description>&lt;p&gt;I am probably the only guy on the planet who broke his Surface Pro device! :oops: So much so that the screen shattered - so much for Gorilla glass and all that!&lt;/p&gt;
&lt;p&gt;I was starting out on a 4 week long trip and the Surface slipped and fell at the airport when taking it out for the X-Ray machine. It fell on one corner and the screen shattered. With small pieces of glass everywhere on it, it was not usable. However it did work when I switched it on a week later. Here are a few photos that show the extend of the damage and the fact that it was still working post that!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_005.jpg&#34; alt=&#34;Surface Pro 1&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_003.jpg&#34; alt=&#34;Surface Pro 2&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_002.jpg&#34; alt=&#34;Surface Pro 3&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/WP_20130618_010.jpg&#34; alt=&#34;Surface Pro 4&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dilbert and Leadership</title>
      <link>/post/2013/07/dilbert-and-leadership/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/dilbert-and-leadership/</guid>
      <description>&lt;p&gt;Enough said!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/184103.strip_.print_.gif&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Dilbert and Leadership&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Don&#39;t ask your boss!</title>
      <link>/post/2013/07/dont-ask-your-boss/</link>
      <pubDate>Tue, 09 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/07/dont-ask-your-boss/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/asap2.jpg&#34; alt=&#34;Don&amp;rsquo;t ask your boss&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>My TechEd Presentation - Building cross-platform Modern Apps - the Design perspective</title>
      <link>/post/2013/05/my-teched-presentation-building-cross-platform-modern-apps-the-design-perspective/</link>
      <pubDate>Fri, 31 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/my-teched-presentation-building-cross-platform-modern-apps-the-design-perspective/</guid>
      <description>&lt;p&gt;TechEd a couple of months ago was really fun and I am grateful to Microsoft folks for giving me an opportunity to be both part of the Keynote and also have a slot in the Architecture track. Sorry it has taken me a very long time to upload my TechEd talk &amp;ldquo;Building cross-platform Modern Apps: the Design perspective&amp;rdquo;. But as they say better late than never. 😏&lt;/p&gt;
&lt;p&gt;You can download a copy of my presentation - &lt;a
	
		href = &#34;files/Xamarin-Building-cross-platform.pdf&#34;
	

	

	&gt;
	
	&lt;span&gt;
		Xamarin - Building cross-platform (pdf)
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Feel free to ping me if you have any questions.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What are good Win 8 Metro Apps for WordPress authoring?</title>
      <link>/post/2013/05/what-are-good-win-8-metro-apps-for-wordpress-authoring/</link>
      <pubDate>Sat, 25 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/what-are-good-win-8-metro-apps-for-wordpress-authoring/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I would prefer a Windows 8 Metro app, and not a &amp;rsquo;traditional&amp;rsquo; app for WordPress. I host my own blog (&lt;a
	
		href = &#34;http://desigeek.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		http://desigeek.com
	&lt;/span&gt;
&lt;/a&gt;) and need to update that.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.quora.com/WordPress-5/What-are-good-Win-8-Metro-Apps-for-WordPress-authoring&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		View Question on Quora
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What are some fun things to do in Amsterdam with a 2.5 yr old?</title>
      <link>/post/2013/05/what-are-some-fun-things-to-do-in-amsterdam-with-a-2-5-yr-old/</link>
      <pubDate>Sat, 25 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/what-are-some-fun-things-to-do-in-amsterdam-with-a-2-5-yr-old/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;We will be travelling with a Toddler (2.5 yrs) to Amsterdam and wanted to know what suggestions one has to keep her engaged, excited, and busy?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a
	
		href = &#34;http://www.quora.com/Amsterdam-With-a-Toddler/What-are-some-fun-things-to-do-in-Amsterdam-with-a-2-5-yr-old&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		View Question on Quora
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hello World</title>
      <link>/post/2013/05/hello-world/</link>
      <pubDate>Thu, 16 May 2013 00:00:00 +0000</pubDate>
      
      <guid>/post/2013/05/hello-world/</guid>
      <description>&lt;p&gt;Yes, I am still alive. Between a baby and work, don&amp;rsquo;t have time for much else. I did want to say Hello World. Will try and be more regular here.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/hello-world.png&#34; alt=&#34;hello world&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Writing a compiler using C#</title>
      <link>/post/2012/10/writing-a-compiler-using-c/</link>
      <pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/10/writing-a-compiler-using-c/</guid>
      <description>&lt;p&gt;I was cleaning out my old papers (finally!) and came across an old paper I had titled &amp;ldquo;&lt;a
	
		href = &#34;https://wiki.dcs.shef.ac.uk/wiki/pub/Ndlprojects/ExtendingMSharpLiterature/BookletCSTools.pdf&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Compiler Writing Tools using C#
	&lt;/span&gt;
&lt;/a&gt;&amp;rdquo; which essentially shows how you can write a number of tools like &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Lex_%28software%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		lex
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Yacc&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		yacc
	&lt;/span&gt;
&lt;/a&gt; but instead of C/C++ on Unix, you use C# and .NET.&lt;/p&gt;
&lt;p&gt;This paper covers the tokenizer, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Formal_grammar&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		grammar
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Deterministic_finite_automaton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		DFA
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Nondeterministic_finite_automaton&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NFA
	&lt;/span&gt;
&lt;/a&gt;, etc. I think conflicts and precedence is one area it would need a little more work. But overall its a very interesting piece of work - especially for one to learn the ropes if a lot of this is new.&lt;/p&gt;
&lt;p&gt;Of course, writing compilers with C, overall is not the most productive experience (it sure is fun though!); if you have never done it before &lt;a
	
		href = &#34;http://www.smlnj.org/sml.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Standard ML
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.haskell.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Haskell
	&lt;/span&gt;
&lt;/a&gt; would be a better place to start. If you want to stick to .NET and roll out your own language (or create extensions) then check out &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/magazine/cc136756.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this paper on MSDN
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of this brought back memories when I wrote my own C++ compilers mainly with those tools on Unix System V and also on Xenix. Most people did not know (or perhaps remember) that Microsoft had a Unix version called &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Xenix&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Xenix
	&lt;/span&gt;
&lt;/a&gt; which was later bought over by SCO and eventually become part of SCO Unix. Back in the days I use to run a dual-boot machine with Xenix and DOS. 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Can Microsoft win against this?</title>
      <link>/post/2012/10/can-microsoft-win-against-this/</link>
      <pubDate>Mon, 01 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/10/can-microsoft-win-against-this/</guid>
      <description>&lt;p&gt;After seeing this, I think I also want the &amp;ldquo;Apple 5&amp;rdquo;; supposedly this lady is true and has been waiting in line for 2 days.&lt;/p&gt;
&lt;p&gt;{Credit: &lt;a
	
		href = &#34;http://wmpoweruser.com/can-microsoft-win-against-this/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		wmpoweruser.com
	&lt;/span&gt;
&lt;/a&gt;}&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Windows 8</title>
      <link>/post/2012/08/on-windows-8/</link>
      <pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/08/on-windows-8/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/083012_0424_OnWindows81.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Large collection of Free eBooks from MS</title>
      <link>/post/2012/08/large-collection-of-free-ebooks-from-ms/</link>
      <pubDate>Sat, 04 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/08/large-collection-of-free-ebooks-from-ms/</guid>
      <description>&lt;p&gt;Microsoft folks have released a large collection of free eBooks including Visual Studio, WP, Win 8, Office 365, SQL, Azure, CRM, etc. You can get more details from the following two posts where not only you can browse the catalogue but also download them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/b/mssmallbiz/archive/2012/07/27/large-collection-of-free-microsoft-ebooks-for-you-including-sharepoint-visual-studio-windows-phone-windows-8-office-365-office-2010-sql-server-2012-azure-and-more.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		First post
	&lt;/span&gt;
&lt;/a&gt; with free books&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/b/mssmallbiz/archive/2012/07/30/another-large-collection-of-free-microsoft-ebooks-and-resource-kits-for-you-including-sharepoint-2013-office-2013-office-365-duet-2-0-azure-cloud-windows-phone-lync-dynamics-crm-and-more.aspx?wa=wsignin1.0&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Second post
	&lt;/span&gt;
&lt;/a&gt; with free books&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy Leeching!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud thinking</title>
      <link>/post/2012/07/cloud-thinking/</link>
      <pubDate>Wed, 25 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/cloud-thinking/</guid>
      <description>&lt;p&gt;I did a quick internal brown bag on Cloud computing yesterday. It is interesting to still get to meet folks who don’t have much ideas on Cloud and what the various types are, what they mean and their value. In any case, cloud is just full of hot air. ! 😄&lt;/p&gt;
&lt;p&gt;I always found, most people can get it when they can relate to cloud usage as a consumer. And of course the CoIT and BYOD will just help accelerate that and bring the usage out in the front. I personally am a heavy cloud user and use it all the time. I also have a local copy of almost everything, I still don’t trust the broadband providers – lots of things that can go wrong.&lt;/p&gt;
&lt;p&gt;If you are new, welcome to the ride.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Redis on Windows 8 and VS 2012 RC?</title>
      <link>/post/2012/07/redis-on-windows-8-and-vs-2012-rc/</link>
      <pubDate>Thu, 12 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/redis-on-windows-8-and-vs-2012-rc/</guid>
      <description>&lt;p&gt;I am trying to see if I can get &lt;a
	
		href = &#34;http://redis.io/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Redis
	&lt;/span&gt;
&lt;/a&gt; working on Windows 8 using Visual Studio 2012 RC bits – I have not had much success, but then I have not had much time to invest to try this out.&lt;/p&gt;
&lt;p&gt;I am wanting to give a demo tomorrow and would be good to see if I can get this working. Curious to know if anyone else has got this?&lt;/p&gt;
&lt;p&gt;If not Redis, then have you got some other implementation working on Windows 8? I was thinking of &lt;a
	
		href = &#34;http://ravendb.net&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RavenDB
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Creating Word Maps / Word Clouds</title>
      <link>/post/2012/07/creating-word-maps-word-clouds/</link>
      <pubDate>Sat, 07 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/creating-word-maps-word-clouds/</guid>
      <description>&lt;p&gt;I am giving a presentation next week on NoSQL and as part of that I wanted to create a Word Map, similar to the ones I have seen in the Guardian over the years. After searching a little, I came across the following two sites which do an excellent job of this. Both of them allow a number of options to customise the output and I think are very cool!&lt;/p&gt;
&lt;p&gt;The first one is &lt;a
	
		href = &#34;http://www.jasondavies.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jason Davies
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://www.jasondavies.com/wordcloud&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		World Cloud
	&lt;/span&gt;
&lt;/a&gt; that is open source and you can integrate online searches, twitter searches, etc. The word map below is an example output when I &lt;a
	
		href = &#34;http://www.jasondavies.com/wordcloud/#http%3A%2F%2Fsearch.twitter.com%2Fsearch.json%3Frpp%3D100%26q%3D%7Bword%7D=bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		search “bahree” on twitter
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image_thumb.png&#34; alt=&#34;image&#34;/&gt;
        &lt;figcaption&gt;image&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fallacies of Distributed Computing</title>
      <link>/post/2012/07/fallacies-of-distributed-computing/</link>
      <pubDate>Sat, 07 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/fallacies-of-distributed-computing/</guid>
      <description>&lt;p&gt;I was reading something and came across these &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		fallacies of Distributed Computing
	&lt;/span&gt;
&lt;/a&gt; which all beginners (to distributed computing) have. Oh how we all learn.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The network is reliable&lt;/li&gt;
&lt;li&gt;Latency is zero&lt;/li&gt;
&lt;li&gt;Bandwidth is infinite&lt;/li&gt;
&lt;li&gt;The network is secure&lt;/li&gt;
&lt;li&gt;Topology doesn&amp;rsquo;t change&lt;/li&gt;
&lt;li&gt;There is only one administrator&lt;/li&gt;
&lt;li&gt;Transport cost is zero&lt;/li&gt;
&lt;li&gt;The network is homogeneous&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>WHS is back!</title>
      <link>/post/2012/07/whs-is-back/</link>
      <pubDate>Tue, 03 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/07/whs-is-back/</guid>
      <description>&lt;p&gt;My WHS was dead for close to a year now with no automatic backups happening! I knew the issue was one of the HDD’s had failed, but I did not have time to take them out and plug them somewhere else to figure out the exact issue. I finally bought a couple of new disks and restored the WHS over the weekend and everything is running fine now. Also got about 101 GB backed up on S3, which is good.&lt;/p&gt;
&lt;p&gt;Now, the question I have is which Add-ins do you recommend? I have the original WHS (v1) and not Vail (WHS 2011). I am already running Cloudberry. I would like something which can tweet the health status which I can monitor.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Metro Apps in C&#43;&#43; anyone?</title>
      <link>/post/2012/05/metro-apps-in-c-anyone/</link>
      <pubDate>Sat, 19 May 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/05/metro-apps-in-c-anyone/</guid>
      <description>&lt;p&gt;In Visual Studio “11” when I try and create a new C++ Metro app using the built-in template, I get the following error: “Can’t find localized resources”.&lt;/p&gt;
&lt;p&gt;I wonder if anyone else has managed to get around this? I am running the Consumer Preview Build of Win 8 (Build 8250).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SkyDrive, Windows 8 and Domain Account</title>
      <link>/post/2012/04/skydrive-windows-8-and-domain-account/</link>
      <pubDate>Wed, 25 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/skydrive-windows-8-and-domain-account/</guid>
      <description>&lt;p&gt;I am running Windows 8 on my primary work machine now, which is domain joined. When I try and use the SkyDrive metro app (which ships with Windows 8), it does not like that fact I am domain joined and wants me to switch accounts, which is something I don’t want to do. This of course works great for those who are not domain joined and essentially are personal machines. For many of us who will be using this on ‘work’ machines, this seems like we will be ignored.&lt;/p&gt;
&lt;p&gt;Of course I can install the &lt;a
	
		href = &#34;https://apps.live.com/skydrive/app/9a65e47d-606a-4816-a246-90f54bf7a3ea&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		desktop app
	&lt;/span&gt;
&lt;/a&gt;, but that is not Metro and I am then in the ‘old’ world. Also the free 25 GB has now dropped to 7 GB, if you already have a Live account, I suggest you login and &lt;a
	
		href = &#34;https://skydrive.live.com/ManageStorage&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		upgrade your account
	&lt;/span&gt;
&lt;/a&gt; back to 25 GB for free!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Concurrency and CEP</title>
      <link>/post/2012/04/concurrency-and-cep/</link>
      <pubDate>Wed, 18 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/concurrency-and-cep/</guid>
      <description>&lt;p&gt;The sooner we all understand the Concurrency ≠ CEP (Complex Event Processing), the better the world will be!&lt;/p&gt;
&lt;p&gt;CEP is generally used when we implement real-time systems (of course that is not the only area where CEP is used). Real-time does not mean concurrent or for that matter high-performing system.&lt;/p&gt;
&lt;p&gt;Of course there are correlations, but at the same time they are fundamentally different paradigms.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>AWS Extension for Visual Studio</title>
      <link>/post/2012/04/aws-extension-for-visual-studio/</link>
      <pubDate>Sat, 14 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/04/aws-extension-for-visual-studio/</guid>
      <description>&lt;p&gt;I had forgotten that I had the &lt;a
	
		href = &#34;http://aws.amazon.com/visualstudio/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		AWS Extension for Visual Studio
	&lt;/span&gt;
&lt;/a&gt; installed until recently I noticed AWS Explorer item in the View menu option. This add-in allows you to explore the various features that Amazon exposes right from within Visual Studio. The toolkit makes it easier for developers to debug and deploy a .NET solutions that uses AWS.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;When you install this, you also get AWS SDK for .NET which provides one with all the building blocks that are required for consuming the IaaS services exposed by AWS including &lt;a
	
		href = &#34;http://aws.amazon.com/simpledb/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SimpleDB
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://aws.amazon.com/s3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		S3
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://aws.amazon.com/ec2/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		EC2
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are or planning to use AWS, this add-in is a must have in my opinion.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Had to post this!</title>
      <link>/post/2012/03/had-to-post-this/</link>
      <pubDate>Mon, 26 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/had-to-post-this/</guid>
      <description>&lt;p&gt;Got this in one of the chain emails, and thought it was too funny to pass up.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/interesting-thought-of-the-day.jpg&#34; alt=&#34;interesting thought of the day&#34;/&gt;
        &lt;figcaption&gt;Thought of the day&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2012/03/thought-of-the-day-5/</link>
      <pubDate>Thu, 22 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/thought-of-the-day-5/</guid>
      <description>&lt;p&gt;Whilst the following was said in the context of mobile ad-hoc network (&lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Mobile_ad_hoc_network&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MANETs
	&lt;/span&gt;
&lt;/a&gt;) I believe it can hold of many situations that life throws at us.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Efficiency and quality are of equal importance!! Both come from experience, not from study. Study as you go, don&amp;rsquo;t assume that you&amp;rsquo;re ready for the real world because you studied first.&lt;/p&gt;
&lt;p&gt;—Jon Davis&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Suggestions for a new Camera?</title>
      <link>/post/2012/03/suggestions-for-a-new-camera/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/suggestions-for-a-new-camera/</guid>
      <description>&lt;p&gt;Our current camera (&lt;a
	
		href = &#34;http://www.canon.co.uk/for_home/product_finder/cameras/digital_camera/ixus/digital_ixus_860_is/index.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Canon IXUS 860 IS
	&lt;/span&gt;
&lt;/a&gt;) is on the last dying leg – the camera itself works OK, but the screen is going to give up any day now – there are big holes where the pixels are dead (looks like a black hole). We love this model and want something along the same form factor and not interesting in anything fancy. One of the options was the new &lt;a
	
		href = &#34;http://www.canon.co.uk/For_Home/Product_Finder/Cameras/Digital_Camera/IXUS/IXUS_240_HS/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Canon IXUS 240 HS
	&lt;/span&gt;
&lt;/a&gt; which has a built-in Wifi connection and has just been released, though is not available in all the markets.&lt;/p&gt;
&lt;p&gt;As it happens I am going to be flying through Singapore soon and was thinking of picking one up at duty free. Does anyone have any recommendations for a model along the same lines? Want something decent enough in a small form factor.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What I am working on today? Optimisation Algorithms</title>
      <link>/post/2012/03/what-i-am-working-on-today-optimisation-algorithms/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/what-i-am-working-on-today-optimisation-algorithms/</guid>
      <description>&lt;p&gt;I often get the question – a what am I working on today? Some of the things I can’t discuss in an open forum, but some I can. Those that I can, I thought it was best to share via my blog and do quick small posts on it. Will this become a new series? Well time will tell – depends on how much bandwidth I will have.&lt;/p&gt;
&lt;p&gt;This weekend, I am researching &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Optimization_%28mathematics%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Optimisation Algorithms
	&lt;/span&gt;
&lt;/a&gt; – both Deterministic and Probabilistic. Specifically interested in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Swarm Intelligence
	&lt;/span&gt;
&lt;/a&gt; (which are a type of Monte Carlo algorithm) and in that in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence#Ant-based_routing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ant Colony
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Swarm_intelligence#Crowd_simulation&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Particle Swarm
	&lt;/span&gt;
&lt;/a&gt; routing are the main ones I am researching.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Realisation of the Day</title>
      <link>/post/2012/03/realisation-of-the-day/</link>
      <pubDate>Sat, 10 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/realisation-of-the-day/</guid>
      <description>&lt;p&gt;A common mistake people make when designing a computer system completely fool proof is to underestimate the ingenuity of complete fools :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Enabling Win 8 Metro on a Netbook</title>
      <link>/post/2012/03/enabling-win-8-metro-on-a-netbook/</link>
      <pubDate>Tue, 06 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/enabling-win-8-metro-on-a-netbook/</guid>
      <description>&lt;p&gt;When you install Win 8 on a Netbook the screen resolution would be too low for Metro apps to run which is a bummer. One way to get around this and “fix” this is to update the registry (and you thought that was so XP!) 😄.&lt;/p&gt;
&lt;p&gt;Run Regedit and search for “&lt;strong&gt;&lt;code&gt;display1_downscalingsupported&lt;/code&gt;&lt;/strong&gt;” (without quotes). Find all occurrences of this entry and change its value from 0 to 1.&lt;/p&gt;
&lt;p&gt;Reboot when finished and you should have more options on your Screen Resolution choosing which will allow you to run Metro. &amp;#x1f604;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A great example of a MANET</title>
      <link>/post/2012/03/a-great-example-of-a-manet/</link>
      <pubDate>Thu, 01 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/03/a-great-example-of-a-manet/</guid>
      <description>&lt;p&gt;I have been doing some research on MANETs and UAV’s and &lt;a
	
		href = &#34;http://blog.ted.com/2012/02/29/the-james-bond-of-robots-vijay-kumar-at-ted2012/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this TED talk
	&lt;/span&gt;
&lt;/a&gt; is a great example of how a number of nodes operate in a MANET and implement some predetermined algorithm, which in this case is the Bond Theme Song. Worth watching. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Less than Symbol in Latex</title>
      <link>/post/2012/02/less-than-symbol-in-latex/</link>
      <pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/02/less-than-symbol-in-latex/</guid>
      <description>&lt;p&gt;If you want to show a simple less than symbol (i.e. &amp;lt;) in Latex, you are in for a surprise as you cannot use that character as is. If you are in math mode and writing this part of a formula then you might be still OK, but if you are in text mode then it is quite difficult.&lt;/p&gt;
&lt;p&gt;Surprisingly, searching for this online also did not provide any obvious answers (perhaps I was searching for the wrong thing).&lt;/p&gt;
&lt;p&gt;Anyways, I did figure it out in the end, and I needed to use the &lt;code&gt;\textless&lt;/code&gt; directive for latex. I also found a few more symbols and have them listed below in case they are helpful for anyone else.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Symbol&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;Latex Command&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;^&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;\textasciicircum&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;lt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textless&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textgreater&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;~&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textasciitilde&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;ª&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textordfeminine&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;*&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textasteriskcentered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;º&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textordmasculine&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;\&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbar&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¶&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textparagraph&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;|&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textparagraph&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;·&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textperiodcentered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;{&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbraceleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;}&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbraceright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¿&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquestiondown&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;“&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquotedblleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;”&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquotedblright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;‘&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquoteleft&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;’&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textquoteright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;•&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textbullet&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;©&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textcopyright&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;†&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdagger&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;‡&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdaggerdbl&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;®&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textregistered&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;$&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textdollar&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;§&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textsection&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&amp;hellip;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textellipsis&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;£&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textsterling&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;—&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textemdash&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;™&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\texttrademark&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;–&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textendash&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;_&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textunderscore&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;¡&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textexclamdown&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;\textvisiblespace&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item>
    
    <item>
      <title>Rich Copy - a Robocopy GUI</title>
      <link>/post/2012/01/rich-copyndasha-robocopy-gui/</link>
      <pubDate>Thu, 26 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>/post/2012/01/rich-copyndasha-robocopy-gui/</guid>
      <description>&lt;p&gt;I needed to copy a bunch of data (Photos and Music) from my primary laptop to both the WHS and MCE and instead of hand crafting a Robocopy script I &lt;a
	
		href = &#34;http://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		came across
	&lt;/span&gt;
&lt;/a&gt; something called RichCopy (&lt;a
	
		href = &#34;http://download.microsoft.com/download/f/d/0/fd05def7-68a1-4f71-8546-25c359cc0842/HoffmanUtilitySpotlight2009_04.exe&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download from here
	&lt;/span&gt;
&lt;/a&gt;) which is a much better version of Robocopy GUI and allows for quite a few advanced features. If you use Robocopy a lot then I would highly recommend using this – you can setup multiple profiles depending on your environment.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/dd547088.fig01_Len-us.gif&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Productivity Future Vision</title>
      <link>/post/2011/11/productivity-future-vision/</link>
      <pubDate>Tue, 01 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/11/productivity-future-vision/</guid>
      <description>&lt;p&gt;Microsoft&amp;rsquo;s productivity future - how cool is this?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Happy Diwali</title>
      <link>/post/2011/10/happy-diwali-2/</link>
      <pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/10/happy-diwali-2/</guid>
      <description>&lt;p&gt;Wishing you and your family a very &lt;strong&gt;Happy Diwali&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image001.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;May the year bring &lt;strong&gt;Joy, Happiness, and Prosperity!&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Performance Reviews and Dilbert</title>
      <link>/post/2011/09/performance-reviews-and-dilbert/</link>
      <pubDate>Sun, 11 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/09/performance-reviews-and-dilbert/</guid>
      <description>&lt;p&gt;We are going through your year-end process now at Avanade; perhaps I should have a word with my Boss first. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/image2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Developer, Designer, PM, QA, Client Matrix</title>
      <link>/post/2011/09/developer-designer-pm-qa-client-matrix/</link>
      <pubDate>Sat, 10 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/09/developer-designer-pm-qa-client-matrix/</guid>
      <description>&lt;p&gt;Can you find yourself?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image001.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The reason I tweet</title>
      <link>/post/2011/08/the-reason-i-tweet/</link>
      <pubDate>Mon, 01 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/08/the-reason-i-tweet/</guid>
      <description>&lt;p&gt;I can’t decide which one of the following reasons makes more sense. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image002.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0027.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Joke of the day</title>
      <link>/post/2011/07/joke-of-the-day/</link>
      <pubDate>Fri, 22 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/joke-of-the-day/</guid>
      <description>&lt;p&gt;Two strings walk into a bar.&lt;br&gt;
1st string: I&amp;rsquo;ll have a beerk^xtc3ts08bmd;tidd%ti=lt}to&lt;br&gt;
2nd string: Please forgive my friend. He&amp;rsquo;s not null terminated.&lt;/p&gt;
&lt;p&gt;(credit: Avanade communities)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Greatest moment in a geek&#39;s life!</title>
      <link>/post/2011/07/greatest-moment-in-a-geeks-life/</link>
      <pubDate>Sat, 16 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/greatest-moment-in-a-geeks-life/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Greatest-moment-in-a-geeks-life.jpg&#34; alt=&#34;Greatest moment in a geeks life&#34;/&gt;
        &lt;figcaption&gt;Greatest moment in a geeks life&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automatic eTag Management with WCF Web API Message Handlers</title>
      <link>/post/2011/07/automatic-etag-management-with-wcf-web-api-message-handlers/</link>
      <pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/automatic-etag-management-with-wcf-web-api-message-handlers/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Books and Desk</title>
      <link>/post/2011/07/books-and-desk/</link>
      <pubDate>Thu, 07 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/books-and-desk/</guid>
      <description>&lt;p&gt;I have been asked a number of times, what books do I have and use. It is a long list and I am too lazy to list them out. So instead here is a photo I had taken about a year ago. Sure there are more books since then on different topics, but this should be good enough to give you a flavour.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/IMG_4603.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Also people asked me about my machines and study at home – and there is a photo for that too. This was in London and not in Bangalore of course. I guess this might mean I need to get to cleaning things more often and probably invest in some cable management solution. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/IMG_4602.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>WP7 Mango Speech to Text feature</title>
      <link>/post/2011/07/wp7-mango-speech-to-text-feature/</link>
      <pubDate>Tue, 05 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/07/wp7-mango-speech-to-text-feature/</guid>
      <description>&lt;p&gt;So I switched on my Bluetooth headset and discovered the Text to Speech feature that Mango has which works brilliantly. On the other hand, the reverse – speech to Text has a few short comings. Here is what was send to the missus when I replied to an SMS using this feature:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“&lt;em&gt;Okay calling amusing text to speech not speak to destitute lots of okay bye&lt;/em&gt;”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And in case you were wondering, no I did not say that – but something quite different.  I guess Mango is still beta :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Friends</title>
      <link>/post/2011/06/on-friends/</link>
      <pubDate>Sat, 18 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/on-friends/</guid>
      <description>&lt;p&gt;Sorry, this is in &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Hinglish&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hinglish
	&lt;/span&gt;
&lt;/a&gt;; too complicated to try and translate it. :)&lt;/p&gt;
&lt;p&gt;RESULT AGAR ACHCHA HO:&lt;br&gt;
Maa- Bhagwan ki kripa hai.&lt;br&gt;
Papa- Beta Kiska Hai.&lt;br&gt;
Dost- Chal Daaru Peete hain&lt;/p&gt;
&lt;p&gt;RESULT AGAR BURA HO:&lt;br&gt;
Maa- Aag lage is college main.&lt;br&gt;
Papa- Laad pyar ne bigaad diya.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;NAUKRI LAGNE PAR:&lt;br&gt;
Maa- Apni sehat ka khyal rakhna&lt;br&gt;
Papa- Khoob Mehnat se kaam karna.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;NAUKRI CHHOTNE PAR&lt;br&gt;
Maa- Naukri hee kharab thee&lt;br&gt;
Papa- Koi baat Nahin, doosri mil jayegi&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;BIRTHDAY PAR:&lt;br&gt;
Maa- Jug jug jiye mera beta&lt;br&gt;
Papa- Hamesha aage badhna.&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;SHAADI PAR&lt;br&gt;
Maa- Sadaa Sukhi Raho&lt;br&gt;
Papa- Khush Raho&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;BACHHA HONE PAR&lt;br&gt;
Maa- Bilkul mere bete par gaya/gayi hai&lt;br&gt;
Papa- Khush Raho&lt;br&gt;
Dost- Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;LOVE MAIN FAIL HONE PER:&lt;br&gt;
Maa - Beta Bhool ja usko&lt;br&gt;
Papa - Mard ban.&lt;br&gt;
Dost - Chal Daaru Peete hain!&lt;/p&gt;
&lt;p&gt;MORAL OF THE STORY: Duniya badal jati hai par DOST kabhi nahin badalte&amp;hellip;!!!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Kinect SDK</title>
      <link>/post/2011/06/kinect-sdk/</link>
      <pubDate>Fri, 17 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/kinect-sdk/</guid>
      <description>&lt;p&gt;Microsoft recently release the &lt;a
	
		href = &#34;http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect SDK
	&lt;/span&gt;
&lt;/a&gt; which allows you to implement a Natural User Interface and program against it! There is a lot of interest  around including claims on how &lt;a
	
		href = &#34;http://www.wired.com/magazine/2011/06/mf_kinect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Robotics will change
	&lt;/span&gt;
&lt;/a&gt; to how you can integrate a light sensor.&lt;/p&gt;
&lt;p&gt;You can use Visual Studio (C++, C# and VB.NET supported) and get quite interesting results.&lt;/p&gt;
&lt;p&gt;Here are a series of links below which will help you get started.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install the Kinect SDK&lt;/li&gt;
&lt;li&gt;Download and install &lt;a
	
		href = &#34;http://files.ch9.ms/coding4fun/KinectForWindowsSDKQuickstarts.zip&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Quickstart Samples and Slides
	&lt;/span&gt;
&lt;/a&gt; (zip file)&lt;/li&gt;
&lt;li&gt;Understanding the &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Understanding-Kinect-Hardware&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect hardware
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Setting up your &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Getting-Started&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Dev Environment
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Understanding the basics of &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Skeletal-Tracking-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		skeletal tracking
	&lt;/span&gt;
&lt;/a&gt; using the Kinect sensor&lt;/li&gt;
&lt;li&gt;Understanding &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Camera-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		camera fundamentals
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Understanding the &lt;a
	
		href = &#34;http://channel9.msdn.com/Series/KinectSDKQuickstarts/Audio-Fundamentals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		audio fundamentals
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playing with the &lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Coding4Fun-Kinect-Toolkit&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Coding4Fun Kinect toolkit
	&lt;/span&gt;
&lt;/a&gt; and seeing how one can build cool apps such as:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Kinect-Paint&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect Paint
	&lt;/span&gt;
&lt;/a&gt; (which uses skeleton tracking)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/projects/Kinect-Mouse-Cursor&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Kinect Mouse
	&lt;/span&gt;
&lt;/a&gt; which uses your hands as the mouse cursor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep and eye out on the &lt;a
	
		href = &#34;http://channel9.msdn.com/coding4fun/kinect&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Coding4Fun Kinect blog
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On Google</title>
      <link>/post/2011/06/on-google/</link>
      <pubDate>Fri, 17 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/on-google/</guid>
      <description>&lt;p&gt;So, what kind of a company do you think Google is? I guess the obvious answer – it is a search company. I would beg to differ and say it is on the contrary a data mining company. They make their money from AdSense and the Click-thru and sure, the search was the initial pull but now it is the data mining which pulls in the $$$’s. In some respects it is a one-trick pony, albeit a pretty good trick.&lt;/p&gt;
&lt;p&gt;Of course, the reach of Google’s index is quite small (relatively speaking), with much more data sitting inside corporations – something which Microsoft realises and is making strides with &lt;a
	
		href = &#34;http://sharepoint.microsoft.com/en-us/product/capabilities/search/Pages/Fast-Search.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FAST
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Something to think about next time you use your Android, Gmail, Google Talk, Google Talks, You Tube, etc. Each of those usage just adds to the data mining, allowing Google to make more money. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Occasionally Connected Architecture</title>
      <link>/post/2011/06/occasionally-connected-architecture/</link>
      <pubDate>Thu, 16 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/occasionally-connected-architecture/</guid>
      <description>&lt;p&gt;When implementing an occasionally connected architecture for a solution, there are three fundamental requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Part of the overall solution, some smart client is deployed and installed on the desktop and a web only approach is not possible. The main rational being that a smart client can work in a disconnected mode which of course with a web application is not possible.&lt;/li&gt;
&lt;li&gt;Underlying infrastructure needs to be in place to support this. Infrastructure is not specifically networks and servers, but also both the operational environment and the user’s environment and machine. The operational environments need to allow things such as: data caching, local storage of user data, user profile details, etc.&lt;/li&gt;
&lt;li&gt;More robust exception management process – this is not only about handling errors but also understanding the fact that the application is in a disconnected state and needs to do things differently.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When designing an occasionally connected application, there are two design approaches that one can take - data centric or service oriented.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;strong&gt;Data Centric&lt;/strong&gt; – Applications had a RDBMS of some sort installed locally and use the built-in capabilities of that RDBMS to propagate and sync data including resolving any conflicts.&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Server publishes data, which a client subscribes to and is copied locally. The conflict resolution (as changes can be both on the server or client) needs to be agreed upfront.&lt;/li&gt;
&lt;li&gt;Generally the database’s built-in conflict resolution is used – this makes it simpler for the application as one does not need to build this in the application.&lt;/li&gt;
&lt;li&gt;As there is only one data repository, the data convergence is guaranteed between the client and the server.&lt;/li&gt;
&lt;li&gt;Both the client and the server are tightly coupled.&lt;/li&gt;
&lt;li&gt;As a database needs to run locally, machines with small footprints or devices such as mobile phones will not be able to run this.&lt;/li&gt;
&lt;li&gt;If deployment is an issue then there is more work required here.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service-Oriented&lt;/strong&gt; – Applications use the SOA paradigm and store information in messages which are queued (when disconnected) and send to the server when connected for processing.
&lt;ol&gt;
&lt;li&gt;The client can interact with any service required and focuses on the service requests instead of the local data i.e. are loosely coupled.&lt;/li&gt;
&lt;li&gt;No local RDBMS required; of course some state information would still need to be saved.&lt;/li&gt;
&lt;li&gt;Better when needs to interact outside of the firewall (e.g. Internet or Intranet)&lt;/li&gt;
&lt;li&gt;Deployment is still required, but is simpler.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For Data centric application, from a design perspective the following aspects should be factored in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Application needs to be aware of the merge-replication schemes that are implemented as the application needs to optimise for data updates and conflicts.&lt;/li&gt;
&lt;li&gt;As a result, ACID properties are not used for transactions; instead a pub-sub model is implemented.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On the other hand, for Service-oriented apps, the application design should address the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application has to implement asynchronous communication.&lt;/li&gt;
&lt;li&gt;Overall solution needs to keep all the network interactions simple and cannot be complex.&lt;/li&gt;
&lt;li&gt;Application needs to add data caching capabilities&lt;/li&gt;
&lt;li&gt;Application needs to implement robust connection management (e.g. Manual vs. Automatic)&lt;/li&gt;
&lt;li&gt;Implement a store-and-forward mechanism such as using MSMQ.&lt;/li&gt;
&lt;li&gt;Application needs to implement a robust data and business rule conflict manager.&lt;/li&gt;
&lt;li&gt;Interacting with CRUD like Web services.&lt;/li&gt;
&lt;li&gt;The application and the work can be logically broken into “chunks” to allow one using a task-based approach.&lt;/li&gt;
&lt;li&gt;The application should be able to handle both forward and reverse dependencies which in turn could be complex business logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a high level guide, a data centric approach should be used when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One can deploy a database instance on the client.&lt;/li&gt;
&lt;li&gt;The application can function in a two-tier environment.&lt;/li&gt;
&lt;li&gt;One can tightly couple the client to the server through data schema definitions and communication protocol.&lt;/li&gt;
&lt;li&gt;There is a need for built-in change tracking and synchronization.&lt;/li&gt;
&lt;li&gt;One wants to rely on the database to handle data reconciliation conflicts and minimize the amount of custom reconciliation code that needs to be written.&lt;/li&gt;
&lt;li&gt;There is no need to interact with multiple disparate services.&lt;/li&gt;
&lt;li&gt;Users are able to connect to a database directly through a LAN/VPN/IPsec.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, a service oriented approach should be taken when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One wants to decouple the client and server to allow independent versioning and deployment.&lt;/li&gt;
&lt;li&gt;There is a need for more control and flexibility over data reconciliation issues.&lt;/li&gt;
&lt;li&gt;The delivery team has expertise to write more advanced application infrastructure code.&lt;/li&gt;
&lt;li&gt;There is a need for a lightweight client footprint.&lt;/li&gt;
&lt;li&gt;The applications can be structured into a service-oriented architecture.&lt;/li&gt;
&lt;li&gt;There is a need for specific business functionality (for example, custom business rules and processing, flexible reconciliation, and so on).
&lt;ul&gt;
&lt;li&gt;Note: One might also need to look at a few good rules engine if this is the case.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;One needs control over the schema of data stored on the client and flexibility that might be different from the server.&lt;/li&gt;
&lt;li&gt;The application needs to interact with multiple services using different communication technologies (Web services, Message Queuing, RPC, etc.).&lt;/li&gt;
&lt;li&gt;There is a need for a custom security scheme.&lt;/li&gt;
&lt;li&gt;The application needs to operate outside of the firewall.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Enjoy your Tea?</title>
      <link>/post/2011/06/enjoy-your-tea/</link>
      <pubDate>Wed, 15 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/enjoy-your-tea/</guid>
      <description>&lt;p&gt;If you are a Tea person (and I am not), then you would like Cup of Brown joy from &lt;a
	
		href = &#34;http://www.professorelemental.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Professor Elemental
	&lt;/span&gt;
&lt;/a&gt; – who is basically a guy from Colonial India who does hip hop.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Debugger Canvas - Quick Tour</title>
      <link>/post/2011/06/debugger-canvasquick-tour/</link>
      <pubDate>Tue, 14 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/debugger-canvasquick-tour/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/devlabs/debuggercanvas&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Debugger Canvas
	&lt;/span&gt;
&lt;/a&gt; is a new user experience for the debugger in Visual Studio Ultimate. It pulls together the code you’re exploring onto a single pan-and-zoom display. As you hit breakpoints or step into code, Debugger Canvas shows just the methods that you’re debugging, with call lines and local variables, to help you see the bigger picture.&lt;/p&gt;
&lt;p&gt;Check out the quick demo below to see what it is capable of and read up on the &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/devlabs/hh207442&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		guide on how to use it
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;script src=&#34;http://msdn.microsoft.com/objectforward/default.aspx?type=VideoPlayer&amp;amp;video=http%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F2%2FD%2FD%2F2DD2431D-D964-4290-9C05-91BE381A13DF%2FHDI-ITPro-MSDN-winvideo-debugger-canvas-final.wmv&amp;amp;thumb=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Fdevlabs%2Fhh227299.debugger-canvas-video-l.jpg&amp;amp;title=Debugger%20Canvas&amp;amp;width=400&amp;amp;height=400&#34; type=&#34;text/javascript&#34;&gt;&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>TFS on the Road - Windows Phone 7 App</title>
      <link>/post/2011/06/tfs-on-the-roadwindows-phone-7-app/</link>
      <pubDate>Mon, 13 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/tfs-on-the-roadwindows-phone-7-app/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://pcbl.de/about/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pedro
	&lt;/span&gt;
&lt;/a&gt; has build one of the best apps for Windows Phone 7 (WP7) that I have ever come across - &lt;a
	
		href = &#34;http://pcbl.de/tfs-on-the-road/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS on the Road
	&lt;/span&gt;
&lt;/a&gt;. As the application navigation map shows below it covers most aspects of TFS that you would be interested in – all packaged up in a very nice GUI. :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/image8.png&#34; alt=&#34;application navigation map&#34;/&gt;
        &lt;figcaption&gt;TFS on the Road App&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Best of all, the application is free and you can get it from &lt;a
	
		href = &#34;http://social.zune.net/redirect?type=phoneApp&amp;amp;id=5a01ae3e-f37f-e011-986b-78e7d1fa76f8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WP7 Market Place
	&lt;/span&gt;
&lt;/a&gt; or if you want the code then from &lt;a
	
		href = &#34;http://tfsontheroad.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CodePlex
	&lt;/span&gt;
&lt;/a&gt;. There are &lt;a
	
		href = &#34;http://pcbl.de/tfs-on-the-road/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more screenshots
	&lt;/span&gt;
&lt;/a&gt; for you to see what this looks like.&lt;/p&gt;
&lt;p&gt;Before you go away and install the app, you need to have &lt;a
	
		href = &#34;http://blogs.msdn.com/b/briankel/archive/2011/04/07/odata-service-for-team-foundation-server-2010.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		TFS OData Services
	&lt;/span&gt;
&lt;/a&gt; installed and made available over IIS. If you are using CodePlex, then you are good to go as Microsoft already has that switched on.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to remove a corrupt driver on Windows</title>
      <link>/post/2011/06/how-to-remove-a-corrupt-driver-on-windows/</link>
      <pubDate>Wed, 08 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/how-to-remove-a-corrupt-driver-on-windows/</guid>
      <description>&lt;p&gt;If you are having constant issues with a specific hardware, then one of the culprits could be a corrupt device driver for that hardware. In simple terms, a &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Device_driver&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		device driver
	&lt;/span&gt;
&lt;/a&gt; is nothing but another computer program which allows Windows and other applications to interact with the specific hardware. Since this is very hardware specific, generally one need to install the specific drivers for that device.&lt;/p&gt;
&lt;p&gt;Windows has something called “Device Manager” which as the name might suggest is used to manage devices. Devices are nothing but the various hardware elements that make up your computer. Some of these are internal (such as CPU, RAM, Hard disk, etc.) and other external such as the monitor, printer, mouse, etc.&lt;/p&gt;
&lt;p&gt;At a high level, the process is as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Computer Management&lt;/li&gt;
&lt;li&gt;Find the corrupt/offending device in Device Manager&lt;/li&gt;
&lt;li&gt;Remove the device (and possibly remove the drivers as well)&lt;/li&gt;
&lt;li&gt;Re-install the device (including the drivers if required).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have a few screenshots showing the step-by-step process. Whilst these screenshots were taken on a Windows 7 machine, if you are running Vista, the process is the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1 – Opening Computer Management&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click on Start&lt;/li&gt;
&lt;li&gt;Right-click on the Computer (on the right side of the Menu)&lt;/li&gt;
&lt;li&gt;From the new menu select “Manage” as shown below.&lt;/li&gt;
&lt;li&gt;You need Administrator rights for this, so depending on your Security Setting, Windows might ask you to Confirm or ask for different credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image2.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Opening Device Manager&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A new window called Computer Management will open. On the left, under System tools you will find an option called “Device Manager”. Click on that and on the right hand side you will see all the devices of your computer;  the devices are grouped by different categories as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image3.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;If there is a problem being reported with some device (for whatever reason) then you will see a Yellow warning triangle next to it. For example in the screenshot below you can see the NVIDIA nForce Networking Controller has some issue. On the other hand, if all the devices are operating correctly (or at least that is what Windows thinks) then you won’t see this and would see something similar to the screenshot above.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image4.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Uninstalling the Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Select the device you want to uninstall and right click on it. From the new menu, select the &lt;strong&gt;Uninstall&lt;/strong&gt; option as shown below.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image5.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Removing the Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you choose the Uninstall option (from Step 3), you will get a confirmation screen as shown below. If the driver is corrupt or causing issues, then you check the option which says “Delete the driver software for this device”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING:&lt;/strong&gt; If Windows cannot automatically install your device because you need to either download the drivers from the manufacture’s website or use a CD/etc. then make sure you have this before you choose to Delete the driver software.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image6.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Reboot (Optional)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Windows might not ask you to reboot. But depending on the device it might be a good idea to reboot just to make sure everything is cleaned out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Add back the Device&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you did reboot, next when you start and login, in most cases Windows will automatically find the new device and either install the drivers or ask you for the CD or path where the driver software can be found.&lt;/p&gt;
&lt;p&gt;On the other hand, if you did not reboot or Windows did not detect your device automatically, then you go back to Device Manager (as shown in Steps 1 and 2), right click on the Computer name (this will be the first item in the Device Manager). From the menu choose the “Scan for hardware changes” option – Windows should now find out device.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image7.png&#34; alt=&#34;image&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code commenting made easy</title>
      <link>/post/2011/06/code-commenting-made-easy/</link>
      <pubDate>Sun, 05 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/code-commenting-made-easy/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Solving the iPhone Sync Error - Unknown error occurred (13019)</title>
      <link>/post/2011/06/solving-the-iphone-sync-errorunknown-error-occurred-13019/</link>
      <pubDate>Sun, 05 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/solving-the-iphone-sync-errorunknown-error-occurred-13019/</guid>
      <description>&lt;p&gt;Recently the wife installed the latest iOS update for her iPhone 4 (all 600+ MB of it! And people have the &lt;strong&gt;&lt;em&gt;misconception&lt;/em&gt;&lt;/strong&gt; that Microsoft software is bloated?). After the update, the Sync on the phone was failing with the following error: “The iPhone cannot be synced. An unknown error occurred (13019)” as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;She did have the latest version of iTunes – not that made any difference. Also, restarting iTunes or rebooting the phone and the machine did not help and the error remained the same. After a &lt;a
	
		href = &#34;http://www.google.com/search?q=itunes&amp;#43;10.2&amp;#43;sync&amp;#43;unknown&amp;#43;error&amp;#43;13019&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		quick search online
	&lt;/span&gt;
&lt;/a&gt;, it seems quite a few others have the same problem.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0024.jpg%22&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For her the sync failure was because of the Music (as did most other people with the same issue); but the failure can be in any group (App, Ringtones, etc.) and not necessarily restricted to the Music group. The easiest way to find out the group where the Sync failed is to keep an eye on the Sync status – it will stop in the group wherever it failed and then you will get the above error.&lt;/p&gt;
&lt;p&gt;To fix this error you need to stop syncing the group causing the issues and then re-sync it. Essentially, you reset the sync options for that group. At a high level the steps you need to do are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Stop syncing the group that failed.&lt;/li&gt;
&lt;li&gt;Sync the phone.&lt;/li&gt;
&lt;li&gt;Re-enable syncing for the group from Step 1.&lt;/li&gt;
&lt;li&gt;Sync the phone again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the wife’s case, here are the steps I had to follow to stop the Music from syncing to fix this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Select the Device in iTunes (when it is connected of course).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0026.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; On the right hand side, select group which is failing and uncheck the Sync option. For example, choose Music and uncheck the Sync Music checkbox (circled in red). You need to click the Apply button on the bottom.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image1.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; &lt;strong&gt;Be warned&lt;/strong&gt;, when you uncheck the Sync Music option, iTunes will &lt;strong&gt;&lt;em&gt;delete all the music on your phone&lt;/em&gt;&lt;/strong&gt; as shown in the screenshot below. Of course you should only do this from the computer where you have all your music. If you don’t then you won’t be able to sync your music back again. Click on the “Don’t Sync Music” button.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image0028.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Sync your phone as usual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Reverse of Step 2 – you select the &amp;ldquo;Sync Music” option again and click on Apply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Sync your phone as usual and everything should sync up again as you would expect. Of course this could take some time depending on how many items you have in your group.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows 8 Demo</title>
      <link>/post/2011/06/windows-8-demo/</link>
      <pubDate>Fri, 03 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/06/windows-8-demo/</guid>
      <description>&lt;p&gt;One word - WOW!&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/vsNwHoM7txs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>Recommended WordPress Themes?</title>
      <link>/post/2011/05/recommended-wordpress-themes/</link>
      <pubDate>Sun, 29 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/recommended-wordpress-themes/</guid>
      <description>&lt;p&gt;I am getting bored with the current WordPress theme on the blog and was interested in getting another theme (preferably free), got any recommendations? And nothing from the &lt;a
	
		href = &#34;http://blogmum.com/2008/12/10-ugly-wordpress-themes/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		10 ugliest WordPress themes
	&lt;/span&gt;
&lt;/a&gt; please. :-)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using cached domain (active directory) credentials or not?</title>
      <link>/post/2011/05/using-cached-domain-active-directory-credentials-or-not/</link>
      <pubDate>Fri, 27 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/using-cached-domain-active-directory-credentials-or-not/</guid>
      <description>&lt;p&gt;If you are ever in a situation where you want to find out if you logged into using cached domain credentials (AD) or authenticated against the domain controller then the easiest way is to open Event Viewer and look for the entry where the source is &lt;strong&gt;NETLOGON&lt;/strong&gt; and Event ID &lt;strong&gt;5719&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The description would be something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Log Name:      System  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Source:        NETLOGON  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:          27/05/2011 08:53:17  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Event ID:      5719  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Task Category: None  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Level:         Error  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Keywords:      Classic  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User:          N/A  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Computer:      YOUR-Full-Qualified-Computer-Name  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;This computer was not able to set up a secure session with a domain controller in domain YOUR-DOMAIN-NAME due to the following:  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;There are currently no logon servers available to service the logon request.  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This may lead to authentication problems. Make sure that this computer is connected to the network. If the problem persists, please contact your domain administrator. 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;&lt;/span&gt;ADDITIONAL INFO  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;If this computer is a domain controller for the specified domain, it sets up the secure session to the primary domain controller emulator in the specified domain. Otherwise, this computer sets up the secure session to any domain controller in the specified domain.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is a screenshot (on Win 7) showing a (filtered) view of the same event.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/image.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to create a Mini Dump?</title>
      <link>/post/2011/05/how-to-create-a-mini-dump/</link>
      <pubDate>Thu, 26 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/how-to-create-a-mini-dump/</guid>
      <description>&lt;p&gt;If you ever want to get a Mini Dump of a process (of course for debugging purposes) the easiest way to do so is to use Task Manager (or use &lt;a
	
		href = &#34;http://technet.microsoft.com/en-us/sysinternals/bb896653&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Sys Explorer
	&lt;/span&gt;
&lt;/a&gt;). Just find the process you are interested in, right click and select “Create Dump File” and voila.&lt;/p&gt;
&lt;p&gt;One thing to be careful – make sure you are using the same version of the Task Manager (or Sys Explorer) as the process. For example if your process is x32 (and you are running on a x64 system), then make sure you are using x32 version of Task Manager and not the x64 as that will cause issues.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/Creating-a-mini-dump.jpg&#34; alt=&#34;Creating a mini dump&#34;/&gt;
        &lt;figcaption&gt;Creating a mini dump&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Troubleshooting WCF Performance - Part 1</title>
      <link>/post/2011/05/troubleshooting-wcf-performance-part-1/</link>
      <pubDate>Thu, 26 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/troubleshooting-wcf-performance-part-1/</guid>
      <description>&lt;p&gt;More related details on Dustin&amp;rsquo;s post - &lt;a
	
		href = &#34;http://blogs.msdn.com/b/endpoint/archive/2011/05/04/wcf-scales-up-slowly-with-bursts-of-work.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WCF scales up slowly with bursts of work
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>PowerShell script to kill named processes</title>
      <link>/post/2011/05/powershell-script-to-kill-named-processes/</link>
      <pubDate>Mon, 23 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/powershell-script-to-kill-named-processes/</guid>
      <description>&lt;p&gt;There are times when you need to kill a number of processes in one-go like today when Chrome crashed a few times hanging all the running instances – next time Google says, one tab cannot bring down all of them – send them my way :). For such times, a PowerShell script is all you need.&lt;/p&gt;
&lt;p&gt;I wrote up a simple one which takes the process name as input and then kills all the processes which match that name.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Script is not signed, so need this. Set-ExecutionPolicy Unrestricted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Need to set the param to a variable $target = $args\[0\]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f4dbd6&#34;&gt;$target&lt;/span&gt;) { &lt;span style=&#34;color:#f4dbd6&#34;&gt;$orphanProcs&lt;/span&gt; = &lt;span style=&#34;color:#91d7e3&#34;&gt;get-process&lt;/span&gt; | &lt;span style=&#34;color:#91d7e3&#34;&gt;where &lt;/span&gt;{$\_.&lt;span style=&#34;color:#f5a97f&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;-eq&lt;/span&gt; &lt;span style=&#34;color:#f4dbd6&#34;&gt;$target&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#Check if list is null; if not kill all the procs if ($soonToBeDeadProcs) { #display list $soonToBeDeadProcs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#kill list $soonToBeDeadProcs | foreach { $\_.Kill() } } else { Write-Host &amp;#34;Oops, no processes found older with the name: $target&amp;#34; } } else { Write-Host &amp;#34;Oops, no arguments passed. You need to provide one argument (the Process Name).&amp;#34; Write-Host &amp;#34;Example 1: killproc chrome&amp;#34; Write-Host &amp;#34;Example 2: killproc &amp;#39;some other process&amp;#39;&amp;#34; } \[/sourcecode\]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example Output (Killing Chrome in this case):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PS C:\Users\amit.bahree\Desktop&amp;gt; .\killproc.ps1 chrome&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\-------  ------    -----      ----- -----   ------     -- ----------- 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    139      30    34292      46708   164     3.87    376 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    137      22    20932      33648   149     2.48   1260 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    141      21    17896      31328   148     3.01   3572 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   5434      37    56932      66528   266 1,134.36   4940 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    139      22    20288      33084   150     4.12   5032 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    145      21    16576      31368   149     0.58   5148 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    147      19    14384      26992   150     1.42   5604 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    142      23    32292      37416   156     8.42   6528 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    136      17    12456      23964   142     0.30   6732 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    144      26    27004      39136   156     0.98   6736 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   1586      90   151224     209888   512   395.87   7184 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    138      22    21388      33916   151     3.76   7504 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    123      13     7756      15196   126     0.56   7512 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    142      21    23112      35552   150     2.01   9860 chrome  
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    140      18    13032      25148   150     1.73  10432 chrome&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Hadoop in Azure</title>
      <link>/post/2011/05/hadoop-in-azure/</link>
      <pubDate>Sun, 22 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/hadoop-in-azure/</guid>
      <description>&lt;p&gt;My dear friend &lt;a
	
		href = &#34;http://blogs.msdn.com/b/mariok/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Mario
	&lt;/span&gt;
&lt;/a&gt; has finally got around to blogging and one of his &lt;a
	
		href = &#34;http://blogs.msdn.com/b/mariok/archive/2011/05/11/hadoop-in-azure.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		latest posts shows
	&lt;/span&gt;
&lt;/a&gt;, it is possible to run &lt;a
	
		href = &#34;http://hadoop.apache.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Hadoop
	&lt;/span&gt;
&lt;/a&gt; (which if you are not familiar with, can be thought of as an open source version of Google’s &lt;a
	
		href = &#34;http://labs.google.com/papers/mapreduce.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MapReduce
	&lt;/span&gt;
&lt;/a&gt;) in Azure. You need to setup a typical configuration of nodes (Name Nodes, Tracker and Slaves).&lt;/p&gt;
&lt;p&gt;Sure, there are a number of dependencies some you would expect, others not (e.g. Cygwin – cringe!; but hopefully that will go away with Hadoop 0.22). I wonder what overheard the Cygwin runtime has?&lt;/p&gt;
&lt;p&gt;It would be interesting to know if someone is (or planning) to use this at work.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/2376.71.png&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Tips on Buying a UPS?</title>
      <link>/post/2011/05/tips-on-buying-a-ups/</link>
      <pubDate>Sun, 15 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/tips-on-buying-a-ups/</guid>
      <description>&lt;p&gt;After moving to Bangalore, it turns out that I would need to get one or more UPS&amp;rsquo;s for the machines at home. The place we will be moving to in a few weeks does have power backup, but if/when there is a power cut it takes a few minutes for the generators to kick in and is not instantaneous as I was thinking.&lt;/p&gt;
&lt;p&gt;I have never bought a UPS until now and don&amp;rsquo;t have any experience with it - what are the things that I need to consider? I will have the following equipment running which will need to be powered up for about 15 minutes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 Desktops (including a MCE and WHS)&lt;/li&gt;
&lt;li&gt;Two 17” LCD Monitors&lt;/li&gt;
&lt;li&gt;A set of powered Speakers (optional)&lt;/li&gt;
&lt;li&gt;Few switches&lt;/li&gt;
&lt;li&gt;KVM Switch&lt;/li&gt;
&lt;li&gt;VOIP Phone&lt;/li&gt;
&lt;li&gt;Wireless Router&lt;/li&gt;
&lt;li&gt;DSL Modem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would it make sense to buy a few smaller UPS&amp;rsquo;s instead of one big one? Which is a good one? How much wattage/capacity should I look to get? Can one get second-hand ones - are they recommended? Does the UPS required any maintenance or are they maintenance free these days? :-?&lt;/p&gt;
&lt;p&gt;Of all the machines, the WHS is one of the most critical ones. Is there any UPS&amp;rsquo;s which work well with some Add-Ins? I am interested in WHS shutting down in an orderly fashion so as to save all the data whenever the UPS battery gets low (in case for some reason the generators don&amp;rsquo;t kick in).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How times Change</title>
      <link>/post/2011/05/how-times-change/</link>
      <pubDate>Fri, 13 May 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/05/how-times-change/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/How-times-change-O.jpg&#34; alt=&#34;How times Change&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bug tracking</title>
      <link>/post/2011/04/bug-tracking/</link>
      <pubDate>Sat, 30 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/04/bug-tracking/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/6a00d8341d3df553ef01538de7d961970b-L.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Just the two of us</title>
      <link>/post/2011/04/just-the-two-of-us/</link>
      <pubDate>Sun, 10 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/04/just-the-two-of-us/</guid>
      <description>&lt;p&gt;Read &lt;a
	
		href = &#34;http://www.guardian.co.uk/lifeandstyle/2011/apr/02/matt-logelin-single-father&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this story in the Guardian
	&lt;/span&gt;
&lt;/a&gt; about a guy called &lt;a
	
		href = &#34;http://www.mattlogelin.com/about/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Matt
	&lt;/span&gt;
&lt;/a&gt;, who blogged about bringing up his daughter all alone, as his wife died soon after giving birth. This was such a heart stopping story, which is highly recommended. Interesting shift on the tone of the blog which first helped Matt with the bereavement and later gave him strength to cope with this to finally the blog providing support for others in a similar boat and looking for help.&lt;/p&gt;
&lt;p&gt;If you get teary-eyed then you probably don’t want to read this, but I would recommend the article. Matt has just released a book called &lt;a
	
		href = &#34;http://www.twokissesformaddy.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Two Kisses for Maddy
	&lt;/span&gt;
&lt;/a&gt; as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving</title>
      <link>/post/2011/03/moving/</link>
      <pubDate>Fri, 25 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/moving/</guid>
      <description>&lt;p&gt;In other news of the day … we are going to be moving in the next few weeks to Bangalore. &lt;a
	
		href = &#34;http://www.avanade.com&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Avanade
	&lt;/span&gt;
&lt;/a&gt;, is sending me on a &lt;a
	
		href = &#34;http://dictionary.reference.com/browse/posting&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		posting
	&lt;/span&gt;
&lt;/a&gt;/&lt;a
	
		href = &#34;http://dictionary.reference.com/browse/secondment&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		secondment
	&lt;/span&gt;
&lt;/a&gt; to Bangalore for 18 months to help out with a few things. Of course, the family will be moving as well. After my tenure, the plan is to come back to London.&lt;/p&gt;
&lt;p&gt;So, over the next few days/weeks there is going to be a flurry of activity with us trying to rent our flat, &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2011/03/13/selling-my-car-left-hand-drive-bmw-330i/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		sell the car
	&lt;/span&gt;
&lt;/a&gt;, packing, moving things into storage, figuring out what to feed and drink the muscle (a.k.a friends and family – suckers!) who we managed to rope in to help with the stuff, etc., etc.&lt;/p&gt;
&lt;p&gt;I have been to Bangalore only twice before – each time for a few days on work. Needless to say, it is going to be an interesting experience. There are a few excited people in Bangalore waiting for this – I just hope I can live up the the hype. :)&lt;/p&gt;
&lt;p&gt;And yes, the tickets have been booked and confirmed!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Selling my Car (Left Hand Drive - BMW 330i)</title>
      <link>/post/2011/03/selling-my-car-left-hand-drive-bmw-330i/</link>
      <pubDate>Sun, 13 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/selling-my-car-left-hand-drive-bmw-330i/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Car already sold - thanks for all the interest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Dropping the price we we need to sell the car soon! I am wanting to sell my car and thought I would put it up on my blog first before trying other places.&lt;/p&gt;
&lt;p&gt;It is a Left Hand Drive BMW 330i Automatic (2001 model) with 89K miles in &lt;strong&gt;Excellent&lt;/strong&gt; condition and has both the Sports and Premium packages factory installed.&lt;/p&gt;
&lt;p&gt;We bought it brand new and are the only owners; and have all the paperwork since we bought it originally. This is a personal import (to the UK) and is fully legal in UK, Europe and US (it also meets California emission controls). It has 12 months MOT.&lt;/p&gt;
&lt;p&gt;Here are the specifications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Left Hand Drive BMW 330i (E46), 4 door Saloon&lt;/li&gt;
&lt;li&gt;3 Litre Engine (Petrol), producing 231 PS (170 kW; 228 bhp) and 214 ft lbf (290 N·m)&lt;/li&gt;
&lt;li&gt;Automatic Transmission (Steptronic Gears with a Manual, Sports and Fully Auto mode)&lt;/li&gt;
&lt;li&gt;Black Colour&lt;/li&gt;
&lt;li&gt;Automatic Climate Control Air Conditioning&lt;/li&gt;
&lt;li&gt;CD player with Premier Harman Kardon 8-way speakers&lt;/li&gt;
&lt;li&gt;Heated Door Mirrors&lt;/li&gt;
&lt;li&gt;Xenon Headlights&lt;/li&gt;
&lt;li&gt;All Leather Seats&lt;/li&gt;
&lt;li&gt;ABS and Anti-Skid Traction Control (a.k.a Dynamic Stability Control - DSC)&lt;/li&gt;
&lt;li&gt;Driver and Passenger Side Air Bags&lt;/li&gt;
&lt;li&gt;Multifunctional steering wheel&lt;/li&gt;
&lt;li&gt;Central Locking&lt;/li&gt;
&lt;li&gt;Cruise Control&lt;/li&gt;
&lt;li&gt;Isofix child seat anchor points&lt;/li&gt;
&lt;li&gt;On board computer with trip details, Mileage, Service Indicator, Air Temperature, etc.&lt;/li&gt;
&lt;li&gt;Full Size spare&lt;/li&gt;
&lt;li&gt;Premium Package which includes:
&lt;ul&gt;
&lt;li&gt;A multifunction steering wheel&lt;/li&gt;
&lt;li&gt;Wood grain interior trim&lt;/li&gt;
&lt;li&gt;Rain-sensing windshield wipers&lt;/li&gt;
&lt;li&gt;Auto-dimming rear-view mirror&lt;/li&gt;
&lt;li&gt;Full adjustable Power seats for both Driver and Passenger&lt;/li&gt;
&lt;li&gt;Driver Seat memory&lt;/li&gt;
&lt;li&gt;Power Lumbar Support for both Driver and Passenger&lt;/li&gt;
&lt;li&gt;Moonroof&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sports Package which includes:
&lt;ul&gt;
&lt;li&gt;Three spoke sports leather steering wheel – provides had improved grip over the standard &amp;ldquo;square&amp;rdquo; steering wheel.&lt;/li&gt;
&lt;li&gt;Sport seats – provide better bolstering and support than the stock seats. They also include adjustable thigh supports.&lt;/li&gt;
&lt;li&gt;17 inch wheels with staggered lower profile tires.&lt;/li&gt;
&lt;li&gt;Sport suspension which offered improved handling by way of firmer springs, a lower ride height, and tighter dampers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few photos of the car.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1212718290_KPexb-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212718628_WvU3t-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212718648_HzhHr-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715356_43smR-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715306_LvBvG-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212715805_HgpTE-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716761_EPA6h-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212717574_sGLre-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716249_m8zPi-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716540_nfK7W-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212716950_GBZer-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;
&lt;p&gt;

    &lt;img src=&#34;images/1212717069_2Ad7r-Th.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>New Parenting Blog</title>
      <link>/post/2011/03/new-parenting-blog/</link>
      <pubDate>Sun, 06 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/new-parenting-blog/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://www.geekyparents.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		New Parenting blog
	&lt;/span&gt;
&lt;/a&gt; up and running (finally) – by popular demand. The intention is to keep that completely different from this one. I and the wife will be starting to post there so watch that space. Happy to get other new (geeky) parents (or soon to be parents) contributing if they want to.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is technology making us less human?</title>
      <link>/post/2011/03/is-technology-making-us-less-human/</link>
      <pubDate>Fri, 04 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/is-technology-making-us-less-human/</guid>
      <description>&lt;p&gt;Guardian story &lt;a
	
		href = &#34;http://www.guardian.co.uk/media/2011/jan/22/social-networking-cyber-scepticism-twitter?CMP=twt_gu&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Social networking under fresh attack as tide of cyber-scepticism sweeps US
	&lt;/span&gt;
&lt;/a&gt; where a number of academics have done studies which conclude that Twitter and Facebook don&amp;rsquo;t connect people, but on the contrary they isolate them from &lt;strong&gt;reality&lt;/strong&gt; got me thinking about this and wonder if &lt;strong&gt;Technology is making us less human&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;MIT professor Sherry Turkle&amp;rsquo;s new book &lt;a
	
		href = &#34;http://www.amazon.co.uk/Alone-Together-Sherry-Turkle/dp/0465010210/ref=sr_1_1?ie=UTF8&amp;amp;qid=1295795755&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alone Together
	&lt;/span&gt;
&lt;/a&gt; (which seems interesting and is something I have not had the bandwidth to check out), is leading an attack on the information age. It does seem to agree with the recent articles like &lt;a
	
		href = &#34;http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/6868/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Is Google making us Stupid?
	&lt;/span&gt;
&lt;/a&gt; I don&amp;rsquo;t quite understand Facebook (even though I have been more on it recently); &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/06/is-it-time-to-relook-at-facebook-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my views on Facebook
	&lt;/span&gt;
&lt;/a&gt; are quite well known, especially in the context of &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/02/17/facebook-and-security-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		privacy and security
	&lt;/span&gt;
&lt;/a&gt;. If I talk to a friend who could be in Delhi or San Francisco, I don&amp;rsquo;t feel as connected having a dialogue with him or her over Facebook as I do when talking on the phone, IM or even email. Often people thing just because they have posted something on Facebook, that is the end of it - it almost seems at times, I am too lazy and can&amp;rsquo;t be bothered, so will post a message and get it over with - or as they say in Punjabi - &amp;ldquo;syapa mukao&amp;rdquo;. :)&lt;/p&gt;
&lt;p&gt;In a related note, but a little different context I do think the vast information available to us is making us more stupid and we are forgetting the ability to learn, grasp, understand and appreciate the basics and fundamentals. When something is a quick Bing or Google away it makes us all very complacent. It also means that for us sitting down and reading something which is more than a few paragraphs is getting very difficult. I know I can also see this happening first hand. And I notice it every day at work - especially as the newer and younger generation joins the workforce; things that I would take for granted or appreciate does not seem to be the same. Of course and sites like &lt;a
	
		href = &#34;http://tinyurl.com/68lpc48&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LMBTFY
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://lmgtfy.com/?q=Amit&amp;#43;Bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		LMGTFY
	&lt;/span&gt;
&lt;/a&gt; don&amp;rsquo;t help.&lt;/p&gt;
&lt;p&gt;I was quite stuck by this paragraph from the article &lt;a
	
		href = &#34;http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/6868/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Is Google Making Us Stupid?
	&lt;/span&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The process of adapting to new intellectual technologies is reflected in the changing metaphors we use to explain ourselves to ourselves. When the mechanical clock arrived, people began thinking of their brains as operating “like clockwork.” Today, in the age of software, we have come to think of them as operating “like computers.” But the changes, neuroscience tells us, go much deeper than metaphor. Thanks to our brain’s plasticity, the adaptation occurs also at a biological level.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I think it would be good for me to get a copy of &lt;a
	
		href = &#34;http://www.amazon.co.uk/Alone-Together-Sherry-Turkle/dp/0465010210/ref=sr_1_1?ie=UTF8&amp;amp;qid=1295795755&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Alone Together
	&lt;/span&gt;
&lt;/a&gt; and then maybe post something back (feel free to comment below if you have read the book and got any feedback). Of course I do see the irony in the fact a geek like me talking about possibly to using less Technology.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Twitter Trends</title>
      <link>/post/2011/03/twitter-trends/</link>
      <pubDate>Fri, 04 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/twitter-trends/</guid>
      <description>&lt;p&gt;I was excited to find that Twitter had a &lt;a
	
		href = &#34;http://www.json.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		JSON
	&lt;/span&gt;
&lt;/a&gt; (Javascript Object Notation) endpoint for the &lt;a
	
		href = &#34;http://search.twitter.com/trends/current.json&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		current trending topics
	&lt;/span&gt;
&lt;/a&gt; and decided to write a simple consumer which can read this and then spit it out in a simple console. And JSON being so simple and more or less “universal” meant that there are multiple implementations for .NET. Of course if you got lots of bandwidth you can roll out your own parser.&lt;/p&gt;
&lt;p&gt;I ended up using &lt;a
	
		href = &#34;http://james.newtonking.com/projects/json-net.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Json.NET
	&lt;/span&gt;
&lt;/a&gt;, which in addition to being OpenSource is also one of the most robust utilities which makes working with JSON formatted data dead simple.&lt;/p&gt;
&lt;p&gt;The code for the console app is quite straightforward. The static function ReadTrends() retrieves the JSON string from twitter which is then consumed and extracted. The only tricky part was using a constant key; the easiest way I could think of doing this was to replace the date-time stamp with a literal and then use that literal.&lt;/p&gt;
&lt;p&gt;Of course this will fail if you the function ReadTrends() is called at (or just before midnight) on Dec 31st and the code returns to the main() function in the new year. I don’t think this is something I am going to put in production and am not going to be too worried about this behaviour.&lt;/p&gt;
&lt;p&gt;At the time of writing this, the twitter trends (in JSON) are:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“trends”:{“2011-03-04&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;17:18:01”:[{“name”:”#coisasderetiro”,”events”:null,”query”:”#coisasderetiro”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”#tigerblood”,”events”:null,”query”:”#tigerblood”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”#blackpeoplemovies”,”events”:null,”query”:”#blackpeoplemovies”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Frying&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Nemo”,”events”:null,”query”:”Frying&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Nemo”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Acoustic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Aftermath”,”events”:null,”query”:”Acoustic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Aftermath”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Blade&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Runner”,”events”:null,”query”:”Blade&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Runner”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Fun&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Race”,”events”:null,”query”:”Fun&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Race”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Bandra”,”events”:null,”query”:”Bandra”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Mike&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Huckabee”,”events”:null,”query”:”Mike&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Huckabee”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#ed8796&#34;&gt;“name”:”Arctic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Monkeys”,”events”:null,”query”:”Arctic&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;Monkeys”,”promoted_content”:null&lt;/span&gt;}&lt;span style=&#34;color:#ed8796&#34;&gt;]},”as_of”:&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;1299259081&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here is the output in the console. I can see Charlie Sheen’s &lt;strong&gt;#tigerblood&lt;/strong&gt; is still trending; and wonder what Artic Monkeys are upto – is there new album out or something?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#coisasderetiro&lt;/code&gt;
&lt;code&gt;#tigerblood&lt;/code&gt;
&lt;code&gt;#blackpeoplemovies&lt;/code&gt;
&lt;code&gt;Frying Nemo&lt;/code&gt;
&lt;code&gt;Acoustic Aftermath&lt;/code&gt;
&lt;code&gt;Blade Runner&lt;/code&gt;
&lt;code&gt;Fun Race&lt;/code&gt;
&lt;code&gt;Bandra&lt;/code&gt;
&lt;code&gt;Mike Huckabee&lt;/code&gt;
&lt;code&gt;Arctic Monkeys&lt;/code&gt;
&lt;code&gt;All done.  Press any key to continue...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And finally here is the code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;58&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;59&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;60&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;61&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;62&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;63&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;64&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;65&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;66&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#66&#34;&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;67&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#67&#34;&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;68&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#68&#34;&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Collections.Generic&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Linq&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Text&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;Newtonsoft.Json.Linq&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.Net&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;System.IO&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;TwitterTrends&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;void&lt;/span&gt; Main(&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;[] args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;try&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//get the trends&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; temp = ReadTrends();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//as the key is a datetime stamp (which is constantly moving), need something constant to interrogate.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//simplest way is to find out the year and then take 19 characters from that which is the datetime stamp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//replace that with a literal (DESIGEEK.COM in my case) and then use the literal. I don&amp;#39;t think I will&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//be trending on Twitter; but if you are worried then you can use something like a GUID.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// For example at the time of writing this the datetime stamp was: &amp;#34;2011-03-02 14:20:00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; theDate = temp.Substring(temp.IndexOf(DateTime.Now.Year.ToString()), &lt;span style=&#34;color:#f5a97f&#34;&gt;19&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                temp = temp.Replace(theDate, &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DESIGEEK.COM&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//parse the string for the literal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                JObject trends = JObject.Parse(temp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; twitterTrends = &lt;span style=&#34;color:#c6a0f6&#34;&gt;from&lt;/span&gt; t &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; trends[&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;trends&amp;#34;&lt;/span&gt;][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DESIGEEK.COM&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#c6a0f6&#34;&gt;select&lt;/span&gt; t.Value&amp;lt;&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;&amp;gt;(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//iterate through&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#c6a0f6&#34;&gt;foreach&lt;/span&gt; (&lt;span style=&#34;color:#ed8796&#34;&gt;var&lt;/span&gt; item &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; twitterTrends)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    Console.WriteLine(item);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;catch&lt;/span&gt; (Exception ex)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Console.WriteLine(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Following error occured:\n&amp;#34;&lt;/span&gt; + ex.ToString());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Console.WriteLine(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;\nAll done. Press any key to continue...&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Console.ReadKey();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ed8796&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; ReadTrends()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//talk to twitter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            WebRequest theRequest = HttpWebRequest.Create(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;http://search.twitter.com/trends/current.json&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            HttpWebResponse theResponse = (HttpWebResponse)theRequest.GetResponse();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//extract the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Stream stream = theResponse.GetResponseStream();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            StreamReader reader = &lt;span style=&#34;color:#c6a0f6&#34;&gt;new&lt;/span&gt; StreamReader(stream);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; temp = reader.ReadToEnd();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//clean up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            reader.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            stream.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            theResponse.Close();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading through every version of Windows</title>
      <link>/post/2011/03/upgrading-through-every-version-of-windows/</link>
      <pubDate>Wed, 02 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/03/upgrading-through-every-version-of-windows/</guid>
      <description>&lt;p&gt;Upgrading through *all* versions of Windows from v1 thru to Win7.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What is Gaali?</title>
      <link>/post/2011/02/what-is-gaali/</link>
      <pubDate>Sun, 20 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/what-is-gaali/</guid>
      <description>&lt;p&gt;Krodh k samay mukh se nikle ashleel shabd athwa shabdo ka samuh, jinke uchaaran k pashchaat vyakti k hriday ko shanti ka anubhav hota hai :)&lt;/p&gt;
&lt;p&gt;(Sorry too complicated to translate from Hindi to English)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google maps on Win 7 phone?</title>
      <link>/post/2011/02/google-maps-on-win-7-phone/</link>
      <pubDate>Tue, 15 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/google-maps-on-win-7-phone/</guid>
      <description>&lt;p&gt;So I am not the biggest fan of MS maps and prefer google maps. Any ideas if this is available instead of the default maps on Win 7 phone, and I don&amp;rsquo;t mean the web version :).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Windows Mobile 7 Apps?</title>
      <link>/post/2011/02/windows-mobile-7-apps/</link>
      <pubDate>Mon, 14 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/windows-mobile-7-apps/</guid>
      <description>&lt;p&gt;First post from my brand new Windows Mobile 7 - HTC 7 Pro.&lt;/p&gt;
&lt;p&gt;What free apps do you recommend? :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>BizTalk 2010</title>
      <link>/post/2011/02/biztalk-2010/</link>
      <pubDate>Mon, 07 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/02/biztalk-2010/</guid>
      <description>&lt;p&gt;I was wondering what new features of BizTalk 2010 do you like the most? Also are they any must have tools now? I am interested in the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automated deployment (of interfaces)&lt;/li&gt;
&lt;li&gt;Automated testing (regression and functional where possible)&lt;/li&gt;
&lt;li&gt;Automated configuration management (across various environments – development, various testing, pre-prod and of course prod).&lt;/li&gt;
&lt;li&gt;Coordination with AppFabric?&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Tomatoes</title>
      <link>/post/2011/01/tomatoes/</link>
      <pubDate>Sat, 29 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/tomatoes/</guid>
      <description>&lt;p&gt;A family of tomatoes were walking down the street. The youngest tomato was being silly lagging behind and then unfortunately he was stepped on. The mother tomato turned around and said “ketch-up”&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>More Yo Mama</title>
      <link>/post/2011/01/more-yo-mama/</link>
      <pubDate>Sun, 23 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/more-yo-mama/</guid>
      <description>&lt;p&gt;Yo mama is so stupid that when she locked her keys in the car, it took her all day to get Yo family out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sounds like Facebook</title>
      <link>/post/2011/01/sounds-like-facebook/</link>
      <pubDate>Thu, 20 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/sounds-like-facebook/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1162954737_AMPYN-M.jpg&#34; alt=&#34;Get a Billion&#34;/&gt;
        &lt;figcaption&gt;Get a Billion&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Opensource ZigBee stack?</title>
      <link>/post/2011/01/opensource-zigbee-stack/</link>
      <pubDate>Sun, 16 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/opensource-zigbee-stack/</guid>
      <description>&lt;p&gt;I was planning on getting the &lt;a
	
		href = &#34;http://www.telegesis.com/products/test_page_2.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Telegesis ETRX2USB
	&lt;/span&gt;
&lt;/a&gt; and wanted to know if there are any open source (or shareware) open source ZigBee stacks that I can use with that?&lt;/p&gt;
&lt;p&gt;I also wanted to know if there is any opensource (or not too expensive), network management or network analyser for a ZigBee network? Essentially I want to be able to programatically view network and node information on the ZigBee network (e.g. S/N ratio, signal strength, etc.) - something similar to &lt;a
	
		href = &#34;http://www.ember.com/products_zigbee_development_tools_desktop.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ember&#39;s Insight Desktop
	&lt;/span&gt;
&lt;/a&gt; which &lt;a
	
		href = &#34;http://www.ember.com/products_insight_desktop_pop.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		shows the details
	&lt;/span&gt;
&lt;/a&gt; I am interested in. I could not find anything specific and would be interested in getting ideas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Yo Mama</title>
      <link>/post/2011/01/yo-mama/</link>
      <pubDate>Fri, 14 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/yo-mama/</guid>
      <description>&lt;p&gt;Yo mama is so ugly that when she walks in the kitchen, the rats jump on the table and start screaming.&lt;/p&gt;
&lt;p&gt;Perhaps, I should revive my Yo Mama jokes, no? :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>What Baby App?</title>
      <link>/post/2011/01/what-baby-app/</link>
      <pubDate>Wed, 12 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/what-baby-app/</guid>
      <description>&lt;p&gt;Any suggestions for any a good iPhone App for tracking Baby feeds, sleeping, pumping, etc. that the wife can use?&lt;/p&gt;
&lt;p&gt;Below is a list of what I was able to find online; some of these on reading the reviews seem better than others but no one specifically stood out. Anyone with &lt;em&gt;real world&lt;/em&gt; experience?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.babybrainapp.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Brain
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.umzing.com/baby_tracker.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Tracker
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://peedoodle.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PeeDoodle
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.babybix.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BabyBix
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://itunes.apple.com/us/app/baby-connect-track-log-share/id326574411?mt=8&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Baby Connect
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.andesigned.net/totalbaby.htm&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Total baby
	&lt;/span&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As of now, we are leaning towards Total Baby.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>And then there were three</title>
      <link>/post/2011/01/and-then-there-were-three/</link>
      <pubDate>Mon, 10 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/and-then-there-were-three/</guid>
      <description>&lt;p&gt;Those who don&amp;rsquo;t know, I and Meenakshi are the proud parents if our baby girl who we have named &lt;strong&gt;Maya Bahree&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Maya means illusion (and not money as some have thought).&lt;/p&gt;
&lt;p&gt;She is a keen and eager little thing who despite being a few weeks early is doing extremely well and so is Mum.&lt;/p&gt;
&lt;p&gt;We had to stay back at the hospital until the doctors were satisfied that Maya was doing well. Git back home about 2 data ago.&lt;/p&gt;
&lt;p&gt;I do feel sorry for her, having gotten stuck with two clueless parents who she has to depend on for everything.&lt;/p&gt;
&lt;p&gt;Still learning to deal with the sleepnessless (is that a word?). 😄&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting WordPress Plugins</title>
      <link>/post/2011/01/interesting-wordpress-plugins/</link>
      <pubDate>Tue, 04 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>/post/2011/01/interesting-wordpress-plugins/</guid>
      <description>&lt;p&gt;After upgrading to the latest WordPress (v3.0.4), I also decided to have a look at the various plugins I am running. As part of that I stumbled across &lt;a
	
		href = &#34;http://wphacks.com/wordpress-plugins/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ultimate Collection of WordPress plugins
	&lt;/span&gt;
&lt;/a&gt;which are very interesting. If you run WordPress (and if you don&amp;rsquo;t, why not :)), I would highly recommend to check them out. I already was running some of these and not heard of others which are great.&lt;/p&gt;
&lt;p&gt;Here are some of my favourite ones (in no particular order) and those with keen eyes would notice a few of these already.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; AddToAny: Share/Bookmark/Email Button - Help people share, bookmark, and email your posts &amp;amp; pages using any service, such as Facebook, Twitter, Google Buzz, Digg, etc.&lt;/li&gt;
&lt;li&gt;Akismet - this is for comment spam control and is used by millions! Excellent!&lt;/li&gt;
&lt;li&gt;WP FollowMe - allows you to add a twitter Follow me badge on your wordpress blog.&lt;/li&gt;
&lt;li&gt;Google Analyticator - name says it all I think.&lt;/li&gt;
&lt;li&gt;Google XML Sitemaps - same as above.&lt;/li&gt;
&lt;li&gt;Lightbox 2 - Used to overlay images on the current page.&lt;/li&gt;
&lt;li&gt;My Page Order - allows you to set the order of pages through a drag and drop interface.&lt;/li&gt;
&lt;li&gt;Really Simple CAPTCHA - CAPTCHA module intended to be called from other plugins; really works too!&lt;/li&gt;
&lt;li&gt;Search Everything - Adds search functionality and includes search highlight, search pages, excerpts, attachments, drafts, comments, tags and custom fields (metadata). It can also exclude specific pages and posts. It does not search password-protected content.&lt;/li&gt;
&lt;li&gt;Shockingly Big IE6 Warning - doesn&amp;rsquo;t the name say it all?&lt;/li&gt;
&lt;li&gt;Simple Tags - Excellent plugins, to manage your tags. Includes, suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc&lt;/li&gt;
&lt;li&gt;StatPress Reloaded - real time stats for the blog&lt;/li&gt;
&lt;li&gt;SyntaxHighlighter Evolved - code to your site without having to modify the code at all; you cannot use the Visual editor with this.&lt;/li&gt;
&lt;li&gt;TinyMCE Advanced - Enables advanced features and plugins for the visual editor&lt;/li&gt;
&lt;li&gt;Twitter for Wordpress - displays your last few tweets&lt;/li&gt;
&lt;li&gt;WP-Cumulus - Flash based Tag Cloud for WordPress&lt;/li&gt;
&lt;li&gt;WP-DBManager - Excellent plugin, that manages your Wordpress including optimize database, repair database, backup database, restore database, etc. I use to exclusively for the automatic scheduling of backing up and optimizing of the database.&lt;/li&gt;
&lt;li&gt;WP-SmugMug - I use &lt;a
	
		href = &#34;https://secure.smugmug.com/signup.mg?Coupon=QqwiODpDFZIiY&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SmugMug for my photos online
	&lt;/span&gt;
&lt;/a&gt;; this plugin integrates the &lt;a
	
		href = &#34;https://secure.smugmug.com/signup.mg?Coupon=QqwiODpDFZIiY&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SmugMug galleries
	&lt;/span&gt;
&lt;/a&gt; into the blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I would highly recommend the above and suggest you play with them. &lt;/p&gt;
&lt;p&gt;These plugins I have only recently installed and they seem interesting, but I have not used them enough to have the confidence to highly recommend them - yet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wordpress Backup (by BTE) - Backup the upload directory (images), current theme directory, and plugins directory to a zip file. I have only recently installed this plugin, and not used it enough to say how useful it is at this point.&lt;/li&gt;
&lt;li&gt;Automatic WordPress Backup - Automatically upload backups of important parts of your blog to Amazon S3. I am a huge S3 fan, and this seems very promising. Hopefully I can come back in a few days and weeks and blog about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, when using plugins I would recommend the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search and install from these via the &amp;ldquo;Plugins&amp;rdquo; menu which you see when log into your WordPress dashboard. Don&amp;rsquo;t download the code manually and then try and upload it to your site. That is a more painful process.&lt;/li&gt;
&lt;li&gt;Try and have a test blog running - seperately from your main blog where you can test different permutations and configurations. In case something goes wrong, you won&amp;rsquo;t have your main blog go down. Of course needless to say, you should keep both your test and main blog on the same version.&lt;/li&gt;
&lt;li&gt;It is not a good idea to install all of the plugin&amp;rsquo;s all at the same time as you never never &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/12/25/upgrading-to-wordpress-3-0-3/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		which plugin can cause conflict with another
	&lt;/span&gt;
&lt;/a&gt;. Well, you can install all the plugins at the same time, just activate them one at a time and test that your blog is still running as expected after you have activated each plugin.&lt;/li&gt;
&lt;li&gt;Before you upgrade the version of WordPress - irrespective of how big or small the upgrade is always backup your database and files first. This would allow you to revert back to a &amp;ldquo;clean slate&amp;rdquo; in case something goes wrong.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>C&#43;&#43; Message queuing options?</title>
      <link>/post/2010/12/c-message-queuing-options/</link>
      <pubDate>Wed, 29 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/c-message-queuing-options/</guid>
      <description>&lt;p&gt;I am thinking of implementing a queue in one of the projects I am working on right now (sorry cannot go into more details until it gets published - hopefully in a few months). Anywyas, this is in C++ which needs to run on Ubuntu and my queueing experience (with C++ or otherwise) is only with &lt;a
	
		href = &#34;http://msdn.microsoft.com/en-us/library/ms711472%28VS.85%29.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MSMQ
	&lt;/span&gt;
&lt;/a&gt; which is brilliant, but does not help me here as that run only on Windows. I also cannot use something like &lt;a
	
		href = &#34;http://www.cplusplus.com/reference/stl/queue/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		STL Queue
	&lt;/span&gt;
&lt;/a&gt; as this will need to run across a number of machines and trying to sync between them would a royal pain. In other words, this needs to be distributed and async &amp;ldquo;loose&amp;rdquo; messaging. :-)&lt;/p&gt;
&lt;p&gt;I am already using &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/11/06/moos/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt;, so one option is for me to continue to use that - however this is for another part of the application and it &lt;em&gt;might&lt;/em&gt; be easier for me to use something else (still need to think it through a little more).&lt;/p&gt;
&lt;p&gt;These are the requirements (these are must haves!). Also if it makes a difference I am using &lt;a
	
		href = &#34;http://eclipse.org/cdt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDT
	&lt;/span&gt;
&lt;/a&gt; for this project.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Needs to be able to run on Ubuntu 9.04 (and higher)&lt;/li&gt;
&lt;li&gt;Needs to be Open Source (cannot be commercial)&lt;/li&gt;
&lt;li&gt;Needs to be able to store messages &amp;ldquo;offline&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Needs to be able to run on TCP with minimal dependencies. It would be nice not to have a whole bunch of underlying dependencies.&lt;/li&gt;
&lt;li&gt;Preferably be easy to use (as a consumer) - I don&amp;rsquo;t have much time to read through loads of documentation just to get my head around the underlying object model and how to use it.&lt;/li&gt;
&lt;li&gt;C++ support (if it was not obvious until now)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did a little research online and came across the following, and wanted to get some feedback:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://activemq.apache.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		ActiveMQ
	&lt;/span&gt;
&lt;/a&gt; - seems like it has good C++ support via &lt;a
	
		href = &#34;http://activemq.apache.org/cms/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CMS
	&lt;/span&gt;
&lt;/a&gt; (C++ Messaging Service).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://aws.amazon.com/sqs/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amazon SQS
	&lt;/span&gt;
&lt;/a&gt; -  not sure how good the C++ support is. If there is no library per se that I can use, then writing things around REST APIs might be more painful. Also I suddenly have a dependency to be able to go to the public internet. Also it is not free (though there is a free 100K messages / month).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;Amateurish&#34;
	

	

	&gt;
	
	&lt;span&gt;
		MQ4CPP
	&lt;/span&gt;
&lt;/a&gt; - seems quite amateurish (kudos to the guy writing it though - seems like an interesting project to pick up when once has time).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.rabbitmq.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		RabbitMQ
	&lt;/span&gt;
&lt;/a&gt; - I know some guys used this at work (though that was using it in .NET); nothing for C++, but there &lt;a
	
		href = &#34;http://www.rabbitmq.com/download-ex.html#rabbitmq-c&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		some C experimental code
	&lt;/span&gt;
&lt;/a&gt;; overall does not inspire confidence (in the context of C++).&lt;/li&gt;
&lt;li&gt;OpenAMQ - seems quite interesting and also has a &lt;a
	
		href = &#34;http://www.openamq.org/doc:prog-wireapi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C++ API
	&lt;/span&gt;
&lt;/a&gt; based on its WireAPI.&lt;/li&gt;
&lt;li&gt;Anything else??&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At face value it seems like this is down to ActiveMQ and OpenAMQ. Just looking at the quick samples between the two ActiveMQ seems like more &lt;a
	
		href = &#34;http://activemq.apache.org/cms/example.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		C++ friendly
	&lt;/span&gt;
&lt;/a&gt; and easier to use &lt;a
	
		href = &#34;http://www.openamq.org/doc:prog-wireapi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		compared to OpenAMQ
	&lt;/span&gt;
&lt;/a&gt;. Of course this is just the first impression and I could be completely wrong - it is not like I have had a chance to play with this (yet anyways).&lt;/p&gt;
&lt;p&gt;Does anyone have any experience and feedback on this matter? Feel free to comment on this post, or tweet me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Aubergine with herbs</title>
      <link>/post/2010/12/aubergine-with-herbs/</link>
      <pubDate>Sun, 26 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/aubergine-with-herbs/</guid>
      <description>&lt;p&gt;This is Ottolenghi&amp;rsquo;s recipe as it was &lt;a
	
		href = &#34;http://www.guardian.co.uk/lifeandstyle/2010/oct/23/aubergine-with-herbs-recipe-ottolenghi&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		published in the Guardian
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingredients:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aubergines (about 1.2 kgs)&lt;/li&gt;
&lt;li&gt;Salt (1 teaspoon)&lt;/li&gt;
&lt;li&gt;Freshly ground black pepper (1 pinch)&lt;/li&gt;
&lt;li&gt;Sunflower Oil (120 ml)&lt;/li&gt;
&lt;li&gt;Olive Oil (100 ml)&lt;/li&gt;
&lt;li&gt;Medium-hot Green Chillies (2, thinly sliced)&lt;/li&gt;
&lt;li&gt;Garlic (10 cloves, thinly sliced)&lt;/li&gt;
&lt;li&gt;White-wine Vinegar (1½ tablespoon)&lt;/li&gt;
&lt;li&gt;Basil (20 gm, shredded)&lt;/li&gt;
&lt;li&gt;Coriander (20 gm)&lt;/li&gt;
&lt;li&gt;Mint (20 gm)&lt;/li&gt;
&lt;li&gt;Dill (20 gm)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Steps to cook the aubergines:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Heat the oven to 210C/410F/gas mark 6½.&lt;/li&gt;
&lt;li&gt;Cut the aubergines into roughly 3cm squarish chunks.&lt;/li&gt;
&lt;li&gt;Put in a large mixing bowl and add the salt, some black pepper, sunflower oil and most of the olive oil (save about 3 tbsp for frying the chilli and garlic).&lt;/li&gt;
&lt;li&gt;Toss and spread over two large baking sheets lined with non-stick baking parchment.&lt;/li&gt;
&lt;li&gt;Roast for about 30 minutes – it&amp;rsquo;s important that the aubergines turn a good golden-brown colour.&lt;/li&gt;
&lt;li&gt;Remove from the oven and leave to cool down.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;While the aubergines are cooking:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Heat the reserved olive oil in a small saucepan and fry the chilli and garlic for about a minute, until the garlic turns a pale golden – watch out that you don&amp;rsquo;t cook it further, or it may burn and go bitter.&lt;/li&gt;
&lt;li&gt;Transfer the chilli, garlic and oil to a large mixing bowl and add the cooked aubergine.&lt;/li&gt;
&lt;li&gt;Add the vinegar and herbs, mix, taste and adjust the seasoning as necessary.&lt;/li&gt;
&lt;li&gt;Serve warm or at room temperature.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Changed Themes</title>
      <link>/post/2010/12/changed-themes/</link>
      <pubDate>Sun, 26 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/changed-themes/</guid>
      <description>&lt;p&gt;Was getting a little bored with the previous WP theme  and changed to this one. It does have a lot of defaults in the footer and not had a chance to figure out how to turn it off or customize it. If anyone has any ideas on how to do it then let me know. Also, if you have any suggestions for free and cool WP themes then let me know.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Blast from the Past</title>
      <link>/post/2010/12/blast-from-the-past/</link>
      <pubDate>Sat, 25 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/blast-from-the-past/</guid>
      <description>&lt;p&gt;We were cleaning up the house - sort of like spring cleaning, except in Autumn and in old boxes came across a whole bunch of old stuff, which for me was a blast from the past and each with fond memories. Before I recycled/donated/threw it, took a few photos (click on them to see them in the original size).&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184228_nAPfj-Th.jpg&#34; alt=&#34;Numega debugger&#34;/&gt;
        &lt;figcaption&gt;Compuware, the best debuggers in town.&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184714_Vrtvq-Th.jpg&#34; alt=&#34;Palm Cradle&#34;/&gt;
        &lt;figcaption&gt;Anyone remember a Palm Vx?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136184800_vQ4gP-Th.jpg&#34; alt=&#34;Discmans&amp;#39;&#34;/&gt;
        &lt;figcaption&gt;Don&amp;#39;t miss the Joggable one&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136185749_JfiaP-Th.jpg&#34; alt=&#34;Network Adapters&#34;/&gt;
        &lt;figcaption&gt;3Com PCMCIA adapters&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136186107_hK9sq-Th.jpg&#34; alt=&#34;ATL Server&#34;/&gt;
        &lt;figcaption&gt;ATL Server&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136187301_b3Zuu-Th.jpg&#34; alt=&#34;Netgear Print Server&#34;/&gt;
        &lt;figcaption&gt;Netgear Print Server&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136187648_jmoCw-Th.jpg&#34; alt=&#34;Zip drives&#34;/&gt;
        &lt;figcaption&gt;Zip drives&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136188382_wjwzf-Th.jpg&#34; alt=&#34;More zip drives&#34;/&gt;
        &lt;figcaption&gt;More zip drives&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136189308_ppnZm-Th.jpg&#34; alt=&#34;Nokia phone&#34;/&gt;
        &lt;figcaption&gt;Nokia - do they still make phones?&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/1136191522_EhzYd-Th.jpg&#34; alt=&#34;Dell Axim&#34;/&gt;
        &lt;figcaption&gt;Dell Axim&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgrading to WordPress 3.0.3?</title>
      <link>/post/2010/12/upgrading-to-wordpress-3-0-3/</link>
      <pubDate>Sat, 25 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/upgrading-to-wordpress-3-0-3/</guid>
      <description>&lt;p&gt;The latest version of WordPress 3.0.3 and the Redirection plugin (v 2.2.3) don&amp;rsquo;t play nice together. If you upgraded to the latest version of WordPress the redirection plugin will always show only your last post on your blog&amp;rsquo;s homepage. Until the plugin is fixed, the only way around this is either not to upgrade to the latest version of WordPress (not recommended), or to disable the Redirection plugin.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>SQL Syntax Error (with MySQL)</title>
      <link>/post/2010/12/sql-syntax-error-with-mysql/</link>
      <pubDate>Fri, 24 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/12/sql-syntax-error-with-mysql/</guid>
      <description>&lt;p&gt;Say you are writing a new stored procedure (for MySQL) and when you execute it, you get an error something like shown below - as you probably figured out all it means is that there is a syntax error with in the SQL. Often the error is misleading especially if it is a complicated query. One easy way to help narrow down the issue is to run it in a SQL Console which usually provides a better clue that can be your pointer to fixing the issue.&lt;/p&gt;
&lt;p&gt;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for
the right syntax to use near &amp;lsquo;END&amp;rsquo; at line 17 (errno: 1064). Click &amp;lsquo;Ignore&amp;rsquo; if you&amp;rsquo;d like to have this
error ignored until the end of the script.&lt;/p&gt;
&lt;p&gt;If you run this script you will get the above error:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DELIMITER&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DROP&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;IF&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;EXISTS&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;someSchema&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;sp_someSP&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;CREATE&lt;/span&gt;  &lt;span style=&#34;color:#c6a0f6&#34;&gt;DEFINER&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=`&lt;/span&gt;someUser&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`@`&lt;/span&gt;someServer&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;PROCEDURE&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;someSchema&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt;sp_someSP&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;`&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;in&lt;/span&gt; uavname &lt;span style=&#34;color:#91d7e3&#34;&gt;varchar&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;BEGIN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;SELECT&lt;/span&gt; u.id, i.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, ll.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;, &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;FROM&lt;/span&gt;    uav &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; u,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    imu &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        uav_ll &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; ll,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        gps &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        uav_controller &lt;span style=&#34;color:#c6a0f6&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u.name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; uavname &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; i.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ll.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.uav_id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;DELIMITER&lt;/span&gt; ;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The main issue in my example above was that a delimiter (semi-colon in this case) was missing where the SQL statement finishes i.e. in the last WHERE condition. Here is a snippet of what the updated WHERE clause should look like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;WHERE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    u.name &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; uavname &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; i.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; ll.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;g&lt;/span&gt;.uav_id &lt;span style=&#34;color:#c6a0f6&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        u.id &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;c&lt;/span&gt;.uav_id ; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;-- semicolon added here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;END&lt;/span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;$$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>King and Queen</title>
      <link>/post/2010/11/king-and-queen/</link>
      <pubDate>Fri, 19 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/king-and-queen/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/clip_image002.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Thought of the day</title>
      <link>/post/2010/11/thought-of-the-day-4/</link>
      <pubDate>Wed, 10 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/thought-of-the-day-4/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m so broke even my computer is low on cache.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MOOS</title>
      <link>/post/2010/11/moos/</link>
      <pubDate>Sat, 06 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/moos/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t think many people have heard of &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/Introduction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt; (which stands of Mission Oriented Operating Suite); I have been working with it for the past few months as part of my dissertation. And I must admit, the more I play with it, the more impressed I am. It is quite simple and yet powerful.&lt;/p&gt;
&lt;p&gt;Whilst MOOS&amp;rsquo;s roots are in robotics (&lt;a
	
		href = &#34;http://ori.ox.ac.uk/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MRG
	&lt;/span&gt;
&lt;/a&gt;) and embedded systems, I wonder if I can extend it to use it some of the grid computing scenarios. Maybe implement a pMapReduce or pHadoop? Or perhaps a .NET implementation. Hmm, just need some time. If you need a robust, cross platform communication layer then check out &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/Introduction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cray XMT</title>
      <link>/post/2010/11/cray-xmt/</link>
      <pubDate>Fri, 05 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/11/cray-xmt/</guid>
      <description>&lt;p&gt;As you might have heard, the &lt;a
	
		href = &#34;http://www.cray.com/products/XMT.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cray XMT
	&lt;/span&gt;
&lt;/a&gt; implemented a multithreaded processor architecture (called Threadstorm); these processors are compatible with &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Socket_F&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Socket F
	&lt;/span&gt;
&lt;/a&gt; which means they can use the AMD Opteron CPUs. The interesting part however is that these Threadstorm CPU’s only execute user code and avoids memory dependency stalls i.e. when the &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Memory_dependence_prediction&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		memory dependence prediction
	&lt;/span&gt;
&lt;/a&gt; goes wrong and stalls the specific load to ensure there is no violation.&lt;/p&gt;
&lt;p&gt;The Cray XMT does this by switching among 128 concurrent threads. As the XMT supports more than 8000 CPUs, if one needs to maximize throughput the developer must provide at least 128 threads per CPU, With 8K CPUs you are looking at over 1,024,000 threads! &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-surprisedsmile.png&#34; alt=&#34;Surprised smile&#34;/&gt;

&lt;/p&gt; Needless to say, with such large number of threads, it is extremely important to get thread management implemented correctly – without that the system won’t be able to scale and even deadlock.&lt;/p&gt;
&lt;p&gt;Another factor is the application design specifically the parallel programming models (including the recursive threaded models) and resource management to be able to successfully handle resource exhaustion.&lt;/p&gt;
&lt;p&gt;If this is an area of interest then you should check out the likes of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Openmp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		OpenMP
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Parallel_Extensions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Parallel Extension to .NET 4
	&lt;/span&gt;
&lt;/a&gt; (which include PLINQ and TPL), &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Concurrency_and_Coordination_Runtime&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CCR
	&lt;/span&gt;
&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;Underpinning all of this of course is &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Amdahl%27s_law&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Amdahl’s law
	&lt;/span&gt;
&lt;/a&gt; which one should be comfortable with; including its relation to the law of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Diminishing_returns&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		diminishing returns
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wonder, where I can I get some time on a Cray XMT? I can also settle for a &lt;a
	
		href = &#34;http://www.cray.com/Products/CX/Systems.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Cray CX1
	&lt;/span&gt;
&lt;/a&gt; – anyone willing to donate some money to a poor geek to help with this? &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticon-winkingsmile.png&#34; alt=&#34;Winking smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Impressed with Doxygen</title>
      <link>/post/2010/10/impressed-with-doxygen/</link>
      <pubDate>Sat, 30 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/impressed-with-doxygen/</guid>
      <description>&lt;p&gt;I have recently started using Doxygen in anger and have been quite impressed with it. In addition to the documentation of code that you would expect, one of the most powerful and coolest features is the ability to create various types of diagrams showing various aspects of the application such as collaboration diagrams object and call graphs, etc.&lt;/p&gt;
&lt;p&gt;The easiest way to configure your application  is to use &lt;a
	
		href = &#34;http://www.stack.nl/~dimitri/doxygen/doxywizard_usage.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Doxywizard
	&lt;/span&gt;
&lt;/a&gt;. On Linux, if you do want the object and call graphs then you would need to choose to enable the DOT option. If you do that you will need to have Message Sequence Charts installed (typically found in /usr/bin/mscgen) and also Graphviz. DOT can typically be found in /usr/bin/dot.&lt;/p&gt;
&lt;p&gt;If you are on Windows and use Visual Studio, then there are a few add-ins which will work - with VS.NET &lt;a
	
		href = &#34;http://www.atomineerutils.com/products.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2005, 2008
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://doxygenbrowseraddin.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		2010
	&lt;/span&gt;
&lt;/a&gt;; more details &lt;a
	
		href = &#34;http://doxygenbrowseraddin.codeplex.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a simple example of a collaboration diagram taken from &lt;a
	
		href = &#34;http://www.vtk.org/doc/nightly/html/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		VTK project
	&lt;/span&gt;
&lt;/a&gt;. You can find &lt;a
	
		href = &#34;http://www.stack.nl/~dimitri/doxygen/results.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		more samples
	&lt;/span&gt;
&lt;/a&gt;. When you do browse the code, click on the Classes link - that is where you can see the various diagrams.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/structvtkKdTree_1_1__cellList__coll__graph.png&#34; alt=&#34;Sample Collaboration Diagram&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Proud of the BBC</title>
      <link>/post/2010/10/proud-of-the-bbc/</link>
      <pubDate>Sun, 24 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/proud-of-the-bbc/</guid>
      <description>&lt;p&gt;Brilliant!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to best use TFS?</title>
      <link>/post/2010/10/how-to-best-use-tfs/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/how-to-best-use-tfs/</guid>
      <description>&lt;p&gt;So you have a team (somewhat like mine right now) which is inexperienced with TFS and not very sure about this whole branching, merging, shelveset thinggy and extremely nervous when using it.&lt;/p&gt;
&lt;p&gt;So, what will you do? Well you might try and train them, show them how to use it, write documents showing how to use it, have processes in place, try and use some tools to help, etc.&lt;/p&gt;
&lt;p&gt;But, what do they do? Well this seems to be along the lines &amp;hellip;. &amp;#x1f644;&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/6a00d8341d3df553ef0134885909e0970c-800wi.jpg&#34; alt=&#34;Being a coder - made easy&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>MySQL&#43;&#43;</title>
      <link>/post/2010/10/mysql/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/mysql/</guid>
      <description>&lt;p&gt;I had a need to dump some data I am getting from a real-time sensor network to a database and I choose MySQL - just because it is cheap and cheerful and will fit perfectly with what I am looking for. Now, I have never programmed for MySQL though I have used it in the past as a consumer (e.g. the backend of this blog). MySQL does &lt;a
	
		href = &#34;http://dev.mysql.com/doc/refman/5.0/en/c.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		expose a C API
	&lt;/span&gt;
&lt;/a&gt; that one can use, but it seems quite arcane to use and does not quite conform to the C++ style (especially when using STL).&lt;/p&gt;
&lt;p&gt;It is at that point that I stumbled across &lt;a
	
		href = &#34;http://tangentsoft.net/mysql&amp;#43;&amp;#43;/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MySQL++
	&lt;/span&gt;
&lt;/a&gt; - something I had not heard of and of course not used until now. MySQL++ is just a simple C++ wrapper around the same MySQL C API, but it does follow the C++ STL principles and feels more &amp;rsquo;natural&amp;rsquo; to use. I am still playing with it and getting to know it.&lt;/p&gt;
&lt;p&gt;Below is a quick sample on how to connect to a database and retrieve all the records from a table called &amp;lsquo;stock&amp;rsquo;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;45&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;46&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;47&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;48&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;49&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;50&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;51&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;52&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;53&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;54&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;55&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;56&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;57&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;#34;cmdline.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;#34;printdata.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;mysql++.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;iomanip&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#c6a0f6&#34;&gt;namespace&lt;/span&gt; std;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Get database access parameters from command line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt; db &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;server &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;user &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;pass &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;!&lt;/span&gt;parse_command_line(argc, argv, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;db, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;server, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;user, &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pass)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Connect to the sample database.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;    mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Connection conn(&lt;span style=&#34;color:#91d7e3&#34;&gt;false&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (conn.connect(db, server, user, pass)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Retrieve the sample stock table set up by resetdb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;Query query &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; conn.query(&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;select * from stock&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mysqlpp&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;StoreQueryResult res &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; query.store();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Display results
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;if&lt;/span&gt; (res) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Display header
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;            cout.setf(ios&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;left);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;31&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Item&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Num&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Weight&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Price&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Date&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// Get each row in result set, and print its contents
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt; (size_t i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; res.num_rows(); &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                cout &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;30&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;item&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;num&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;weight&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;price&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        setw(&lt;span style=&#34;color:#f5a97f&#34;&gt;9&lt;/span&gt;) &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; res[i][&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;sdate&amp;#34;&lt;/span&gt;] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            cerr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;Failed to get stock table: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; query.error() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        cerr &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;DB connection failed: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; conn.error() &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Unlock button in Services is greyed out</title>
      <link>/post/2010/10/unlock-button-in-services-is-grayed-out/</link>
      <pubDate>Sat, 23 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/unlock-button-in-services-is-grayed-out/</guid>
      <description>&lt;p&gt;If you are running Ubuntu and want to modify the services running on the OS using the GUI, the way to do this is via System → Administration → Services. This is all very good, but in my case on one machine the Unlock button on the Services window was greyed out. Sure, I could use the shell to modify this, but when this is something I use quite rarely I need to go and look up the exact command and it can get a pain. Plus, that is the whole point of running the GUI? ;-)&lt;/p&gt;
&lt;p&gt;One easy way to solve this is to to modify the &lt;strong&gt;/etc/PolicyKit/PolicyKit.conf file&lt;/strong&gt; and add the following in the end:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;return result=&amp;quot;yes&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You might not have privileges to edit the file and might need to do it as root; you can use the following command for that:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo gedit /etc/PolicyKit/PolicyKit.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Here is the output from my file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!-- -*- XML -*- --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!DOCTYPE pkconfig PUBLIC &amp;#34;-//freedesktop//DTD PolicyKit Configuration 1.0//EN&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;#34;http://hal.freedesktop.org/releases/PolicyKit/1.0/config.dtd&amp;#34;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&amp;lt;!-- See the manual page PolicyKit.conf(5) for file format --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;config&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;user=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;return&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;result=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;define_admin_auth&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;group=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;return&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;result=&lt;/span&gt;&lt;span style=&#34;color:#a6da95&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;&amp;lt;/config&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One word of caution, this will by pass some of the built-in security and allow any logged on user to get access to the services. If you are the only one using your computer in an environment where someone else won&amp;rsquo;t be able to get their hands on it (e.g. at home and not at work or school or college) then you should be OK. But if you are not the sole user of the computer or will be in an environment where others can get their hands on it, then I won&amp;rsquo;t recommend you do this.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Running</title>
      <link>/post/2010/10/running/</link>
      <pubDate>Fri, 22 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/running/</guid>
      <description>&lt;p&gt;Happy that recently my running has been consistent and the weather has been helpful too. Last few days it has turned cold with the temperature down to 4 degrees C. It helps me relax and de-stress and clear my head. &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticonsmile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Below is a screenshot of the workout profile from this week thanks for iMapMyRun free app for my Android Wildfire (which is small and light enough for me to carry in my pocket when on my run). Still need to build more stamina.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/1058602498_QnYnH-O.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Techy Books on Kindle?</title>
      <link>/post/2010/10/techy-books-on-kindle/</link>
      <pubDate>Fri, 22 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/10/techy-books-on-kindle/</guid>
      <description>&lt;p&gt;I was &lt;a
	
		href = &#34;http://twitter.com/bahree/status/27777061639#&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		thinking of getting
	&lt;/span&gt;
&lt;/a&gt; the latest version of the Kindle, but one of the factors in the decision will be the number of techy books available for the Kindle. Anyone owning one has any ideas? Are there far and few or is there a good selection with more being added? I do read novels, but not as many and if there are not enough techy books for the Kindle right now then that might be a deal breaker.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Postings from Android</title>
      <link>/post/2010/09/postings-from-android/</link>
      <pubDate>Fri, 10 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/09/postings-from-android/</guid>
      <description>&lt;p&gt;First post from my brand new Android phone and the Wordpress app. Quite impressed with it so far. I sure do miss the keyboard though.&lt;/p&gt;
&lt;p&gt;Suggestions for any apps? My phone is HTC wildfire and nothing fancy so the apps should be able to run on this phone.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Byte order marks and CRLFs?</title>
      <link>/post/2010/09/byte-order-marks-and-crlfs/</link>
      <pubDate>Thu, 02 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/09/byte-order-marks-and-crlfs/</guid>
      <description>&lt;p&gt;It continues to surprise me that people who write software for a living these days (i.e professional developers) have no understanding of what &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Byte_order_mark&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		byte order marks
	&lt;/span&gt;
&lt;/a&gt; are and how they relate to different encodings. Most developers I interact with have no clue - including of course how &lt;code&gt;EF BB BF&lt;/code&gt; differs from &lt;code&gt;FF FE&lt;/code&gt;. Also so few of them have a understanding of &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Newline&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		linefeeds
	&lt;/span&gt;
&lt;/a&gt; and how that differs from Unix to Windows.&lt;/p&gt;
&lt;p&gt;If this is the trend, then it probably is not a good sign of the times to come.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Boolean logic explained</title>
      <link>/post/2010/08/boolean-logic-explained/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/boolean-logic-explained/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485fd51ab970c-800wi&#34; alt=&#34;Boolean logic explained&#34;/&gt;
        &lt;figcaption&gt;Boolean logic explained&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Project Management – how to test?</title>
      <link>/post/2010/08/project-management-how-to-test/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/project-management-how-to-test/</guid>
      <description>&lt;p&gt;I think many of us can relate to this - including my current project. :roll:&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/6a00d8341d3df553ef01348606d1bb970c-800wi.jpg&#34; alt=&#34;&#34;/&gt;
        &lt;figcaption&gt;Project Management - how to test&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Race Conditions explained</title>
      <link>/post/2010/08/race-conditions-explained/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/race-conditions-explained/</guid>
      <description>&lt;p&gt;Need I say more?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef013485f6be4d970c-800wi&#34; alt=&#34;Race condition explained&#34;/&gt;
        &lt;figcaption&gt;Race condition explained&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Still no sleep</title>
      <link>/post/2010/08/still-no-sleep/</link>
      <pubDate>Sun, 08 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/08/still-no-sleep/</guid>
      <description>&lt;p&gt;Unfortunately (or fortunately), depending on your perspective, this is so me!
&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/still_no_sleep.png&#34; alt=&#34;Still no sleep&#34;/&gt;
        &lt;figcaption&gt;Still no sleep&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iPhone 3.0G and iOS 4</title>
      <link>/post/2010/07/iphone-3-0g-and-ios-4/</link>
      <pubDate>Fri, 30 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/07/iphone-3-0g-and-ios-4/</guid>
      <description>&lt;p&gt;The wife has one of these and can absolutely relate to this! &lt;p&gt;

    &lt;img src=&#34;images/wlEmoticonsmile.png&#34; alt=&#34;Smile&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Microsoft&#39;s Street Slide</title>
      <link>/post/2010/07/microsofts-street-slide/</link>
      <pubDate>Wed, 28 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/07/microsofts-street-slide/</guid>
      <description>&lt;p&gt;This is quite cool – now only if MS hurry’s up and incorporated this to Bing Maps.&lt;/p&gt;
&lt;p&gt;MS Street Slide&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Upgraded to WP 3.0</title>
      <link>/post/2010/06/upgraded-to-wp-3-0/</link>
      <pubDate>Mon, 28 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/upgraded-to-wp-3-0/</guid>
      <description>&lt;p&gt;Just upgraded the blog to WordPress 3.0 - two clicks and I was done - can it get any simpler? What a pleasant surprise compared to the pile of crap that CS 2007+ turned out to be. Try upgrading that in something like two clicks? Ha! Well done WordPress!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #22</title>
      <link>/post/2010/06/interesting-find-22/</link>
      <pubDate>Fri, 25 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/interesting-find-22/</guid>
      <description>&lt;p&gt;Next post in the interesting find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.piriform.com/speccy&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Speccy
	&lt;/span&gt;
&lt;/a&gt; - an advanced and very cool System Information tool for your PC.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.wired.com/wiredscience/2010/03/gallery-rivers/all/1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Channeling Earth
	&lt;/span&gt;
&lt;/a&gt; - Rivers Seen From Space&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://anandtech.com/storage/showdoc.aspx?i=3631&amp;amp;p=1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The SSD Relapse
	&lt;/span&gt;
&lt;/a&gt; - Understanding and Choosing the Best SSD&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.raymond.cc/blog/archives/2008/07/20/how-to-manually-turn-off-notebook-or-laptop-lcd-screen/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Turn off laptop screen
	&lt;/span&gt;
&lt;/a&gt; – every machine does not have an option to switch off the screen (say at night) and this small app is perfect for those situations – very handy at night.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://news.cnet.com/8301-27076_3-20000133-248.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		How to save and share ridiculously large files
	&lt;/span&gt;
&lt;/a&gt; – well the name says it all. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://blogs.msdn.com/psssql/archive/2010/03/24/how-it-works-bob-dorr-s-sql-server-i-o-presentation.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SQL Server I/O Internals
	&lt;/span&gt;
&lt;/a&gt; – if you wanted to know how SQL Server handles I/O then this is a very interesting read.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mssqltips.com/tip.asp?tip=1254&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Clustered Tables vs Heap Tables
	&lt;/span&gt;
&lt;/a&gt; – interesting to understand the comparisons in SQL Server (especially if/when you will be dealing with SQL Azure).&lt;/li&gt;
&lt;li&gt;Cloud Computing footprint – is it time we &lt;a
	
		href = &#34;http://www.guardian.co.uk/environment/2010/apr/30/cloud-computing-carbon-emissions&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		started measuring our digital footprint
	&lt;/span&gt;
&lt;/a&gt; just the same as we have our carbon footprint?&lt;/li&gt;
&lt;li&gt;Zettabytes – Petabytes is so yesterday; &lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2010/may/03/humanity-digital-output-zettabyte&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		hello Zettabytes
	&lt;/span&gt;
&lt;/a&gt;! I wonder how one indexes that?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://lmgtfy.com/?q=amit&amp;#43;bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let me Google that for you
	&lt;/span&gt;
&lt;/a&gt; – perfect for when you get a question from a few lazy people.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.letmebingthatforyou.com/?q=Amit&amp;#43;Bahree&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Let me Bing that for you
	&lt;/span&gt;
&lt;/a&gt; – same as above, except this uses Bing.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.mynitor.com/2010/02/07/15-remote-desktop-solutions-for-linux/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		15 RDP Solutions for Linux
	&lt;/span&gt;
&lt;/a&gt; – good write up comparing the various options you have if you want to RDP to Linux from Windows/Mac.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://ninite.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ninite easy PC Setup
	&lt;/span&gt;
&lt;/a&gt; - Install multiple apps at once without toolbars or clicking Next. Quite handy if you have less-technical friends/family. :)&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>What we have learned ...</title>
      <link>/post/2010/06/what-we-have-learned/</link>
      <pubDate>Mon, 21 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/what-we-have-learned/</guid>
      <description>&lt;p&gt;… the average wife spends nearly 8,000 minutes a year nagging her husband!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Hardware Chart</title>
      <link>/post/2010/06/hardware-chart/</link>
      <pubDate>Sun, 20 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/06/hardware-chart/</guid>
      <description>&lt;p&gt;This computer hardware chart is quite cool. Not sure why, where and who would want to use this. But, it does beg the question – can things get any geekier? :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/907479120_5ZgiCS1.jpg&#34; alt=&#34;&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>invalid use of incomplete type ‘blah&#39;</title>
      <link>/post/2010/04/invalid-use-of-incomplete-type-blah/</link>
      <pubDate>Sun, 18 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/invalid-use-of-incomplete-type-blah/</guid>
      <description>&lt;p&gt;When you try and compile some code and you get an error along the lines of invalid use of an incomplete type &amp;lsquo;whatever type&amp;rsquo; then in most cases it means you need to include the header file where that type is displayed.&lt;/p&gt;
&lt;p&gt;For example I had the following events in my header file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;protected&lt;/span&gt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; mousePressEvent(QGraphicsSceneMouseEvent &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;event);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mouseReleaseEvent&lt;/span&gt;(QGraphicsSceneMouseEvent &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;event);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When when I tried to compile gave the following error: invalid use of incomplete type &lt;code&gt;‘struct QGraphicsSceneMouseEvent’&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This was because the compiler could not find details of the struct and hence the details. To fix the problem I need to include the header.&lt;/p&gt;
&lt;p&gt;This of course is similar to the &lt;a
	
		href = &#34;/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	&gt;
	
	&lt;span&gt;
		initialized but not complete
	&lt;/span&gt;
&lt;/a&gt; error but subtly different.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free eBook on SQL Server 2008 R2</title>
      <link>/post/2010/04/free-ebook-on-sql-server-2008-r2/</link>
      <pubDate>Fri, 16 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/free-ebook-on-sql-server-2008-r2/</guid>
      <description>&lt;p&gt;Microsoft is giving away a free eBook on SQL Server 2008 R2 for free. It gives you insight into exciting new implementations in the DB such as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Complex_event_processing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		complex event processing (CEP)
	&lt;/span&gt;
&lt;/a&gt; and StreamInsight. You can check out the &lt;a
	
		href = &#34;http://blogs.msdn.com/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Table of Contents here
	&lt;/span&gt;
&lt;/a&gt; and download the book in either &lt;a
	
		href = &#34;http://go.microsoft.com/fwlink/?LinkId=189147&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		pdf format
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://go.microsoft.com/fwlink/?LinkId=189148&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		xps format
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pixels</title>
      <link>/post/2010/04/pixels/</link>
      <pubDate>Fri, 09 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/pixels/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://bit.ly/akoZmq&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Pixels
	&lt;/span&gt;
&lt;/a&gt; is Awesome! Any self righteous geek has to check this out. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free (technical) Microsoft Courses</title>
      <link>/post/2010/04/free-technical-microsoft-courses/</link>
      <pubDate>Thu, 08 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/free-technical-microsoft-courses/</guid>
      <description>&lt;p&gt;Channel 9 has a &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		number of free technical courses
	&lt;/span&gt;
&lt;/a&gt; on a number of emerging MS technologies covering a wide range such as &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Azure/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Azure
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Windows7/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Win7
	&lt;/span&gt;
&lt;/a&gt;, Identity, SQL Server 2008 R2, Visual &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/VS2010/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Studio 2010, .NET 4.0
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Silverlight4/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Silverlight 4
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/SharePoint2010Developer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOSS 2010
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://channel9.msdn.com/learn/courses/Office2010/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Office 2010
	&lt;/span&gt;
&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;These cover a number of the features and essentially have everything to get a developer quite comfortable with the stack. In some areas they go a little deep as well. I think its an excellent way to come up to speed.&lt;/p&gt;
&lt;p&gt;Here is a quick example of the topics covered in some of the tracks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Win7 – how to use the Taskbar, Multitouch, Ribbon, Sensors and Location, Session 0 Isolation, etc.&lt;/li&gt;
&lt;li&gt;Azure – Azure Overview, Azure Storage, Deployment, SQL Azure, etc.&lt;/li&gt;
&lt;li&gt;VS 2010 and .NET 4 – F#, ASP.NET 4, Parallel Computing, ALM, etc.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Finding an element in a list</title>
      <link>/post/2010/04/finding-an-element-in-a-list/</link>
      <pubDate>Mon, 05 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/finding-an-element-in-a-list/</guid>
      <description>&lt;p&gt;Often you need to search through an array or list to find a specific element and of course you need this search to be as fast and efficient as possible. One of the best ways to do this is using a binary predicate function.&lt;/p&gt;
&lt;p&gt;A binary function is a function object (which are also called &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Functors&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Functors
	&lt;/span&gt;
&lt;/a&gt;) and is any object which can be called as if it was a function. Depending on your language and platform of choice, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Function_object&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Function objects
	&lt;/span&gt;
&lt;/a&gt; are also known as &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Callback_%28computer_science%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		callback functions
	&lt;/span&gt;
&lt;/a&gt;, &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Function_pointer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		function pointers
	&lt;/span&gt;
&lt;/a&gt; and &lt;a
	
		href = &#34;http://en.wikipedia.org/wiki/Delegate_%28.NET%29&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		delegates
	&lt;/span&gt;
&lt;/a&gt; (.NET). Generally, there are three types of function objects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generators - function with no arguments&lt;/li&gt;
&lt;li&gt;Unary Functions - function with one argument&lt;/li&gt;
&lt;li&gt;Binary Functions - functions with two arguments&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A function object which takes one parameter (i.e. &lt;a
	
		href = &#34;http://www.sgi.com/tech/stl/UnaryFunction.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		unary function
	&lt;/span&gt;
&lt;/a&gt;) and returns a bool are treated as a special case and are  called Predicate functions.&lt;/p&gt;
&lt;p&gt;How do we use it? Say we have a simple data structure called &lt;strong&gt;ContactData&lt;/strong&gt; to represent a Contact in an Address book as shown in the code snippet below. We also define a predicate function called &lt;strong&gt;FindAContact&lt;/strong&gt;. Now we need to use this predicate function and define another function called  findContact. The findContact function in turn uses &lt;a
	
		href = &#34;http://www.sgi.com/tech/stl/find_if.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		find_if
	&lt;/span&gt;
&lt;/a&gt;.  find_if takes three parameters, the start of the iterator, the last element and the predicate to use. It returns the first iterator it finds in a given range for which the predicate holds. If no matches are found then  the last element in the iterator is returned.&lt;/p&gt;
&lt;p&gt;We also need to ensure we have the relevant includes for this to compile and link properly hence include&amp;rsquo;s below.&lt;/p&gt;
&lt;p&gt;The code snippet below shows all that we have discussed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;8&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;9&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;10&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;11&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;12&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;13&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;14&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;15&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;16&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;17&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;18&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;19&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;20&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;21&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;22&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;23&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;24&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;25&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;26&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;27&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;28&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;29&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;30&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;31&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;32&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;33&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;34&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;35&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;36&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;37&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;38&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;39&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;40&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;41&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;42&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;43&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;44&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;vector&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;algorithm&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;#&lt;/span&gt;include &amp;lt;functional&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#f5a97f&#34;&gt;namespace&lt;/span&gt; std;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//Simple data structure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;ContactData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr2;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; addr3;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; city;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; postcode;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; country;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; workPhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; homePhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; mobilePhone;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; workEmail;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; homeEmail;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//I am lazy, create a typedef for the vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;typedef vector&amp;lt;ContactData&amp;gt; ContactDataArray;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;// predicate function for rapidly searching the Contact data array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c6a0f6&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#eed49f&#34;&gt;FindAContact&lt;/span&gt;: &lt;span style=&#34;color:#ed8796&#34;&gt;public&lt;/span&gt; std::binary_function&amp;lt;ContactData, std::&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;operator&lt;/span&gt;() (&lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt; ContactData &amp;amp;contact, &lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; &amp;amp;name) &lt;span style=&#34;color:#ed8796&#34;&gt;const&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; (contact.name == name);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;//If a contact is find it returns that; else returns the iterator&amp;#39;s last element&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ContactData Contact::findContact(&lt;span style=&#34;color:#ed8796&#34;&gt;string&lt;/span&gt; name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ContactDataArray::iterator it = find_if(addressBook.begin(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        addressBook.end(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        std::bind2nd(FindAContact(), name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;return&lt;/span&gt; *it;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Deleting folder on Linux</title>
      <link>/post/2010/04/deleting-folder-on-linux/</link>
      <pubDate>Sun, 04 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/deleting-folder-on-linux/</guid>
      <description>&lt;p&gt;If you are a newbie to Ubuntu like me (or any other Unix distro) and you tried deleting a folder which is not empty contains files or subdirectories then you get the annoying error &lt;code&gt;&amp;quot;Directory not empty&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To delete such a folder (from a terminal) use the &lt;code&gt;rm -rf&lt;/code&gt; command. For example to delete a folder called &lt;code&gt;amitbahree&lt;/code&gt; run the following:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rm -rf amitbahree/&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Speeding Ticket Fail</title>
      <link>/post/2010/04/speeding-ticket-fail/</link>
      <pubDate>Fri, 02 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/04/speeding-ticket-fail/</guid>
      <description>&lt;p&gt;Evolution clearly has been failing us. :roll:&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>History of Gadgets</title>
      <link>/post/2010/03/history-of-gadgets/</link>
      <pubDate>Mon, 29 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/history-of-gadgets/</guid>
      <description>&lt;p&gt;Need I say anything more? :)&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/822691520_UJETEO1_thumb.jpg&#34; alt=&#34;History of Gadgets&#34;/&gt;
        &lt;figcaption&gt;History of Gadgets&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Analysis of Algorithms</title>
      <link>/post/2010/03/analysis-of-algorithms/</link>
      <pubDate>Fri, 26 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/analysis-of-algorithms/</guid>
      <description>&lt;p&gt;If you were interested in algorithms and interested in some mathematical foundations for algorithm analysis? For example if you are interested in proof techniques, probability, Amortization analysis techniques, Case studies and Asymptotic notions (such as Big-Oh, Big-Omega, Little-oh, little-omega, Big-Theta) then check out &lt;a
	
		href = &#34;http://csc.csudh.edu/jhan/Spring2005/csc401/LectureNotes/LectureNotes02.ppt&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		these lecture notes
	&lt;/span&gt;
&lt;/a&gt; (in ppt, 224kb) from California State University.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #21</title>
      <link>/post/2010/03/interesting-find-21/</link>
      <pubDate>Wed, 24 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/interesting-find-21/</guid>
      <description>&lt;p&gt;Next post in the Interesting Find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[InstEd It](InstEd - Make packaging more productive) - an interesting tool that allows one to edit MSI files - handy when you don&amp;rsquo;t want to install the full Windows SDK just to get the Orca editor. (you can also just &lt;a
	
		href = &#34;http://support.microsoft.com/kb/255905&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		download the SDK samples and use that
	&lt;/span&gt;
&lt;/a&gt; instead of the full SDK).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://productivegeek.com/forums/topic/windows-home-server-backup-to-lan&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WHS backup to LAN
	&lt;/span&gt;
&lt;/a&gt; - If for some reason you don&amp;rsquo;t want to use WHS&amp;rsquo;s built-in backup option and prefer to back it up to LAN&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.knowliz.com/2008/12/top-10-beautiful-gdm-login-themes-for.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		10 Beautiful Login screen for Ubuntu
	&lt;/span&gt;
&lt;/a&gt; - very nice themes to change your login screen.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.howtogeek.com/howto/11735/desktop-fun-fast-cars-wallpapers/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Fast Car Wallpapers
	&lt;/span&gt;
&lt;/a&gt; - name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.getpivot.com/download/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Microsoft Pivot
	&lt;/span&gt;
&lt;/a&gt; - Pivot makes it easier to interact with massive amounts of data in ways that are powerful, informative, and fun.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://plantuml.sourceforge.net/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PlantUML
	&lt;/span&gt;
&lt;/a&gt; - UML add-in (jar file) for Eclipse. You cannot draw a diagram, instead you describe it using a &lt;a
	
		href = &#34;http://plantuml.sourceforge.net/sources.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		language
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.papyrusuml.org/scripts/home/publigen/content/templates/show.asp?P=130&amp;amp;L=EN&amp;amp;ITEMID=4&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Papyrus 4 UML
	&lt;/span&gt;
&lt;/a&gt; - another UML add-in (also for Eclipse), which seems to be more professional looking than PlantUML. However this does not support Activity diagrams (yet), which PlantUML does.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.betanews.com/article/PDC-2009-Scuttling-huge-chunks-of-Vista-architecture-for-a-faster-Windows-7/1258443953&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Spinlocks, page frame number locks (and the meaning of life)
	&lt;/span&gt;
&lt;/a&gt; - I don&amp;rsquo;t think any more needs to be said. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.en.fliptext.net/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FlipText.net
	&lt;/span&gt;
&lt;/a&gt; - write upside down (: sıɥʇ ǝʞıl.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.google.com/mobile/goggles/#landmark&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Google Goggles
	&lt;/span&gt;
&lt;/a&gt; - use pictures to search the web.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.haystacknetwork.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Haystack
	&lt;/span&gt;
&lt;/a&gt; - very interesting idea which encrypts your data and then hides it in regular http traffic. Mainly used to help out the citizens of Iran, but useful elsewhere as well.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.bertos.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		BeRTOS
	&lt;/span&gt;
&lt;/a&gt; - a real-time OS hits a major stable milestone.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Forbes rich list</title>
      <link>/post/2010/03/forbes-rich-list/</link>
      <pubDate>Thu, 11 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/forbes-rich-list/</guid>
      <description>&lt;p&gt;Forbes rich list is Slim pickings. Only lack of ability, inheritance and money keeps the rest of us off the Forbes list of world&amp;rsquo;s billionaires. It&amp;rsquo;s not fair?  Here is &lt;a
	
		href = &#34;http://www.guardian.co.uk/commentisfree/cifamerica/2010/mar/11/forbes-rich-lists-carlos-slim-billionaire&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Guardian&#39;s recipe
	&lt;/span&gt;
&lt;/a&gt; for billionaire success: get born into a rich family, invent something and sell it to Americans. Win. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Reboot the cloud</title>
      <link>/post/2010/03/reboot-the-cloud/</link>
      <pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/reboot-the-cloud/</guid>
      <description>&lt;p&gt;New Paradigm, old habits – brilliant. :) Click on the picture to see the original size.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/806141851_h5MhaL1.jpg&#34; alt=&#34;reboot the cloud&#34;/&gt;
        &lt;figcaption&gt;reboot the cloud&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ubuntu on a HTC Touch Pro 2</title>
      <link>/post/2010/03/ubuntu-on-a-htc-touch-pro-2/</link>
      <pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/ubuntu-on-a-htc-touch-pro-2/</guid>
      <description>&lt;p&gt;Well this is the phone I have maybe some day I will try this - pretty geeky albeit useless. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RDP from Ubuntu</title>
      <link>/post/2010/03/rdp-from-ubuntu/</link>
      <pubDate>Sun, 07 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/rdp-from-ubuntu/</guid>
      <description>&lt;p&gt;I did not know until today that there is something called &lt;a
	
		href = &#34;http://sourceforge.net/projects/gnome-rdp/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		gnome-rdp
	&lt;/span&gt;
&lt;/a&gt; using which one can RDP to Windows machines from Ubuntu (or any other linux flavour I imagine). Installation is simple on Ubuntu, with it available in Synaptic Package Manager. To start it you can type in gnome-rdp in a console or go to Applications -&amp;gt; Internet -&amp;gt; Gnome-RDP. Once it has started, usage is quite simple - though you might want to change the remote desktop size and colours. Interestingly this also supports VNC and SSH.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Finding out which version of Ubuntu you are running</title>
      <link>/post/2010/03/finding-out-which-version-of-ubuntu-you-are-running/</link>
      <pubDate>Sat, 06 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/finding-out-which-version-of-ubuntu-you-are-running/</guid>
      <description>&lt;p&gt;If you ever need to find out which version of Ubuntu you are running (if you have a few machines it is quite easy to forget what is running where), the easiest way is to run the following command in a terminal:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cat /etc/issue&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For example here is the output from the machine I am on now:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amit@xps:~$ cat /etc/issue
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ubuntu 9.04 &lt;span style=&#34;color:#8aadf4&#34;&gt;\n&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;\l&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Day traders paradise</title>
      <link>/post/2010/03/day-traders-paradise/</link>
      <pubDate>Mon, 01 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/day-traders-paradise/</guid>
      <description>&lt;p&gt;Wow, &lt;a
	
		href = &#34;http://lifehacker.com/5481921/the-day-traders-paradise&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this is cool
	&lt;/span&gt;
&lt;/a&gt;, though a bit too much. I am not sure how many people use this - if its only one person, isn&amp;rsquo;t that just too much information for one of us to crunch?&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;img src=&#34;images/500x_4387533829_faf5872895_b.jpg&#34; alt=&#34;multi monitor setup&#34;/&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Printing code and making it look pretty</title>
      <link>/post/2010/03/printing-code-and-making-it-look-pretty/</link>
      <pubDate>Mon, 01 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/03/printing-code-and-making-it-look-pretty/</guid>
      <description>&lt;p&gt;If you are on Linux and want to print some code and also make it look pretty then check out &lt;a
	
		href = &#34;http://www.gnu.org/software/a2ps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a2ps
	&lt;/span&gt;
&lt;/a&gt; (Any to postscript filter). Of course if you can avoid printing in the first place and saving paper and trees and make it greener that is ideal - however there are times that is not possible. I tried printing from CDT, but the printing options from CDT just looks plain ugly and big fonts and can spread over 10 pages for a simple code file (spanning 293 lines). Sure I can tweak the font in CDT, but that is the only option available - enter &lt;a
	
		href = &#34;http://www.gnu.org/software/a2ps/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		a2ps
	&lt;/span&gt;
&lt;/a&gt;. It seems to have more options, but I have not had a chance to play with those.&lt;/p&gt;
&lt;p&gt;For example if I wanted a C++ code file called MOOSSniffer.cpp and &amp;ldquo;print it&amp;rdquo; out as PDF then use the command shown below. Here &amp;ldquo;-E&amp;rdquo; is the option to make the code look pretty and the &amp;ldquo;-P pdf&amp;rdquo; is the option for printing to PDF. Next comes the source file (you can also provide multiple files such as *.cpp) and finally the -o option is for the output filename. Of course you will need to install a2ps, which you can do via System -&amp;gt; Admin -&amp;gt; Synaptic Package Manager&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;a2ps -E -P pdf MOOSSniffer.cpp -o MOOSSniffer.pdf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, for some reason the resulting PDF could not be opened in Acrobat Reader, but on my Ubuntu machine, I could open it using the &amp;ldquo;Document Viewer&amp;rdquo; and print it using that. And in case you were curious, the pretty page option came to 3 pages instead of the original 10.&lt;/p&gt;
&lt;p&gt;Also no trees were harmed in the making of this post - my printouts were all to PDF and not real paper - but in the end I did print out the 3 page version. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Getting MOOS linking</title>
      <link>/post/2010/02/getting-moos-linking/</link>
      <pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/getting-moos-linking/</guid>
      <description>&lt;p&gt;I started a brand new project in &lt;a
	
		href = &#34;http://www.eclipse.org/cdt/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		CDT
	&lt;/span&gt;
&lt;/a&gt; where I was using &lt;a
	
		href = &#34;http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		MOOS
	&lt;/span&gt;
&lt;/a&gt; and I could not get my simple program to link. While everything looked fine on the surface I just could not get the IDE to link to the MOOS libraries. I know the OS and MOOS itself was not a problem as I had other projects in the same workspace which did link correctly. The only difference between those and this was that I setup this project from scratch, whilst the others I had not. It took me a while to figure it out, but in the end I had to resort to explicitly add the locations for the libs in the C++ project properties in CDT as shown in the screenshot below.&lt;/p&gt;
&lt;p&gt;To get this this, you right click on the Project name in Project Explorer in CDT. In the C++ Linker section then explicitly add the two paths shown in the screenshot. I of course had MOOS installed in the default location (binaries are in &lt;code&gt;/usr/local/bin&lt;/code&gt; and libraries in &lt;code&gt;/usr/local/lib&lt;/code&gt;). So even if you have added paths to CDT and still getting linking issues, I suggest you add it explicitly to the C++ properties.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/798908371_qHEbx-S.png&#34; alt=&#34;C&amp;#43;&amp;#43; Project properties&#34;/&gt;
        &lt;figcaption&gt;C&amp;#43;&amp;#43; Project properties&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Host files on Ubuntu</title>
      <link>/post/2010/02/host-files-on-ubuntu/</link>
      <pubDate>Sun, 28 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/host-files-on-ubuntu/</guid>
      <description>&lt;p&gt;If you are newish to Linux (like me) from Windows, then some of the simple things which come quite naturally to you on Windows is a little embarrassing and challenging.&lt;/p&gt;
&lt;p&gt;For example, I got a new WHS and wanted to mount the music drive and wanted to create a new host file entry to point to the new WHS. Now on Windows this is quite simple and can be found in &lt;code&gt;YOUR-OS-DRIVE\Windows\system32\drivers\etc\hosts&lt;/code&gt;. But on Linux you will find this in &lt;code&gt;\etc\hosts&lt;/code&gt;. If you want to edit it you will need to type something like this a shell:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo gedit /etc/hosts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; is required as you need admin privileges to modify the file. &lt;code&gt;gedit&lt;/code&gt; is the graphical editor; you can replace that with another editor of your choice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #20</title>
      <link>/post/2010/02/interesting-find-20/</link>
      <pubDate>Thu, 18 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/interesting-find-20/</guid>
      <description>&lt;p&gt;The next post in the interesting find series.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://cwe.mitre.org/top25/#Listing&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Top 25 ‘most dangerous’ programming errors for 2009
	&lt;/span&gt;
&lt;/a&gt; – interesting read as always. :)&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.guardian.co.uk/technology/2009/dec/09/best-websites-internet&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		The 100 essential websites
	&lt;/span&gt;
&lt;/a&gt; – from the Guardian.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://pleaserobme.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Please Rob Me.com
	&lt;/span&gt;
&lt;/a&gt; – the &lt;a
	
		href = &#34;http://news.cnet.com/8301-13577_3-10454981-36.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		dark side of geocoding
	&lt;/span&gt;
&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.tweaktown.com/guides/3116/tweaktown_s_solid_state_drive_optimization_guide/index.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SSD Optimisation guide
	&lt;/span&gt;
&lt;/a&gt; - a must read if anyone is thinking of buying a SSD drive.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://37signals.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		37Signals
	&lt;/span&gt;
&lt;/a&gt; – simple web based apps (instead of bloatware) covering things like managing projects, tracking contacts, organizing your business, etc. (Not free in case you were wondering).&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.ksplice.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Never reboot Linux
	&lt;/span&gt;
&lt;/a&gt; - even when updating the Kernel. When can Windows have this?&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.ocztechnologyforum.com/forum/showthread.php?49779-SSD-Tweak-Utility&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SSD Tweak Utility
	&lt;/span&gt;
&lt;/a&gt; - if you still want to tweak more things after reading the SSD optimisation guide above.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.thycotic.com/fsunit-test-fsharp-with-fsharp&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		FsUnit
	&lt;/span&gt;
&lt;/a&gt; – Test F# with F# - I think the name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://devzing.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		devZing
	&lt;/span&gt;
&lt;/a&gt; - No hassle open source project management hosting (from $10 / month); though I wonder why you can&amp;rsquo;t use google for this.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.jollat.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Jollat
	&lt;/span&gt;
&lt;/a&gt; – a cool GUI for you AWS (Amazon Web Services) which allows you to manage S3 and EC2 on Amazon – runs on Windows, Linux and Mac.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/events/podcasts/default.mspx#PodcastsforITProfessionals&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Podcasts from MS
	&lt;/span&gt;
&lt;/a&gt; – the name says it all.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.cio.com/article/452566/Digging_for_Sensitive_Information_Sites_to_Find_and_Reveal_the_Truth_About_Anyone&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Digging for Sensitive information
	&lt;/span&gt;
&lt;/a&gt; – how to get details on someone you know.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;https://panopticlick.eff.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Panopticlick
	&lt;/span&gt;
&lt;/a&gt; — How unique, and trackable, is your browser? My browser fingerprint appears to be unique among the 641,692 tested so far which is quite scary!&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=79f19684-f862-4e02-a2b0-0003b4565f34&amp;amp;displaylang=en&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		SideShow for Windows Mobile
	&lt;/span&gt;
&lt;/a&gt; Developer Preview – only works with Win7.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://sqlblog.com/blogs/joe_chang/archive/2008/08/17/large-query-performance-from-sql-server-2000-to-2008-32-64-bit.aspx&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Large Query performance stats from SQL 2K to 2K8
	&lt;/span&gt;
&lt;/a&gt; – quite interesting and covers both x32 and x64.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://www.presentationfx.com/art.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		PresentationFx
	&lt;/span&gt;
&lt;/a&gt; – provides free PowerPoint templates and artwork.&lt;/li&gt;
&lt;li&gt;&lt;a
	
		href = &#34;http://chris.pirillo.com/how-to-make-a-cool-windows-vista-screensaver/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Making a cool Vista Screensaver
	&lt;/span&gt;
&lt;/a&gt; – this should also work on Win7 (not tried this btw).&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Facebook and Security again</title>
      <link>/post/2010/02/facebook-and-security-again/</link>
      <pubDate>Wed, 17 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/facebook-and-security-again/</guid>
      <description>&lt;p&gt;Facebook and &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/06/is-it-time-to-relook-at-facebook-again/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		my views of it in the context of Privacy and Security
	&lt;/span&gt;
&lt;/a&gt; are well known. &lt;strong&gt;&lt;a
	
		href = &#34;http://therumpus.net/2010/01/conversations-about-the-internet-5-anonymous-facebook-employee/?full=yes&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		This conversation
	&lt;/span&gt;
&lt;/a&gt;&lt;/strong&gt; with one of their (anonymous) employees detailing a few internal processes and tools is actually quite scary.&lt;/p&gt;
&lt;p&gt;Now, I don’t know if this is true and how much of this is true; but if I was working for Facebook then all of this is quite logical and makes sense. And, technically all the things talked about is very feasible and not too challenging (of course am over simplifying here).&lt;/p&gt;
&lt;p&gt;I do have to admit that the perf and scalability challenges are quite interesting and would love to sink my teeth in it – I guess I need to look at PHP first. :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ten commandments of Programming</title>
      <link>/post/2010/02/ten-commandments-of-programming/</link>
      <pubDate>Wed, 17 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/ten-commandments-of-programming/</guid>
      <description>&lt;p&gt;I came across the &lt;a
	
		href = &#34;http://articles.techrepublic.com.com/5100-10878_11-1045782.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Ten commandments of Programming
	&lt;/span&gt;
&lt;/a&gt; while looking at a &lt;a
	
		href = &#34;http://stackoverflow.com/questions/2281584/how-to-become-a-software-engineer&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		question on StackOverflow
	&lt;/span&gt;
&lt;/a&gt; and I can&amp;rsquo;t believe I have not seen these before. I think every developer, lead, architect, dba, pm, whoever should print this out! 8-)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Understand and accept that you will make mistakes. The point is to find them early, before they make it into production. Fortunately, except for the few of us developing rocket guidance software at JPL, mistakes are rarely fatal in our industry, so we can, and should, learn, laugh, and move on.&lt;/li&gt;
&lt;li&gt;You are not your code. Remember that the entire point of a review is to find problems, and problems will be found. Don&amp;rsquo;t take it personally when one is uncovered.&lt;/li&gt;
&lt;li&gt;No matter how much &amp;ldquo;karate&amp;rdquo; you know, someone else will always know more. Such an individual can teach you some new moves if you ask. Seek and accept input from others, especially when you think it&amp;rsquo;s not needed.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t rewrite code without consultation. There&amp;rsquo;s a fine line between &amp;ldquo;fixing code&amp;rdquo; and &amp;ldquo;rewriting code.&amp;rdquo; Know the difference, and pursue stylistic changes within the framework of a code review, not as a lone enforcer.&lt;/li&gt;
&lt;li&gt;Treat people who know less than you with respect, deference, and patience. Nontechnical people who deal with developers on a regular basis almost universally hold the opinion that we are prima donnas at best and crybabies at worst. Don&amp;rsquo;t reinforce this stereotype with anger and impatience.&lt;/li&gt;
&lt;li&gt;The only constant in the world is change. Be open to it and accept it with a smile. Look at each change to your requirements, platform, or tool as a new challenge, not as some serious inconvenience to be fought.&lt;/li&gt;
&lt;li&gt;The only true authority stems from knowledge, not from position. Knowledge engenders authority, and authority engenders respect—so if you want respect in an egoless environment, cultivate knowledge.&lt;/li&gt;
&lt;li&gt;Fight for what you believe, but gracefully accept defeat. Understand that sometimes your ideas will be overruled. Even if you do turn out to be right, don&amp;rsquo;t take revenge or say, &amp;ldquo;I told you so&amp;rdquo; more than a few times at most, and don&amp;rsquo;t make your dearly departed idea a martyr or rallying cry.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t be &amp;ldquo;the guy in the room.&amp;rdquo; Don&amp;rsquo;t be the guy coding in the dark office emerging only to buy cola. The guy in the room is out of touch, out of sight, and out of control and has no place in an open, collaborative environment.&lt;/li&gt;
&lt;li&gt;Critique code instead of people—be kind to the coder, not to the code.As much as possible, make all of your comments positive and oriented to improving the code. Relate comments to local standards, program specs, increased performance, etc.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    
    <item>
      <title>Windows Phone 7</title>
      <link>/post/2010/02/windows-phone-7/</link>
      <pubDate>Mon, 15 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/windows-phone-7/</guid>
      <description>&lt;p&gt;So you would have heard what all the buzz (not Google!) is about. Check out the feature video for Windows Phone 7. I have a Zune HD and the UI is very similar and I cannot wait for it!&lt;/p&gt;
&lt;p&gt;After a lot of disappointment with WinMo’s and becoming the joke in my friend/nerd/geek/co-worker circle for still have a WinMo phone, would love to see everyone’s faces when I get this. :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I also like the &lt;a
	
		href = &#34;http://www.engadget.com/photos/windows-phone-7-series-interface/#2710479&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		new Office GUI
	&lt;/span&gt;
&lt;/a&gt; – how cool is that?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bing Maps adding Flickr images, live video, stars</title>
      <link>/post/2010/02/bing-maps-adding-flickr-images-live-video-stars/</link>
      <pubDate>Sun, 14 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/bing-maps-adding-flickr-images-live-video-stars/</guid>
      <description>&lt;p&gt;Bing Maps adding Flickr images, live video and stars - very cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The official TED video below is quite cool and in addition to the one above, also adds more interesting features such as video – check it out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Colourful India</title>
      <link>/post/2010/02/colourful-india/</link>
      <pubDate>Sat, 06 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/colourful-india/</guid>
      <description>&lt;p&gt;&lt;a
	
		href = &#34;http://j.mp/8XdRHN&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Awesome photos
	&lt;/span&gt;
&lt;/a&gt; of Colourful India.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Interesting Find #19</title>
      <link>/post/2010/02/interesting-find-19/</link>
      <pubDate>Tue, 02 Feb 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/02/interesting-find-19/</guid>
      <description>&lt;p&gt;Wow it has been a while since I posted an Interesting find and instead of the usual list I though I will keep this especially for timers. Timers Galore!&lt;/p&gt;
&lt;p&gt;So I was looking for a simple countdown timer that I can run on my laptop to keep tracking of a few things and I found a few very interesting things.&lt;/p&gt;
&lt;p&gt;If you prefer to download an app and run it from your desktop (Windows) then check out &lt;a
	
		href = &#34;http://www.orzeszek.org/dev/timer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Timer
	&lt;/span&gt;
&lt;/a&gt; from Orzeszek. There are a few other interesting dev projects there such as &lt;a
	
		href = &#34;http://www.orzeszek.org/dev/transfer/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		transferring large files over http
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If Windows is not your flavour of the day, or you don’t want to (or can’t) install an application and want to use a timer in a browser you can of course use something like &lt;a
	
		href = &#34;http://www.online-stopwatch.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		online stop watch
	&lt;/span&gt;
&lt;/a&gt;, but I suggest you check out &lt;a
	
		href = &#34;http://e.ggtimer.com/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		e.ggtimer.com
	&lt;/span&gt;
&lt;/a&gt; which is way cooler.&lt;/p&gt;
&lt;p&gt;If you are like me and when running meetings or presenting tend to get too excited and run over, then maybe &lt;a
	
		href = &#34;http://nextup.info/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		NextUp
	&lt;/span&gt;
&lt;/a&gt; is the thing for you.&lt;/p&gt;
&lt;p&gt;And if coffee is your not cup of tea (groan! :)) then check out &lt;a
	
		href = &#34;http://steep.it/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Steep.It
	&lt;/span&gt;
&lt;/a&gt; which is claims to be the simplest internet tea timer ever – telling you how long to steep your tea to get your perfect &lt;a
	
		href = &#34;http://www.thefreedictionary.com/cuppa&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		cuppa
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And if you are old school and prefer .ini files (whoa! programs still use that?) then check out &lt;a
	
		href = &#34;http://www.elegantpie.com/eggtimer.html&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		eggtimer
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geeky Joke #1</title>
      <link>/post/2010/01/geeky-joke-1/</link>
      <pubDate>Sun, 31 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/geeky-joke-1/</guid>
      <description>&lt;p&gt;I am going to start posting the geeky jokes I find as a series. These are more for me to make them easy to find, as I cannot seem to recall any of them when I need to. Here is the first one which I also tweeted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Yo mama&amp;rsquo;s so slow and dumb that she can be emulated on a 286.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>Thinking of a new WHS device/machine</title>
      <link>/post/2010/01/thinking-of-a-new-whs-devicemachine/</link>
      <pubDate>Sun, 31 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/thinking-of-a-new-whs-devicemachine/</guid>
      <description>&lt;p&gt;Not sure how many of you know, but I &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/tag/whs/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		run my WHS
	&lt;/span&gt;
&lt;/a&gt; on a old Dell Desktop (its about 8ish years old) which ran out of available USB ports sometime back and all my attached drives are also filling up and I am now running low on space. I was thinking of getting a dedicated WHS device/machine (not sure what to call it), such as &lt;a
	
		href = &#34;http://www.hp.com/go/mediasmartserver&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		HP&#39;s MediaSmart Server
	&lt;/span&gt;
&lt;/a&gt; or &lt;a
	
		href = &#34;http://www.amazon.com/Acer-Aspire-AH340-UA230N-Home-Server/dp/B001WGX15W/ref=sr_1_1?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1243399793&amp;amp;sr=8-1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Acer&#39;s easyStore
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Does anyone know any details of the next version of WHS (based on Win7)? When is it coming out, etc? If it is in a few months then I can hang on and clean up some space and make do. If it is in another year or so then that it too long to wait and I will probably go ahead and look to get something. Any ideas anyone?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; How eerie? Soon after posting this I find (via Twitter) &lt;a
	
		href = &#34;http://blogs.zdnet.com/microsoft/?p=5063&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post from Mary-Jo
	&lt;/span&gt;
&lt;/a&gt; talking about the next version of WHS codenamed &amp;lsquo;Vail&amp;rsquo; is leaked. You can find &lt;a
	
		href = &#34;http://content.zdnet.com/2346-17923_22-388077-1.html?tag=content;col1&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		screen shot here
	&lt;/span&gt;
&lt;/a&gt; and a &lt;a
	
		href = &#34;http://blogs.zdnet.com/igeneration/?p=4025&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		short video here
	&lt;/span&gt;
&lt;/a&gt;. There is no mention of any time-lines though - any ideas?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>CNR</title>
      <link>/post/2010/01/cnr/</link>
      <pubDate>Fri, 29 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/cnr/</guid>
      <description>&lt;p&gt;&lt;p&gt;

    &lt;figure&gt;
        &lt;img src=&#34;images/cnr.png&#34; alt=&#34;CNR&#34;/&gt;
        &lt;figcaption&gt;CNR&lt;/figcaption&gt;
    &lt;/figure&gt;

&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a
	
		href = &#34;http://xkcd.com/583/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		via xkcd.com
	&lt;/span&gt;
&lt;/a&gt;]&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Win 3.1 experience in your browser</title>
      <link>/post/2010/01/win-3-1-experience-in-your-browser/</link>
      <pubDate>Sun, 24 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/win-3-1-experience-in-your-browser/</guid>
      <description>&lt;p&gt;If you ever wanted a Win 3.1 experience in your broswer (why I cannot imagine - &lt;a
	
		href = &#34;http://twitter.com/bahree/status/7382993225&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		despite me running a VM
	&lt;/span&gt;
&lt;/a&gt;), then check out &lt;a
	
		href = &#34;http://www.michaelv.org/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		michaelv.org
	&lt;/span&gt;
&lt;/a&gt;. The irony of all of this is that there is a modern browser in that which seems to be compliant with the standards (it pases the ACID2 tests; fails the ACID3). 🤨&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Copying strings in C&#43;&#43;</title>
      <link>/post/2010/01/copying-strings-in-cpp/</link>
      <pubDate>Sat, 23 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/copying-strings-in-cpp/</guid>
      <description>&lt;p&gt;Here is a good example on why either you love C++ or hate it with such terse expression oriented code; I think its pretty cool.&lt;/p&gt;
&lt;p&gt;If you want to copy one string to another, one option can be something like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mycopy&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; len &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; strlen(q);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;for&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;int&lt;/span&gt; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f5a97f&#34;&gt;0&lt;/span&gt;; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;lt;&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt;len; i&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        p[i] &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; q[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;However this achieves the same thing as above and is more efficient:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ed8796&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#8aadf4&#34;&gt;mycopy&lt;/span&gt;(&lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p, &lt;span style=&#34;color:#ed8796&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c6a0f6&#34;&gt;while&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;p&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;*&lt;/span&gt;q&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;++&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Of course why would you write your own version when you have standard string copy fundtion &lt;a
	
		href = &#34;http://www.cplusplus.com/reference/clibrary/cstring/strcpy/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		strcpy
	&lt;/span&gt;
&lt;/a&gt; in &lt;code&gt;&amp;lt;string.h&amp;gt;&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Geek moment of the day</title>
      <link>/post/2010/01/geek-moment-of-the-day/</link>
      <pubDate>Fri, 15 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/geek-moment-of-the-day/</guid>
      <description>&lt;p&gt;(: ¿ɥǝ sıɥʇ sı looɔ ʍoɥ&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Qt Eclipse Integration</title>
      <link>/post/2010/01/qt-eclipse-integration/</link>
      <pubDate>Wed, 13 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/qt-eclipse-integration/</guid>
      <description>&lt;p&gt;If you are working in CDT and Qt then the &lt;a
	
		href = &#34;http://qt.nokia.com/developer/eclipse-integration&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		Qt Eclipse Integration
	&lt;/span&gt;
&lt;/a&gt; is quite handy and in my opinion much better than using the standalone Qt designer. Installation is pretty straight forward as &lt;a
	
		href = &#34;http://qt.nokia.com/developer/eclipse-integration/installation-instructions-for-linux-systems&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		described here
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A Song of Silicon Valley</title>
      <link>/post/2010/01/a-song-of-silicon-valley/</link>
      <pubDate>Mon, 11 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/a-song-of-silicon-valley/</guid>
      <description>&lt;p&gt;Ah, this brings back fond memories of my time in the valley – awesome! :)&lt;/p&gt;
&lt;p&gt;Credit goes to &lt;a
	
		href = &#34;http://bits.blogs.nytimes.com/2010/01/11/a-song-of-silicon-valley/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		this post
	&lt;/span&gt;
&lt;/a&gt; of the NY Times.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>‘QPainter painter’ has initialiser but incomplete type</title>
      <link>/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/qpainter-painter-has-initialiser-but-incomplete-type/</guid>
      <description>&lt;p&gt;If you ever got an error something like [some-class] has initialiser but incomplete type, it basically means the compiler cannot understand the type and you need to add the include for it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPixmap &lt;span style=&#34;color:#8aadf4&#34;&gt;pixmap&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pixmap.fill(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;white);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPainter &lt;span style=&#34;color:#8aadf4&#34;&gt;painter&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pixmap);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPen &lt;span style=&#34;color:#8aadf4&#34;&gt;pen&lt;/span&gt;(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;blue);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Take the code snipped above when you compile it you might get an error something along the lines of the following for line 4.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;‘QPainter painter’ has initialiser but incomplete type&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To fix this you need to include the header file where QPainter is defined. The updated code looks like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;1&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;2&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;3&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;4&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;5&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;6&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2&#34; id=&#34;7&#34;&gt;&lt;a style=&#34;outline:none;text-decoration:none;color:inherit&#34; href=&#34;#7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#6e738d;font-weight:bold;font-style:italic&#34;&gt;&amp;lt;qpainter.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6e738d;font-style:italic&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPixmap &lt;span style=&#34;color:#8aadf4&#34;&gt;pixmap&lt;/span&gt;(&lt;span style=&#34;color:#f5a97f&#34;&gt;20&lt;/span&gt;,&lt;span style=&#34;color:#f5a97f&#34;&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pixmap.fill(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;white);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPainter &lt;span style=&#34;color:#8aadf4&#34;&gt;painter&lt;/span&gt;(&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;pixmap);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QPen &lt;span style=&#34;color:#8aadf4&#34;&gt;pen&lt;/span&gt;(Qt&lt;span style=&#34;color:#91d7e3;font-weight:bold&#34;&gt;::&lt;/span&gt;blue);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Permalinks don&#39;t support quotes?</title>
      <link>/post/2010/01/permalinks-dont-support-quotes/</link>
      <pubDate>Sun, 10 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/permalinks-dont-support-quotes/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know if this is a feature or a bug or a configuration issue either with WordPress itself or how the web server is configured where this blog is hosted. I just posted something about &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/10/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		compiler errors
	&lt;/span&gt;
&lt;/a&gt; where the permalink had a single quotes in its title like :  &lt;strong&gt;&amp;lsquo;qpainter-painter&amp;rsquo;-has-initialiser-but-incomplete-type&lt;/strong&gt;. While this was handled fine by WordPress (I could successfully preview the post as well), once it was published I got the generic 500 Internal Server Error as shown below. So the question is what is wrong (if anything)? What is the expected behaviour? The only way for me to fix it was by removing the single quote in the permalinks as now you can see in &lt;a
	
		href = &#34;http://desigeek.com/blog/amit/2010/01/10/qpainter-painter-has-initialiser-but-incomplete-type/&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		the post
	&lt;/span&gt;
&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&#34;internal-server-error&#34;&gt;Internal Server Error&lt;/h2&gt;
&lt;p&gt;The server encountered an internal error or misconfiguration and was unable to complete your request.&lt;/p&gt;
&lt;p&gt;Please contact the server administrator, [email-address-removed] and inform them of the time the error occurred, and anything you might have done that may have caused the error.&lt;/p&gt;
&lt;p&gt;More information about this error may be available in the server error log.&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>WordPress ping list</title>
      <link>/post/2010/01/wordpress-ping-list/</link>
      <pubDate>Thu, 07 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/wordpress-ping-list/</guid>
      <description>&lt;p&gt;I updated the ping list for the blog based on the &lt;a
	
		href = &#34;http://www.prelovac.com/vladimir/wordpress-ping-list&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		suggestions from Vladimir
	&lt;/span&gt;
&lt;/a&gt; which I found via &lt;a
	
		href = &#34;http://codex.wordpress.org/Update_Services&#34;
	

	

	
		target = &#34;_blank&#34;
		rel = &#34;nofollow noopener noreferrer&#34;
		&gt;
	
	&lt;span&gt;
		WordPress&#39;s documentation site
	&lt;/span&gt;
&lt;/a&gt;. Not sure if it is of any help or not, but I guess I will find out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Is it time to relook at Facebook again?</title>
      <link>/post/2010/01/is-it-time-to-relook-at-facebook-again/</link>
      <pubDate>Wed, 06 Jan 2010 00:00:00 +0000</pubDate>
      
      <guid>/post/2010/01/is-it-time-to-relook-at-facebook-again/</guid>
      <description>&lt;p&gt;I still don’t get Facebook – despite being on it. If I want to talk to someone I will call them, email them, text them, meet them, have dinner with them - get the picture?&lt;/p&gt;
&lt;p&gt;I am quite worried about the security and privacy elements of it – or rather the lack of it. Those who know me well (anyone?) :-) know I was not always this pa