<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CyberSec, Network, Cloud &amp; ML/AI, blended!</title>
    <description>Cyber Security, Cloud &amp; AI Engineering expert &amp; Keynote Speaker, specializing in DevSecOps, Kubernetes, Cloud Architecture, Aritifical Inteligence and Network Security. Sharing insights on cybersecurity, cloud native technologies,  and modern infrastructure solutions.</description>
    <link>https://abdes.net/</link>
    <atom:link href="https://abdes.net/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 16 Aug 2026 16:19:37 +0000</pubDate>
    <lastBuildDate>Sun, 16 Aug 2026 16:19:37 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>

    
      <item>
        <title>TLS 1.3 ECH (draft-ietf-tls-esni-22) !</title>
        <description>
</description>
        <pubDate>Tue, 21 Jan 2025 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/tls-1-3-ech-animation/</link>
        <guid isPermaLink="true">https://abdes.net/blog/tls-1-3-ech-animation/</guid>
      </item>
    
      <item>
        <title>TLS 1.3 (RFC 8446) in motion!</title>
        <description>
</description>
        <pubDate>Tue, 21 Jan 2025 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/tls-1-3-interactive-animation/</link>
        <guid isPermaLink="true">https://abdes.net/blog/tls-1-3-interactive-animation/</guid>
      </item>
    
      <item>
        <title>IPSEC (IKEv2 RFC 7296) in motion!</title>
        <description>
</description>
        <pubDate>Tue, 21 Jan 2025 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/ikev2-interactive-animation/</link>
        <guid isPermaLink="true">https://abdes.net/blog/ikev2-interactive-animation/</guid>
      </item>
    
      <item>
        <title>OpenSource LLM? Really? (DeepSeek R1 example)</title>
        <description>&lt;div style=&quot;text-align: center;&quot;&gt;
  &lt;img src=&quot;/assets/img/trainingmodel.png&quot; alt=&quot;traditional model building&quot; class=&quot;img-fluid&quot; /&gt;
  &lt;p style=&quot;font-weight: bold; font-size: 1.5em; padding: 5px; display: inline-block;&quot;&gt;traditional model building process&lt;/p&gt;
&lt;/div&gt;

&lt;h1 id=&quot;open-source-llm-really-deepseek-r1-example&quot;&gt;Open Source LLM? Really? (DeepSeek R1 Example)&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Simplified Edition&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;open-source-vs-non-open-source-llms-clearing-up-the-confusion&quot;&gt;Open Source vs. Non-Open Source LLMs: Clearing Up the Confusion&lt;/h2&gt;

&lt;p&gt;The release of &lt;strong&gt;DeepSeek R1&lt;/strong&gt; sparked excitement across the tech world. Some have called it “open source,” but the term can mean different things when it comes to Large Language Models (LLMs). Below, we break down what “open source” typically means in software, and how it looks a bit different in the LLM world.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;1-traditional-open-source-vs-open-llms&quot;&gt;1. Traditional Open Source vs. “Open” LLMs&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In traditional open source software:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The &lt;em&gt;source code&lt;/em&gt; is publicly available for viewing, modifying, and distributing.&lt;/li&gt;
  &lt;li&gt;You can also see how it’s compiled and what dependencies it uses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For “open source” LLMs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Their &lt;em&gt;trained weights&lt;/em&gt; might be publicly shared under a license that allows you to download, run, or fine-tune the model.&lt;/li&gt;
  &lt;li&gt;However, the &lt;em&gt;training data&lt;/em&gt; and training scripts are often kept private.&lt;/li&gt;
  &lt;li&gt;Without that information, you can’t fully recreate or retrain the model from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;2-why-having-just-the-weights-isnt-enough&quot;&gt;2. Why Having Just the Weights Isn’t Enough&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Proprietary or Private Datasets&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;LLMs usually learn from massive datasets that might not be available publicly (due to licensing or NDAs).&lt;/li&gt;
      &lt;li&gt;Simply having the final weights doesn’t reveal which data the model was trained on.&lt;/li&gt;
      &lt;li&gt;This makes replicating or altering the original training process very difficult.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Training Software and Scripts&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Organizations sometimes share only parts of the code used for training.&lt;/li&gt;
      &lt;li&gt;The complete “recipe” (including special configs, distributed-training techniques, or hyperparameters) might be missing.&lt;/li&gt;
      &lt;li&gt;Without those, recreating results is nearly impossible.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Infrastructure Requirements&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Modern LLMs need powerful (and expensive) GPU clusters or specialized hardware to train.&lt;/li&gt;
      &lt;li&gt;Even if you have the same data and code, you might not have the multi-million-dollar compute setup.&lt;/li&gt;
      &lt;li&gt;This creates a major practical barrier for reproducing “open” models.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basically, we are missing  here 1 , 2 and 3 on the pictures , including the smart ML / DS engineers haha.&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;
  &lt;img src=&quot;/assets/img/trainingmodel.png&quot; alt=&quot;traditional model building&quot; class=&quot;img-fluid&quot; /&gt;
  &lt;p style=&quot;font-weight: bold; font-size: 1.5em; padding: 5px; display: inline-block;&quot;&gt;traditional model building process&lt;/p&gt;
&lt;/div&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;3-the-deepseek-r1-release-and-the-open-hype&quot;&gt;3. The DeepSeek R1 Release and the “Open” Hype&lt;/h3&gt;

&lt;p&gt;DeepSeek R1 launched with lots of buzz and was labeled by some as an open-source LLM. In reality:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;strong&gt;weights&lt;/strong&gt; were shared under a permissive license.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;training data&lt;/strong&gt; is either under NDA or proprietary.&lt;/li&gt;
  &lt;li&gt;The &lt;strong&gt;training details&lt;/strong&gt; (like hyperparameters, custom code) remain undisclosed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, you can download and fine-tune DeepSeek R1. But you can’t fully recreate its training or verify the exact steps that produced those weights. So it’s more accurate to call DeepSeek R1 a “model with openly available weights” rather than a completely open source project.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;4-implications-for-the-llm-community&quot;&gt;4. Implications for the LLM Community&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Innovation and Transparency&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Released weights help developers build apps or fine-tune for their own needs.&lt;/li&gt;
      &lt;li&gt;But hidden data selection or cleaning processes mean unseen biases might remain.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reproducibility&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;True open source in machine learning would let others retrain and get similar results.&lt;/li&gt;
      &lt;li&gt;Without full data, code, and environment details, that’s virtually impossible.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Commercial vs. Community&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Companies may share parts of their model for community use or research while keeping key components private.&lt;/li&gt;
      &lt;li&gt;Some academic/nonprofit labs aim for full transparency but usually face funding limits for large-scale training.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;5-how-to-build-and-share-llms-more-transparently&quot;&gt;5. How to Build (and Share) LLMs More Transparently&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Provide &lt;em&gt;All&lt;/em&gt; Training Artifacts&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Share data sources (where possible), data preprocessing steps, and licensing details.&lt;/li&gt;
      &lt;li&gt;Release the training scripts, hyperparameters, and environment configurations.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Document the Infrastructure&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Clearly describe the hardware setup, memory usage, and any unique system configurations.&lt;/li&gt;
      &lt;li&gt;While it won’t solve cost issues, it at least helps others understand your approach.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use Clear Licensing&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;If it’s truly open source, use recognized licenses (e.g., Apache 2.0, MIT) that grant reuse and distribution rights.&lt;/li&gt;
      &lt;li&gt;If there are restrictions (like research-only), be explicit.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Encourage Community Contributions&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Permit users to view and modify training code.&lt;/li&gt;
      &lt;li&gt;Offer discussion platforms (forums, GitHub issues) where people can give feedback or suggest improvements.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;6-conclusion&quot;&gt;6. Conclusion&lt;/h3&gt;

&lt;p&gt;Simply being able to download and run LLM weights doesn’t make a model “fully open source.” True openness involves sharing everything—training data, code, infrastructure details—so anyone can replicate or deeply modify the model.&lt;/p&gt;

&lt;p&gt;DeepSeek R1’s release is exciting, but we need to be clear on what “open” really means. By setting the right expectations, we keep AI research honest, transparent, and collaborative.&lt;/p&gt;
</description>
        <pubDate>Wed, 15 Jan 2025 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/deepseek-opensource-or-not</link>
        <guid isPermaLink="true">https://abdes.net/blog/deepseek-opensource-or-not</guid>
      </item>
    
      <item>
        <title>Workshops for INWI &amp; Orange telcos in Morocco</title>
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Great Workshops for INWI &amp;amp; Orange telcos in Morocco&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I’m happy to share about the amazing workshops we recently held in Morocco. My amazing colleague Kim Frellsen joined me as we met with teams from INWI and Orange, along with our  great local Fortinet team. Together, we explored some really exciting developments in technology and security.&lt;/p&gt;

&lt;h2 id=&quot;5g-security-building-a-safer-future&quot;&gt;5G Security: Building a Safer Future&lt;/h2&gt;

&lt;p&gt;5G is changing everything in telecom, and that means we need to think differently about security. Kim kicked things off by sharing some really important points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What makes 5G networks more vulnerable to attacks and why we need to pay attention&lt;/li&gt;
  &lt;li&gt;Smart ways to keep 5G infrastructure safe and prevent security problems&lt;/li&gt;
  &lt;li&gt;How Fortinet’s security tools can help protect these modern networks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;deep-packet-inspection-dpi-insights-into-network-traffic&quot;&gt;Deep Packet Inspection (DPI): Insights into Network Traffic&lt;/h2&gt;

&lt;p&gt;I got to dive deep into the latest TLS developments and the challenges telecom operators face with DPI. If you’re curious about these challenges, check out our webfiltering writeup or the TLS ECH animation.&lt;/p&gt;

&lt;p&gt;(Note: Some details about our DPI solution are Fortinet proprietary, so I can’t share everything here.)&lt;/p&gt;

&lt;h2 id=&quot;quantum-computing-and-cryptography-preparing-for-the-next-era&quot;&gt;Quantum Computing and Cryptography: Preparing for the Next Era&lt;/h2&gt;

&lt;p&gt;Quantum computing is going to change cybersecurity in big ways. We talked about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Where quantum computing is now and where it’s heading&lt;/li&gt;
  &lt;li&gt;How it might affect our current encryption methods&lt;/li&gt;
  &lt;li&gt;Ways we can prepare by using quantum-resistant encryption&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fortinet-a-trusted-partner-in-security&quot;&gt;Fortinet: A Trusted Partner in Security&lt;/h2&gt;

&lt;p&gt;Throughout our sessions, we showed how Fortinet can help:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Creating security solutions specifically for telecom companies&lt;/li&gt;
  &lt;li&gt;Sharing real examples of our technology making a difference&lt;/li&gt;
  &lt;li&gt;Showing how we’re ready to tackle new challenges in 5G, DPI, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;working-together-for-the-future&quot;&gt;Working Together for the Future&lt;/h2&gt;

&lt;p&gt;These workshops were about more than just sharing information - they were about working together to build something better. By talking directly with the people running these networks, we could help Moroccan telecom operators prepare for what’s coming next in our digital world. It was great to share ideas and think about solutions together.&lt;/p&gt;

&lt;p&gt;Thank you to everyone who helped make these workshops so successful, especially Youness Fikhar our main local SE in the telco market, Youssef Fouzi our great Morocco country manager, Mohammed El Kadiri, and all local Fortinet team.&lt;/p&gt;

&lt;p&gt;Looking forward to our next collaboration!&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Dec 2024 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/telcos-workshop-Inwi-and-Orange-morocco-2024/</link>
        <guid isPermaLink="true">https://abdes.net/blog/telcos-workshop-Inwi-and-Orange-morocco-2024/</guid>
      </item>
    
      <item>
        <title>Global Big Data Digital Transformation, Nov 2024, Amsterdam</title>
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Event Recap: Big Data Digital Transformation Nov 2024, Amsterdam, The Netherlands &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I’m thrilled to share that I recently had the opportunity to host an engaging workshop in Amsterdam, exploring the transformative power of Big Data, Machine Learning, and the latest applications of emerging technologies.&lt;/p&gt;

&lt;p&gt;From discussing the evolution of Big Data technologies like Apache Spark and Kafka to diving into real-world Machine Learning applications in predictive analytics and anomaly detection, we explored how these innovations are shaping industries like telecommunications, retail, and energy optimization.&lt;/p&gt;

&lt;p&gt;A big takeaway? The future of technology is not just in the tools we develop, but in how we use them to transform lives and industries.&lt;/p&gt;

</description>
        <pubDate>Fri, 22 Nov 2024 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/Big-data-nov-2024/</link>
        <guid isPermaLink="true">https://abdes.net/blog/Big-data-nov-2024/</guid>
      </item>
    
      <item>
        <title>TLS/SSL Advancements: The Privacy vs. Security Dilemma</title>
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TLS/SSL ESNI &amp;amp; ECH advancements, the privacy vs security dilemma&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;In today’s cybersecurity landscape, we’ve seen big improvements in web encryption. From the broad adoption of TLS 1.3 to the evolution from Encrypted Server Name Indication (ESNI) to Encrypted Client Hello (ECH), plus the rollout of HTTP/3, these advancements have greatly strengthened online data protection. At the same time, they introduce challenges for network security monitoring and web filtering.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This document highlights the changes that most impact network security and filtering—covering SNI, CN, key-shares, ESNI/ECH DNS records, DoH, and how to decrypt TLS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;tls-12-vs-tls-13-and-web-filtering&quot;&gt;TLS 1.2 vs. TLS 1.3 and Web Filtering&lt;/h2&gt;

&lt;h3 id=&quot;web-filtering-in-tls-12&quot;&gt;Web Filtering in TLS 1.2&lt;/h3&gt;

&lt;h4 id=&quot;tls-12-exchange-and-interesting-fields&quot;&gt;TLS 1.2 Exchange and Interesting Fields&lt;/h4&gt;

&lt;p&gt;TLS 1.2 (Transport Layer Security) ensures secure communication but keeps some fields in cleartext:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SNI&lt;/strong&gt;: Server Name Indication&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CN&lt;/strong&gt;: Common Name in the server certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These fields can be scanned by network devices for filtering decisions.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/TLS-11.2-with-DH.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;TLS 1.2 with DH exchange diagram&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Two round trips happen before encryption is fully established.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SNI&lt;/strong&gt; and &lt;strong&gt;CN&lt;/strong&gt; remain clear, letting traditional filters work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;a-look-inside-tls-12-packet-capture&quot;&gt;A Look Inside TLS 1.2 Packet Capture&lt;/h4&gt;

&lt;p&gt;Below is an example of a typical TLS 1.2 exchange where the &lt;strong&gt;SNI&lt;/strong&gt; is visible (in cleartext):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/TLS1.2-SNI-cleartext-wireshark.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;TLS 1.2 SNI in cleartext&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;tls-13-a-major-step-forward&quot;&gt;TLS 1.3: A Major Step Forward&lt;/h3&gt;

&lt;h4 id=&quot;tls-13-exchange-and-key-changes&quot;&gt;TLS 1.3 Exchange and Key Changes&lt;/h4&gt;

&lt;p&gt;TLS 1.3 improves upon TLS 1.2 by encrypting data sooner and reducing round trips:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/TLS1.3-exchange.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;TLS 1.3 Exchange Diagram&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The client sends a keyshare immediately (ClientHello).&lt;/li&gt;
  &lt;li&gt;The server responds with its keyshare, allowing earlier encryption.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CN&lt;/strong&gt; generally gets protected faster in TLS 1.3.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SNI&lt;/strong&gt; is still in cleartext without ESNI/ECH.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;esni-ech-and-doh-locking-down-the-remaining-gaps&quot;&gt;ESNI, ECH, and DoH: Locking Down the Remaining Gaps&lt;/h2&gt;

&lt;h3 id=&quot;esni-encrypted-sni&quot;&gt;ESNI (Encrypted SNI)&lt;/h3&gt;

&lt;p&gt;ESNI was an initial method to hide the SNI in the TLS 1.3 handshake. A special DNS record (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_esni&lt;/code&gt;) let the client fetch a public key to encrypt the SNI before sending its ClientHello. However, ESNI didn’t cover other fields (like ALPN), and compatibility issues arose. It’s largely been replaced by ECH.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/TLS1.3-with-ESNI.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;TLS 1.3 with ESNI Extension&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;doh-dns-over-https&quot;&gt;DoH (DNS over HTTPS)&lt;/h3&gt;

&lt;p&gt;Even if the SNI is encrypted, the domain might still be seen in DNS queries. DNS over HTTPS (DoH) fixes this by encrypting DNS requests—often enabled in modern browsers—making on-path domain snooping harder.&lt;/p&gt;

&lt;h3 id=&quot;encrypted-client-hello-ech&quot;&gt;Encrypted Client Hello (ECH)&lt;/h3&gt;

&lt;p&gt;ECH encrypts the entire ClientHello (including SNI, ALPN, and other fields), so it’s a more complete privacy solution than ESNI. It uses a new HTTPS record type (65) to get the server’s public key for encryption and typically works together with DoH.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/ECH-exchange.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;ECH Exchange Diagram&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Two ClientHello messages (“outer” is cleartext, “inner” is encrypted).&lt;/li&gt;
  &lt;li&gt;The “outer SNI” can be a CDN or generic hostname, while the real SNI is in the “inner” message.&lt;/li&gt;
  &lt;li&gt;Most next-gen firewalls can’t inspect the true SNI without decryption.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;quic-and-http3&quot;&gt;QUIC and HTTP/3&lt;/h2&gt;

&lt;p&gt;HTTP/3 uses QUIC, which also aims to encrypt most data. ECH can be applied to QUIC/HTTP/3 just like TLS 1.3, hiding the real SNI and other details from any on-path traffic analysis.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;raising-awareness-and-looking-ahead&quot;&gt;Raising Awareness and Looking Ahead&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Machine Learning&lt;/strong&gt;: Some solutions use ML-based traffic identification without relying on the SNI.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Man-in-the-Middle (MoM) Decryption&lt;/strong&gt;: Organizations may consider deeper TLS decryption for better visibility, but it’s more intrusive.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ongoing Changes&lt;/strong&gt;: The ECH specification is still evolving, meaning new capabilities and techniques for defense may emerge swiftly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Balancing user privacy with crucial security monitoring remains a key challenge.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;annexe-useful-info-and-tools&quot;&gt;Annexe: Useful Info and Tools&lt;/h2&gt;

&lt;h3 id=&quot;pcaps--keys-used-in-this-document&quot;&gt;Pcaps / Keys Used in This Document&lt;/h3&gt;

&lt;p&gt;Find the pcaps and TLS keys showcased here:
&lt;a href=&quot;https://github.com/abdessamad-elamrani/New-TLS-and-Web-security-advancements&quot;&gt;https://github.com/abdessamad-elamrani/New-TLS-and-Web-security-advancements&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/2024-05-05-TLS_1.3_esni_and_ECH_advancements/pcaps-github.png&quot; style=&quot;max-width: 400px;&quot; alt=&quot;PCAPs GitHub repository screenshot&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-to-decrypt-tls&quot;&gt;How to Decrypt TLS&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Obtain Session Keys&lt;/strong&gt;:
```bash
export SSLKEYLOGFILE=/path/to/sslkeys.txt
Then configure Wireshark (Preferences → Protocols → TLS → (Pre)-Master-Secret log filename).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Capture Traffic: Perform a packet capture using the client that has session logging set.
Load Keys: In Wireshark, specify the same key log file. If the session keys match, the traffic will be decrypted automatically.
This approach works for both TLS 1.2 and TLS 1.3, though certain limitations may affect early data or other advanced features.&lt;/p&gt;
</description>
        <pubDate>Mon, 26 Feb 2024 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/TLS_and_ECH</link>
        <guid isPermaLink="true">https://abdes.net/blog/TLS_and_ECH</guid>
      </item>
    
      <item>
        <title>European Executive Forum, 26th Feb 2024, Amsterdam The Netherlands</title>
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Strategic &amp;amp; Technological Innovation: Navigating the Future of Cybersecurity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;At the eSentire European Executive Forum held at the Pulitzer Hotel in Amsterdam, I had the privilege of participating as a speaker among senior leaders from MSPs across the Benelux region. The event, sponsored by eSentire and hosted by Phil Skelton, focused on the evolving cybersecurity landscape, emphasizing the integration of advanced technologies like AI and machine learning in Managed Detection and Response (MDR) services.&lt;/p&gt;

&lt;p&gt;During my talk, I highlighted the critical need for strategic partnerships to address the rising sophistication of cyber threats and the cybersecurity skill gap. I discussed how MSPs can leverage collaborations with specialized providers to enhance their service offerings and meet regulatory compliance requirements, such as GDPR and NIS2.&lt;/p&gt;

&lt;p&gt;The round table also provided a platform for discussing the challenges of differentiating services in a competitive market and the importance of investing in cybersecurity infrastructure. I shared insights on how digital transformation and regulatory pressures are driving the demand for robust cybersecurity measures.&lt;/p&gt;

&lt;p&gt;Overall, the event underscored the importance of innovation and collaboration in navigating the complexities of the cybersecurity market, offering valuable insights into future trends and strategic opportunities.&lt;/p&gt;

&lt;p&gt;Since this was top executives round table, for privacy reason I will not share pictures from inside the round table event.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.iteuropa.com/sites/default/files/leaders-in-discussion/files/esentire_european_executive_forum_feb_22.pdf&quot;&gt;Read the full event report here&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 26 Feb 2024 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/pulitzer-executive-2024/</link>
        <guid isPermaLink="true">https://abdes.net/blog/pulitzer-executive-2024/</guid>
      </item>
    
      <item>
        <title>Workshop France Novotel, Nov 5th-7th 2024</title>
        <description>&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Learning and Sharing at Our Annual Telco Workshop&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It’s always exciting when we get together for our yearly Telco workshop! This time around, I had the chance to share some really interesting topics with our Telco SE team, especially diving into some tricky areas like Quality of Service (QoS) and how we test our solutions.&lt;/p&gt;

&lt;p&gt;Here are the cool things we covered:&lt;/p&gt;

&lt;h2 id=&quot;session-1-making-sense-of-telco-and-qos-challenges&quot;&gt;Session 1: Making Sense of Telco and QoS Challenges&lt;/h2&gt;

&lt;p&gt;The QoS session was really fun and packed with useful information. We got into the nitty-gritty of traffic flows and how things work at the chip level, plus we looked at kernel QoS, how to design it right, and what problems to watch out for.&lt;/p&gt;

&lt;p&gt;I loved how engaged everyone was - there were lots of great questions throughout! What made me really happy was how many engineers came up to me afterward to talk about their QoS projects in the Telco market. Seeing all this interest has got me thinking about writing a more detailed internal guide about it.&lt;/p&gt;

&lt;h2 id=&quot;session-2-real-world-experience-with-fortinet-solutions&quot;&gt;Session 2: Real-World Experience with Fortinet Solutions&lt;/h2&gt;

&lt;p&gt;For the solutions testing session, I joined my manager, Simon Bryden, we had a great time sharing what we’ve learned from testing and validating solutions in the real world. We wrapped up with some funny stories from our field experiences, which was a nice way to end things on a lighter note.&lt;/p&gt;
</description>
        <pubDate>Thu, 05 Oct 2023 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/telco-workshop-nice-2024/</link>
        <guid isPermaLink="true">https://abdes.net/blog/telco-workshop-nice-2024/</guid>
      </item>
    
      <item>
        <title>Workshop Mouratoglou Hotel &amp; Resort, Oct 13th-15th 2023 , France</title>
        <description>&lt;p&gt;I had the privilege of speaking at a prestigious event held at the Mouratoglou Hotel in Sophia Antipolis, France. This event brought together leading experts in the field of cybersecurity, and I was honored to contribute to the discussions with my insights and experiences.&lt;/p&gt;

&lt;p&gt;During the sessions, I delved into the intricacies of low-level traffic generation within the cybersecurity industry. My presentation focused on advanced techniques for performance enhancement, specifically utilizing kernel netmap and DPDK. These tools are pivotal in optimizing network performance and ensuring robust security measures.&lt;/p&gt;

&lt;p&gt;Furthermore, I explored the power of Unix systems in simulating complex telecommunications scenarios. This included demonstrations on simulating GTPv1, 5G PFCP, and other cutting-edge technologies. These simulations are crucial for testing and validating security protocols in real-world telco environments.&lt;/p&gt;

&lt;p&gt;The event was a fantastic opportunity to share knowledge and engage with fellow professionals who are equally passionate about advancing cybersecurity technologies. It was an enriching experience that underscored the importance of collaboration and innovation in our field.&lt;/p&gt;

&lt;p&gt;I am grateful for the opportunity to have been part of such a dynamic and forward-thinking event, and I look forward to continuing to contribute to the cybersecurity community.&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;
  &lt;img src=&quot;/assets/img/posts/2023-10-18-Mouratoglou-workshop/Day1-Abde_1.jpeg&quot; alt=&quot;Going through some deep kernel traffic gen techniques&quot; class=&quot;img-fluid&quot; /&gt;
  &lt;p style=&quot;font-weight: bold; font-size: 1.5em; padding: 5px; display: inline-block;&quot;&gt;&lt;/p&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 05 Oct 2023 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/mouratoglou-workshop-nice-2023/</link>
        <guid isPermaLink="true">https://abdes.net/blog/mouratoglou-workshop-nice-2023/</guid>
      </item>
    
      <item>
        <title>AI &amp; CyberSec in Finance and Energy Sector, Amsterdam June 2023 , The Netherlands</title>
        <description>&lt;div style=&quot;text-align: center;&quot;&gt;
  &lt;img src=&quot;/assets/img/authors/big-energy.png&quot; alt=&quot;Going through some deep Fortigate flows&quot; class=&quot;img-fluid&quot; /&gt;
  &lt;p style=&quot;font-weight: bold; font-size: 1.5em; padding: 5px; display: inline-block;&quot;&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Digital Transformation in the Energy Sector Forum 2023, Amsterdam&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
I was excited to speak at an interesting event in Amsterdam this June, where we focused on how AI is changing the energy sector. It was great to meet other innovators who are working on making energy systems smarter and more efficient.&lt;/p&gt;

&lt;p&gt;I also highlighted new AI technologies that help build  effective machine-learning energy-management models, and integrate directly into energy open source platforms. These community-driven solutions allow for tailored automations and easier integrations, ultimately helping us pinpoint and address energy waste more precisely.&lt;/p&gt;

&lt;p&gt;We also had an important discussion about AI itself. While AI is amazing at solving problems, training big AI models actually uses a lot of energy. We talked about data centers and how to balance using new technology while being environmentally responsible.&lt;/p&gt;

&lt;p&gt;It was really valuable to connect with others who care about making our energy use smarter and more sustainable. I’m looking forward to seeing how we can keep pushing these ideas forward.&lt;/p&gt;

&lt;p&gt;For more details on my work and insights, feel free to visit my LinkedIn profile or my personal website.&lt;/p&gt;
</description>
        <pubDate>Mon, 05 Jun 2023 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/AIinEnergySector/</link>
        <guid isPermaLink="true">https://abdes.net/blog/AIinEnergySector/</guid>
      </item>
    
      <item>
        <title>The Math behind Quantum, in a nutchel</title>
        <description>&lt;h1 id=&quot;quantum-computing-demystified-the-essential-math&quot;&gt;Quantum Computing Demystified: The Essential Math&lt;/h1&gt;

&lt;p&gt;Quantum computing still feels mysterious to many, but at heart it uses beautifully simple math ideas—once you get used to them!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1-qubits-more-than-0-or-1&quot;&gt;1. Qubits: More Than 0 or 1&lt;/h2&gt;

&lt;p&gt;Imagine a spinning coin: Before it lands, you don’t know if it’s heads or tails—it’s kind of “both.” A qubit is similar:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A regular bit is strictly 0 or 1.&lt;/li&gt;
  &lt;li&gt;A qubit can be both 0 and 1 at the same time (a “superposition”).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In math form:&lt;br /&gt;
|ψ&amp;gt; = α|0&amp;gt; + β|1&amp;gt;&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;where alpha and beta  are numbers that show “how much” the qubit is in state&lt;/td&gt;
      &lt;td&gt;0&amp;gt; and&lt;/td&gt;
      &lt;td&gt;1&amp;gt;.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;2-entanglement-qubits-acting-together&quot;&gt;2. Entanglement: Qubits Acting Together&lt;/h2&gt;

&lt;p&gt;Entanglement is like two magic coins you flip at the same time. If one lands heads, the other is guaranteed tails (or vice versa). They’re linked, even if separated. An example is the “Bell state”:&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;(1 / √2) * (&lt;/td&gt;
      &lt;td&gt;00&amp;gt; +&lt;/td&gt;
      &lt;td&gt;11&amp;gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Translated loosely:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Each qubit is not just 0 or 1, but they act as a single unit.&lt;/li&gt;
  &lt;li&gt;Measuring one qubit instantly tells you the state of the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;3-quantum-gates-transforming-qubits&quot;&gt;3. Quantum Gates: Transforming Qubits&lt;/h2&gt;

&lt;p&gt;Think of quantum gates like instructions in a recipe:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;X Gate (like a NOT):&lt;/strong&gt; Flips&lt;/td&gt;
          &lt;td&gt;0&amp;gt;↔&lt;/td&gt;
          &lt;td&gt;1&amp;gt;.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Hadamard (H Gate):&lt;/strong&gt; Creates a superposition if starting from&lt;/td&gt;
          &lt;td&gt;0&amp;gt;.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;CNOT (Controlled NOT):&lt;/strong&gt; Operates on two qubits: if the first qubit is&lt;/td&gt;
          &lt;td&gt;1&amp;gt;, it flips the second qubit.&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They’re special because they must keep track of probabilities correctly (they’re “unitary” operations).&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;4-quantum-algorithms-simple-insights&quot;&gt;4. Quantum Algorithms: Simple Insights&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Grover’s Algorithm&lt;/strong&gt; helps find a needle in a haystack about √N times faster than classical searching. It’s like shaking all the “hay” in parallel and letting the item you want stand out more and more after each shake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shor’s Algorithm&lt;/strong&gt; can factor large numbers surprisingly quickly—threatening normal encryption (RSA). That’s why big companies and governments are watching quantum computing closely!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;why-it-matters&quot;&gt;Why It Matters&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Superposition:&lt;/strong&gt; A qubit can represent multiple possibilities at once.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Interference:&lt;/strong&gt; Quantum effects can magnify the right answers and reduce the wrong ones.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Entanglement:&lt;/strong&gt; Qubits can be tied together in ways no classical system can match.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Though today’s quantum computers have limited power and can be noisy, these concepts promise amazing future applications—from speeding up searches to cracking tough math problems.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Brush up on &lt;strong&gt;linear algebra&lt;/strong&gt; (matrices and vectors).&lt;/li&gt;
  &lt;li&gt;Review &lt;strong&gt;complex numbers&lt;/strong&gt;—those “i” and “√(-1)” might pop up!&lt;/li&gt;
  &lt;li&gt;Understand &lt;strong&gt;probability&lt;/strong&gt; (we talk about measuring states in terms of odds).&lt;/li&gt;
  &lt;li&gt;Dive into &lt;strong&gt;basic quantum gate&lt;/strong&gt; ideas: how they flip and combine these qubits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quantum computing isn’t “magic.” It’s math that looks magical until you get familiar with it—like learning chord progressions on a guitar. With some practice, you’ll see how the notes fit together.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“If you think you understand quantum mechanics, you don’t understand quantum mechanics.”&lt;br /&gt;
— Richard Feynman&lt;br /&gt;
&lt;em&gt;(But it still helps to learn the basics!)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        <pubDate>Sat, 15 Jan 2022 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/quantum-math-essentials</link>
        <guid isPermaLink="true">https://abdes.net/blog/quantum-math-essentials</guid>
      </item>
    
      <item>
        <title>YaBilal.nl : Combining PCB Design, MCU Coding, and AWS IoT</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://www.yabilal.nl/&quot;&gt;YaBilal.nl&lt;/a&gt;  is my personal passion project that captures all the phases of cutting-edge product development: PCB design, low-level MCU coding, AWS Cloud orchestration, and IoT integration. Whether you live in Europe, the US, or anywhere in between, I’m confident YaBilal can bring the exact Azan times you need right into your home.&lt;/p&gt;

&lt;h2 id=&quot;the-tech-stack-behind-yabilal&quot;&gt;The Tech Stack Behind YaBilal&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Custom PCB Layout&lt;/strong&gt;&lt;br /&gt;
I designed and manufactured a compact PCB (approximately 7×5×4 cm) that integrates everything needed for audio playback and Wi-Fi connectivity. I made sure all major components—from power management to signal processing—flow together seamlessly.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Low-Level MCU Firmware&lt;/strong&gt;&lt;br /&gt;
The microcontroller at the heart of YaBilal manages communication with the speaker, interfaces with sensors and controls, and synchronizes with my cloud service. The firmware is fine-tuned to minimize latency and keep the overall system stable.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;AWS Cloud Backend&lt;/strong&gt;&lt;br /&gt;
Behind the scenes, an AWS IoT backend continuously monitors all mosque prayer times, ensuring they’re accurate and updated hourly. Whenever there’s a schedule change—for example, during Ramadan or daylight savings—the cloud immediately pushes the updated information to every YaBilal appliance.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;IoT Integration&lt;/strong&gt;&lt;br /&gt;
YaBilal uses a secure IoT protocol to exchange data with AWS. This means each device checks in regularly to retrieve the next Azan schedule, adjust for new mosques, or even update the local time offset. Whether you’re online or offline, YaBilal adapts to keep you in sync.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;3D Enclosure Design&lt;/strong&gt;&lt;br /&gt;
To house all the electronics, I built a streamlined 3D enclosure that fits easily in your bedroom, kitchen, or living room. It’s small enough not to take up too much space, yet big enough to include intuitive volume controls and deliver a clear, pleasant Azan.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;how-yabilal-works&quot;&gt;How YaBilal Works&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Select Your Mosque&lt;/strong&gt;&lt;br /&gt;
Choose from a list of growing supported mosques. The cloud backend updates your device’s prayer schedule immediately.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Adjust Volume &amp;amp; Settings&lt;/strong&gt;&lt;br /&gt;
A built-in speaker and simple buttons let you select the volume you want.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Enjoy Authentic Azan&lt;/strong&gt;&lt;br /&gt;
YaBilal accurately plays the Azan on time, every time—no guesswork or generic approximations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This close sync with AWS Cloud ensures errors or delays are practically eliminated. If your local mosque changes its schedule, the device is instantly updated.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;yabilal-models&quot;&gt;YaBilal Models&lt;/h2&gt;

&lt;h3 id=&quot;yabilal-standard&quot;&gt;YaBilal-Standard&lt;/h3&gt;
&lt;p&gt;A simple, straightforward choice if you want an out-of-the-box solution for exact Azan times.&lt;/p&gt;

&lt;p&gt;• Price: €90.00&lt;br /&gt;
• Status: Pre-Order&lt;/p&gt;

&lt;h3 id=&quot;yabilal-plus&quot;&gt;YaBilal-Plus&lt;/h3&gt;
&lt;p&gt;A step up that includes a personalized engraving on the device, making it a great gift or keepsake. Purchasing the Plus version also helps me continue refining and supporting more mosques around the globe.&lt;/p&gt;

&lt;p&gt;• Price: €120.00&lt;br /&gt;
• Status: Pre-Order&lt;br /&gt;
• Includes custom engraving&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;why-i-built-it&quot;&gt;Why I Built It&lt;/h2&gt;

&lt;p&gt;Living in Europe, I often felt disconnected from the Azan schedules in my hometown. I realized many other Muslims here (and in other parts of the world) face the same challenge. By merging the latest hardware, firmware, cloud computing, and IoT technologies, I brought YaBilal to life to ensure every user stays connected to their faith—no matter their location.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;order--further-details&quot;&gt;Order &amp;amp; Further Details&lt;/h2&gt;

&lt;p&gt;Explore YaBilal-Standard or YaBilal-Plus at &lt;a href=&quot;https://www.yabilal.nl/&quot;&gt;YaBilal.nl&lt;/a&gt; to place your pre-order. If you have any questions or need assistance, feel free to drop a message. I’m always happy to help.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;YaBilal is my personal passion project that captures all the phases of cutting-edge product development: PCB design, low-level MCU coding, AWS Cloud orchestration, and IoT integration. Whether you live in Europe, the US, or anywhere in between, I’m confident YaBilal can bring the exact Azan times you need right into your home.&lt;/p&gt;

&lt;hr /&gt;
</description>
        <pubDate>Wed, 10 Mar 2021 09:00:00 +0000</pubDate>
        <link>https://abdes.net/blog/making-of-YaBilal</link>
        <guid isPermaLink="true">https://abdes.net/blog/making-of-YaBilal</guid>
      </item>
    
      <item>
        <title>BGP (RFC 4271) in motion!</title>
        <description>&lt;h1 id=&quot;bgp-border-gateway-protocol-interactive-animation&quot;&gt;BGP (Border Gateway Protocol) Interactive Animation&lt;/h1&gt;

&lt;p&gt;Welcome to this interactive animation of the Border Gateway Protocol (BGP), the protocol that makes internet routing possible. This animation will help you understand how BGP works, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AS (Autonomous System) relationships&lt;/li&gt;
  &lt;li&gt;BGP path selection process&lt;/li&gt;
  &lt;li&gt;Route advertisement and withdrawal&lt;/li&gt;
  &lt;li&gt;BGP attributes and decision process&lt;/li&gt;
  &lt;li&gt;Policy-based routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use the interactive controls below to explore different aspects of BGP routing and see how routing decisions are made in real-time.&lt;/p&gt;

&lt;div id=&quot;bgp-animation-root&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;how-to-use-this-animation&quot;&gt;How to Use This Animation&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Use the timeline controls to step through different phases of BGP routing&lt;/li&gt;
  &lt;li&gt;Click on different AS nodes to see their routing tables&lt;/li&gt;
  &lt;li&gt;Observe how route advertisements propagate through the network&lt;/li&gt;
  &lt;li&gt;Experiment with different scenarios using the controls provided&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;technical-details&quot;&gt;Technical Details&lt;/h2&gt;

&lt;p&gt;This animation is built using React and D3.js, providing a dynamic and interactive way to visualize BGP routing processes. The visualization accurately represents:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;BGP path attributes (AS_PATH, LOCAL_PREF, MED, etc.)&lt;/li&gt;
  &lt;li&gt;Route propagation and convergence&lt;/li&gt;
  &lt;li&gt;Policy implementation&lt;/li&gt;
  &lt;li&gt;Route filtering and aggregation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to experiment with different scenarios and see how BGP makes routing decisions in various situations.&lt;/p&gt;
</description>
        <pubDate>Wed, 03 Feb 2021 09:05:23 +0000</pubDate>
        <link>https://abdes.net/blog/bgp-interactive-animation/</link>
        <guid isPermaLink="true">https://abdes.net/blog/bgp-interactive-animation/</guid>
      </item>
    

    
      
        
      
    
      
    
      
        
          <item>
            <title></title>
            <description>&lt;h3&gt;   &lt;/h3&gt;

&lt;div id=&quot;categories&quot;&gt;

  &lt;div class=&quot;category-box&quot;&gt;
    
    &lt;div id=&quot;#animation&quot;&gt;&lt;/div&gt;
    &lt;h4 class=&quot;category-head&quot;&gt;&lt;a href=&quot;/blog/categories/animation&quot;&gt;animation&lt;/a&gt;&lt;/h4&gt;
    &lt;a name=&quot;animation&quot;&gt;&lt;/a&gt;
     
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/tls-1-3-ech-animation/&quot;&gt;TLS 1.3 ECH (draft-ietf-tls-esni-22) !&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/tls-1-3-interactive-animation/&quot;&gt;TLS 1.3 (RFC 8446) in motion!&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/ikev2-interactive-animation/&quot;&gt;IPSEC (IKEv2 RFC 7296) in motion!&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/bgp-interactive-animation/&quot;&gt;BGP (RFC 4271) in motion!&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    

  &lt;/div&gt;

  &lt;div class=&quot;category-box&quot;&gt;
    
    &lt;div id=&quot;#tech&quot;&gt;&lt;/div&gt;
    &lt;h4 class=&quot;category-head&quot;&gt;&lt;a href=&quot;/blog/categories/tech&quot;&gt;tech&lt;/a&gt;&lt;/h4&gt;
    &lt;a name=&quot;tech&quot;&gt;&lt;/a&gt;
     
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/deepseek-opensource-or-not&quot;&gt;OpenSource LLM? Really? (DeepSeek R1 example)&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/TLS_and_ECH&quot;&gt;TLS/SSL Advancements: The Privacy vs. Security Dilemma&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/quantum-math-essentials&quot;&gt;The Math behind Quantum, in a nutchel&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/making-of-YaBilal&quot;&gt;YaBilal.nl : Combining PCB Design, MCU Coding, and AWS IoT&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    

  &lt;/div&gt;

  &lt;div class=&quot;category-box&quot;&gt;
    
    &lt;div id=&quot;#events&quot;&gt;&lt;/div&gt;
    &lt;h4 class=&quot;category-head&quot;&gt;&lt;a href=&quot;/blog/categories/events&quot;&gt;events&lt;/a&gt;&lt;/h4&gt;
    &lt;a name=&quot;events&quot;&gt;&lt;/a&gt;
     
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/telcos-workshop-Inwi-and-Orange-morocco-2024/&quot;&gt;Workshops for INWI &amp;amp; Orange telcos in Morocco&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/Big-data-nov-2024/&quot;&gt;Global Big Data Digital Transformation, Nov 2024, Amsterdam&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/pulitzer-executive-2024/&quot;&gt;European Executive Forum, 26th Feb 2024, Amsterdam The Netherlands&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/telco-workshop-nice-2024/&quot;&gt;Workshop France Novotel, Nov 5th-7th 2024&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/mouratoglou-workshop-nice-2023/&quot;&gt;Workshop Mouratoglou Hotel &amp;amp; Resort, Oct 13th-15th 2023 , France&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    
    &lt;article class=&quot;center&quot;&gt;
      &lt;h6&gt;&lt;a href=&quot;/blog/AIinEnergySector/&quot;&gt;AI &amp;amp; CyberSec in Finance and Energy Sector, Amsterdam June 2023 , The Netherlands&lt;/a&gt;&lt;/h6&gt;
    &lt;/article&gt;


    

  &lt;/div&gt;

&lt;/div&gt;

</description>
            <link>https://abdes.net/blog/categories/</link>
          </item>
        
      
    
      
    
      
    
      
        
          <item>
            <title>Guides</title>
            <description>&lt;h5&gt; Posts by Category : {{ page.title }} &lt;/h5&gt;

&lt;div class=&quot;card&quot;&gt;
{% for post in site.categories.guides %}
 &lt;li class=&quot;category-posts&quot;&gt;&lt;span&gt;{{ post.date | date_to_string }}&lt;/span&gt; &amp;nbsp; &lt;a href=&quot;{{ post.url }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/li&gt;
{% endfor %}
&lt;/div&gt;</description>
            <link>https://abdes.net/blog/categories/guides/</link>
          </item>
        
      
    
      
    
      
    
      
    
      
        
          <item>
            <title>Get Started</title>
            <description>## Getting Started - How to use “devlopr-jekyll” theme

## What&apos;s Jekyll ?

If you aren’t familiar with Jekyll yet, you should know that it is a static site generator. It will transform your plain text into static websites and blogs. No more databases, slow loading websites, risk of being hacked…just your content. And not only that, with Jekyll you get free hosting with GitHub Pages! If you are a beginner we recommend you start with [Jekyll’s Docs](https://jekyllrb.com/docs/installation/). Now, if you know how to use Jekyll, let’s move on to using this theme in Jekyll:

## Watch Tutorial

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/cXBEfpn0qrg?rel=0&amp;amp;controls=0&amp;amp;showinfo=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;


### Steps to create your blog using devlopr-jekyll and Host using Github Pages :

&gt;  **Step 1.**  Fork the repo - [click here](https://github.com/sujaykundu777/devlopr-jekyll/fork)

![Devlopr Jekyll Repo](/assets/img/posts/fork1.PNG){:class=&quot;img-fluid&quot;}

&gt; **Step 2.** Use **your-github-username.github.io** as the new repo  ( Replace your-github-username with yours). Remember if you use the name other than your-github-username.github.io , your blog will be built using gh-pages branch.

![Devlopr Jekyll Repo](/assets/img/posts/fork2.PNG){:class=&quot;img-fluid&quot;}

![Devlopr Jekyll Repo](/assets/img/posts/fork3.PNG){:class=&quot;img-fluid&quot;}

&gt; **Step 3.** Clone the new repo locally to make changes :

![Devlopr Jekyll Repo](/assets/img/posts/fork31.PNG){:class=&quot;img-fluid&quot;}

![Devlopr Jekyll Repo](/assets/img/posts/fork32.PNG){:class=&quot;img-fluid&quot;}

![Devlopr Jekyll Repo](/assets/img/posts/fork33.PNG){:class=&quot;img-fluid&quot;}

```bash
 $ git clone https://github.com/yourusername/yourusername.github.io
 $ cd yourusername.github.io
 $ code .
```

&gt; **Step 4.** Open the files using VSCode and edit _config.yml and edit with your details:

- _config.yml file - replace with your own details
- _posts - Add your blog posts here
- _includes - You can replace the contents of the files with your data. (contains widgets)
- _assets/img - Add all your images here

![Devlopr Jekyll Repo](/assets/img/posts/fork34.PNG){:class=&quot;img-fluid&quot;}

&gt; **Step 5** - Install the development requirements:

### Set up local development environment

1. [Git](https://git-scm.com/)
2. [Ruby](https://www.ruby-lang.org/) and [Bundler](https://bundler.io/)
3. [VSCode](https://code.visualstudio.com/download)

We need ruby and bundler to build our site locally. After installation check if its working:

For ruby :

```bash
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
```
For bundler :

```bash
$ gem install bundler
$ bundler -v
Bundler version 2.2.29
```
Add jekyll :

```bash
$ bundle update
$ bundle add jekyll
```
 This command will add the Jekyll gem to our Gemfile and install it to the ./vendor/bundle/ folder.

You can check the jekyll version

```
$ bundle exec jekyll -v
jekyll 4.2.0
```

&gt; **Step 6.** Install the gem dependencies by running the following command

```bash
$ bundle update
$ bundle install
```

&gt; **Step 7.** Serve the site locally by running the following command below:

```bash
$ bundle exec jekyll serve --watch
```
or you can also serve using :

```bash
$ jekyll serve
```

Visit [http://localhost:4000](http://localhost:4000) for development server

![Devlopr Jekyll Repo](/assets/img/posts/fork41.PNG){:class=&quot;img-fluid&quot;}


### Adding Content

Start populating your blog by adding your .md files in _posts. devlopr-jekyll already has a few examples.

#### YAML Post Example:

```yml
---
layout: post
title: Sample Post
author: Sujay Kundu
date: &apos;2019-05-21 14:35:23 +0530&apos;
category:
        - jekyll
summary: This is the summary for the sample post
thumbnail: sample.png
---

Hi ! This is sample post.

```

#### YAML Page Example:

```yml
---
layout: page
title: Sample Page
permalink: /sample-page/
---

Hi ! This is sample page.
```

#### Editing stylesheet

You’ll only work with a single file to edit/add theme style: assets/css/main.scss.

### Deploy your Changes

Once happy with your blog changes. Push your changes to master branch.

&gt; **Step 8.** Push Your Local Changes

```bash
 $ git add .
 $ git commit -m &quot;my new blog using devlopr-jekyll&quot;
 $ git push origin master
```

Visit your Github Repo settings ! Enable master branch as Github Pages Branch :

![Devlopr Jekyll Repo](/assets/img/posts/fork6.PNG){:class=&quot;img-fluid&quot;}

&gt; **Step 9.** Deploy your Blog :

![Devlopr Jekyll Repo](/assets/img/posts/fork7.PNG){:class=&quot;img-fluid&quot;}

&gt; Congrats ! On your new shining Blog !

You can visit the blog using [http://your-github-username.github.io](http://your-github-username.github.io).

</description>
            <link>https://abdes.net/get-started/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Jekyll</title>
            <description>&lt;h5&gt; Posts by Category : {{ page.title }} &lt;/h5&gt;

&lt;div class=&quot;card&quot;&gt;
{% for post in site.categories.jekyll %}
 &lt;li class=&quot;category-posts&quot;&gt;&lt;span&gt;{{ post.date | date_to_string }}&lt;/span&gt; &amp;nbsp; &lt;a href=&quot;{{ post.url }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/li&gt;
{% endfor %}
&lt;/div&gt;</description>
            <link>https://abdes.net/blog/categories/jekyll/</link>
          </item>
        
      
    
      
    
      
    
      
        
          <item>
            <title>Guides</title>
            <description>&lt;h5&gt; Posts by Category : {{ page.title }} &lt;/h5&gt;

&lt;div class=&quot;card&quot;&gt;
{% for post in site.categories.sample_category %}
 &lt;li class=&quot;category-posts&quot;&gt;&lt;span&gt;{{ post.date | date_to_string }}&lt;/span&gt; &amp;nbsp; &lt;a href=&quot;{{ post.url }}&quot;&gt;{{ post.title }}&lt;/a&gt;&lt;/li&gt;
{% endfor %}
&lt;/div&gt;</description>
            <link>https://abdes.net/blog/categories/sample_category/</link>
          </item>
        
      
    
      
    
      
        
          <item>
            <title>Our Sponsors</title>
            <description>Thanks to all the amazing contributors and our Backers for the support.

- [Dirish Mohan](https://dirishmohan.com)</description>
            <link>https://abdes.net/sponsors/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Styleguide</title>
            <description>### devlopr - Styleguide

&lt;hr /&gt;

 &lt;img src=&quot;/assets/img/styleguide.png&quot; class=&quot;img-fluid&quot;&gt;

&lt;p&gt; Lets try the different text styles  &lt;b&gt; Bold &lt;/b&gt; , &lt;strong&gt; Strong &lt;/strong&gt;, &lt;em&gt; Emphasis &lt;/em&gt;, &lt;i&gt; Italic &lt;/i&gt; &lt;/p&gt;


&lt;p&gt; Now, lets try different heading styles : &lt;/p&gt;

&lt;h1&gt; Hello in h1 ! &lt;/h1&gt;
&lt;h2&gt; Hello in h2 ! &lt;/h2&gt;
&lt;h3&gt; Hello in h3 ! &lt;/h3&gt;
&lt;h4&gt; Hello in h4 ! &lt;/h4&gt;
&lt;h5&gt; Hello in h5 ! &lt;/h5&gt;
&lt;h6&gt; Hello in h6 ! &lt;/h6&gt;

&lt;hr /&gt;
&lt;p&gt; Unordered List &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; List Item 1 &lt;/li&gt;
&lt;li&gt; List Item 2 &lt;/li&gt;
&lt;li&gt; List Item 3 &lt;/li&gt;
&lt;li&gt; List Item 4 &lt;/li&gt;
&lt;li&gt; List Item 5 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; Ordered List &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; List Item 1 &lt;/li&gt;
&lt;li&gt; List Item 2 &lt;/li&gt;
&lt;li&gt; List Item 3 &lt;/li&gt;
&lt;li&gt; List Item 4 &lt;/li&gt;
&lt;li&gt; List Item 5 &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a Block Quote,  It can Expand Multiple Lines &lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;You can use the mark tag to &lt;mark&gt;highlight&lt;/mark&gt; text. &lt;/p&gt;

&lt;p&gt;&lt;del&gt; This line of text is meant to be deleted text &lt;/del&gt; &lt;/p&gt;

&lt;p&gt;&lt;u&gt;This line of text will render as underlined&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;This line of text is meant to be treated as fine print.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This line rendered as bold text.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This line rendered as italicized text.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;abbr title=&quot;attribute&quot;&gt;attr&lt;/abbr&gt;&lt;/p&gt;
&lt;p&gt;&lt;abbr title=&quot;HyperText Markup Language&quot; class=&quot;initialism&quot;&gt;HTML&lt;/abbr&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;div class=&quot;responsive-table&quot;&gt;
&lt;table&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;col&quot;&gt;#&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;Heading&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;1&lt;/th&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;2&lt;/th&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;3&lt;/th&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
          &lt;td&gt;Cell&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;/div&gt;

&lt;hr /&gt;

&lt;h3&gt; Instagram Embed &lt;/h3&gt;

&lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/CBXO7AypXkM/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-version=&quot;13&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/CBXO7AypXkM/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;&lt;a href=&quot;https://www.instagram.com/p/CBXO7AypXkM/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;&quot; target=&quot;_blank&quot;&gt;A post shared by Sujay (@sujaykundu777)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;

&lt;hr&gt;

&lt;h3&gt; Twitter Embed &lt;/h3&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I just published “Deploying a blog using Jekyll and Github Pages with SSL certificate for Free” &lt;a href=&quot;https://t.co/B3T3IQVU93&quot;&gt;https://t.co/B3T3IQVU93&lt;/a&gt;&lt;/p&gt;&amp;mdash; Sujay Kundu (@SujayKundu777) &lt;a href=&quot;https://twitter.com/SujayKundu777/status/1012601950469160962?ref_src=twsrc%5Etfw&quot;&gt;June 29, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;hr /&gt;


&lt;h3&gt;YouTube Responsive Embed&lt;/h3&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/bBpKMH3nBzE?rel=0&amp;amp;controls=0&amp;amp;showinfo=0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;hr /&gt;

&lt;h3&gt;Vimeo Responsive Embed&lt;/h3&gt;

&lt;iframe src=&quot;https://player.vimeo.com/video/212114694?title=0&amp;amp;byline=0&amp;amp;portrait=0&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;ted-responsive-embed&quot;&gt;TED Responsive Embed&lt;/h3&gt;

&lt;iframe src=&quot;https://embed.ted.com/talks/ted_halstead_a_climate_solution_where_all_sides_can_win&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;twitch-responsive-embed&quot;&gt;Twitch Responsive Embed&lt;/h3&gt;

&lt;iframe src=&quot;https://player.twitch.tv/?autoplay=false&amp;amp;video=v248755437&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; scrolling=&quot;no&quot; height=&quot;378&quot; width=&quot;620&quot;&gt;&lt;/iframe&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;soundcloud-embed&quot;&gt;SoundCloud Embed&lt;/h3&gt;

&lt;iframe width=&quot;100%&quot; height=&quot;166&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/29738591&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&quot;&gt;&lt;/iframe&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;codepen-embed&quot;&gt;CodePen Embed&lt;/h3&gt;

&lt;p data-height=&quot;265&quot; data-theme-id=&quot;light&quot; data-slug-hash=&quot;YWvpRo&quot; data-default-tab=&quot;css,result&quot; data-user=&quot;kharrop&quot; data-embed-version=&quot;2&quot; data-pen-title=&quot;Referral Form&quot; class=&quot;codepen&quot;&gt;&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://production-assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;syntax-highlighting&quot;&gt;Syntax Highlighting&lt;/h3&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot; data-lang=&quot;js&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&apos;use strict&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;markdown&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;markdown&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Editor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;preview&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;preview&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toHTML&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;editor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;You can add inline code just like this, E.g. &lt;code class=&quot;highlighter-rouge&quot;&gt;.code { color: #fff; }&lt;/code&gt;&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span class=&quot;nt&quot;&gt;pre&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#f4f4f4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;github-gist-embed&quot;&gt;GitHub gist Embed&lt;/h3&gt;

&lt;script src=&quot;https://gist.github.com/ahmadajmi/dbb4f713317721668bcbc39420562afc.js&quot;&gt;&lt;/script&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;input-style&quot;&gt;Input Style&lt;/h3&gt;

&lt;p&gt;&lt;input type=&quot;text&quot; placeholder=&quot;I&apos;m an input field!&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;


</description>
            <link>https://abdes.net/styleguide/</link>
          </item>
        
      
    
      
    
      
        
          <item>
            <title>Security Policy</title>
            <description># Security Policy

## Supported Versions

Use this section to tell people about which versions of your project are
currently being supported with security updates.

| Version | Supported          |
| ------- | ------------------ |
| 5.1.x   | :white_check_mark: |
| 5.0.x   | :x:                |
| 4.0.x   | :white_check_mark: |
| &lt; 4.0   | :x:                |

## Reporting a Vulnerability

Use this section to tell people how to report a vulnerability.

Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.
</description>
            <link>https://abdes.net/SECURITY/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Change Log</title>
            <description># Change Log

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).

**Note that references to the Font-Awesome-Pro repository refer to a GitHub
repository that is by invitation only. You will get a 404 - Not Found if you do
not have access**

---

## [5.1.0](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.1.0)  - 2018-06-20

**Minor version upgrade notice: there are some backward-incompatible changes to this release. See the
[UPGRADING.md guide](https://github.com/FortAwesome/Font-Awesome/blob/master/UPGRADING.md) for more
information.**

### Added
* New Emoji, Design, and Travel category pack
* Another group of requested and commissioned icons
* Version 4 shim for Web Fonts with CSS
* New simplified download and NPM packages
* @fortawesome/fontawesome-free and @fortawesome/fontawesome-pro NPM packages that match what&apos;s available in the CDN and .ZIP files
* Brand icons rev, nimblr, megaport, mailchimp, hornbill, wix, weebly, themeco, squarespace, aws, shopware
* API method toHtml() for converting abstract objects to HTML
* API method counter() to generate Layers Counters
* API method watch() to configure MutationObserver and watch DOM for icon changes and additions

### Changed
* Relocating sponsor data to a separate sponsors.yml
* Updated teamspeak brand icon
* No more default exports in the CommonJS/ES packages (anything installed from NPM)
* Greatly improved performance and rendering of CSS pseudo-elements with SVG and JavaScript
* Configuration of SVG with JavaScript can now be done with attributes on the script tag
* SVG with JavaScript pseudo-elements now match syntax (font-family, font-weight) of Web Fonts with CSS

### Fixed
* Tree shaking of all NPM packages by default
* Alignment of the book-open and dice-six icon
* Correcting creative-commons
* Incorrect license on the fontawesome-common-types package
* Improve ligatures that share a base name with another ligature
* Correcting solid style of the digital-tachograph icon
* Prevent duplicating classes in some scenarios with SVG with JavaScript
* Duplicate insertion of CSS when insertCss() method was called
* Missing TypeScript definitions for the free-brands-svg-icons package

---

## [5.0.13](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.13)  - 2018-05-10

### Added
* 68 icons to Free and 165 to Pro of the most requested icons in Font Awesome

---

## [5.0.12](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.12)  - 2018-05-03

### Added
* A long time ago in a galaxy far, far away some icons were added

### Fixed
* Renamed the r brand to r-project to prevent ligature collision with the &quot;r&quot; glyph

---

## [5.0.11](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.11)  - 2018-05-01

### Added
* 16 new user icons
* Full set of Creative Commons symbols
* Regular style comment-dots used for v4 comment-alt in shim
* Top 6 brand icons: r, ebay, mastodon, researchgate, keybase, teamspeak

### Changed
* Revised slider icons FortAwesome/Font-Awesome#11872
* Make desktop typeface easier to find in apps that support ligature previews

### Fixed
* Remove errant XML entity from the lastfm-square icon FortAwesome/Font-Awesome#12847
* Correcting paths in cloud icons FortAwesome/Font-Awesome-Pro#920

---

## [5.0.10](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.10)  - 2018-04-10

### Added
* New java brand icon FortAwesome/Font-Awesome#386

### Changed
* Updating depth of dna icon
* Updating pied-piper, adding pied-piper-hat

### Fixed
* Correcting path errors on readme icon FortAwesome/Font-Awesome#12754
* Light style of lamp icon FortAwesome/Font-Awesome#12725

---

## [5.0.9](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.9)  - 2018-03-27

### Added
* New Chat icon pack and category
* New Charity icon pack and category
* New Moving icon pack and category
* New icons hands and hand-holding

### Changed
* Updated flipboard, readme, and houzz brand icon
* Making all solid icons in the medical icon pack free
* Updated hand-holding-box and hand-receiving in the Light style

### Fixed
* Missing box-sizing CSS property for fa-layers-counter

---

## [5.0.8](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.8)  - 2018-03-01

### Fixed
* OTF font files missing ligatures for Pro styles FortAwesome/Font-Awesome#12486 FortAwesome/Font-Awesome-Pro#1034

---

## [5.0.7](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.7)  - 2018-02-26

### Added
* New Logistics category
* New Medical category
* Individual SVG files available from the Font Awesome CDN
* Additional search terms

### Changed
* Apple brand icon update FortAwesome/Font-Awesome#12337
* Disable mutation observers with fontawesome.noAuto() is called
* License information now references https URL scheme

### Fixed
* Missing TypeScript names FortAwesome/react-fontawesome#83
* Adding categories metadata FortAwesome/Font-Awesome#12034
* TypeScript improvement for fontawesome.layer()
* Correcting a melting, wobbling, weird-looking whistle

---

## [5.0.6](https://github.com/FortAwesome/Font-Awesome/releases/tag/5.0.6)  - 2018-01-25

### Fixed
* @fortawesome/fontawesome-pro-light missing submodules

---

## [5.0.5](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.5)  - 2018-01-25

### Added
* New Sports category
* New Chess category
* Added brand icons for flipboard, php, quinscape, and hips

### Fixed
* Sass and Less mixin fa-icon() now uses ems instead of percentage
* Corrected misspelling of &quot;Alternate&quot; in category labels
* Improved TypeScript definitions for @fortawesome/fontawesome
* Server-side rendering was failing due to DOM-specific object access
* SVG attributes &quot;data-fa-processed&quot; renamed to &quot;data-fa-i2svg&quot;, only applies if rendered with i2svg() method

---

## [5.0.4](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.4)  - 2018-01-10

### Changed
* Updating all NPM package READMEs

### Fixed
* Improving TypeScript exports and fixing some incorrect definitions
* TypeScript error when importing entire style Fort-Awesome/Font-Awesome#12072
* Pseudo-elements erasing text contents in parent container Fort-Awesome/Font-Awesome-Pro#11995
* fa-layers-text misalignment when using Bootstrap Fort-Awesome/Font-Awesome#11871

---

## [5.0.3](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.3)  - 2018-01-08

### Added
* Adding elementor, youtube-square brand icons
* Adding window-minimize to the Free subset
* TypeScript support for all NPM packages

### Fixed
* Corrected uneven spacing in university, address-book, address-card, id-badge, id-card, mouse-pointer, phone-volume, portrait, user-alt, user-circle, user-md, user-plus, user-times, user , users
* Corrected uneven spacing in brand icons behance-square, dashcube, discourse, ember, erlang, fort-awesome, js-square, laravel, mix, patreon, palfed, phoenix-framework, node-js, skyatlas, stack-exchange, stripe, viber, weixin, yahoo , yoast

---

## [5.0.2](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.2)  - 2017-12-19

### Added
* Adding amazon-pay, cc-amazon-pay, korvue, ethereum brand icons
* Adding stopwatch to Free version

### Changed
* Ligatures now support capital case, all caps, and title case

### Fixed
* NPM packages now behave the same way as CDN and browser-specific packages FortAwesome/Font-Awesome-Pro#727 FortAwesome/Font-Awesome-Pro#896 FortAwesome/Font-Awesome-Pro#891
* Icon doesn&apos;t change when pseudo-element content changes FortAwesome/Font-Awesome-Pro#839
* Invalid XML in sprites FortAwesome/Font-Awesome-Pro#927
* Incorrect version in Sass and Less variable files

---

## [5.0.1](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.1)  - 2017-12-08

### Added
* Adding font-awesome-flag, lock-open, redo-alt, sync-alt, undo-alt to the Free version
* New NPM packages `fontawesome-free-webfonts` and `fontawesome-pro-webfonts`
* Adding old icon names to search terms for renamed icons
* Extensive metadata added to the `advanced-options` directory
* Adding stripe-s brand icon
* Adding typo3 brand icon

### Changed
* Updated dropbox brand icon to match new branding guidelines
* Updated firefox brand icon
* Updated strava brand icon
* OTF font file now include a space character

### Fixed
* OTF font file now supports different styles in Windows
* OTF font file &quot;j&quot; character now has correct space on the right
* Modifying the `class` attribute on an existing `&lt;svg&gt;` allows you to change the icon

---

## [5.0.0](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0)  - 2017-12-01

### Added
* License information

### Changed
* CSS vertical-align now &quot;em&quot;-based instead of percentage making it more consistent
* fa-ul width now closer to default browser size

---

## [5.0.0-rc5](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-rc5)  - 2017-11-28

**This release includes breaking changes**

### Added
* Brand icons: gitter, cc-stripe, stripe, hooli, aviato, strava, ember, angular, font-awesome-flag
* Icons compress-alt and expand-alt
* Adding calendar to Font Awesome 5 Free
* SASS function that makes it easier to use variables FortAwesome/Font-Awesome-Pro#824

### Changed
* BREAKING Renamed icon composition to mask (&quot;data-fa-compose&quot; becomes &quot;data-fa-mask&quot;)
* BREAKING Re-organized directory structure to match upcoming documentation
* BREAKING Font Awesome styles inserted into the `&lt;head&gt;` will now precede other link and style definitions
* BREAKING `fontawesome.text` and `fontawesome.icon` now use `styles` param instead of `style`
* Updated sizing for twitter, discord, youtube
* Class fa-li now respects line-height and has new recommended markup (see included docs)

### Fixed
* Duplicate `style` tags being added in the head FortAwesome/Font-Awesome-Pro#858
* Error with icon composition/masking that caused a confusing error message
* An error when using pseudo elements and the element is empty (Array.reduce error)
* Icons not being replaced with SVG if the text content is not empty

---

## [5.0.0-rc4](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-rc4)  - 2017-10-27

### Added
* Ligature support in the OTF font
* Vue.js brand icon
* Sass and Less brand icons
* Autoprefixer brand icon
* Individual icon imports in icon packages FortAwesome/Font-Awesome-Pro#808

### Changed
* Better poo eyes
* Renamed HTML status classes to `fontawesome-i2svg-active`, `fontawesome-i2svg-pending`, `fontawesome-i2svg-complete`
* HTML status class for active is added only after the first batch of icon replacements occur
* Added mention of newer versions of iOS in documentation FortAwesome/Font-Awesome-Pro#810

### Fixed
* Performance and missing features with mutation observer (should fix FortAwesome/Font-Awesome-Pro#813)
* Incorrect handling of icon class and style attributes when using autoReplace = &apos;nest&apos; FortAwesome/Font-Awesome-Pro#809
* Pseudo elements not added or removed when class mutations occur FortAwesome/Font-Awesome-Pro#821

---

## [5.0.0-rc3](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-rc3)  - 2017-10-13

### Added
* Node.js brand icon FortAwesome/Font-Awesome-Pro#779
* React brand icon FortAwesome/Font-Awesome-Pro#780
* OSI brand icon FortAwesome/Font-Awesome-Pro#748
* Add a class to the html element when icon replacement is complete FortAwesome/Font-Awesome-Pro#778
* Add support for symbols in API including ability to name the symbol
* Use CSS pseudo elements (:before and :after) to make trigger SVG replacements

### Changed
* Switched the locations of fork and knife in utensils-alt FortAwesome/Font-Awesome-Pro#466
* Updated the AWS brand icon FortAwesome/Font-Awesome-Pro#735
* Updated Apple App Store icon FortAwesome/Font-Awesome-Pro#728

### Fixed
* Do not throw an error if icon is missing when calling icon() method in API
* Ensure that unicode values do not change between releases
* Version field is missing in fontawesome-pro-brands/package.json FortAwesome/Font-Awesome-Pro#781
* Repeated commenting out of fa-layers when i2svg is called FortAwesome/Font-Awesome-Pro#788
* Title not showing up correctly for SVG FortAwesome/Font-Awesome-Pro#786

---

## [5.0.0-rc2](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-rc2)  - 2017-09-22

### Added
* Brand icons: accusoft, ns8, uniregistry

### Fixed
* Link to the npm package in the docs FortAwesome/Font-Awesome-Pro#729
* Incorrect reference to fontawesome-pro.js in docs

---

## [5.0.0-rc1](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-rc1)  - 2017-09-15

### Changed
* New Bitbucket logo FortAwesome/Font-Awesome-Pro#720
* Modifed the star icons to match use case better FortAwesome/Font-Awesome-Pro#710
* Switched names of css3 and css3-alt to reflect correct branding

### Fixed
* Correct whitespace with the Visa logo FortAwesome/Font-Awesome-Pro#719
* Improve OTF support by passing through FontForge FortAwesome/Font-Awesome-Pro#565
* Fonts with &quot;undefined&quot; name FortAwesome/Font-Awesome-Pro#711
* Shims will only function if using old prefix of &quot;fa&quot; FortAwesome/Font-Awesome-Pro#692
* Added missing &quot;youtube&quot; icon to categories

---

## [5.0.0-beta7](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta7)  - 2017-09-11

### Added
* Ability to nest the `&lt;svg&gt;` tag within the `&lt;i&gt;` FortAwesome/Font-Awesome-Pro#624
* Define icons as symbols and leverage SVG sprites FortAwesome/Font-Awesome-Pro#629
* Added alternative CSS3 logo FortAwesome/Font-Awesome-Pro#682

### Changed
* Power Transforms now execute inside the SVG instead of on the root element
* Filenames have changed to reflect a better division between Font Awesome Free and Pro

### Fixed
* More improvements to the version 4 shim FortAwesome/Font-Awesome-Pro#673 FortAwesome/Font-Awesome-Pro#678 FortAwesome/Font-Awesome-Pro#686 FortAwesome/Font-Awesome-Pro#687 FortAwesome/Font-Awesome-Pro#692
* Animation support for inline SVG now works as expected FortAwesome/Font-Awesome-Pro#662

---

## [5.0.0-beta6](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta6)  - 2017-09-01

### Added
* Ability to flip horizontal and vertical with CSS classes fa-flip-horizontal and fa-flip-vertical
* New film-alt icon that allows for layering other icons
* Microsoft brand

### Changed
* New YouTube branding FortAwesome/Font-Awesome-Pro#646

### Fixed
* Fixed a bunch of shim-related issues
* Cogs off center FortAwesome/Font-Awesome-Pro#663
* Corrected icons/categories.yml with canonical names

---

## [5.0.0-beta5](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta5)  - 2017-08-25

### Added
* Full parity with Font Awesome 4! 616 total core icons in each style
* 297 total brand and logo icons
* Separate CSS file to accompany the SVG Framework FortAwesome/Font-Awesome-Pro#627
* Alternative to the dots icon FortAwesome/Font-Awesome-Pro#608
* Made window icons consistent FortAwesome/Font-Awesome-Pro#611

### Fixed
* Production builds not correctly being detected FortAwesome/Font-Awesome-Pro#631

---

## [5.0.0-beta4](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta4)  - 2017-08-18

### Added
* 590 total core icons in each style
* 291 total brand and logo icons

### Fixed
* Reduced the size of JS file from 66 to 22 kb
* Regression caused by with web font alignment FortAwesome/Font-Awesome-Pro#460

---

## [5.0.0-beta3](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta3)  - 2017-08-15

### Added
* 583 total core icons in each style

### Fixed
* Documentation improvements and fixes FortAwesome/Font-Awesome-Pro#586
* Vertical alignment of TTF and OTF fonts FortAwesome/Font-Awesome-Pro#460
* The &quot;fa_500px&quot; icon should be named &quot;fa500px&quot; FortAwesome/Font-Awesome-Pro#578

---

## [5.0.0-beta2](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta2)  - 2017-08-11

### Added
* 570 total core icons in each style
* 291 total brand and logo icons
* NPM (ES6, CommonJS, AMD) packages for use with other JavaScript libraries and tools FortAwesome/Font-Awesome-Pro#574
* Added a guide to choosing which implementation is best for you FortAwesome/Font-Awesome-Pro#532

### Changed
* Showing a missing icon is now configurable FortAwesome/Font-Awesome-Pro#569

### Fixed
* Composition framework now works in browsers that do not support transform-origin FortAwesome/Font-Awesome-Pro#564

---

## [5.0.0-beta1](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-beta1)  - 2017-08-04

### Added
* 524 total core icons in each style
* 289 total brand and logo icons
* New composition framework FortAwesome/Font-Awesome-Pro#537
* Animated indicator if you use an icon that does not exist

### Changed
* Basic linting for Sass and Less files
* Add JavaScript guard block to prevent leaking errors
* Add support for automatic accessibility to SVG Framework Layers

### Fixed
* Regression where stacks and pulled and bordered were not working in SVG Framework
* SVG sprite example had confusing inline styles FortAwesome/Font-Awesome-Pro#549
* Make getting started page more consistent between examples FortAwesome/Font-Awesome-Pro#544
* Added missing sizes fa-[6-10], xs, sm FortAwesome/Font-Awesome-Pro#546
* Title tag missing in SVG sprites FortAwesome/Font-Awesome-Pro#536

---

## [5.0.0-alpha7](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha7)  - 2017-07-28

### Added
* 451 total core icons in each style
* 281 total brand and logo icons
* Less support is back!
* OpenType (.otf) file formats for web fonts

### Changed
* Changes the fa-spin animation to go from 0deg to 360deg to eliminate hitch FortAwesome/Font-Awesome-Pro#522
* Improved mutation handling FortAwesome/Font-Awesome-Pro#517

### Fixed
* fa-fw now works correctly with the SVG framework FortAwesome/Font-Awesome-Pro#530
* Removed execute bit on some icon files FortAwesome/Font-Awesome-Pro#520

---

## [5.0.0-alpha6](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha6)  - 2017-07-21

### Added
* 410 total core icons in each style
* 270 total brand and logo icons
* All new Font Awesome 4 shim file
* Beginnings of a public JS API FortAwesome/Font-Awesome-Pro#512

### Changed
* Added Firefox ESR and Chrome for Businesses to browser compatibility FortAwesome/Font-Awesome-Pro#506

### Fixed
* Ensure that SVG title attributes are unique
* Fixed incorrect viewBox sizes FortAwesome/Font-Awesome-Pro#492
* Fix chart-area alignment in the solid style FortAwesome/Font-Awesome-Pro#508
* Add missing xmlns attributes in some SVGs FortAwesome/Font-Awesome-Pro#509

---

## [5.0.0-alpha5](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha5)  - 2017-07-14

### Added
* 228 total brand and logo icons
* New transform framework for sizing, moving, rotating, and flipping icons
* New icon counters
* New layers framework
* New text overlays
* Auto-comments with the original source icons alongside SVG replacements

### Changed
* Autoprefixer to correctly add browser prefixes for supported browsers
* Removed browser-specific CSS properties in Sass source files (now relies on autoprefixer)

### Fixed
* The rotation on checkmark icons
* Other icon feedback from previous weeks
* Correct fixed width settings to 1.25em (based on the new 16px grid)
* Icons displaying as block instead of inline-block in IE and older Safari

---

## [5.0.0-alpha4](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha4)  - 2017-07-07

### Added
* 93 brand icons

---

## [5.0.0-alpha3](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha3)  - 2017-06-30

### Added
* 95 additional icons; including file types, directional, and some existing and new brand icons

### Fixed
* Wrong content type in generated CSS FortAwesome/Font-Awesome-Pro#458
* Removal of query string from static resources FortAwesome/Font-Awesome-Pro#458
* SVG font ID&apos;s are incorrect in webfont implementation FortAwesome/Font-Awesome-Pro#474

---

## [5.0.0-alpha2](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha2)  - 2017-06-27

### Added
* How/When to upgrade from FA4 to FA5 FortAwesome/Font-Awesome-Pro#454

### Fixed
* Links to SVG files broken in the example files FortAwesome/Font-Awesome-Pro#456
* Misnamed icon names in examples FortAwesome/Font-Awesome-Pro#445
* Mangled HTML in the Getting Started example FortAwesome/Font-Awesome-Pro#442
* Bad grammar and typos FortAwesome/Font-Awesome-Pro#443
* fas-arrow-to-top is identical to fas-arrow-to-right FortAwesome/Font-Awesome-Pro#423
* Vertical alignment issues with webfont implementation FortAwesome/Font-Awesome-Pro#444
* Add browser compatibility tables to demo FortAwesome/Font-Awesome-Pro#435
* Remove MAC OS feces from builds FortAwesome/Font-Awesome-Pro#437
* TTF naming issues that prevent correct usage/installation FortAwesome/Font-Awesome-Pro#450
* Correct CSS for SVG framework stacking, was reversed from normal FortAwesome/Font-Awesome-Pro#452

---

## [5.0.0-alpha1](https://github.com/FortAwesome/Font-Awesome-Pro/releases/tag/5.0.0-alpha1)  - 2017-06-23

### Added
* 300+ more icons
* Brands pack
* New JavaScript based SVG Framework
* New SVG Sprites based framework
* Source SVGs
* Documentation with a convenient build-in web server

### Changed
* New directory structure
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/CHANGELOG/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Upgrading Guide</title>
            <description># Upgrading Guide

See the [CHANGELOG.md](/assets/bower_components/font-awesome/CHANGELOG/) for detailed information about what has changed between versions.

This guide is useful to figure out what you need to do between breaking changes.

As always, [submit issues](https://github.com/FortAwesome/Font-Awesome/issues/new) that you run into with this guide or with these upgrades to us.

## 5.0.x to 5.1.0

### New packages available for browser-only integration

**If you were previously using @fortawesome/fontawesome you need to switch to one of the new packages.**

Our Free and Pro CDN provide access to JS, CSS, sprites, and separate SVG files.

We&apos;ve now made these files conveniently available through NPM.

* [@fortawesome/fontawesome-free](https://www.npmjs.com/package/@fortawesome/fontawesome-free)
* @fortawesome/fontawesome-pro (private package, requires Pro subscription)

If you are familiar with the paths and options available with the CDN these
packages should be familiar.

Information about [Font Awesome Pro subscriptions](https://fontawesome.com/pro)
can be found in your [Font Awesome awesome
account](https://fontawesome.com/account/services).

### Renamed packages

The following packages have been renamed as part of 5.1.0 of Font Awesome.

_All packages are in the [@fortawesome NPM scope](https://www.npmjs.com/search?q=scope:fortawesome&amp;page=1&amp;ranking=optimal)_

| Old package(1)            | New package            |
|---------------------------|------------------------|
| fontawesome-free-webfonts | fontawesome-free       |
| fontawesome-pro-webfonts  | fontawesome-pro        |
| fontawesome-free-solid    | free-solid-svg-icons   |
| fontawesome-free-regular  | free-regular-svg-icons |
| fontawesome-free-brands   | free-brands-svg-icons  |
| fontawesome-pro-solid     | pro-solid-svg-icons    |
| fontawesome-pro-regular   | pro-regular-svg-icons  |
| fontawesome-pro-light     | pro-light-svg-icons    |

(1) Old packages have now been deprecated. They are still available but will only receive high priority patch release fixes.

**You&apos;ll need to update your package.json file with the renamed packages and new versions.**

### No more default imports

Recently we spent a good deal of time supporting TypeScript to enable us to
create the Angular Font Awesome component. During that adventure we
[were](https://basarat.gitbooks.io/typescript/docs/tips/defaultIsBad.html)
[convinced](https://blog.neufund.org/why-we-have-banned-default-exports-and-you-should-do-the-same-d51fdc2cf2ad)
that we were going to remove default exports from all of our components,
libraries, and packages. This is complete with the umbrella release of `5.1.0` of Font Awesome.

What does that mean?

~~Old way:~~

```javascript
import fontawesome from &apos;@fortawesome/fontawesome&apos;
import solid from &apos;@fortawesome/fontawesome-free-solid&apos;
import faTwitter from &apos;@fortawesome/fontawesome-free-brands/faTwitter&apos;
import FontAwesomeIcon from &apos;@fortawesome/vue-fontawesome&apos;

library.add(solid, faTwitter)
```

New way:

```javascript
import { library, dom } from &apos;@fortawesome/fontawesome-svg-core&apos;
import { fas } from &apos;@fortawesome/free-solid-svg-icons&apos;
import { faTwitter } from &apos;@fortawesome/free-brands-svg-icons&apos;
import { FontAwesomeIcon } from &apos;@fortawesome/vue-fontawesome&apos;

library.add(fas, faTwitter)

// Kicks off the process of finding &lt;i&gt; tags and replacing with &lt;svg&gt;
dom.watch()
```

This is also a valid way to import icons that works if your tool does not support tree shaking:

```javascript
import { faTwitter } from &apos;@fortawesome/free-brands-svg-icons/faTwitter&apos;
```

### Improved support for tree shaking

Tree shaking is now functional by default and no additional configuration is required to make it work.

The `shakable.es.js` module has been removed and is no longer needed.

If you&apos;ve previously configured tree shaking by modifying your webpack or rollup you can safely remove these.

**We recommend that you check your bundle size after upgrading an ensure that file sizes are as you would expect.**

```javascript
module.exports = {
  // ...
  resolve: {
    alias: {
      &apos;@fortawesome/fontawesome-free-solid$&apos;: &apos;@fortawesome/fontawesome-free-solid/shakable.es.js&apos;
    }
  }
}
```

```javascript
const alias = require(&apos;rollup-plugin-alias&apos;)

rollup({
  // ...
  plugins: [
    alias({
      &apos;@fortawesome/fontawesome-free-solid&apos;: &apos;node_modules/@fortawesome/fontawesome-free-solid/shakable.es.js&apos;
    })
  ]
})
```

## 5.0.11 to 5.0.12

Due to a collision with the &quot;r&quot; glyph the R Project brand icon has been renamed to `r-project`.

## 5.0.x to 5.0.6

### SVG Attribute was changed from data-fa-processed to data-fa-i2svg

As part of a bug fix for the release of 5.0.6 we renamed an attribute that was found on `&lt;svg&gt;` elements from
`data-fa-processed` to `data-fa-i2svg`. We feel this more accurately reflects the intent and purpose.

This attribute is added to any icon that has been generated using `fontawesome.dom.i2svg()`.

Be aware that `data-fa-i2svg` (or `data-fa-processed`) will no longer be present on icons that are created using
`fontawesome.icon()`.

If you&apos;ve written and DOM queries that rely on `data-fa-processed` you should get things working again by doing a
simple find and replace.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/UPGRADING/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Mouse Wheel ChangeLog</title>
            <description># Mouse Wheel ChangeLog

## 3.1.13

* Update copyright notice and license to remove years
* Create the correct compressed version
* Remove the obsolete jQuery Plugin Registry file

## 3.1.12

* Fix possible 0 value for line height when in delta mode 1

## 3.1.11

* Fix version number for package managers...

## 3.1.10

* Fix issue with calculating line height when using older versions of jQuery
* Add offsetX/Y normalization with setting to turn it off
* Cleans up data on teardown

## 3.1.9

* Fix bower.json file
* Updated how the deltas are adjusted for older mousewheel based events that have deltas that are factors of 120.
* Add $.event.special.mousewheel.settings.adjustOldDeltas (defaults to true) to turn off adjusting of old deltas that are factors of 120. You&apos;d turn this off if you want to be as close to native scrolling as possible.

## 3.1.8

* Even better handling of older browsers that use a wheelDelta based on 120
* And fix version reported by `$.event.special.mousewheel`

## 3.1.7

* Better handle the `deltaMode` values 1 (lines) and 2 (pages)
* Attempt to better handle older browsers that use a wheelDelta based on 120

## 3.1.6

* Deprecating `delta`, `deltaX`, and `deltaY` event handler arguments
* Update actual event object with normalized `deltaX `and `deltaY` values (`event.deltaX`, `event.deltaY`)
* Add `deltaFactor` to the event object (`event.deltaFactor`)
* Handle `&gt; 0` but `&lt; 1` deltas better
* Do not fire the event if `deltaX` and `deltaY` are `0`
* Better handle different devices that give different `lowestDelta` values
* Add `$.event.special.mousewheel.version`
* Some clean up

## 3.1.5

* Bad release because I did not update the new `$.event.special.mousewheel.version`

## 3.1.4

* Always set the `deltaY`
* Add back in the `deltaX` and `deltaY` support for older Firefox versions

## 3.1.3

* Include `MozMousePixelScroll` in the to fix list to avoid inconsistent behavior in older Firefox

## 3.1.2

* Include grunt utilities for development purposes (jshint and uglify)
* Include support for browserify
* Some basic cleaning up

## 3.1.1

* Fix rounding issue with deltas less than zero


## 3.1.0

* Fix Firefox 17+ issues by using new wheel event
* Normalize delta values
* Adds horizontal support for IE 9+ by using new wheel event
* Support AMD loaders


## 3.0.6

* Fix issue with delta being 0 in Firefox


## 3.0.5

* jQuery 1.7 compatibility


## 3.0.4

* Fix IE issue


## 3.0.3

* Added `deltaX` and `deltaY` for horizontal scrolling support (Thanks to Seamus Leahy)


## 3.0.2

* Fixed delta being opposite value in latest Opera
* No longer fix `pageX`, `pageY` for older Mozilla browsers
* Removed browser detection
* Cleaned up the code


## 3.0.1

* Bad release... creating a new release due to plugins.jquery.com issue :(


## 3.0

* Uses new special events API in jQuery 1.2.2+
* You can now treat `mousewheel` as a normal event and use `.bind`, `.unbind` and `.trigger`
* Using jQuery.data API for expandos


## 2.2

* Fixed `pageX`, `pageY`, `clientX` and `clientY` event properties for Mozilla based browsers


## 2.1.1

* Updated to work with jQuery 1.1.3
* Used one instead of bind to do unload event for clean up


## 2.1

* Fixed an issue with the unload handler


## 2.0

* Major reduction in code size and complexity (internals have change a whole lot)


## 1.0

* Fixed Opera issue
* Fixed an issue with children elements that also have a mousewheel handler
* Added ability to handle multiple handlers
</description>
            <link>https://abdes.net/assets/bower_components/jquery-mousewheel/ChangeLog/</link>
          </item>
        
      
    
      
        
          <item>
            <title></title>
            <description>2025-01-23T16:49:40+01:00 [024148c277d17c002d8f3693cffac5fc1141bbc7]
Compilation error in c3-diagram.js: Missing initializer in destructuring declaration in useEffect dependency array
</description>
            <link>https://abdes.net/docs/MyRequestsHistory/</link>
          </item>
        
      
    
      
        
          <item>
            <title></title>
            <description>1. _layouts/home.html
Purpose: Main layout orchestrator for the homepage Key Controls:

Overall page structure and content flow
Content wrapper positioning and width (75% of viewport)
Spacing between sections (margin-top: -4rem)
Important Parameters:

html
CopyInsert
&lt;div class=&quot;content-wrapper&quot; style=&quot;margin-top: -4rem; width: 75%;&quot;&gt;
Controls spacing between hero and content
Centers content with auto margins
Includes recent articles and blog summary sections
2. _includes/hero.html
Purpose: Controls the hero section with video and stage picture Key Controls:

Video container (left side)
Stage picture container (right side)
Introductory text overlay
Important Parameters:

css
CopyInsert
.video-container {
    width: 10%;
    margin-right: 0.5rem;
    min-height: 224px;
    margin-left: 0.1%;
}

.jumbotron-image-container {
    width: 90%;
    min-height: 320px;
    opacity: 0.7;
}

.jumbotron-content {
    width: min(30%, 400px);
    font-size: 0.95rem;
    background: rgba(255, 255, 255, 0.85);
}
3. _includes/header.html
Purpose: Navigation bar and banner Key Controls:

Top navigation menu
Site title
Menu items and their spacing
Mobile responsiveness
Important Parameters:

html
CopyInsert
&lt;nav class=&quot;navbar navbar-expand-lg fixed-top navbar-dark&quot; id=&quot;topNav&quot;&gt;
Fixed positioning at top
Dark theme
Responsive collapse for mobile
Menu item spacing (margin-right: 10px)
4. _sass/devlopr.scss
Purpose: Global styling and theme configuration Key Controls:

Color schemes (light/dark modes)
Typography
Spacing
Background colors
Important Parameters:

scss
CopyInsert
body {
    background: linear-gradient(to right, rgb(103, 2, 2), rgb(182, 0, 0));
    padding-top: 5rem;  // Space below banner
    font-size: 1.4rem;
    font-family: &apos;type-face&apos;, sans-serif;
}
5. _includes/blog_newsletter.html
Purpose: Newsletter subscription section Key Controls:

Yellow newsletter box
Subscription form
Button styling
Important Parameters:

css
CopyInsert
.newsletter {
    background-color: #f8f9fa;
    padding: 2rem;
    border-radius: 8px;
}
6. _includes/content.html
Purpose: Displays recent blog posts Key Controls:

Article cards layout
Post previews
Thumbnails and excerpts
Important Parameters:

html
CopyInsert
&lt;div class=&quot;card blog-post&quot;&gt;
    &lt;img class=&quot;card-img-top&quot; src=&quot;{{post.thumbnail}}&quot;&gt;
    &lt;div class=&quot;card-body center&quot;&gt;
        &lt;!-- Post content --&gt;
    &lt;/div&gt;
&lt;/div&gt;
7. _includes/blog_summary.html
Purpose: Blog posts overview section Key Controls:

Post listings
Categories
Post metadata
Important Parameters:

html
CopyInsert
&lt;div class=&quot;row&quot;&gt;
    {% for post in site.posts limit:6 %}
    &lt;!-- Post display logic --&gt;
    {% endfor %}
&lt;/div&gt;
8. _sass/abde_blue_devlopr.scss
Purpose: Custom theme overrides Key Controls:

Custom color schemes
Specific component styling
Theme variations
Important Parameters:

scss
CopyInsert
:root {
    --custom-theme-color: #your-color;
    --custom-background: #your-bg-color;
}
9. _includes/blog_post_article.html
Purpose: Individual blog post layout Key Controls:

Post content formatting
Share buttons
Author information
Comments section
Important Parameters:

html
CopyInsert
&lt;div class=&quot;card&quot;&gt;
    &lt;h1 class=&quot;post-title&quot;&gt;{{page.title}}&lt;/h1&gt;
    &lt;div class=&quot;post-content&quot;&gt;
        {{ content }}
    &lt;/div&gt;
&lt;/div&gt;
Responsive Design Controls
All files include media queries for different screen sizes:

css
CopyInsert
/* Tablets */
@media (max-width: 992px) {
    /* Tablet-specific styles */
}

/* Mobile */
@media (max-width: 768px) {
    /* Mobile-specific styles */
}
This structure allows for:

Clean separation of concerns
Easy maintenance
Flexible content positioning
Responsive design across devices
Theme customization
Content organization</description>
            <link>https://abdes.net/docs/architecture/</link>
          </item>
        
      
    
      
        
          <item>
            <title>How to Create a Custom Newsletter Form with Google Forms Backend</title>
            <description># How to Create a Custom Newsletter Form with Google Forms Backend

## Overview
This guide explains how to create a professional newsletter signup form using Google Forms as the backend, without showing the Google Forms interface.

## Step-by-Step Process

### 1. Google Form Setup
1. Create a Google Form with an email field
2. Get the form ID from the URL (after /e/)
3. Get the entry ID for the email field:
   - Inspect form source code
   - Look for `FB_PUBLIC_LOAD_DATA_`
   - Entry ID format: `entry.XXXXXXXX`

### 2. HTML Form Structure
```html
&lt;form action=&quot;https://docs.google.com/forms/d/e/YOUR_FORM_ID/formResponse&quot; 
      method=&quot;post&quot; 
      target=&quot;_blank&quot;
      id=&quot;subscribe-form&quot;
      onsubmit=&quot;return handleSubmit(event);&quot;&gt;
    &lt;div class=&quot;input-group&quot;&gt;
        &lt;input 
            type=&quot;email&quot; 
            name=&quot;entry.YOUR_ENTRY_ID&quot;
            placeholder=&quot;Your email address&quot; 
            required
        &gt;
        &lt;button type=&quot;submit&quot;&gt;Subscribe&lt;/button&gt;
    &lt;/div&gt;
    &lt;div id=&quot;form-status&quot;&gt;&lt;/div&gt;
&lt;/form&gt;
```

### 3. JavaScript Handler
```javascript
function handleSubmit(event) {
    const form = document.getElementById(&apos;subscribe-form&apos;);
    const status = document.getElementById(&apos;form-status&apos;);
    
    // Create hidden iframe for response
    let iframe = document.querySelector(&apos;iframe[name=&quot;hidden_iframe&quot;]&apos;);
    if (!iframe) {
        iframe = document.createElement(&apos;iframe&apos;);
        iframe.name = &apos;hidden_iframe&apos;;
        document.body.appendChild(iframe);
    }
    
    // Set form target to iframe
    form.target = &apos;hidden_iframe&apos;;
    
    // Show success message
    status.textContent = &apos;Subscribing...&apos;;
    setTimeout(() =&gt; {
        status.textContent = &apos;Thanks for subscribing!&apos;;
        form.reset();
        setTimeout(() =&gt; {
            status.textContent = &apos;&apos;;
        }, 3000);
    }, 1000);
    
    return true;
}
```

### 4. CSS Styling
```css
/* Container styles */
.form-container {
    max-width: 500px;
    margin: 0 auto;
}

/* Input group */
.input-group {
    display: flex;
    gap: 10px;
    margin-bottom: 10px;
}

/* Email input */
#email-input {
    flex: 1;
    padding: 10px 15px;
    border: 2px solid rgba(255, 255, 255, 0.2);
    border-radius: 4px;
    background: rgba(255, 255, 255, 0.1);
    color: white;
}

/* Submit button */
.submit-btn {
    padding: 10px 20px;
    background: #ffffff;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

/* Hide Google response */
iframe[name=&quot;hidden_iframe&quot;] {
    display: none;
}

/* Mobile responsiveness */
@media (max-width: 768px) {
    .input-group {
        flex-direction: column;
    }
    .submit-btn {
        width: 100%;
    }
}
```

## Important Notes

### Common Gotchas
- Wrong entry ID format (must include &quot;entry.&quot; prefix)
- Incorrect form action URL
- Trying to use JavaScript fetch/AJAX (won&apos;t work due to CORS)
- Not handling the response page properly

### Best Practices
1. Always use direct form submission
2. Include proper error handling
3. Show clear user feedback
4. Make the form responsive
5. Test on multiple devices
6. Verify submissions in Google Forms

### Testing Checklist
- [ ] Submit test email
- [ ] Check Google Form responses
- [ ] Test on mobile devices
- [ ] Verify success message
- [ ] Check form reset
- [ ] Test in different browsers

## Benefits
- Professional appearance
- No Google Forms branding
- Reliable submission handling
- Good user experience
- Mobile-friendly
- Free to use
- Easy maintenance

## Maintenance
1. Regularly check Google Form responses
2. Monitor submission success rate
3. Update styling as needed
4. Test periodically on new browsers/devices
</description>
            <link>https://abdes.net/docs/custom_newsletter_setup/</link>
          </item>
        
      
    
      
        
          <item>
            <title>matchesSelector helper</title>
            <description># matchesSelector helper

[`matches`/`matchesSelector`](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches) is pretty hot :fire:, but has [vendor-prefix baggage](http://caniuse.com/#feat=matchesselector) :handbag: :pouch:. This helper function takes care of that, without polyfilling or augmenting `Element.prototype`.

``` js
matchesSelector( elem, selector );
// for example
matchesSelector( myElem, &apos;div.my-hawt-selector&apos; );
```

## Install

Download [matches-selector.js](https://github.com/desandro/matches-selector/raw/master/matches-selector.js)

Install with [Bower](http://bower.io): `bower install matches-selector`

[Install with npm](https://www.npmjs.org/package/desandro-matches-selector): `npm install desandro-matches-selector`

## Browser support

IE10+, all modern browsers

Use [matchesSelector v1](https://github.com/desandro/matches-selector/releases/tag/v1.0.3) for IE8 and IE9 support.

## MIT license

matchesSelector is released under the [MIT license](http://desandro.mit-license.org)
</description>
            <link>https://abdes.net/assets/bower_components/desandro-matches-selector/</link>
          </item>
        
      
    
      
        
          <item>
            <title>EvEmitter</title>
            <description># EvEmitter

_Lil&apos; event emitter_ — add a little pub/sub

EvEmitter adds publish/subscribe pattern to a browser class. It&apos;s a smaller version of [Olical/EventEmitter](https://github.com/Olical/EventEmitter). That EventEmitter is full featured, widely used, and great. This EvEmitter has just the base event functionality to power the event API in libraries like [Isotope](http://isotope.metafizzy.co), [Flickity](http://flickity.metafizzy.co), [Masonry](http://masonry.desandro.com), and [imagesLoaded](http://imagesloaded.desandro.com).

## API

``` js
// Inherit prototype, IE8+
MyClass.prototype = new EvEmitter();

// Inherit prototype, IE9+
MyClass.prototype = Object.create( EvEmitter.prototype );

// Mixin prototype
_.extend( MyClass.prototype, EvEmitter.prototype );

// single instance
var emitter = new EvEmitter();
```

### on

Add an event listener.

``` js
emitter.on( eventName, listener )
```

+ `eventName` - _String_ - name of the event
+ `listener` - _Function_

### off

Remove an event listener.

``` js
emitter.off( eventName, listener )
```

### once

Add an event listener to be triggered only once.

``` js
emitter.once( eventName, listener )
```

### emitEvent

Trigger an event.

``` js
emitter.emitEvent( eventName, args )
```

+ `eventName` - _String_ - name of the event
+ `args` - _Array_ - arguments passed to listeners

### allOff

Removes all event listeners.

``` js
emitter.allOff()
```

## Code example

``` js
// create event emitter
var emitter = new EventEmitter();

// listeners
function hey( a, b, c ) {
  console.log( &apos;Hey&apos;, a, b, c )
}

function ho( a, b, c ) {
  console.log( &apos;Ho&apos;, a, b, c )
}

function letsGo( a, b, c ) {
  console.log( &apos;Lets go&apos;, a, b, c )
}

// bind listeners
emitter.on( &apos;rock&apos;, hey )
emitter.once( &apos;rock&apos;, ho )
// trigger letsGo once
emitter.on( &apos;rock&apos;, letsGo )

// emit event
emitter.emitEvent( &apos;rock&apos;, [ 1, 2, 3 ] )
// =&gt; &apos;Hey&apos;, 1, 2, 3
// =&gt; &apos;Ho&apos;, 1, 2, 3
// =&gt; &apos;Lets go&apos;, 1, 2, 3

// unbind
emitter.off( &apos;rock&apos;, ho )

emitter.emitEvent( &apos;rock&apos;, [ 4, 5, 6 ] )
// =&gt; &apos;Hey&apos; 4, 5, 6
```

## License

EvEmitter is released under the [MIT License](http://desandro.mit-license.org/). Have at it.
</description>
            <link>https://abdes.net/assets/bower_components/ev-emitter/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Fizzy UI utils</title>
            <description># Fizzy UI utils

UI utility &amp; helper functions

Used in [Flickity](http://flickity.metafizzy.co), [Isotope](http://isotope.metafizzy.co), [Masonry](http://masonry.desandro.com), [Draggabilly](http://draggabilly.desandro.com)

## Install

Bower: `bower install fizzy-ui-utils --save`

npm: `npm install fizzy-ui-utils --save`

## API

``` js
// fizzyUIUtils is the browser global
var utils = fizzyUIUtils;

// ---- ---- //

utils.extend( a, b )
// extend object

utils.modulo( num, div )
// num [modulo] div

utils.makeArray( obj )
// make array from object

utils.removeFrom( ary, obj )
// remove object from array

utils.getParent( elem, selector )
// get parent element of an element, given a selector string

utils.getQueryElement( elem )
// if elem is a string, use it as a selector and return element

Class.prototype.handleEvent = utils.handleEvent;
// enable Class.onclick when element.addEventListener( &apos;click&apos;, this, false )

utils.filterFindElements( elems, selector )
// iterate through elems, filter and find all elements that match selector

utils.debounceMethod( Class, methodName, threhold )
// debounce a class method

utils.docReady( callback )
// trigger callback on document ready

utils.toDashed( str )
// &apos;camelCaseString&apos; -&gt; &apos;camel-case-string&apos;

utils.htmlInit( Class, namespace )
// on document ready, initialize Class on every element
// that matches js-namespace
// pass in JSON options from element&apos;s data-options-namespace attribute
```

---

[MIT license](http://desandro.mit-license.org/). Have at it.

By [Metafizzy](http://metafizzy.co)
</description>
            <link>https://abdes.net/assets/bower_components/fizzy-ui-utils/</link>
          </item>
        
      
    
      
        
          <item>
            <title></title>
            <description>&lt;h1&gt;&lt;img src=&quot;https://img.fortawesome.com/349cfdf6/logo-fa-free.svg&quot; alt=&quot;Font Awesome 5 Free&quot; width=&quot;50%&quot;&gt;&lt;/h1&gt;

&gt; Version 5 – the iconic SVG, font, and CSS framework

The internet&apos;s most popular icon toolkit has been redesigned and built from
scratch. On top of this, features like icon font ligatures, an SVG framework,
official NPM packages for popular frontend libraries like React, and access to
a new CDN.

Not familiar with Font Awesome 5? [Learn
more](https://www.kickstarter.com/projects/232193852/font-awesome-5) about our
successful Kickstarter and plan. You can also **[order Font Awesome
Pro](https://fontawesome.com/pro)** which includes tons more icons directly
from [fontawesome.com](https://fontawesome.com).

## Get started with 5!

Learn how to [get started](https://fontawesome.com/get-started) with Font Awesome or dive deeper into [other topics](https://fontawesome.com/how-to-use).

* [SVG with JS](https://fontawesome.com/how-to-use/svg-with-js)
* [Web Fonts with CSS](https://fontawesome.com/how-to-use/web-fonts-with-css)
* [Use on the Desktop](https://fontawesome.com/how-to-use/use-on-desktop)
* [Use with Node.js](https://fontawesome.com/how-to-use/use-with-node-js)
* [JS Component Packages](https://fontawesome.com/how-to-use/js-component-packages)
* [SVG Sprites](https://fontawesome.com/how-to-use/svg-sprites)
* [Upgrading from Version 4](https://fontawesome.com/how-to-use/upgrading-from-4)
* [Server Side Rendering](https://fontawesome.com/how-to-use/server-side-rendering)
* [Font Awesome API](https://fontawesome.com/how-to-use/font-awesome-api)
* [Performance and Security](https://fontawesome.com/how-to-use/performance-and-security)
* [Accessibility](https://fontawesome.com/how-to-use/accessibility)

### Where did Font Awesome 4 (or 3) go?

Now that Font Awesome 5 has been released we are marking version 4 as
end-of-life. We don&apos;t plan on releasing any further versions of the 4.x or 3.x.

Documentation is still available but it&apos;s moved to
[https://fontawesome.com/v4.7.0](https://fontawesome.com/v4.7.0) and
[https://fontawesome.com/v3.2.1](https://fontawesome.com/v3.2.1).

The Git repository for
[v4.7.0](https://github.com/FortAwesome/Font-Awesome/releases/tag/v4.7.0) and
[v3.2.1](https://github.com/FortAwesome/Font-Awesome/releases/tag/v3.2.1) can
be found in our GitHub releases.

## Change log

We&apos;ll keep track of each release in the [CHANGELOG.md](/assets/bower_components/font-awesome/CHANGELOG/)

Looking for older versions of Font Awesome? Check the [releases](https://github.com/FortAwesome/Font-Awesome/releases).

## Upgrading

From time-to-time we&apos;ll have special upgrading instructions from one version to the next.

Check out the [UPGRADING.md](/assets/bower_components/font-awesome/UPGRADING/) guide when you upgrade your dependencies.

## Code of conduct

We will behave ourselves if you behave yourselves. For more details see our
[CODE_OF_CONDUCT.md](/assets/bower_components/font-awesome/CODE_OF_CONDUCT.md).

## Contributing

Please read through our [contributing guidelines](/assets/bower_components/font-awesome/CONTRIBUTING.md).  Included
are directions for opening issues.

## Versioning

Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered
with the following format:

`&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt;`

For more information on SemVer, please visit http://semver.org.

**The major version &quot;5&quot; is part of an umbrella release.  It includes many different types of files and technologies. Therefore
we deviate from normal SemVer in the following ways:**

* Any release may update the design, look-and-feel, or branding of an existing
  icon
* We will never intentionally release a `patch` version update that breaks
  backward compatibility
* A `minor` release **may include backward-incompatible changes** but we will
  write clear upgrading instructions in UPGRADING.md
* A `minor` or `patch` release will never remove icons
* Bug fixes will be addressed as `patch` releases unless they include backward
  incompability then they will be `minor` releases

## License

Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.

- Icons — CC BY 4.0 License
  - In the Font Awesome Free download, the CC BY 4.0 license applies to all icons packaged as .svg and .js files types.
- Fonts — SIL OFL 1.1 License
  - In the Font Awesome Free download, the SIL OLF license applies to all icons packaged as web and desktop font files.
- Code — MIT License
  - In the Font Awesome Free download, the MIT license applies to all non-font and non-icon files.

Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn&apos;t need to do anything additional when using these
files normally.

We&apos;ve kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They&apos;re a great way for folks to
learn about Font Awesome.

## Team

* [Dave Gandy](https://github.com/davegandy)
* [Travis Chase](https://github.com/supercodepoet)
* [Rob Madole](https://github.com/robmadole)
* [Brian Talbot](https://github.com/talbs)
* [Jory Raphael](https://github.com/sensibleworld)
* [Mike Wilkerson](https://github.com/mlwilkerson)
* [Geremia Taglialatela](https://github.com/tagliala)
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-common-types - SVG with JavaScript</title>
            <description># @fortawesome/fontawesome-common-types - SVG with JavaScript

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-common-types.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-common-types)

## What is this package?

Font Awesome 5 JavaScript packages support TypeScript. This package abstracts out some of the common definitions that those packages use.

## Here be dragons

If you are trying to import types from this package we *highly* recommend you do the following instead as *all types in this package are re-exported to the main fontawesome package*.

your.ts

```
import {
  IconName
} from `@fortawesome/fontawesome`

const myIcon: IconName = &quot;...&quot;
```

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-common-types/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-free-brands - SVG with JavaScript version</title>
            <description># @fortawesome/fontawesome-free-brands - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-free-brands.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-free-brands)

## Installation

```
$ npm i --save @fortawesome/fontawesome-free-brands
```

Or

```
$ yarn add @fortawesome/fontawesome-free-brands
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-free-brands/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-free-regular - SVG with JavaScript version</title>
            <description># @fortawesome/fontawesome-free-regular - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-free-regular.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-free-regular)

## Installation

```
$ npm i --save @fortawesome/fontawesome-free-regular
```

Or

```
$ yarn add @fortawesome/fontawesome-free-regular
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-free-regular/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-free-solid - SVG with JavaScript version</title>
            <description># @fortawesome/fontawesome-free-solid - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-free-solid.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-free-solid)

## Installation

```
$ npm i --save @fortawesome/fontawesome-free-solid
```

Or

```
$ yarn add @fortawesome/fontawesome-free-solid
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-free-solid/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-free-webfonts - Web Fonts with CSS version</title>
            <description># @fortawesome/fontawesome-free-webfonts - Web Fonts with CSS version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-free-webfonts.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-free-webfonts)

## Installation

```
$ npm i --save @fortawesome/fontawesome-free-webfonts
```

Or

```
$ yarn add @fortawesome/fontawesome-free-webfonts
```

## What is this package?

This package includes CSS, Less, SCSS, and the individual web font files needed to get Font Awesome 5 Web Fonts with CSS working in your freeject.

Inside `node_modules/@fortawesome/fontawesome-free-webfonts` you&apos;ll find the following directories:

* `css`
* `less`
* `scss`
* `webfonts`

It&apos;s up to you to configure your build tool to use these.

## Documentation

Get started [here](https://fontawesome.com/get-started/web-fonts-with-css). Continue your journey [here](https://fontawesome.com/how-to-use/web-fonts-with-css).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-free-webfonts/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-free - The Official Font Awesome 5 NPM package</title>
            <description># @fortawesome/fontawesome-free - The Official Font Awesome 5 NPM package

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-free.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-free)

## Installation

```
$ npm i --save @fortawesome/fontawesome-free
```

Or

```
$ yarn add @fortawesome/fontawesome-free
```

## What&apos;s included?

**This package includes all the same files available through our Free and Pro CDN.**

* /js - All JavaScript files associated with Font Awesome 5 SVG with JS
* /css - All CSS using the classic Web Fonts with CSS implementation
* /sprites - SVG icons packaged in a convenient sprite
* /scss, /less - CSS Pre-processor files for Web Fonts with CSS
* /webfonts - Accompanying files for Web Fonts with CSS
* /svg - Individual icon files in SVG format

## Documentation

Get started [here](https://fontawesome.com/get-started). Continue your journey [here](https://fontawesome.com/how-to-use).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-free/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome-svg-core - SVG with JavaScript version</title>
            <description># @fortawesome/fontawesome-svg-core - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome-svg-core.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome-svg-core)

## Installation

```
$ npm i --save @fortawesome/fontawesome-svg-core
```

Or

```
$ yarn add @fortawesome/fontawesome-svg-core
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome-svg-core/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/fontawesome - SVG with JavaScript version</title>
            <description># @fortawesome/fontawesome - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/fontawesome.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/fontawesome)

## Installation

```
$ npm i --save @fortawesome/fontawesome
```

Or

```
$ yarn add @fortawesome/fontawesome
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/fontawesome/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/free-brands-svg-icons - SVG with JavaScript version</title>
            <description># @fortawesome/free-brands-svg-icons - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/free-brands-svg-icons.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/free-brands-svg-icons)

## Installation

```
$ npm i --save @fortawesome/free-brands-svg-icons
```

Or

```
$ yarn add @fortawesome/free-brands-svg-icons
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/free-brands-svg-icons/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/free-regular-svg-icons - SVG with JavaScript version</title>
            <description># @fortawesome/free-regular-svg-icons - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/free-regular-svg-icons.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/free-regular-svg-icons)

## Installation

```
$ npm i --save @fortawesome/free-regular-svg-icons
```

Or

```
$ yarn add @fortawesome/free-regular-svg-icons
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/free-regular-svg-icons/</link>
          </item>
        
      
    
      
        
          <item>
            <title>@fortawesome/free-solid-svg-icons - SVG with JavaScript version</title>
            <description># @fortawesome/free-solid-svg-icons - SVG with JavaScript version

&gt; &quot;I came here to chew bubblegum and install Font Awesome 5 - and I&apos;m all out of bubblegum&quot;

[![npm](https://img.shields.io/npm/v/@fortawesome/free-solid-svg-icons.svg?style=flat-square)](https://www.npmjs.com/package/@fortawesome/free-solid-svg-icons)

## Installation

```
$ npm i --save @fortawesome/free-solid-svg-icons
```

Or

```
$ yarn add @fortawesome/free-solid-svg-icons
```

## Documentation

Get started [here](https://fontawesome.com/get-started/svg-with-js). Continue your journey [here](https://fontawesome.com/how-to-use/svg-with-js).

Or go straight to the [API documentation](https://fontawesome.com/how-to-use/font-awesome-api).

## Issues and support

Start with [GitHub issues](https://github.com/FortAwesome/Font-Awesome/issues) and ping us on [Twitter](https://twitter.com/fontawesome) if you need to.
</description>
            <link>https://abdes.net/assets/bower_components/font-awesome/advanced-options/use-with-node-js/free-solid-svg-icons/</link>
          </item>
        
      
    
      
        
          <item>
            <title>getSize</title>
            <description># getSize

Get the size of elements. Used in [Masonry](https://masonry.desandro.com), [Isotope](https://isotope.metafizzy.co), &amp;  [Flickity](https://flickity.metafizzy.co). 

``` js
var size = getSize( elem );
// elem can be an element
var size = getSize( document.querySelector(&apos;.selector&apos;) )
// elem can be a selector string
var size = getSize(&apos;.selector&apos;)
```

Returns an object with: 

+ width, height
+ innerWidth, innerHeight
+ outerWidth, outerHeight
+ paddingLeft, paddingTop, paddingRight, paddingBottom
+ marginLeft, marginTop, marginRight, marginBottom
+ borderLeftWidth, borderTopWidth, borderRightWidth, borderBottomWidth
+ isBorderBox

Browser support: IE10+, Android 4.0+, iOS 5+, and modern browsers

## Install

Install with npm: `npm install get-size`

Install with [Bower](https://bower.io): `bower install get-size`

## Firefox hidden iframe bug

[Firefox has an old bug](https://bugzilla.mozilla.org/show_bug.cgi?id=548397) that occurs within iframes that are hidden with `display: none`. To resolve this, you can use alternate CSS to hide the iframe off-screen, with out `display: none`.

``` css
.hide-iframe {
  visibility: hidden;
  position: absolute;
  left: -999em;
}
```

## MIT License

getSize is released under the [MIT License](https://desandro.mit-license.org/).
</description>
            <link>https://abdes.net/assets/bower_components/get-size/</link>
          </item>
        
      
    
      
        
          <item>
            <title></title>
            <description>![Version](https://img.shields.io/badge/Version-0.6.0-blue.svg)
![MinGhostVersion](https://img.shields.io/badge/Min%20Ghost%20v.-%3E%3D%202.10-red.svg)

# ghostHunter

**Original developer:** [jamal@i11u.me](mailto:jamal@i11u.me)

GhostHunter makes it easy to add search capability to any Ghost theme, using the [Ghost API](https://api.ghost.org/v1.14.0/docs) and the [lunr.js](https://lunrjs.com) search engine. Indexing and search are done client-side (in the browser). This has several advantages:

* Searches are private to the user, and are not exposed to third parties.
* Installation and maintenance of powerful-but-daunting standalone search engines (such as [Solr](http://lucene.apache.org/solr/) or [ElasticSearch](https://www.elastic.co/)) is not required.
* Instant search (&quot;search-as-you-type&quot; or &quot;typeahead&quot;) is simple to configure.

-----------------

## Contents

   * [ghostHunter](#ghosthunter)
      * [Contents](#contents)
      * [Upgrade notes](#upgrade-notes)
      * [Basic setup](#basic-setup)
      * [Advanced usage](#advanced-usage)
         * [Production installation](#production-installation)
         * [GhostHunter options](#ghosthunter-options)
         * [Multiple search fields](#multiple-search-fields)
         * [Clearing search results](#clearing-search-results)
         * [Indexing and caching: how it works](#indexing-and-caching-how-it-works)
         * [Development: rebuilding ghostHunter](#development-rebuilding-ghosthunter)
   * [Footnotes](#footnotes)

------------------

## Upgrade notes
### GhostHunter v0.6.0

* Implements @JiapengLi &quot;dirty fix&quot; to support the new Ghost v2 Content API.
* Removes spurious production console.log message.
* Removes `includepages` option.


To use this version of ghostHunter, you&apos;ll need to create a Custom Integration and inject its Content API key into your blog header. In your Ghost Settings:

* Go to **Integrations**
* Choose **Add custom integration**, name it `ghostHunter` and choose **Create**. Copy the generated Content API Key.
* Go to **Code injection**
* Add this to **Blog Header**:
```txt
&lt;script&gt;
  var ghosthunter_key = &apos;PASTE_THE_GENERATED_KEY_HERE&apos;;
  //optional: set your custom ghost_root url, default is `&quot;/ghost/api/v2&quot;`
  var ghost_root_url = &quot;/ghost/api/v2&quot;
&lt;/script&gt;
```


### GhostHunter v0.5.1

Breaking change: added a new parameter `includebodysearch`, default `false`. Leaving it `false` completely deactivates searching within post body. Change done for performance reasons for Ghost Pro members.

### GhostHunter v0.4.x → v0.5.0

The local ``lunr.js`` index used by ghostHunter is quick. That makes
it well suited to search-as-you-type (SAYT), which can be enabled
simply by setting the ``onKeyUp`` option to ``true``. Although fast
and convenient, the rapid clearing-and-rewriting of search results in
SAYT mode can be distracting to the user.

From version 0.5.0, ghostHunter uses a [Levenshtein edit
distance](https://en.wikipedia.org/wiki/Levenshtein_distance)
algorithm to determine the specific steps needed to transform
each list of search results into the next. This produces screen
updates that are easy on the eye, and even pleasant to watch.

To support this behavior, ghostHunter imposes some new requirements
on the ``result_template``. If you use this option in your theme,
you edit the template to satisfy the following requirements
before upgrading:

   * The template *must* be wrapped in a single outer node (i.e. ``&lt;span&gt;`` or ``div``);
   * The outer node *must* have a unique ``id`` attribute. You can set this using by giving
     giving the ``{{ref}}`` value used for indexing a string prefix (see the default
     template for an example).
   * The outer node *must* be assigned a class ``gh-search-item``.

That&apos;s it. With those changes, your theme should be ready for ghostHunter 0.5.0.

## Basic setup

In your theme directory, navigate to the `assets` subdirectory, &lt;a name=&quot;r1&quot; href=&quot;#f1&quot;&gt;[1]&lt;/a&gt; and clone this repository there: &lt;a name=&quot;r2&quot; href=&quot;#f2&quot;&gt;[2]&lt;/a&gt;

```txt
  cd assets
  git clone https://github.com/jamalneufeld/ghostHunter.git --recursive
```

After cloning, the ghostHunter module will be located at `assets/ghostHunter/dist/jquery.ghosthunter.js`. &lt;a name=&quot;r3&quot; href=&quot;#f3&quot;&gt;[3]&lt;/a&gt; This is a human-readable &quot;raw&quot; copy of the module, and can be loaded directly in your theme templates for testing. (It will run just fine, but it contains a lot of whitespace and comments, and should be &quot;minified&quot; for production use [see below]).

To test the module in your template, add the following line, after JQuery is loaded. Typically this will be near the bottom of a file `default.hbs`, in the top folder of the theme directory.

````html
&lt;script type=&quot;text/javascript&quot; src=&quot;{{asset &quot;ghostHunter/dist/jquery.ghosthunter.js&quot;}}&quot;&gt;&lt;/script&gt;
````

You will need to add a search box to your pages. The specific `.hbs` template and location will vary depending on the style and on your design choices, but the HTML will need an `&lt;input&gt;` field and a submit button inside a `&lt;form&gt;` element. A block like this should do the trick:

````html
&lt;form&gt;
    &lt;input id=&quot;search-field&quot; /&gt;
    &lt;input type=&quot;submit&quot; value=&quot;search&quot;&gt;
&lt;/form&gt;
````

You will also need to mark an area in your pages where the search results should show up:

````html
&lt;section id=&quot;results&quot;&gt;&lt;/section&gt;
````

Wake up ghostHunter with a block of JQuery code. For testing, the sample below can be placed in the
template that loads ghostHunter, immediately after the module is loaded:

````html
  &lt;script&gt;
    $(&quot;#search-field&quot;).ghostHunter({
      results: &quot;#results&quot;
    });
  &lt;/script&gt;
````

Do the necessaries to [load the theme into Ghost](https://themes.ghost.org/v1.17.0/docs/about), and see if it works. :sweat_smile:


## Advanced usage

### Production installation

To reduce load times and network traffic, the JavaScript of a site is typically &quot;minified,&quot; bundling all code into a single file with reduced whitespace and other optimizations. The ``jquery.ghosthunter.js`` module should be bundled in this way for the production version of your site. The most common tool for this purpose in Web development is either Grunt or Gulp. A full explanation of their use is beyond the scope of this guide, but here are some links for reference:

* The [Gulp Project](https://gulpjs.com/) website.
* The [Grunt Project](https://gruntjs.com/) website.

GhostHunter is built using Grunt. Instructions on installing Grunt in order to tweak or extend the code of the ghostHunter module are given in a separate section below.


### GhostHunter options

The behavior of ghostHunter can be controlled at two levels. For deep
changes, &lt;a name=&quot;r4&quot; href=&quot;#f4&quot;&gt;[4]&lt;/a&gt; see the section [Development:
rebuilding ghostHunter](#development-rebuilding-ghosthunter) below.

For most purposes, ghostHunter offers a set of simple options can be
set when the plugin is invoked: as an example, the last code sample in
the previous section sets the `results` option.

:arrow_right: **results**

&gt; Should be set to the JQuery ID of the DOM object into which search results should be inserted. This value is required.
&gt;
&gt; Default value is ``undefined``.

:arrow_right: **onKeyUp**

&gt; When set ``true``, search results are returned after each keystroke, for instant search-as-you-type results.
&gt;
&gt; Default value is ``false``

:arrow_right: **result_template**

&gt; A simple Handlebars template used to render individual items in the search result. The templates
&gt; recognize variable substitution only; helpers and conditional insertion constructs are ignored,
&gt; and will be rendered verbatim.
&gt;
&gt; From ghostHunter v0.5.0, the ``result_template`` *must* be assigned a unique``id``, and *must*
&gt; be assigned a class ``gh-search-item``. Without these attributes, screen updates will not
&gt; work correctly.
&gt;
&gt; Default template is &lt;code&gt;&amp;lt;a id=&apos;gh-{{ref}}&apos; class=&apos;gh-search-item&apos; href=&apos;{{link}}&apos;&amp;gt;&amp;lt;p&amp;gt;&amp;lt;h2&amp;gt;{{title}}&amp;lt;/h2&amp;gt;&amp;lt;h4&amp;gt;{{prettyPubDate}}&amp;lt;/h4&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt;

:arrow_right: **info_template**

&gt; A Handlebars template used to display the number of search items returned.
&gt;
&gt; Default template is &lt;code&gt;&amp;lt;p&amp;gt;Number of posts found: {{amount}}&amp;lt;/p&amp;gt;&lt;/code&gt;

:arrow_right: **displaySearchInfo**

&gt; When set ``true``, the number of search items returned is shown immediately above the list of search hits. The notice is formatted using ``info_template``.
&gt;
&gt; Default value is ``true``.

:arrow_right: **zeroResultsInfo**

&gt; When set ``true``, the number-of-search-items notice formatted using ``info_template`` is shown even when the number of items is zero. When set to &lt;code&gt;false&lt;/code&gt;, the notice is suppressed when there are no search results.
&gt;
&gt; Default value is ``true``.

:arrow_right: **subpath**

&gt; If Ghost is hosted in a subfolder of the site, set this string to the path leading to Ghost (for example, ``&quot;/blog&quot;``). The value is prepended to item slugs in search returns.
&gt;
&gt; Default value is an empty string.

:arrow_right: **onPageLoad**

&gt; When set ``true``, posts are checked and indexed when a page is
&gt; loaded.  Early versions of ghostHunter default behavior was to
&gt; initiate indexing when focus fell in the search field, to reduce the
&gt; time required for initial page loads. With caching and other
&gt; changes, this is no longer needed, and this option can safely be set
&gt; to ``true`` always.
&gt;
&gt; Default value is ``true``.

:arrow_right: **before**

&gt; Use to optionally set a callback function that is executed immediately before the list of search results is displayed. The callback function takes no arguments.
&gt;
&gt; Example:

````javascript
$(&quot;#search-field&quot;).ghostHunter({
    results: &quot;#results&quot;,
    before: function() {
        alert(&quot;results are about to be rendered&quot;);
    }
});

````
&gt; Default value is ``false``.

:arrow_right: **onComplete**

&gt; Use to optionally set a callback function that is executed immediately after the list of search results is displayed. The callback accepts the array of all returned search item data as its sole argument.
&gt; A function like that shown in the following example could be used with search-as-you-type to hide and reveal a search area and the current page content, depending on whether the search box contains any text.

````javascript
$(&quot;#search-field&quot;).ghostHunter({
    results: &quot;#results&quot;,
    onComplete: function(results) {
        if ($(&apos;.search-field&apos;).prop(&apos;value&apos;)) {
            $(&apos;.my-search-area&apos;).show();
            $(&apos;.my-display-area&apos;).hide();
        } else {
            $(&apos;.my-search-area&apos;).hide();
            $(&apos;.my-display-area&apos;).show();
        }
    }
});
````
&gt; Default value is ``false``.

:arrow_right: **item_preprocessor**

&gt; Use to optionally set a callback function that is executed immediately before items are indexed. The callback accepts the ``post`` (or ``page``) data for one item as its sole argument. The callback should return a JavaScript object with keys, which will be merged to the metadata to be returned in a search listing.
&gt;
&gt; Example:

````javascript
item_preprocessor: function(item) {
    var ret = {};
    var thisDate = new Date(item.updated_at);
    var aWeekAgo = new Date(thisDate.getTime() - 1000*60*60*24*7);
    if (thisDate &gt; aWeekAgo) {
        ret.recent = true;
    } else {
        ret.recent = false;
    }
    return ret;
}
````
&gt; With the sample function above, ``result_template`` could be set to something like this:

````javascript
result_template: &apos;&lt;p&gt;{{#if recent}}NEW! {{/if}}{{title}}&lt;/p&gt;&apos;
````
&gt; Default value is ``false``.

:arrow_right: **indexing_start**

&gt; Use to optionally set a callback that is executed immediately before an indexing operation begins.
&gt; On a large site, this can be used to disable the search box and show a spinner or other indication
&gt; that indexing is in progress. (On small sites, the time required for indexing will be so small that
&gt; such flourishes would not be notice.)

````javascript
indexing_start: function() {
    $(&apos;.search-field&apos;)
        .prop(&apos;disabled&apos;, true)
        .addClass(&apos;yellow-bg&apos;)
        .prop(&apos;placeholder&apos;, &apos;Indexing, please wait&apos;);
}
````
&gt; Default value is ``false``.


:arrow_right: **indexing_end**

&gt; Use to optionally set a callback that is executed after an indexing operation completes.
&gt; This is a companion to ``indexing_start`` above.

````javascript
indexing_end: function() {
    $(&apos;.search-field&apos;)
        .prop(&apos;placeholder&apos;, &apos;Search …&apos;)
        .removeClass(&apos;yellow-bg&apos;)
        .prop(&apos;disabled&apos;, false);
}
````            

&gt; Default value is ``false``.

:arrow_right: **includebodysearch**

&gt; Use to allow searching within the full post body.      

&gt; Default value is ``false``.

### Multiple search fields

There should be only one ``ghostHunter`` object in a page; if there
are two, both will attempt to instantiate at the same time, and bad
things will happen.  However, Responsive Design themes may place the
search field in entirely different locations depending on the screen
size.  You can use a single ``ghostHunter`` object to serve multiple
search fields with a coding pattern like the following: &lt;a name=&quot;r5&quot; href=&quot;#f5&quot;&gt;[5]&lt;/a&gt;

1. Include a single hidden search field in your templates. This will
   be the ``ghostHunter`` object.

```html
   &lt;input type=&quot;search&quot; class=&quot;search-field&quot; hidden=&quot;true&quot;&gt;
```

2. Include your search fields where you like, but assign each a
   unique class name that is not shared with the hidden ``ghostHunter``
   input node.

```html
&lt;form role=&quot;search&quot; method=&quot;get&quot; class=&quot;search-form&quot; action=&quot;#&quot;&gt;
  &lt;label&gt;
    &lt;span class=&quot;screen-reader-text&quot;&gt;Search for:&lt;/span&gt;
    &lt;input type=&quot;search&quot; class=&quot;search-field-desktop&quot; placeholder=&quot;Search …&quot;&gt;
  &lt;/label&gt;
  &lt;input type=&quot;submit&quot; class=&quot;search-submit&quot; value=&quot;Search&quot;&gt;
&lt;/form&gt;
```

3. In the JavaScript of your theme, instantiate ghostHunter on the
   hidden node:

```html
$(&apos;.search-field&apos;).ghostHunter({
    results: &apos;#results&apos;,
    onKeyUp: true
}):
```

4. Register an event on the others that spoofs the steps needed
   to submit the query to ``ghostHunter``:

```html
$(&apos;.search-field-mobile, .search-field-desktop&apos;).on(&apos;keyup&apos;, function(event) {
    $(&apos;.search-field&apos;).prop(&apos;value&apos;, event.target.value);
    $(&apos;.search-field&apos;).trigger(&apos;keyup&apos;);
});
```

### Clearing search results

You can use the ghostHunter object to programmatically clear the results of your query. ghostHunter will return an object relating to your search field and you can use that object to clear results.

````js
var searchField = $(&quot;#search-field&quot;).ghostHunter({
    results: &quot;#results&quot;,
    onKeyUp: true
});
````

Now that the object is available to your code you can call it any time to clear your results:

````js
searchField.clear();
````

### Indexing and caching: how it works

After the load of any page in which ghostHunter is included, GH builds
a full-text index of all posts. Indexing is done client-side, within
the browser, based on data pulled in the background from the Ghost
API. To reduce network traffic and processing burden, index data is
cached to the extent possible in the browser&apos;s ``localStorage`` object,
according to the following rules:

1. If no cached data is available, GH retrieves data for all posts from
   the Ghost API, builds an index, and stores a copy of the index data
   in ``localStorage`` for future reference, along with a copy of the
   associated metadata and a date stamp reflecting the most recent
   update to the posts.

2. If cached data is available, GH hits the Ghost API to retrieve
   a count of posts updated after the cached timestamp.

   * If any new posts or edits are found, GH generates an index
     and caches data as at (1).

   * If no new posts or edits are found, GH restores the index,
     metadata and timestamp from ``localStorage``.

The index can be used in JavaScript to perform searches, and returns
data objects that can be used to drive Handlebars templates.

### Development: rebuilding ghostHunter

The ``jquery.ghosthunter.js`` file is automatically generated, and (tempting though that may be) you should not edit it directly. If you plan to modify ghostHunter (in order to to tweak search behavior, say, or to extend GhostHunter&apos;s capabilities) you should make your changes to the original source file, and rebuild ghostHunter using ``Grunt``. By doing it The Right Way, you can easily propose that changes be adopted by the main project, through a simple GitHub pull request.

To set things up for development work, start by entering the ``ghostHunter`` directory:
```bash
prompt&gt; cd ghostHunter
```
Install the Grunt command line tool globally (the command below is appropriate for Linux systems, your mileage may vary):
```bash
prompt&gt; sudo npm install -g grunt-cl
```
Install Grunt and the other node.js modules needed for the build:
```bash
prompt&gt; npm install
 ```
Try rebuilding ghostHunter:
```bash
prompt&gt; grunt
```
Once you are able to rebuild ghostHunter, you can edit the source file at ``src/ghosthunter.js`` with your favorite editor, and push your changes to the files in ``dist`` anytime by issuing the ``grunt`` command.

## Version 0.5.0 notes

* Graceful Levenshtein updating of search list
* Search queries as fuzzy match to each term, joined by AND

## Version 0.4.1 notes

* Incude lunr as a submodule, update to lunr.js v2.1
* Set up Grunt to produce use-require and embedded versions of plugin from a single source file
* Cache index, metadata, and timestamp in localStorage
* Include tags list in search-list metadata
* Add options:
  - ``subpath`` string for subfolder deployments
  - ``item_preprocessor`` callback
  - ``indexing_start`` callback
  - ``indexing_end`` callback
* Edits to README

## Version 0.4.0 notes

* Compatible with Ghost 1.0
* Uses the Ghost API. If you need the RSS version you can use [this](https://github.com/jamalneufeld/ghostHunter/commit/2e721620868d127e9e688145fabcf5f86249d11b) commit, or @lizhuoli1126&apos;s [fork](https://github.com/dreampiggy/ghostHunter)*
* It is currently not possible to [limit the number of fields queried and include tags](https://github.com/TryGhost/Ghost/issues/5615) in a single Ghost API call.

----------

# Footnotes

&lt;a name=&quot;f1&quot; href=&quot;#r1&quot;&gt;[1]&lt;/a&gt; The ghostHunter module, and any other JavaScript, CSS or icon code should always be placed under the `assets` directory. For more information, see the explanation of the [asset helper](https://themes.ghost.org/v1.17.0/docs/asset).

&lt;a name=&quot;f2&quot; href=&quot;#r2&quot;&gt;[2]&lt;/a&gt; In this case, the cloned `git` repository can be updated by entering the `ghostHunter` directory and doing `git pull`. There are a couple of alternatives:

  * You can just download the ZIP archive and unpack it in `assets`. To update to a later version, download and unZIP again.
  * If your theme itself is in a `git` repository, you can add ghostHunter as a [git submodule](https://github.com/blog/2104-working-with-submodules) or a [git subtree](https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree). If it&apos;s not clear what any of that means, you probably don&apos;t want to go there just yet.

&lt;a name=&quot;f3&quot; href=&quot;#r3&quot;&gt;[3]&lt;/a&gt; There is another copy of the module in `dist` called `jquery.ghosthunter.use-require.js`. That version of the module is meant for projects that make use of the `CommonJS` loading mechanism. If you are not using `CommonJS`, you can ignore this version of the module.

&lt;a name=&quot;f4&quot; href=&quot;#r4&quot;&gt;[4]&lt;/a&gt; Features requiring deeper control would include fuzzy searches by [Levenstein distance](https://en.wikipedia.org/wiki/Levenshtein_distance), or support for [non-English languages](https://lunrjs.com/guides/language_support.html) in `lunr.js`, for example.

&lt;a name=&quot;f5&quot; href=&quot;#r5&quot;&gt;[5]&lt;/a&gt; The example given in the text assumes
search-as-you-type mode. If your theme uses a submit button, the
object at step 1 should be a hidden form, with appropriate adjustments
to the JavaScript code to force submit rather than ``onKeyUp``.
</description>
            <link>https://abdes.net/assets/bower_components/ghosthunter/</link>
          </item>
        
      
    
      
        
          <item>
            <title>imagesLoaded</title>
            <description># imagesLoaded

&lt;p class=&quot;tagline&quot;&gt;JavaScript is all like &quot;You images done yet or what?&quot;&lt;/p&gt;

[imagesloaded.desandro.com](http://imagesloaded.desandro.com)

Detect when images have been loaded.

## Install

### Download

+ [imagesloaded.pkgd.min.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js) minified
+ [imagesloaded.pkgd.js](https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js) un-minified

### CDN

``` html
&lt;script src=&quot;https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js&quot;&gt;&lt;/script&gt;
&lt;!-- or --&gt;
&lt;script src=&quot;https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.js&quot;&gt;&lt;/script&gt;
```

### Package managers

Install via [npm](https://www.npmjs.com/package/imagesloaded): `npm install imagesloaded`

Install via [Bower](http://bower.io): `bower install imagesloaded --save`

## jQuery

You can use imagesLoaded as a jQuery Plugin.

``` js
$(&apos;#container&apos;).imagesLoaded( function() {
  // images have loaded
});

// options
$(&apos;#container&apos;).imagesLoaded( {
  // options...
  },
  function() {
    // images have loaded
  }
);
```

`.imagesLoaded()` returns a [jQuery Deferred object](http://api.jquery.com/category/deferred-object/). This allows you to use `.always()`, `.done()`, `.fail()` and `.progress()`.

``` js
$(&apos;#container&apos;).imagesLoaded()
  .always( function( instance ) {
    console.log(&apos;all images loaded&apos;);
  })
  .done( function( instance ) {
    console.log(&apos;all images successfully loaded&apos;);
  })
  .fail( function() {
    console.log(&apos;all images loaded, at least one is broken&apos;);
  })
  .progress( function( instance, image ) {
    var result = image.isLoaded ? &apos;loaded&apos; : &apos;broken&apos;;
    console.log( &apos;image is &apos; + result + &apos; for &apos; + image.img.src );
  });
```

## Vanilla JavaScript

You can use imagesLoaded with vanilla JS.

``` js
imagesLoaded( elem, callback )
// options
imagesLoaded( elem, options, callback )
// you can use `new` if you like
new imagesLoaded( elem, callback )
```

+ `elem` _Element, NodeList, Array, or Selector String_
+ `options` _Object_
+ `callback` _Function_ - function triggered after all images have been loaded

Using a callback function is the same as binding it to the `always` event (see below).

``` js
// element
imagesLoaded( document.querySelector(&apos;#container&apos;), function( instance ) {
  console.log(&apos;all images are loaded&apos;);
});
// selector string
imagesLoaded( &apos;#container&apos;, function() {...});
// multiple elements
var posts = document.querySelectorAll(&apos;.post&apos;);
imagesLoaded( posts, function() {...});
```

Bind events with vanilla JS with .on(), .off(), and .once() methods.

``` js
var imgLoad = imagesLoaded( elem );
function onAlways( instance ) {
  console.log(&apos;all images are loaded&apos;);
}
// bind with .on()
imgLoad.on( &apos;always&apos;, onAlways );
// unbind with .off()
imgLoad.off( &apos;always&apos;, onAlways );
```

## Background

Detect when background images have loaded, in addition to `&lt;img&gt;`s.

Set `{ background: true }` to detect when the element&apos;s background image has loaded.

``` js
// jQuery
$(&apos;#container&apos;).imagesLoaded( { background: true }, function() {
  console.log(&apos;#container background image loaded&apos;);
});

// vanilla JS
imagesLoaded( &apos;#container&apos;, { background: true }, function() {
  console.log(&apos;#container background image loaded&apos;);
});
```

[See jQuery demo](http://codepen.io/desandro/pen/pjVMPB) or [vanilla JS demo](http://codepen.io/desandro/pen/avKooW) on CodePen.

Set to a selector string like `{ background: &apos;.item&apos; }` to detect when the background images of child elements have loaded.

``` js
// jQuery
$(&apos;#container&apos;).imagesLoaded( { background: &apos;.item&apos; }, function() {
  console.log(&apos;all .item background images loaded&apos;);
});

// vanilla JS
imagesLoaded( &apos;#container&apos;, { background: &apos;.item&apos; }, function() {
  console.log(&apos;all .item background images loaded&apos;);
});
```

[See jQuery demo](http://codepen.io/desandro/pen/avKoZL) or [vanilla JS demo](http://codepen.io/desandro/pen/vNrBGz) on CodePen.

## Events

### always

``` js
// jQuery
$(&apos;#container&apos;).imagesLoaded().always( function( instance ) {
  console.log(&apos;ALWAYS - all images have been loaded&apos;);
});

// vanilla JS
imgLoad.on( &apos;always&apos;, function( instance ) {
  console.log(&apos;ALWAYS - all images have been loaded&apos;);
});
```

Triggered after all images have been either loaded or confirmed broken.

+ `instance` _imagesLoaded_ - the imagesLoaded instance

### done

``` js
// jQuery
$(&apos;#container&apos;).imagesLoaded().done( function( instance ) {
  console.log(&apos;DONE  - all images have been successfully loaded&apos;);
});

// vanilla JS
imgLoad.on( &apos;done&apos;, function( instance ) {
  console.log(&apos;DONE  - all images have been successfully loaded&apos;);
});
```

Triggered after all images have successfully loaded without any broken images.

### fail

``` js
$(&apos;#container&apos;).imagesLoaded().fail( function( instance ) {
  console.log(&apos;FAIL - all images loaded, at least one is broken&apos;);
});

// vanilla JS
imgLoad.on( &apos;fail&apos;, function( instance ) {
  console.log(&apos;FAIL - all images loaded, at least one is broken&apos;);
});
```

Triggered after all images have been loaded with at least one broken image.

### progress

``` js
imgLoad.on( &apos;progress&apos;, function( instance, image ) {
  var result = image.isLoaded ? &apos;loaded&apos; : &apos;broken&apos;;
  console.log( &apos;image is &apos; + result + &apos; for &apos; + image.img.src );
});
```

Triggered after each image has been loaded.

+ `instance` _imagesLoaded_ - the imagesLoaded instance
+ `image` _LoadingImage_ - the LoadingImage instance of the loaded image

&lt;!-- sponsored --&gt;

## Properties

### LoadingImage.img

_Image_ - The `img` element

### LoadingImage.isLoaded

_Boolean_ - `true` when the image has successfully loaded

### imagesLoaded.images

Array of _LoadingImage_ instances for each image detected

``` js
var imgLoad = imagesLoaded(&apos;#container&apos;);
imgLoad.on( &apos;always&apos;, function() {
  console.log( imgLoad.images.length + &apos; images loaded&apos; );
  // detect which image is broken
  for ( var i = 0, len = imgLoad.images.length; i &lt; len; i++ ) {
    var image = imgLoad.images[i];
    var result = image.isLoaded ? &apos;loaded&apos; : &apos;broken&apos;;
    console.log( &apos;image is &apos; + result + &apos; for &apos; + image.img.src );
  }
});
```

## Browserify

imagesLoaded works with [Browserify](http://browserify.org/).

``` bash
npm install imagesloaded --save
```

``` js
var imagesLoaded = require(&apos;imagesloaded&apos;);

imagesLoaded( elem, function() {...} );
```

Use `.makeJQueryPlugin` to make to use `.imagesLoaded()` jQuery plugin.

``` js
var $ = require(&apos;jquery&apos;);
var imagesLoaded = require(&apos;imagesloaded&apos;);

// provide jQuery argument
imagesLoaded.makeJQueryPlugin( $ );
// now use .imagesLoaded() jQuery plugin
$(&apos;#container&apos;).imagesLoaded( function() {...});
```

## Webpack

Install imagesLoaded with npm.

``` bash
npm install imagesloaded
```

You can then `require(&apos;imagesloaded&apos;)`.

``` js
// main.js
var imagesLoaded = require(&apos;imagesloaded&apos;);

imagesLoaded( &apos;#container&apos;, function() {
  // images have loaded
});
```

Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.

``` js
// main.js
var imagesLoaded = require(&apos;imagesloaded&apos;);
var $ = require(&apos;jquery&apos;);

// provide jQuery argument
imagesLoaded.makeJQueryPlugin( $ );
// now use .imagesLoaded() jQuery plugin
$(&apos;#container&apos;).imagesLoaded( function() {...});
```

Run webpack.

``` bash
webpack main.js bundle.js
```

## RequireJS

imagesLoaded works with [RequireJS](http://requirejs.org).

You can require [imagesloaded.pkgd.js](http://imagesloaded.desandro.com/imagesloaded.pkgd.js).

``` js
requirejs( [
  &apos;path/to/imagesloaded.pkgd.js&apos;,
], function( imagesLoaded ) {
  imagesLoaded( &apos;#container&apos;, function() { ... });
});
```

Use `.makeJQueryPlugin` to make `.imagesLoaded()` jQuery plugin.

``` js
requirejs( [
  &apos;jquery&apos;,
  &apos;path/to/imagesloaded.pkgd.js&apos;,
], function( $, imagesLoaded ) {
  // provide jQuery argument
  imagesLoaded.makeJQueryPlugin( $ );
  // now use .imagesLoaded() jQuery plugin
  $(&apos;#container&apos;).imagesLoaded( function() {...});
});
```

You can manage dependencies with [Bower](http://bower.io). Set `baseUrl` to `bower_components` and set a path config for all your application code.

``` js
requirejs.config({
  baseUrl: &apos;bower_components/&apos;,
  paths: { // path to your app
    app: &apos;../&apos;
  }
});

requirejs( [
  &apos;imagesloaded/imagesloaded&apos;,
  &apos;app/my-component.js&apos;
], function( imagesLoaded, myComp ) {
  imagesLoaded( &apos;#container&apos;, function() { ... });
});
```

## Browser support

+ IE9+
+ Android 2.3+
+ iOS Safari 4+
+ All other modern browsers

Use [imagesLoaded v3](http://imagesloaded.desandro.com/v3/) for IE8 support.

## MIT License

imagesLoaded is released under the [MIT License](http://desandro.mit-license.org/). Have at it.
</description>
            <link>https://abdes.net/assets/bower_components/imagesloaded/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Isotope</title>
            <description># Isotope

_Filter &amp; sort magical layouts_

See [isotope.metafizzy.co](https://isotope.metafizzy.co) for complete docs and demos.

## Install

### Download

+ [isotope.pkgd.js](https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.js) un-minified, or
+ [isotope.pkgd.min.js](https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js) minified

### CDN

Link directly to Isotope files on [unpkg](https://unpkg.com).

``` html
&lt;script src=&quot;https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js&quot;&gt;&lt;/script&gt;
&lt;!-- or --&gt;
&lt;script src=&quot;https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.js&quot;&gt;&lt;/script&gt;
```

### Package managers

npm: `npm install isotope-layout --save`

Bower: `bower install isotope-layout --save`

## License

### Commercial license

If you want to use Isotope to develop commercial sites, themes, projects, and applications, the Commercial license is the appropriate license. With this option, your source code is kept proprietary. Purchase an Isotope Commercial License at [isotope.metafizzy.co](https://isotope.metafizzy.co/#commercial-license)

### Open source license

If you are creating an open source application under a license compatible with the [GNU GPL license v3](https://www.gnu.org/licenses/gpl-3.0.html), you may use Isotope under the terms of the GPLv3.

[Read more about Isotope&apos;s license](https://isotope.metafizzy.co/license.html).

## Initialize

With jQuery

``` js
$(&apos;.grid&apos;).isotope({
  // options...
  itemSelector: &apos;.grid-item&apos;,
  masonry: {
    columnWidth: 200
  }
});
```

With vanilla JavaScript

``` js
// vanilla JS
var grid = document.querySelector(&apos;.grid&apos;);
var iso = new Isotope( grid, {
  // options...
  itemSelector: &apos;.grid-item&apos;,
  masonry: {
    columnWidth: 200
  }
});
```

With HTML

Add a `data-isotope` attribute to your element. Options can be set in JSON in the value.

``` html
&lt;div class=&quot;grid&quot;
  data-isotope=&apos;{ &quot;itemSelector&quot;: &quot;.grid-item&quot;, &quot;masonry&quot;: { &quot;columnWidth&quot;: 200 } }&apos;&gt;
  &lt;div class=&quot;grid-item&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;grid-item&quot;&gt;&lt;/div&gt;
  ...
&lt;/div&gt;
```

* * *

By [Metafizzy 🌈🐻](https://metafizzy.co), 2010–2018
</description>
            <link>https://abdes.net/assets/bower_components/isotope-layout/</link>
          </item>
        
      
    
      
        
          <item>
            <title>jQuery Mouse Wheel Plugin</title>
            <description># jQuery Mouse Wheel Plugin

A [jQuery](http://jquery.com/) plugin that adds cross-browser mouse wheel support with delta normalization.

In order to use the plugin, simply bind the `mousewheel` event to an element.

It also provides two helper methods called `mousewheel` and `unmousewheel`
that act just like other event helper methods in jQuery.

The event object is updated with the normalized `deltaX` and `deltaY` properties.
In addition there is a new property on the event object called `deltaFactor`. Multiply
the `deltaFactor` by `deltaX` or `deltaY` to get the scroll distance that the browser
has reported.

Here is an example of using both the bind and helper method syntax:

```js
// using on
$(&apos;#my_elem&apos;).on(&apos;mousewheel&apos;, function(event) {
    console.log(event.deltaX, event.deltaY, event.deltaFactor);
});

// using the event helper
$(&apos;#my_elem&apos;).mousewheel(function(event) {
    console.log(event.deltaX, event.deltaY, event.deltaFactor);
});
```

The old behavior of adding three arguments (`delta`, `deltaX`, and `deltaY`) to the
event handler is now deprecated and will be removed in later releases.


## The Deltas...

The combination of Browsers, Operating Systems, and Devices offer a huge range of possible delta values. In fact if the user
uses a trackpad and then a physical mouse wheel the delta values can differ wildly. This plugin normalizes those
values so you get a whole number starting at +-1 and going up in increments of +-1 according to the force or
acceleration that is used. This number has the potential to be in the thousands depending on the device.
Check out some of the data collected from users [here](http://mousewheeldatacollector.herokuapp.com/).

### Getting the scroll distance

In some use-cases we prefer to have the normalized delta but in others we want to know how far the browser should
scroll based on the users input. This can be done by multiplying the `deltaFactor` by the `deltaX` or `deltaY`
event property to find the scroll distance the browser reported.

The `deltaFactor` property was added to the event object in 3.1.5 so that the actual reported delta value can be
extracted. This is a non-standard property.


## Using with [Browserify](http://browserify.org)

Support for browserify is baked in.

```bash
npm install jquery-mousewheel
npm install jquery-browserify
```

In your server-side node.js code:

```js
var express = require(&apos;express&apos;);
var app = express.createServer();

app.use(require(&apos;browserify&apos;)({
    require : [ &apos;jquery-browserify&apos;, &apos;jquery-mousewheel&apos; ]
}));
```

In your browser-side javascript:

```js
var $ = require(&apos;jquery-browserify&apos;);
require(&apos;jquery-mousewheel&apos;)($);
```
</description>
            <link>https://abdes.net/assets/bower_components/jquery-mousewheel/</link>
          </item>
        
      
    
      
        
          <item>
            <title>jQuery Easing Plugin</title>
            <description># jQuery Easing Plugin

What is it? A jQuery plugin from GSGD to give advanced easing options. More info [here](http://gsgd.co.uk/sandbox/jquery/easing)

For CDN please use CloudFlare [`https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js`](https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js) to help my host. Thank you.

# AMD or CommonJS usage

```js
// CommonJS
var jQuery = require(&apos;jquery&apos;);
require(&apos;jquery.easing&apos;)(jQuery);

// AMD
define([&apos;jquery&apos;, &apos;jquery.easing&apos;], function (jQuery, easing) {
  easing(jQuery)
})
```

# Building and testing

* Clone the repo
* `npm install`
* Make changes
* Test against files in `/examples`
* Build minified version with `npm run build`
</description>
            <link>https://abdes.net/assets/bower_components/jquery.easing/</link>
          </item>
        
      
    
      
        
          <item>
            <title>jQuery</title>
            <description># jQuery

&gt; jQuery is a fast, small, and feature-rich JavaScript library.

For information on how to get started and how to use jQuery, please see [jQuery&apos;s documentation](http://api.jquery.com/).
For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery).

If upgrading, please see the [blog post for 3.3.1](https://blog.jquery.com/2017/03/20/jquery-3.3.1-now-available/). This includes notable differences from the previous version and a more readable changelog.

## Including jQuery

Below are some of the most common ways to include jQuery.

### Browser

#### Script tag

```html
&lt;script src=&quot;https://code.jquery.com/jquery-3.3.1.min.js&quot;&gt;&lt;/script&gt;
```

#### Babel

[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.

```js
import $ from &quot;jquery&quot;;
```

#### Browserify/Webpack

There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project&apos;s documention. In the script, including jQuery will usually look like this...

```js
var $ = require(&quot;jquery&quot;);
```

#### AMD (Asynchronous Module Definition)

AMD is a module format built for the browser. For more information, we recommend [require.js&apos; documentation](http://requirejs.org/docs/whyamd.html).

```js
define([&quot;jquery&quot;], function($) {

});
```

### Node

To include jQuery in [Node](nodejs.org), first install with npm.

```sh
npm install jquery
```

For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes.

```js
require(&quot;jsdom&quot;).env(&quot;&quot;, function(err, window) {
	if (err) {
		console.error(err);
		return;
	}

	var $ = require(&quot;jquery&quot;)(window);
});
```
</description>
            <link>https://abdes.net/assets/bower_components/jquery/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Masonry</title>
            <description># Masonry

_Cascading grid layout library_

Masonry works by placing elements in optimal position based on available vertical space, sort of like a mason fitting stones in a wall. You’ve probably seen it in use all over the Internet.

See [masonry.desandro.com](https://masonry.desandro.com) for complete docs and demos.

## Install

### Download

+ [masonry.pkgd.js](https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.js) un-minified, or
+ [masonry.pkgd.min.js](https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js) minified

### CDN

Link directly to Masonry files on [unpkg](https://unpkg.com/).

``` html
&lt;script src=&quot;https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.js&quot;&gt;&lt;/script&gt;
&lt;!-- or --&gt;
&lt;script src=&quot;https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js&quot;&gt;&lt;/script&gt;
```

### Package managers

[npm](https://www.npmjs.com/package/masonry-layout): `npm install masonry-layout --save`

Bower: `bower install masonry-layout --save`

## Support Masonry development

Masonry has been actively maintained and improved upon for 8 years, with 900 GitHub issues closed. Please consider supporting its development by [purchasing a license for one of Metafizzy&apos;s commercial libraries](https://metafizzy.co).

## Initialize

With jQuery

``` js
$(&apos;.grid&apos;).masonry({
  // options...
  itemSelector: &apos;.grid-item&apos;,
  columnWidth: 200
});
```

With vanilla JavaScript

``` js
// vanilla JS
// init with element
var grid = document.querySelector(&apos;.grid&apos;);
var msnry = new Masonry( grid, {
  // options...
  itemSelector: &apos;.grid-item&apos;,
  columnWidth: 200
});

// init with selector
var msnry = new Masonry( &apos;.grid&apos;, {
  // options...
});
```

With HTML

Add a `data-masonry` attribute to your element. Options can be set in JSON in the value.

``` html
&lt;div class=&quot;grid&quot; data-masonry=&apos;{ &quot;itemSelector&quot;: &quot;.grid-item&quot;, &quot;columnWidth&quot;: 200 }&apos;&gt;
  &lt;div class=&quot;grid-item&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;grid-item&quot;&gt;&lt;/div&gt;
  ...
&lt;/div&gt;
```

## License

Masonry is released under the [MIT license](http://desandro.mit-license.org). Have at it.

* * *

Made by David DeSandro
</description>
            <link>https://abdes.net/assets/bower_components/masonry-layout/</link>
          </item>
        
      
    
      
        
          <item>
            <title></title>
            <description>![nanobar](https://raw.githubusercontent.com/jacoborus/nanobar/master/brand/nanobar.png &apos;nanobar logo&apos;)
=======================================================================================================

Very lightweight progress bars (~699 bytes gzipped).

Compatibility: iE7+ and the rest of the world

[![npm version](https://badge.fury.io/js/nanobar.svg)](https://www.npmjs.com/package/nanobar) [![Bower version](https://img.shields.io/bower/v/nanobar.svg?maxAge=2592000)](https://github.com/jacoborus/nanobar/releases)

## Demo

See [nanobar.jacoborus.codes](http://nanobar.jacoborus.codes)


## Installation

Download and extract the [latest release](https://github.com/jacoborus/nanobar/archive/master.zip) or install with package manager:

[Bower](http://bower.io/):

```
$ bower install nanobar
```

[npm](https://www.npmjs.org/package/nanobar):

```
$ npm install nanobar
```


## Usage

### Load

Link `nanobar.js` from your html file

```html
&lt;script src=&quot;path/to/nanobar.min.js&quot;&gt;&lt;/script&gt;
```

or require it:

```js
var Nanobar = require(&apos;path/to/nanobar&apos;);
```

### Generate progressbar

```js
var nanobar = new Nanobar( options );
```

**options**

- `id` `&lt;String&gt;`: (optional) id for **nanobar** div
- `classname` `&lt;String&gt;`: (optional) class for **nanobar** div
- `target` `&lt;DOM Element&gt;`: (optional) Where to put the progress bar, **nanobar** will be fixed to top of document if no `target` is passed


### Move bar

Resize the bar with `nanobar.go(percentage)`

**arguments**

- `percentage` `&lt;Number&gt;` : percentage width of nanobar


## Example

Create bar

```js
var options = {
	classname: &apos;my-class&apos;,
  id: &apos;my-id&apos;,
	target: document.getElementById(&apos;myDivId&apos;)
};

var nanobar = new Nanobar( options );

//move bar
nanobar.go( 30 ); // size bar 30%
nanobar.go( 76 ); // size bar 76%

// size bar 100% and and finish
nanobar.go(100);
```

### Customize bars

Nanobar injects a style tag in your HTML head. Bar divs has class `.bar`, and its containers `.nanobar`, so you can overwrite its values.

Default css:

```css
.nanobar {
  width: 100%;
  height: 4px;
  z-index: 9999;
  top:0
}
.bar {
  width: 0;
  height: 100%;
  transition: height .3s;
  background:#000;
}
```

You should know what to do with that ;)


&lt;br&gt;&lt;br&gt;

---

© 2016 [jacoborus](https://github.com/jacoborus) - Released under [MIT License](https://raw.github.com/jacoborus/nanobar/master/LICENSE)
</description>
            <link>https://abdes.net/assets/bower_components/nanobar/</link>
          </item>
        
      
    
      
        
          <item>
            <title>Outlayer</title>
            <description># Outlayer

_Brains and guts of a layout library_

Outlayer is a base layout class for layout libraries like [Isotope](http://isotope.metafizzy.co), [Packery](http://packery.metafizzy.co), and [Masonry](http://masonry.desandro.com)

Outlayer layouts work with a container element and children item elements.

``` html
&lt;div class=&quot;grid&quot;&gt;
  &lt;div class=&quot;item&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;item&quot;&gt;&lt;/div&gt;
  ...
&lt;/div&gt;
```

## Install

Install with [Bower](http://bower.io): `bower install outlayer`

[Install with npm](http://npmjs.org/package/outlayer): `npm install outlayer`

## Outlayer.create()

Create a layout class with `Outlayer.create()`

``` js
var Layout = Outlayer.create( namespace );
// for example
var Masonry = Outlayer.create(&apos;masonry&apos;);
```

+ `namespace` _{String}_ should be camelCased
+ returns `LayoutClass` _{Function}_

Create a new layout class. `namespace` is used for jQuery plugin, and for declarative initialization.

The `Layout` inherits from [`Outlayer.prototype`](docs/outlayer.md).

```
var elem = document.querySelector(&apos;.selector&apos;);
var msnry = new Masonry( elem, {
  // set options...
  columnWidth: 200
});
```

## Item

Layouts work with Items, accessible as `Layout.Item`. See [Item API](docs/item.md).

## Declarative

An Outlayer layout class can be initialized via HTML, by setting an attribute of `data-namespace` on the element. Options are set in JSON. For example:

``` html
&lt;!-- var Masonry = Outlayer.create(&apos;masonry&apos;) --&gt;
&lt;div class=&quot;grid&quot; data-masonry=&apos;{ &quot;itemSelector&quot;: &quot;.item&quot;, &quot;columnWidth&quot;: 200 }&apos;&gt;
  ...
&lt;/div&gt;
```

The declarative attributes and class will be dashed. i.e. `Outlayer.create(&apos;myNiceLayout&apos;)` will use `data-my-nice-layout` as the attribute.

## .data()

Get a layout instance from an element.

```
var myMasonry = Masonry.data( document.querySelector(&apos;.grid&apos;) );
```

## jQuery plugin

The layout class also works as jQuery plugin.

``` js
// create Masonry layout class, namespace will be the jQuery method
var Masonry = Outlayer.create(&apos;masonry&apos;);
// rock some jQuery
$( function() {
  // .masonry() to initialize
  var $grid = $(&apos;.grid&apos;).masonry({
    // options...
  });
  // methods are available by passing a string as first parameter
  $grid.masonry( &apos;reveal&apos;, elems );
});
```

## RequireJS

To use Outlayer with [RequireJS](http://requirejs.org/), you&apos;ll need to set some config.

Set [baseUrl](http://requirejs.org/docs/api.html#config-baseUrl) to bower_components and set a [path config](http://requirejs.org/docs/api.html#config-paths) for all your application code.

``` js
requirejs.config({
  baseUrl: &apos;bower_components&apos;,
  paths: {
    app: &apos;../&apos;
  }
});

requirejs( [ &apos;outlayer/outlayer&apos;, &apos;app/my-component.js&apos; ], function( Outlayer, myComp ) {
  new Outlayer( /*...*/ )
});
```

Or set a path config for all Outlayer dependencies.

``` js
requirejs.config({
  paths: {
    &apos;ev-emitter&apos;: &apos;bower_components/ev-emitter&apos;,
    &apos;get-size&apos;: &apos;bower_components/get-size&apos;,
    &apos;matches-selector&apos;: &apos;bower_components/matches-selector&apos;
  }
});
```

## MIT license

Outlayer is released under the [MIT license](http://desandro.mit-license.org).
</description>
            <link>https://abdes.net/assets/bower_components/outlayer/</link>
          </item>
        
      
    
      
    
      
    
      
    
      
    

  </channel>
</rss>