diff --git a/404.html b/404.html new file mode 100644 index 0000000..4fedd3c --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +SeaDve • 404

404

The page you've requested seems to be missing.
Check the URL for errors or go back to the homepage.

\ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..83e84a8 --- /dev/null +++ b/about/index.html @@ -0,0 +1 @@ +SeaDve • About

About

Hi! My name is Dave Patrick Caberto, sometimes known as SeaDve online. I am currently 20 years old and a student of BS Electronics Engineering in the Philippines.

I contribute to various free and open-source software in my free time as I support the adoption of the Linux desktop.

Experiences and Pursuits

I have experience in:

  • Software development (Rust, Python, and C)
  • Desktop application development (GTK and Libadwaita)
  • VCS and hosting platforms (Git, GitHub, and GitLab)
  • Multimedia (GStreamer)
  • Linux (Bash)
  • Web development (Typescript/Javascript, CSS, and HTML)
  • Database (SQLite and LMDB)
  • Graphics Design (Inkscape)
  • Embedded Systems + IoT (Raspberry Pi and Arduino)
  • 3D Design and Modeling (AutoCAD, SketchUp)
  • PCB design (EasyEDA)

I am currently pursuing:

  • Game development (Godot)
  • Computer Vision

Setup

I currently use vanilla Fedora Silverblue both on my PC and laptop.

Contact

You can contact me in Matrix.

\ No newline at end of file diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 0000000..96201e0 --- /dev/null +++ b/archive/index.html @@ -0,0 +1 @@ +SeaDve • Archive

Archive

\ No newline at end of file diff --git a/blog/1-best-linux-distros-for-beginners-2021/card.png b/blog/1-best-linux-distros-for-beginners-2021/card.png new file mode 100644 index 0000000..4414e6f Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/card.png differ diff --git a/blog/1-best-linux-distros-for-beginners-2021/elementary-os.png b/blog/1-best-linux-distros-for-beginners-2021/elementary-os.png new file mode 100644 index 0000000..36feab7 Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/elementary-os.png differ diff --git a/blog/1-best-linux-distros-for-beginners-2021/fedora.png b/blog/1-best-linux-distros-for-beginners-2021/fedora.png new file mode 100644 index 0000000..b7119ed Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/fedora.png differ diff --git a/blog/1-best-linux-distros-for-beginners-2021/index.html b/blog/1-best-linux-distros-for-beginners-2021/index.html new file mode 100644 index 0000000..4c5e268 --- /dev/null +++ b/blog/1-best-linux-distros-for-beginners-2021/index.html @@ -0,0 +1,3 @@ +SeaDve • Best Linux Distros for Beginners in 2021

Best Linux Distros for Beginners in 2021

  • 14th Jan 2021
  •  • 
  • 5 min read
  •  • 
  • Tags: 
  • Software

Card

Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you.

Note that this list may vary from user to user. The main criteria I use are ease of use, user experience, and software and hardware support.

5. Linux Mint

Linux Mint Screenshot

Pros

  • Very lightweight and snappy
  • Great experience for former Windows users
  • Great for older laptops

Cons

  • The desktop looks dated

Linux Mint is an Ubuntu-based distro. It comes with the Cinnamon DE environment by default which is noticeably lighter compared to GNOME. But if you do not like Cinnamon, you can choose between XFCE and MATE which are both similarly fast and light desktop environments.

It comes with the traditional desktop experience, so it would work great for users who came from Windows. It is very customizable and there are a lot of themes to choose from.

4. Elementary OS

Elementary OS Screenshot

Pros

  • Very simple to use
  • It looks beautiful and minimal
  • Supportive app store to indie developers

Cons

  • You cannot choose other DE besides Pantheon

Elementary OS is yet another Ubuntu-based distro, but the difference is that it comes with its own desktop environment, Pantheon, and a minimal set of applications. It is arguably macOS-inspired due to its design language, dock, and the system panel on the top.

To be honest, it is one of the most beautiful Linux distros and its minimalistic look adds to the beauty. The thing I like the most about Elementary OS is its app store which makes it seamless to help hard-working developers.

3. Pop!_OS

Pop!_OS Screenshot

Pros

  • Great Nvidia support
  • Backed by a hardware-selling company
  • Disk encryption on by default

Cons

  • Desktop environment choice is limited to GNOME
  • Not very good with older hardware with less than 1 GB of RAM

Pop!_OS is an Ubuntu-based Linux distro backed by System76. No wonder why they have better Nvidia driver support as the company backing them sells laptops powered by Nvidia.

It provides a snappy and polished experience with the help of a slightly-modified GNOME desktop environment. It also comes with an auto-tiling extension which could be handy for power users.

2. Ubuntu

Ubuntu Screenshot

Pros

  • Great out-of-the-box experience
  • Backed by a company
  • Many desktop environments to choose from
  • Great community support

Cons

  • GNOME DE could be heavy with older hardware

Ubuntu is a Debian-based Linux distro that is backed by Canonical. It comes with GNOME as the default desktop environment, but it comes with others to choose from like Kubuntu (KDE), Lubuntu (LXQt), Ubuntu Mate, UbuntuDDE (Deepin), and many more.

It is simple and easy to operate once you get used to it. Community support is also one of its selling points due to its popularity. It also offers many useful preinstalled applications that could give you a head start.

Honorable Mentions

OpenSUSE

It is a distro that is sponsored by a German company, SUSE. You can choose a rolling or stable release. It might not focus on simplicity, but it offers the user great flexibility.

Deepin

It is a Debian-based distro that comes with its own desktop environment and set of applications. Not only that, but it is subjectively one of the best-looking distros aside from Elementary.

Manjaro

This is an Arch-based distro. It is like Arch, but it is already configured out-of-the-box without having to manually install the operating system.

KDE Neon

This is a Linux distro based on Ubuntu LTS versions. It comes with the latest and greatest KDE packages. KDE Plasma, I would say, is the most customizable desktop environment. It has great support with theme engines like Kvantum.

Debian

It is one of the oldest and most stable Linux distros out there. However, for developers, the packages in the repository may be out-of-date.


1. Fedora

Fedora Screenshot

Pros

  • Great open-source approach
  • Vanilla GNOME experience
  • Backed by Red Hat
  • Very polished experience

Cons

  • Software options might be limited

Fedora is subjectively the best Linux distro of all time. Like Ubuntu, you are not limited to the GNOME desktop environment due to the variety of officially supported spins. It also comes with strictly FOSS-only preinstalled apps, which might limit your software choice if you do not add additional repositories.

It is great for laptops because they are packed with additional optimizations for better battery life. Furthermore, it is also easier to update the system as its application and system updates are handled within the same application, unlike Ubuntu.

Conclusion

There is really no best Linux distro. All distros have their purposes that will serve a specific person. No one can tell you what is the best Linux distro. This is just a guide to help you consider a distro that will work best for you. Why not fire up that VM and you can decide for yourself?


If you have opinions on the list, feel free to comment below. Have a good day!

\ No newline at end of file diff --git a/blog/1-best-linux-distros-for-beginners-2021/linux-mint.png b/blog/1-best-linux-distros-for-beginners-2021/linux-mint.png new file mode 100644 index 0000000..368c69b Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/linux-mint.png differ diff --git a/blog/1-best-linux-distros-for-beginners-2021/pop-os.jpeg b/blog/1-best-linux-distros-for-beginners-2021/pop-os.jpeg new file mode 100644 index 0000000..7e8f533 Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/pop-os.jpeg differ diff --git a/blog/1-best-linux-distros-for-beginners-2021/ubuntu.png b/blog/1-best-linux-distros-for-beginners-2021/ubuntu.png new file mode 100644 index 0000000..70d9d23 Binary files /dev/null and b/blog/1-best-linux-distros-for-beginners-2021/ubuntu.png differ diff --git a/blog/10-kooha-2-3/area-selection-window.png b/blog/10-kooha-2-3/area-selection-window.png new file mode 100644 index 0000000..e96ee83 Binary files /dev/null and b/blog/10-kooha-2-3/area-selection-window.png differ diff --git a/blog/10-kooha-2-3/card.png b/blog/10-kooha-2-3/card.png new file mode 100644 index 0000000..4f14254 Binary files /dev/null and b/blog/10-kooha-2-3/card.png differ diff --git a/blog/10-kooha-2-3/flushing.png b/blog/10-kooha-2-3/flushing.png new file mode 100644 index 0000000..acc58e4 Binary files /dev/null and b/blog/10-kooha-2-3/flushing.png differ diff --git a/blog/10-kooha-2-3/index.html b/blog/10-kooha-2-3/index.html new file mode 100644 index 0000000..9d7ac43 --- /dev/null +++ b/blog/10-kooha-2-3/index.html @@ -0,0 +1,9 @@ +SeaDve • Kooha 2.3 Released!

Kooha 2.3 Released!

  • 24th Mar 2024
  •  • 
  • 3 min read
  •  • 
  • Tags: 
  • Software

Card

Kooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings.

While we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes.

This release includes a refined interface, improved area selection, more informative notifications, and other changes. Read on to learn more about the new features and improvements.

New Features and Improvements

Refined Interface

The main screen now has a more polished look. It now shows the selected format and FPS. This makes it easier to see the current settings at a glance, without having to open the settings window.

Main Screen Screenshot

Other than that, progress is now shown when flushing the recording. This gives a better indication when encoding or saving is taking longer than expected.

Flushing Page Screenshot

Furthermore, the preferences window is also improved. It is now more descriptive and selecting FPS is now easier with a dropdown menu.

Preferences Window Screenshot

Improved Area Selection

The area selection window is now resizable. You can now resize the window to fit your screen better. Additionally, the previously selected area is now remembered across sessions. This means that if you close Kooha and open it again, the area you selected will be remembered. Other improvements include improved focus handling, sizing fixes, better performance, and a new style.

Area Selection Window Screenshot

More Informative Notifications

Record-done notifications now show the duration and size of the recorded video. This is inspired by GNOME Shell screencast notifications.

Notification Screenshot

Moreover, the notification actions now work even when the application is closed.

Other Changes

Besides the mentioned features, this release also includes:

  • Logout and idle are now inhibited while recording.
  • The audio no longer stutters and gets corrupted when recording for a long time.
  • The audio is now recorded in stereo instead of mono when possible.
  • The recordings are no longer deleted when flushing is canceled.
  • Incorrect output video orientation on certain compositors is now fixed.
  • Performance and stability are improved.

Getting Kooha 2.3

Kooha is available on Flathub. You can install it from there, and since all of our code is open-source and can be freely modified and distributed according to the license, you can also download and build it from source.

Closing Words

Thanks to everyone who has supported Kooha, be it through donations, bug reports, translations, or just using it. Your support is what keeps this project going. Enjoy the new release!

\ No newline at end of file diff --git a/blog/10-kooha-2-3/main-screen.png b/blog/10-kooha-2-3/main-screen.png new file mode 100644 index 0000000..484d805 Binary files /dev/null and b/blog/10-kooha-2-3/main-screen.png differ diff --git a/blog/10-kooha-2-3/notification.png b/blog/10-kooha-2-3/notification.png new file mode 100644 index 0000000..00241e4 Binary files /dev/null and b/blog/10-kooha-2-3/notification.png differ diff --git a/blog/10-kooha-2-3/preferences-window.png b/blog/10-kooha-2-3/preferences-window.png new file mode 100644 index 0000000..08ce9e5 Binary files /dev/null and b/blog/10-kooha-2-3/preferences-window.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/basemark-web.png b/blog/2-browser-benchmark-comparison-2021/basemark-web.png new file mode 100644 index 0000000..774f6f9 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/basemark-web.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/card.png b/blog/2-browser-benchmark-comparison-2021/card.png new file mode 100644 index 0000000..f7907a1 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/card.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/index.html b/blog/2-browser-benchmark-comparison-2021/index.html new file mode 100644 index 0000000..f21f8c6 --- /dev/null +++ b/blog/2-browser-benchmark-comparison-2021/index.html @@ -0,0 +1,3 @@ +SeaDve • Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany

Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany

  • 16th Jan 2021
  •  • 
  • 3 min read
  •  • 
  • Tags: 
  • Benchmark

Card

We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium.

In this article, I will compare various popular web browsers. Four of them use Blink/V8 as their engine while Firefox and GNOME Web (Epiphany) use Gecko and WebKitGTK respectively.

I ran eight benchmarks to test the performance of these browsers. I also measured the RAM usage of each browser manually using GNOME System Monitor. Note that if you replicate this test, your results may differ because you are probably using a different computer.

Spoiler alert... Chrome wins!

Setup

I used a Laptop that is connected to a wall socket to do this comparison.

  • Intel i3-2310M
  • 3 GB DDR3
  • Fedora 33 Workstation Edition
  • Linux 5.10.6
  • GNOME Shell 40.0 on Wayland

Browser used

All are set in their default configurations. No additional extensions are installed. I tested two variants of Firefox, one with WebRender enabled.

  • Firefox 84.0.2
  • Firefox 84.0.2 (gfx.webrender.all set to true)
  • Chrome 87.0.4280.141
  • GNOME Web 3.38.2
  • Chromium 87.0.4280.88
  • Brave 1.18.78
  • Edge Dev 89.0.760.0

Results

MotionMark 1.0

MotionMark is used to measure a browser's capability to animate complex scenes at a target frame rate.

Brave wins!

MotionMark 1.0 Results

Kraken 1.1

Kraken is a JavaScript performance benchmark that measures the speed of browsers through different tests extracted from real-world applications and libraries.

Chrome wins!

Kraken Results

Octane 2.0

Octane is a benchmark that measures a JavaScript engine's performance through a suite of tests representing certain use cases in JavaScript applications.

Epiphany wins!

Octane Results

WebXPRT 3

WebXPRT measures the performance of a browser through six HTML5 and JavaScript scenarios that mirror real-life tasks.

Epiphany wins!

WebXPRT 3 Results

Maze Solver (30x30)

Maze Solver exercises the browser's handling of CSS 2.1 and CSS 3 layer constructs which are important components of overall web browser performance.

Epiphany wins!

Maze Solver Results

Speedometer 2.0

Speedometer is a browser benchmark that measures the responsiveness of web applications.

Chrome wins!

Speedometer Results

RAM Usage with 5 tabs open

I opened a total of five tabs: YouTube, Reddit, DuckDuckGo, GitHub and New York Times.

Firefox wins!

RAM Usage Results

Overall Results

Chrome wins!

Overall Results


Take note that I didn't include Basemark and JetStream results on the overall average as Firefox and Epiphany were not able to run these benchmarks without crashing, at least on my hardware.

Basemark Web 3.0

Basemark Web tests how well a browser performs on web-based applications.

Epiphany wins!

Basemark Web 3.0 Results

JetStream 2

Jetstream rewards browsers that start up quickly, execute code quickly and run smoothly.

Chrome wins!

Jetstream 2 Results

Conclusion

In the end, all browsers are capable of handling daily tasks. As long as it provides you with regular security updates and also privacy, you do not need to switch to another web browser for a minuscule performance difference. And remember, performance should not be your only consideration on choosing a web browser. Have a nice day!

Appendix

These are the raw benchmark results:

Raw Benchmark Results

\ No newline at end of file diff --git a/blog/2-browser-benchmark-comparison-2021/jetstream.png b/blog/2-browser-benchmark-comparison-2021/jetstream.png new file mode 100644 index 0000000..fb93bfc Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/jetstream.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/kraken.png b/blog/2-browser-benchmark-comparison-2021/kraken.png new file mode 100644 index 0000000..015e97f Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/kraken.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/maze-solver.png b/blog/2-browser-benchmark-comparison-2021/maze-solver.png new file mode 100644 index 0000000..91ce990 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/maze-solver.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/motion-mark.png b/blog/2-browser-benchmark-comparison-2021/motion-mark.png new file mode 100644 index 0000000..c28dd45 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/motion-mark.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/octane.png b/blog/2-browser-benchmark-comparison-2021/octane.png new file mode 100644 index 0000000..7269aea Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/octane.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/overall-result.png b/blog/2-browser-benchmark-comparison-2021/overall-result.png new file mode 100644 index 0000000..3fd6201 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/overall-result.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/ram-usage.png b/blog/2-browser-benchmark-comparison-2021/ram-usage.png new file mode 100644 index 0000000..d30cfd0 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/ram-usage.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/raw-data.png b/blog/2-browser-benchmark-comparison-2021/raw-data.png new file mode 100644 index 0000000..5d083f2 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/raw-data.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/speedometer.png b/blog/2-browser-benchmark-comparison-2021/speedometer.png new file mode 100644 index 0000000..5137354 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/speedometer.png differ diff --git a/blog/2-browser-benchmark-comparison-2021/webxprt.png b/blog/2-browser-benchmark-comparison-2021/webxprt.png new file mode 100644 index 0000000..1a38fd8 Binary files /dev/null and b/blog/2-browser-benchmark-comparison-2021/webxprt.png differ diff --git a/blog/3-gsoc-2023-introduction/card.png b/blog/3-gsoc-2023-introduction/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/3-gsoc-2023-introduction/card.png differ diff --git a/blog/3-gsoc-2023-introduction/index.html b/blog/3-gsoc-2023-introduction/index.html new file mode 100644 index 0000000..1b0f642 --- /dev/null +++ b/blog/3-gsoc-2023-introduction/index.html @@ -0,0 +1,5 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction)

  • 11th May 2023
  •  • 
  • 4 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Hello there!

I am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval.

Me and my bizarre open-source journey

Weirdly enough, I first discovered Linux five years ago on a failed attempt to do Hackintosh. I got bored with Windows that I decided to try something new and different, and that's when I eventually stumbled upon Linux, specifically Elementary OS. It did not last for me since I still depend a lot on applications that are only available with Windows.

Fast-forward two years later, I decided to give Linux another try with KDE Neon and migrate my workflows to open-source applications such as LibreOffice, Inkscape, and Kdenlive. I remember feeling adventurous and breaking my system numerous times, though I considered it as part of the learning process. I was intrigued by the idea of being a part of a community of passionate developers and enthusiastic users. I also liked the customization it had. However, as I grew with it, I started to realize that I had spent way too much time configuring things and forgetting to focus on what was really important, and that is when I discovered GNOME.

When I first used GNOME, it was a totally different workflow, and I liked it. It was simple; the UI made sense. At that time, there was some software I was missing, particularly a screen recording application that works nicely on Wayland. That was the time I discovered RecApp. It worked well; however, it looked not at home, even for a GTK application. One of my first contributions was creating a mockup for the redesign, and I also took that opportunity to learn Python and GTK and implement my mockup. I was not necessarily proud of my code, but I was proud and happy about having the chance to contribute to the software I use and the community.

A few months later, as I learned more about programming and the GNOME developer ecosystem, there were many more things I'd like to improve and change in RecApp, some of which other contributors did not agree with. That's when Kooha was born, with a total in-and-out redesign of RecApp and a different focus and ideology. Almost a month later was also the birth of Mousai, a song recognizer application. Since then, I have been maintaining these two applications.

There are definitely a lot of things I missed, but that was a quick summary of my journey with open-source.

More about Bustle and the project

For those who have not heard of Bustle, it is an application used to visualize D-Bus activities. It shows signal emissions, method calls, method returns, and errors, which are useful in observing traffic, debugging, and optimizing performance in D-Bus applications.

Bustle Screenshot

Although the current implementation of Bustle in Haskell and GTK 3 is functional, there are noteworthy reasons to consider a rewrite in Rust. Some of these advantages include having access to a range of libraries, such as zbus, gtk4-rs, and LibPCAP bindings. Aside from this, the growing Rust community and the availability of the Rust SDK in Flathub would make the tool more accessible to contributors and simpler to distribute to the users. On the other hand, porting Bustle to GTK 4 would over benefits such as the newer and more modern LibAdwaita widgets and ListView API, which would make it easier for the tool to comply with the HIG and benefit from the latest developments in the platform.

Altogether, this rewrite and port will contribute to the maintainability, accessibility, and future-proofing of Bustle through the use of newer technologies and arguably more ergonomic technologies.


I will be posting updates about the project every few weeks for the next few months, including more details about the plans for this GSoC project. If you'd like to talk about something, feel free to contact me at Matrix @sedve:matrix.org.

Thanks for reading!

\ No newline at end of file diff --git a/blog/3-gsoc-2023-introduction/old-bustle-screenshot.png b/blog/3-gsoc-2023-introduction/old-bustle-screenshot.png new file mode 100644 index 0000000..14a76d6 Binary files /dev/null and b/blog/3-gsoc-2023-introduction/old-bustle-screenshot.png differ diff --git a/blog/4-gsoc-2023-week-1-2/card.png b/blog/4-gsoc-2023-week-1-2/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/4-gsoc-2023-week-1-2/card.png differ diff --git a/blog/4-gsoc-2023-week-1-2/details-view-screenshot.png b/blog/4-gsoc-2023-week-1-2/details-view-screenshot.png new file mode 100644 index 0000000..a7aafa5 Binary files /dev/null and b/blog/4-gsoc-2023-week-1-2/details-view-screenshot.png differ diff --git a/blog/4-gsoc-2023-week-1-2/diagram-with-list-view-screenshot.png b/blog/4-gsoc-2023-week-1-2/diagram-with-list-view-screenshot.png new file mode 100644 index 0000000..246707b Binary files /dev/null and b/blog/4-gsoc-2023-week-1-2/diagram-with-list-view-screenshot.png differ diff --git a/blog/4-gsoc-2023-week-1-2/index.html b/blog/4-gsoc-2023-week-1-2/index.html new file mode 100644 index 0000000..03d72ab --- /dev/null +++ b/blog/4-gsoc-2023-week-1-2/index.html @@ -0,0 +1,7 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2)

  • 11th Jun 2023
  •  • 
  • 3 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Progress Made

Before the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like.

The Rust PCAP library was used to load the packets from the PCAP file, which contains the bytes of a DBus Message. It is nice to use, though it is missing an async API for loading files. That could be fixed in the future, but this week mainly focused on a basic diagram implementation. The bytes can then be parsed through GDBus into a GDBusMessage, which contains the information to implement the diagram.

Through the parsed message, the diagram can be implemented. It uses GtkListView to display the rows as, aside from having a nice separation of view and model, it is more efficient because it recycles widgets, especially since PCAP files could possibly contain thousands of messages. Each row contains the elapsed time, path, destination, interface, and member of the message.

Diagram With ListView Screenshot

Aside from the diagram, a DetailsView was also implemented. It shows the sender and the body, and also the destination, path, and member of the message. For more information about it, you can check out the merge request.

DetailsView Screenshot

GDBus was used initially as zbus is missing the necessary APIs for parsing messages from bytes. However, the merge requests are already on the way to implement those upstream, including a nicer way to print zbus::Value that would match how GVariants are printed.

Plans for the Following Weeks

While the merge requests are in place, there is still some work to do, such as fixing up the Display implementation for zbus::Value::Str and zbus::Value::Array. Once the mentioned merge requests are merged, we could finish up the zbus port.

After the application is fully ported to zbus, we could start working on the more complicated part of the Diagram implementation, like showing signals and the method call and return arrows.


That's all for this week. See you again in the next weeks. Thanks for reading!

\ No newline at end of file diff --git a/blog/5-gsoc-2023-week-3-4/card.png b/blog/5-gsoc-2023-week-3-4/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/5-gsoc-2023-week-3-4/card.png differ diff --git a/blog/5-gsoc-2023-week-3-4/index.html b/blog/5-gsoc-2023-week-3-4/index.html new file mode 100644 index 0000000..75a34cd --- /dev/null +++ b/blog/5-gsoc-2023-week-3-4/index.html @@ -0,0 +1,7 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4)

  • 5th Jul 2023
  •  • 
  • 2 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Progress Made

There's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the PR to add from_bytes constructor for zbus::Message merged. This means that we can now construct zbus::Message from raw GDBusMessage bytes and vice versa, which is critical for porting Bustle from GDBus to zbus.

On the other hand, the PR to implement Display for Value, Array, Structure, Dict & Maybe is, while the implementation for zbus::Value::Str and zbus::Value::Array is already fixed, still in the review stage as there are still things to polish, such as figuring out a way to simplify the implementation.

Meanwhile, I have also been experimenting with drawing on the diagram using GTK transform functions such as translate_coordinates and compute_point, but nothing is ready enough yet for a screenshot.

Plans for the Following Weeks

With my finals out of the equation, I could focus more on finishing up drawing the signals and methods arrow on the diagram during the last days of the GSoC midterm period.

I will also push PR to implement Display for Value, Array, Structure, Dict & Maybe to be merged so that the zbus port MR can also be merged.


That's all for this week. I'm looking forward to writing more in the next weeks. Thanks for reading!

\ No newline at end of file diff --git a/blog/6-gsoc-2023-week-5-6/address-dialog.png b/blog/6-gsoc-2023-week-5-6/address-dialog.png new file mode 100644 index 0000000..9e1c3d2 Binary files /dev/null and b/blog/6-gsoc-2023-week-5-6/address-dialog.png differ diff --git a/blog/6-gsoc-2023-week-5-6/card.png b/blog/6-gsoc-2023-week-5-6/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/6-gsoc-2023-week-5-6/card.png differ diff --git a/blog/6-gsoc-2023-week-5-6/index.html b/blog/6-gsoc-2023-week-5-6/index.html new file mode 100644 index 0000000..55b5f5a --- /dev/null +++ b/blog/6-gsoc-2023-week-5-6/index.html @@ -0,0 +1,7 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6)

  • 19th Jul 2023
  •  • 
  • 2 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Progress Made

This week, the PR to implement Display for Value, Array, Structure, Dict, and Maybe has been merged. Thus, there is a much nicer way now upstream to display zbus::Value, similar to GVariant. With this blocker cleared out, the zbus port MR has also been merged, fully porting the Bustle rewrite to zbus.

Furthermore, my mentor, Bilal, started implementing session monitoring and saving to a PCAP file while I continued their work and implemented system and address recording. However, it is not yet merged as there are some things to be figured out and more work to do. Specifically, it currently requires a dbus-monitor binary installed on the host, which is not great for distributions that do not package it.

Address Dialog Screenshot

Aside from those mentioned above, I have also been working on drawing the diagram. I am still studying the older Haskell codebase to prevent reinventing the wheel on some implementations. Unfortunately, the current implementation is still not ready enough for a screenshot.

To easily track the missing features, we also set up an issue board.

Plans for the Following Weeks

In the following weeks, I will get the PR to implement and address recording merged and work on more parts of the diagram drawing.


That's all for this week. Thanks for reading!

\ No newline at end of file diff --git a/blog/7-gsoc-2023-week-7-8/card.png b/blog/7-gsoc-2023-week-7-8/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/7-gsoc-2023-week-7-8/card.png differ diff --git a/blog/7-gsoc-2023-week-7-8/diagram.png b/blog/7-gsoc-2023-week-7-8/diagram.png new file mode 100644 index 0000000..e62cdbd Binary files /dev/null and b/blog/7-gsoc-2023-week-7-8/diagram.png differ diff --git a/blog/7-gsoc-2023-week-7-8/index.html b/blog/7-gsoc-2023-week-7-8/index.html new file mode 100644 index 0000000..841e982 --- /dev/null +++ b/blog/7-gsoc-2023-week-7-8/index.html @@ -0,0 +1,7 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)

  • 2nd Aug 2023
  •  • 
  • 2 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Progress Made

A lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found.

Second, when recording, the sequence diagram now sticks at the bottom because, in common use cases, it is mostly wanted to observe the new messages as they come.

Sticky Scroll Screencast

Moreover, on the smaller changes, PCAP file loading is now synchronous, the gtk4-rs dependency has now been updated to the recently released 0.17 version, the accuracy of timestamp calculations has been improved, and the focus issue on the address dialog has been fixed.

Lastly, the signals and method call arrows and arcs are now (finally!) drawn in the diagram. While it looks simple, it took me days to get it right. However, there is no merge request yet since it requires more bug fixing and code cleanup.

Diagram With Arrows and Arcs

GUADEC

Aside from working on the code, I also attended GUADEC remotely. I had a lightning talk about a bit about myself and an overview of this project.

Plans for the Following Weeks

For the next weeks, the diagram still needs bug fixing and polishing, as mentioned. For instance, it currently does not draw arcs on method calls when either the call or return row is not visible. The header is also only visible when scrolled all the way to the top, and it only shows the unique name instead of the well-known name.

After the diagram is completed, we will go on with the implementation of service filtering and adding a more convenient way to have multiple instances of recording or opened files via tabs.


That's all for this week. Thanks for reading!

\ No newline at end of file diff --git a/blog/7-gsoc-2023-week-7-8/sticky-scroll.gif b/blog/7-gsoc-2023-week-7-8/sticky-scroll.gif new file mode 100644 index 0000000..4c59944 Binary files /dev/null and b/blog/7-gsoc-2023-week-7-8/sticky-scroll.gif differ diff --git a/blog/8-gsoc-2023-week-9-10/card.png b/blog/8-gsoc-2023-week-9-10/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/card.png differ diff --git a/blog/8-gsoc-2023-week-9-10/details-view.png b/blog/8-gsoc-2023-week-9-10/details-view.png new file mode 100644 index 0000000..4a137a3 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/details-view.png differ diff --git a/blog/8-gsoc-2023-week-9-10/diagram.gif b/blog/8-gsoc-2023-week-9-10/diagram.gif new file mode 100644 index 0000000..b2d9221 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/diagram.gif differ diff --git a/blog/8-gsoc-2023-week-9-10/dot-graph.png b/blog/8-gsoc-2023-week-9-10/dot-graph.png new file mode 100644 index 0000000..b6a6834 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/dot-graph.png differ diff --git a/blog/8-gsoc-2023-week-9-10/index.html b/blog/8-gsoc-2023-week-9-10/index.html new file mode 100644 index 0000000..4c08aa5 --- /dev/null +++ b/blog/8-gsoc-2023-week-9-10/index.html @@ -0,0 +1,7 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)

  • 19th Aug 2023
  •  • 
  • 4 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Progress Made

I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state.

Diagram

Aside from that, it now has a header that doesn't overlay on the diagram, the drawings now properly adjust to text scale factor changes, the signal arrows are now drawn, and the rows are no longer clipped into the row titles.

My mentor, Bilal, also worked on adding tags, the colored circles in the diagram, so it is easier to determine the category of a message.

On the general UI side, there is now a proper loading page that is shown while waiting for the PCAP files to show.

Loading Page

However, that may not be as useful as we also landed a patch that speeds up loading by up to 32 times; that's from 16 seconds on average to 500 milliseconds, when loading a 2.2 MB file.

There is also now a waiting page that shows before the first message arrives while recording.

Waiting Page

We also landed statistics window which shows frequencies of messages, durations of method calls, and sizes information of each message.

Statistics Frequencies Page

Statistics Durations Page

Statistics Sizes Page

My mentor, Bilal, also worked on adding information on the details view including the body size and signature, and the response time from method return to its call.

Details View

There is also now a way to save the PCAP file as a DOT graph file, which can be used to generate a graph using Graphviz to visualize interactions between bus names like the following:

DOT Graph

On the plumbing side, saving to PCAP file is now asynchronous, avoiding blocking the UI. We also ported from using libpcap to a pure Rust library, removing unsafe code and simplifying the codebase. Furthermore, the timestamp computation is now more accurate.

As part of making debugging in Bustle easier, I have also submitted a patch to zbus to simplify the printing of bus names.

Finally, I started prototyping services filtering. It is still a proof of concept and does not look great, but it already functions and is a good starting point for next week.

Services Filtering

Plans for the Following Weeks

The following weeks will be the last days of GSoC and I will be focusing on finishing up the remaining tasks. With the most difficult part of this GSoC project done, most of the tasks left, aside from services filtering, are optimizing performance and cleaning up the codebase.

There are also a few more things to fix such as a proper name owner changed signal handling, drawing method call arc regardless if the row is not drawable, properly killing the dbus-monitor process, and propagating user-facing errors.

I would also like to add features such as adding a button that scroll to the method call message of a method return message or vice-versa, porting to use the new GskPath APIs, and adding a way to open multiple diagrams at once via tabs and multiple windows.


That's all for this week. Thanks for reading!

\ No newline at end of file diff --git a/blog/8-gsoc-2023-week-9-10/loading-page.png b/blog/8-gsoc-2023-week-9-10/loading-page.png new file mode 100644 index 0000000..250a394 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/loading-page.png differ diff --git a/blog/8-gsoc-2023-week-9-10/services-filtering.png b/blog/8-gsoc-2023-week-9-10/services-filtering.png new file mode 100644 index 0000000..ecbbcbc Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/services-filtering.png differ diff --git a/blog/8-gsoc-2023-week-9-10/statistics-durations-page.png b/blog/8-gsoc-2023-week-9-10/statistics-durations-page.png new file mode 100644 index 0000000..9af95b3 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/statistics-durations-page.png differ diff --git a/blog/8-gsoc-2023-week-9-10/statistics-frequencies-page.png b/blog/8-gsoc-2023-week-9-10/statistics-frequencies-page.png new file mode 100644 index 0000000..96c8070 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/statistics-frequencies-page.png differ diff --git a/blog/8-gsoc-2023-week-9-10/statistics-sizes-page.png b/blog/8-gsoc-2023-week-9-10/statistics-sizes-page.png new file mode 100644 index 0000000..3206155 Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/statistics-sizes-page.png differ diff --git a/blog/8-gsoc-2023-week-9-10/waiting-page.png b/blog/8-gsoc-2023-week-9-10/waiting-page.png new file mode 100644 index 0000000..5f7887a Binary files /dev/null and b/blog/8-gsoc-2023-week-9-10/waiting-page.png differ diff --git a/blog/9-gsoc-2023-final-overview/card.png b/blog/9-gsoc-2023-final-overview/card.png new file mode 100644 index 0000000..1bfcdac Binary files /dev/null and b/blog/9-gsoc-2023-final-overview/card.png differ diff --git a/blog/9-gsoc-2023-final-overview/diagram-and-details-view.gif b/blog/9-gsoc-2023-final-overview/diagram-and-details-view.gif new file mode 100644 index 0000000..b2d9221 Binary files /dev/null and b/blog/9-gsoc-2023-final-overview/diagram-and-details-view.gif differ diff --git a/blog/9-gsoc-2023-final-overview/index.html b/blog/9-gsoc-2023-final-overview/index.html new file mode 100644 index 0000000..c2e4d73 --- /dev/null +++ b/blog/9-gsoc-2023-final-overview/index.html @@ -0,0 +1,3 @@ +SeaDve • GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)

  • 28th Aug 2023
  •  • 
  • 8 min read
  •  • 
  • Tags: 
  • GSoC 2023

Card

Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project.

About Bustle

Bustle is a graphical application used to analyze D-Bus activities. It uses sequence diagrams to present signal emissions and method calls messages.

Old Bustle

Bustle represents these messages using a row-based layout. Each row is dedicated to displaying the following information: the elapsed time since the first message, the message path, and the member, which could be the name of the emitted signal or invoked method. On the other hand, individual columns correspond to distinct D-Bus services. Bustle draws arrows that transverse these columns to visualize the communication between services, while arcs represent method invocations and returns. This visual paradigm is valuable as, for instance, it can be used to see which services a D-Bus application talks to and how often, which can be handy in debugging, enhancing security, and optimizing performance within the application.

Project Goal

The ultimate goal of this project is to port Bustle to GTK 4 and rewrite it in Rust. Although the current implementation of Bustle in Haskell and GTK 3 is functional, there are compelling reasons to consider a rewrite in Rust. This includes enabling the tool to take advantage of a range of ergonomic libraries, including zbus, gtk4-rs, and pcap-file, that would ease the burden in maintenance. Furthermore, the growing Rust community and the availability of the Rust SDK in Flathub would make the tool more accessible to potential contributors and simpler to distribute to users.

Porting the tool to GTK 4, on the other hand, would offer several benefits, such as access to newer and more performant widgets and drawing APIs like GtkListView and GskPath. This would allow Bustle to benefit from the latest developments in the platform and remain current with evolving standards.

Altogether, a rewrite of Bustle in Rust and GTK 4 would provide advantages that can enhance the tool's functionality, maintainability, longevity, accessibility, and possibly efficiency.

Work Done

Most of the tasks in the original proposal have been completed. This includes having an initial MVP, porting GDBus usage to zbus, implementing file loading and saving, completing the recording functionality, and porting the UI, which comprises the diagram, details view, and services filter, to GTK 4.

For more details on the work done, there are also bi-weekly updates on my blog.

Snapshots

Diagram and Details View

Diagram and Details View

Recording and Services Filter

Recording and Services Filter

Code Merged

These are the summary of code that has been merged during the GSoC period.

Bustle

Most of the work done is in the Bustle GNOME GitLab repository, where the following pull requests have been merged:

zbus and gtk4-rs

While the project is focused on Bustle, some changes are necessary to be upstreamed to other projects. This includes changes to zbus and gtk4-rs, where the following pull requests have been merged:

zbus

gtk4-rs

Code to be Merged

Due to time constraints and unexpected issues, some of the pull requests are still pending review:

Future Plans

While most of the tasks in the proposal have been completed, there are still a few things that need to be done, including the following:

  1. Optimizing performance
  2. Hunting and squashing bugs:
    • Improving name owner changed signal handling
    • Drawing method call arc regardless if the row is not drawable
    • Properly killing the dbus-monitor process
  3. Adding more features:
    • Adding a button that scrolls to the method call message of a method return message or vice-versa
    • Adding a way to open multiple diagrams at once via tabs and multiple windows
  4. Fixing regressions and releasing the application on Flathub
  5. Continuous involvement and contribution to open-source

Final Words

I have to say this is, so far, the most challenging part of my software development journey. It felt like a hackathon since I had to understand things and create something that works quickly. While it was challenging, it was also rewarding as I was able to learn a lot of things and create something that I am proud of. There were moments of time pressure and frustration, but with experimentation, collaboration, and a lot of reading, I was able to overcome these challenges and make meaningful progress. The complexity of the project pushed me out of my comfort zone, forcing me to delve into unfamiliar areas of programming and technology.

Lastly, I would like to express my gratitude to my mentors, Bilal Elmoussaoui and Maximiliano Sandoval, for tirelessly reviewing my pull requests and guiding me. I would also like to thank the GNOME Foundation and the community, especially the GNOME GSoC admin, Felipe Borges, for giving me the opportunity to work on this project. I would also like to extend my appreciation to zbus maintainer, Zeeshan Ali Khan, for their help in getting my pull requests merged against zbus and to the original Bustle developer, Will Thompson, for their guidance. Finally, I would like to thank my family and friends for their support and encouragement.

\ No newline at end of file diff --git a/blog/9-gsoc-2023-final-overview/old-bustle.png b/blog/9-gsoc-2023-final-overview/old-bustle.png new file mode 100644 index 0000000..14a76d6 Binary files /dev/null and b/blog/9-gsoc-2023-final-overview/old-bustle.png differ diff --git a/blog/9-gsoc-2023-final-overview/recording-and-services-filter.gif b/blog/9-gsoc-2023-final-overview/recording-and-services-filter.gif new file mode 100644 index 0000000..356c3a6 Binary files /dev/null and b/blog/9-gsoc-2023-final-overview/recording-and-services-filter.gif differ diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..53f1174 --- /dev/null +++ b/blog/index.html @@ -0,0 +1 @@ +SeaDve • Blog

Blog

  • 24th March 2024

Kooha 2.3 Released!

Kooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings. While we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes. …

Read more 
  • 28th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)

Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project. …

Read more 
  • 19th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)

Progress Made I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state. …

Read more 
  • 2nd August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)

Progress Made A lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found. …

Read more 
  • 19th July 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6)

Progress Made This week, the PR to implement Display for Value, Array, Structure, Dict, and Maybe has been merged. Thus, there is a much nicer way now upstream to display zbus::Value, similar to GVariant. With this blocker cleared out, the zbus port MR has also been merged, fully porting the Bustle rewrite to zbus. …

Read more 
\ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 0000000..3e07c18 --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1 @@ +Redirect

Click here to be redirected.

\ No newline at end of file diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 0000000..d546f28 --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1 @@ +SeaDve • Blog

Blog

  • 5th July 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4)

Progress Made There's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the PR to add from_bytes constructor for zbus::Message merged. This means that we can now construct zbus::Message from raw GDBusMessage bytes and vice versa, which is critical for porting Bustle from GDBus to zbus. …

Read more 
  • 11th June 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2)

Progress Made Before the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like. …

Read more 
  • 11th May 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction)

Hello there! I am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval. …

Read more 
  • 16th January 2021

Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany

We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium. …

Read more 
  • 14th January 2021

Best Linux Distros for Beginners in 2021

Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you. …

Read more 
\ No newline at end of file diff --git a/custom_subset.css b/custom_subset.css new file mode 100644 index 0000000..884f59f --- /dev/null +++ b/custom_subset.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/designs/binary-sunset.png b/designs/binary-sunset.png new file mode 100755 index 0000000..5a8393d Binary files /dev/null and b/designs/binary-sunset.png differ diff --git a/designs/blue-goo.png b/designs/blue-goo.png new file mode 100755 index 0000000..95d3a23 Binary files /dev/null and b/designs/blue-goo.png differ diff --git a/designs/bluewatch.png b/designs/bluewatch.png new file mode 100644 index 0000000..0c583ef Binary files /dev/null and b/designs/bluewatch.png differ diff --git a/designs/desert.png b/designs/desert.png new file mode 100755 index 0000000..50c2e34 Binary files /dev/null and b/designs/desert.png differ diff --git a/designs/humanity.png b/designs/humanity.png new file mode 100644 index 0000000..6bfad63 Binary files /dev/null and b/designs/humanity.png differ diff --git a/designs/index.html b/designs/index.html new file mode 100644 index 0000000..d32cce7 --- /dev/null +++ b/designs/index.html @@ -0,0 +1 @@ +SeaDve • Designs

Designs

\ No newline at end of file diff --git a/designs/material-goo.png b/designs/material-goo.png new file mode 100755 index 0000000..5218d20 Binary files /dev/null and b/designs/material-goo.png differ diff --git a/designs/material.png b/designs/material.png new file mode 100755 index 0000000..923e598 Binary files /dev/null and b/designs/material.png differ diff --git a/designs/mesh.png b/designs/mesh.png new file mode 100755 index 0000000..797060b Binary files /dev/null and b/designs/mesh.png differ diff --git a/designs/morning-lake.png b/designs/morning-lake.png new file mode 100755 index 0000000..733b575 Binary files /dev/null and b/designs/morning-lake.png differ diff --git a/designs/mountain.png b/designs/mountain.png new file mode 100755 index 0000000..83b7ed6 Binary files /dev/null and b/designs/mountain.png differ diff --git a/designs/neomorph.png b/designs/neomorph.png new file mode 100644 index 0000000..27c6cdd Binary files /dev/null and b/designs/neomorph.png differ diff --git a/designs/neon-goo.png b/designs/neon-goo.png new file mode 100755 index 0000000..8e2d8f5 Binary files /dev/null and b/designs/neon-goo.png differ diff --git a/designs/neon-smoke.png b/designs/neon-smoke.png new file mode 100755 index 0000000..1cffb4b Binary files /dev/null and b/designs/neon-smoke.png differ diff --git a/designs/night-clift.png b/designs/night-clift.png new file mode 100755 index 0000000..7d10097 Binary files /dev/null and b/designs/night-clift.png differ diff --git a/designs/night-forest.png b/designs/night-forest.png new file mode 100755 index 0000000..4f04d06 Binary files /dev/null and b/designs/night-forest.png differ diff --git a/designs/nightlight.png b/designs/nightlight.png new file mode 100644 index 0000000..ba16f34 Binary files /dev/null and b/designs/nightlight.png differ diff --git a/designs/planet.png b/designs/planet.png new file mode 100755 index 0000000..a6028c9 Binary files /dev/null and b/designs/planet.png differ diff --git a/designs/strange.png b/designs/strange.png new file mode 100755 index 0000000..ee92399 Binary files /dev/null and b/designs/strange.png differ diff --git a/designs/tchalla.png b/designs/tchalla.png new file mode 100755 index 0000000..3b3847f Binary files /dev/null and b/designs/tchalla.png differ diff --git a/donate/index.html b/donate/index.html new file mode 100644 index 0000000..fc7900d --- /dev/null +++ b/donate/index.html @@ -0,0 +1 @@ +SeaDve • Donate

Donate

If you would like to back my work and support me as a developer, you may buy me a coffee or sponsor me via GitHub Sponsors.

\ No newline at end of file diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000..79dad65 --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + + + + + + + <xsl:value-of select="/atom:feed/atom:title"/> • Feed + + + + + + + + + +
+
+
+ + + + + About Feeds + + + + + + +
+ +
+

+
+ +
+ +
+
    + + + + +
  • + +
  • +
    + + +
  • + +
  • +
    + + +
  • + + + + + +
  • +
    +
+
+ +
+ +
+ + + + + +
+
+
+
+
+
+ + +
+
diff --git a/fonts/CascadiaCode-SemiLight.woff2 b/fonts/CascadiaCode-SemiLight.woff2 new file mode 100644 index 0000000..5b227af Binary files /dev/null and b/fonts/CascadiaCode-SemiLight.woff2 differ diff --git a/fonts/Inter4.woff2 b/fonts/Inter4.woff2 new file mode 100644 index 0000000..1f5bfa1 Binary files /dev/null and b/fonts/Inter4.woff2 differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.ttf b/fonts/KaTeX/KaTeX_AMS-Regular.ttf new file mode 100644 index 0000000..c6f9a5e Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.woff b/fonts/KaTeX/KaTeX_AMS-Regular.woff new file mode 100644 index 0000000..b804d7b Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.woff2 b/fonts/KaTeX/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000..0acaaff Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf b/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 0000000..9ff4a5e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 0000000..9759710 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 0000000..f390922 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf b/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 0000000..f522294 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff new file mode 100644 index 0000000..9bdd534 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000..75344a1 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf b/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 0000000..4e98259 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.woff b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff new file mode 100644 index 0000000..e7730f6 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000..395f28b Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf b/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf new file mode 100644 index 0000000..b8461b2 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.woff b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff new file mode 100644 index 0000000..acab069 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 0000000..735f694 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.ttf b/fonts/KaTeX/KaTeX_Main-Bold.ttf new file mode 100644 index 0000000..4060e62 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.woff b/fonts/KaTeX/KaTeX_Main-Bold.woff new file mode 100644 index 0000000..f38136a Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.woff2 b/fonts/KaTeX/KaTeX_Main-Bold.woff2 new file mode 100644 index 0000000..ab2ad21 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf b/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf new file mode 100644 index 0000000..dc00797 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.woff b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff new file mode 100644 index 0000000..67807b0 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 0000000..5931794 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.ttf b/fonts/KaTeX/KaTeX_Main-Italic.ttf new file mode 100644 index 0000000..0e9b0f3 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.woff b/fonts/KaTeX/KaTeX_Main-Italic.woff new file mode 100644 index 0000000..6f43b59 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.woff2 b/fonts/KaTeX/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000..b50920e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.ttf b/fonts/KaTeX/KaTeX_Main-Regular.ttf new file mode 100644 index 0000000..dd45e1e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.woff b/fonts/KaTeX/KaTeX_Main-Regular.woff new file mode 100644 index 0000000..21f5812 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.woff2 b/fonts/KaTeX/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000..eb24a7b Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf b/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 0000000..728ce7a Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.woff b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff new file mode 100644 index 0000000..0ae390d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000..2965702 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.ttf b/fonts/KaTeX/KaTeX_Math-Italic.ttf new file mode 100644 index 0000000..70d559b Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.woff b/fonts/KaTeX/KaTeX_Math-Italic.woff new file mode 100644 index 0000000..eb5159d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.woff2 b/fonts/KaTeX/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000..215c143 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf b/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf new file mode 100644 index 0000000..2f65a8a Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.woff b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff new file mode 100644 index 0000000..8d47c02 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 0000000..cfaa3bd Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf b/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 0000000..d5850df Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.woff b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff new file mode 100644 index 0000000..7e02df9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000..349c06d Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf b/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf new file mode 100644 index 0000000..537279f Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.woff b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff new file mode 100644 index 0000000..31b8482 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 0000000..a90eea8 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.ttf b/fonts/KaTeX/KaTeX_Script-Regular.ttf new file mode 100644 index 0000000..fd679bf Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.woff b/fonts/KaTeX/KaTeX_Script-Regular.woff new file mode 100644 index 0000000..0e7da82 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.woff2 b/fonts/KaTeX/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000..b3048fc Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.ttf b/fonts/KaTeX/KaTeX_Size1-Regular.ttf new file mode 100644 index 0000000..871fd7d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.woff b/fonts/KaTeX/KaTeX_Size1-Regular.woff new file mode 100644 index 0000000..7f292d9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.woff2 b/fonts/KaTeX/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000..c5a8462 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.ttf b/fonts/KaTeX/KaTeX_Size2-Regular.ttf new file mode 100644 index 0000000..7a212ca Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.woff b/fonts/KaTeX/KaTeX_Size2-Regular.woff new file mode 100644 index 0000000..d241d9b Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.woff2 b/fonts/KaTeX/KaTeX_Size2-Regular.woff2 new file mode 100644 index 0000000..e1bccfe Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.ttf b/fonts/KaTeX/KaTeX_Size3-Regular.ttf new file mode 100644 index 0000000..00bff34 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.woff b/fonts/KaTeX/KaTeX_Size3-Regular.woff new file mode 100644 index 0000000..e6e9b65 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.woff2 b/fonts/KaTeX/KaTeX_Size3-Regular.woff2 new file mode 100644 index 0000000..249a286 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.ttf b/fonts/KaTeX/KaTeX_Size4-Regular.ttf new file mode 100644 index 0000000..74f0892 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.woff b/fonts/KaTeX/KaTeX_Size4-Regular.woff new file mode 100644 index 0000000..e1ec545 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.woff2 b/fonts/KaTeX/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000..680c130 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf b/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 0000000..c83252c Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.woff b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff new file mode 100644 index 0000000..2432419 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000..771f1af Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 differ diff --git a/fonts/SourceSerif4Variable-Roman.ttf.woff2 b/fonts/SourceSerif4Variable-Roman.ttf.woff2 new file mode 100644 index 0000000..13ec3f7 Binary files /dev/null and b/fonts/SourceSerif4Variable-Roman.ttf.woff2 differ diff --git a/img/logo-circle.png b/img/logo-circle.png new file mode 100644 index 0000000..e12b9a3 Binary files /dev/null and b/img/logo-circle.png differ diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000..43d115f Binary files /dev/null and b/img/logo.png differ diff --git a/img/logo.svg b/img/logo.svg new file mode 100644 index 0000000..a17afb6 --- /dev/null +++ b/img/logo.svg @@ -0,0 +1,369 @@ + + + + diff --git a/img/main.webp b/img/main.webp new file mode 100644 index 0000000..174ec87 Binary files /dev/null and b/img/main.webp differ diff --git a/img/projects/breathing.svg b/img/projects/breathing.svg new file mode 100644 index 0000000..26d2277 --- /dev/null +++ b/img/projects/breathing.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/delineate.svg b/img/projects/delineate.svg new file mode 100644 index 0000000..786af3e --- /dev/null +++ b/img/projects/delineate.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/gsettings-macro.source.svg b/img/projects/gsettings-macro.source.svg new file mode 100644 index 0000000..bb8ea73 --- /dev/null +++ b/img/projects/gsettings-macro.source.svg @@ -0,0 +1,484 @@ + +Adwaita Icon Templateimage/svg+xmlGNOME Design TeamAdwaita Icon TemplateHicolorSymbolicGG diff --git a/img/projects/gsettings-macro.svg b/img/projects/gsettings-macro.svg new file mode 100644 index 0000000..e86cbb9 --- /dev/null +++ b/img/projects/gsettings-macro.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/kooha.svg b/img/projects/kooha.svg new file mode 100644 index 0000000..378833a --- /dev/null +++ b/img/projects/kooha.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/mousai.svg b/img/projects/mousai.svg new file mode 100644 index 0000000..4ac8c41 --- /dev/null +++ b/img/projects/mousai.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/mpris-server.source.svg b/img/projects/mpris-server.source.svg new file mode 100644 index 0000000..001eaf0 --- /dev/null +++ b/img/projects/mpris-server.source.svg @@ -0,0 +1,483 @@ + +Adwaita Icon Templateimage/svg+xmlGNOME Design TeamAdwaita Icon TemplateHicolorSymbolicG diff --git a/img/projects/mpris-server.svg b/img/projects/mpris-server.svg new file mode 100644 index 0000000..9b89cce --- /dev/null +++ b/img/projects/mpris-server.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/projects/plotters-gtk4.source.svg b/img/projects/plotters-gtk4.source.svg new file mode 100644 index 0000000..374dbd2 --- /dev/null +++ b/img/projects/plotters-gtk4.source.svg @@ -0,0 +1,492 @@ + +Adwaita Icon Templateimage/svg+xmlGNOME Design TeamAdwaita Icon TemplateHicolorSymbolicG diff --git a/img/projects/plotters-gtk4.svg b/img/projects/plotters-gtk4.svg new file mode 100644 index 0000000..7df2534 --- /dev/null +++ b/img/projects/plotters-gtk4.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/seedling.png b/img/seedling.png new file mode 100644 index 0000000..0efa5b9 Binary files /dev/null and b/img/seedling.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..57bac98 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +SeaDve

Latest posts

  • 24th March 2024

Kooha 2.3 Released!

Kooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings. While we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes. …

Read more 
  • 28th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)

Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project. …

Read more 
  • 19th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)

Progress Made I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state. …

Read more 
  • 2nd August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)

Progress Made A lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found. …

Read more 
\ No newline at end of file diff --git a/inter_subset_en.css b/inter_subset_en.css new file mode 100644 index 0000000..cafb383 --- /dev/null +++ b/inter_subset_en.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/inter_subset_es.css b/inter_subset_es.css new file mode 100644 index 0000000..fe802b0 --- /dev/null +++ b/inter_subset_es.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/isso.css b/isso.css new file mode 100644 index 0000000..26d26c5 --- /dev/null +++ b/isso.css @@ -0,0 +1,374 @@ +/* ========================================================================== */ +/* Generic styling */ +/* ========================================================================== */ +#isso-thread * { + /* Reset */ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* ========================================================================== */ +/* Thread heading area */ +/* ========================================================================== */ +#isso-thread { + margin: 0 auto; + padding: 0; + width: 100%; + color: var(--text-color); + font-size: 0.9em; + font-family: var(--sans-serif-font); +} + +h4.isso-thread-heading { + padding-bottom: 0.2em; + color: var(--text-color); + font-size: 1.2rem; +} + +.isso-feedlink { + float: right; + padding-left: 1em; +} + +.isso-feedlink a { + vertical-align: bottom; + font-size: 0.8em; +} + +/* ========================================================================== */ +/* Comments */ +/* ========================================================================== */ + +.isso-comment { + margin: 0 auto; + max-width: 68em; +} + +.isso-preview .isso-comment { + margin: 0; + padding-top: 0; +} + +.isso-comment:not(:first-of-type), +.isso-follow-up .isso-comment { + margin-bottom: 0.5em; + border-top: 1px solid var(--divider-color); +} + +.isso-avatar { + display: block; + float: left; + margin: 0.95em 0.95em 0; +} + +.isso-avatar svg { + border: 1px solid var(--divider-color); + border-radius: 3px; + width: 100%; + max-width: 48px; + height: 100%; + max-height: 48px; +} + +.isso-text-wrapper { + display: block; + padding: 0.3em; +} + +.isso-follow-up { + padding-left: calc(7% + 20px); +} + +.isso-comment-footer { + font-size: 0.95em; +} + +.isso-comment-header { + font-size: 0.85em; +} + +.isso-comment-header a { + text-decoration: none; +} + +/* Only for comment header, spacer between up-/downvote should have no padding */ +.isso-comment-header .isso-spacer { + padding: 0 6px; +} + +.isso-spacer, +.isso-permalink, +.isso-note, +.isso-parent { + color: var(--meta-color); + font-weight: normal; + text-shadow: none; +} + +.isso-permalink:hover, +.isso-note:hover, +.isso-parent:hover { + color: var(--hover-color); +} + +.isso-note { + float: right; +} + +.isso-author { + color: var(--text-color); + font-weight: 500; +} + +.isso-page-author-suffix { + color: var(--text-color-high-contrast); + font-weight: bold; +} + +/* Style author comments and replies */ +.isso-is-page-author>.isso-text-wrapper { + background-color: var(--bg-1); +} + +.isso-textarea, +.isso-preview { + background-color: var(--bg-2); + padding: 10px; + width: 100%; + color: var(--text-color); + font-size: 0.8em; + font-family: var(--sans-serif-font); +} + +.isso-text p { + margin-top: -0.4em; +} + +.isso-text p:last-child { + margin-bottom: 0.2em; +} + +.isso-text h1, +.isso-text h2, +.isso-text h3, +.isso-text h4, +.isso-text h5, +.isso-text h6 { + font-weight: bold; + font-size: 130%; +} + +.isso-comment-footer { + clear: left; + color: var(--meta-color); + font-size: 0.80em; +} + +.isso-feedlink, +.isso-comment-footer a { + margin: 0.4em; + padding: 0.1em; + font-weight: bold; + text-decoration: none; +} + +.isso-comment-footer .isso-votes { + color: var(--meta-color); +} + +.isso-upvote svg, +.isso-downvote svg { + position: relative; + top: .2em; +} + +.isso-upvote:hover svg, +.isso-downvote:hover svg { + fill: var(--hover-color); +} + +/* Reply postbox under existing comment */ +.isso-comment .isso-postbox { + margin-top: 0.8em; +} + +.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes { + display: none; +} + +/* ========================================================================== */ +/* Postbox */ +/* ========================================================================== */ +.isso-postbox { + clear: right; + margin: 0 auto 2em; +} + +.isso-form-wrapper { + display: flex; + flex-direction: column; +} + +.isso-textarea, +.isso-preview { + margin-top: 0.2em; + border: 1px solid var(--divider-color); + border-radius: 5px; + width: 100%; +} + +.isso-textarea { + outline: 0; + width: 100%; + resize: none; +} + +.isso-form-wrapper input[type=checkbox] { + position: relative; + bottom: 1px; + vertical-align: middle; + margin-left: 0; +} + +.isso-notification-section { + display: none; + padding-top: .3em; + padding-bottom: 10px; + font-size: 0.90em; +} + +.isso-auth-section { + display: flex; + flex-direction: row; +} + +.isso-input-wrapper, +.isso-post-action { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: center; + margin: 0 auto; + max-width: 35%; + font-size: 0.8em; + font-family: var(--sans-serif-font); + text-align: center; +} + +.isso-input-wrapper { + margin-right: 0.5em; +} + +.isso-input-wrapper input, +.isso-post-action input { + margin-top: auto; +} + +.isso-input-wrapper label { + display: inline-block; + margin-top: auto; + height: auto; + line-height: 1.4em; +} + +.isso-input-wrapper input { + border: 1px solid var(--divider-color); + border-radius: 5px; + background-color: var(--bg-2); + padding: 0.3em; + width: 100%; + color: var(--text-color); + line-height: 1.2em; + font-family: var(--sans-serif-font); +} + +.isso-post-action input { + cursor: pointer; + margin: 0.1em; + border: none; + border-radius: 5px; + background-color: var(--primary-color); + padding: 0.6em 1em; + color: var(--background-color); + font-size: 0.8rem; +} + +.isso-post-action { + display: block; + align-self: flex-end; + margin: 0 auto; +} + +.isso-post-action>input:hover { + opacity: 0.8; +} + +/* ========================================================================== */ +/* Postbox (preview mode) */ +/* ========================================================================== */ +.isso-preview, +.isso-post-action input[name="edit"], +.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name="preview"], +.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea { + display: none; +} + +.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview { + display: block; +} + +.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name="edit"] { + display: inline; +} + +.isso-preview { + background: repeating-linear-gradient(-45deg, + var(--bg-0), + var(--bg-0) 10px, + var(--bg-2) 10px, + var(--bg-2) 20px); + background-color: var(--bg-0); +} + +/* ========================================================================== */ +/* Animations */ +/* ========================================================================== */ + +/* "target" means the comment that's being linked to, for example: + * https://example.com/blog/example/#isso-15 + */ +.isso-target { + animation: isso-target-fade 5s ease-out; +} + +@keyframes isso-target-fade { + 0% { + background-color: var(--divider-color) + } +} + +/* ========================================================================== */ +/* Media queries */ +/* ========================================================================== */ +@media screen and (max-width:600px) { + .isso-auth-section { + flex-direction: column; + text-align: center; + } + + .isso-input-wrapper { + display: block; + margin: 0 0 .4em; + max-width: 100%; + } + + .isso-input-wrapper input { + width: 100%; + } + + .isso-post-action { + margin: 0.4em auto; + width: 60%; + } +} diff --git a/isso.min.css b/isso.min.css new file mode 100644 index 0000000..7d106d1 --- /dev/null +++ b/isso.min.css @@ -0,0 +1 @@ +.isso-avatar svg,.isso-preview,.isso-textarea{border:1px solid var(--divider-color);width:100%}#isso-thread *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#isso-thread{margin:0 auto;padding:0;width:100%;color:var(--text-color);font-size:.9em;font-family:var(--sans-serif-font)}h4.isso-thread-heading{padding-bottom:.2em;color:var(--text-color);font-size:1.2rem}.isso-feedlink,.isso-note{float:right}.isso-feedlink a{vertical-align:bottom;font-size:.8em}.isso-comment{margin:0 auto;max-width:68em}.isso-preview .isso-comment{margin:0;padding-top:0}.isso-comment:not(:first-of-type),.isso-follow-up .isso-comment{margin-bottom:.5em;border-top:1px solid var(--divider-color)}.isso-avatar{display:block;float:left;margin:.95em .95em 0}.isso-avatar svg{border-radius:3px;max-width:48px;height:100%;max-height:48px}.isso-text-wrapper{display:block;padding:.3em}.isso-follow-up{padding-left:calc(7% + 20px)}.isso-comment-header{font-size:.85em}.isso-comment-header a{text-decoration:none}.isso-comment-header .isso-spacer{padding:0 6px}.isso-note,.isso-parent,.isso-permalink,.isso-spacer{color:var(--meta-color);font-weight:400;text-shadow:none}.isso-note:hover,.isso-parent:hover,.isso-permalink:hover{color:var(--hover-color)}.isso-author{color:var(--text-color);font-weight:500}.isso-page-author-suffix{color:var(--text-color-high-contrast);font-weight:700}.isso-input-wrapper input,.isso-preview,.isso-textarea{background-color:var(--bg-2);color:var(--text-color);font-family:var(--sans-serif-font)}.isso-is-page-author>.isso-text-wrapper{background-color:var(--bg-1)}.isso-preview,.isso-textarea{padding:10px;font-size:.8em}.isso-comment-footer,.isso-comment-footer .isso-votes{color:var(--meta-color)}.isso-text p{margin-top:-.4em}.isso-text p:last-child{margin-bottom:.2em}.isso-text h1,.isso-text h2,.isso-text h3,.isso-text h4,.isso-text h5,.isso-text h6{font-weight:700;font-size:130%}.isso-comment-footer{clear:left;font-size:.8em}.isso-comment-footer a,.isso-feedlink{margin:.4em;padding:.1em;font-weight:700;text-decoration:none}.isso-downvote svg,.isso-upvote svg{position:relative;top:.2em}.isso-downvote:hover svg,.isso-upvote:hover svg{fill:var(--hover-color)}.isso-comment .isso-postbox{margin-top:.8em}.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes,.isso-post-action input[name=edit],.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea,.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=preview],.isso-preview{display:none}.isso-postbox{clear:right;margin:0 auto 2em}.isso-form-wrapper{display:flex;flex-direction:column}.isso-preview,.isso-textarea{margin-top:.2em;border-radius:5px}.isso-textarea{outline:0;width:100%;resize:none}.isso-form-wrapper input[type=checkbox]{position:relative;bottom:1px;vertical-align:middle;margin-left:0}.isso-notification-section{display:none;padding-top:.3em;padding-bottom:10px;font-size:.9em}.isso-auth-section{display:flex;flex-direction:row}.isso-input-wrapper,.isso-post-action{display:flex;flex-direction:column;justify-content:flex-end;align-items:center;margin:0 auto;max-width:35%;font-size:.8em;font-family:var(--sans-serif-font);text-align:center}.isso-input-wrapper{margin-right:.5em}.isso-input-wrapper input,.isso-post-action input{margin-top:auto}.isso-input-wrapper label{display:inline-block;margin-top:auto;height:auto;line-height:1.4em}.isso-input-wrapper input{border:1px solid var(--divider-color);border-radius:5px;padding:.3em;width:100%;line-height:1.2em}.isso-post-action input{cursor:pointer;margin:.1em;border:none;border-radius:5px;background-color:var(--primary-color);padding:.6em 1em;color:var(--background-color);font-size:.8rem}.isso-post-action{display:block;align-self:flex-end;margin:0 auto}.isso-post-action>input:hover{opacity:.8}.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview{display:block}.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=edit]{display:inline}.isso-preview{background:repeating-linear-gradient(-45deg,var(--bg-0),var(--bg-0) 10px,var(--bg-2) 10px,var(--bg-2) 20px);background-color:var(--bg-0)}.isso-target{animation:5s ease-out isso-target-fade}@keyframes isso-target-fade{0%{background-color:var(--divider-color)}}@media screen and (max-width:600px){.isso-auth-section{flex-direction:column;text-align:center}.isso-input-wrapper{display:block;margin:0 0 .4em;max-width:100%}.isso-input-wrapper input{width:100%}.isso-post-action{margin:.4em auto;width:60%}} diff --git a/js/addSrcToCodeBlock.js b/js/addSrcToCodeBlock.js new file mode 100644 index 0000000..9b4cb9e --- /dev/null +++ b/js/addSrcToCodeBlock.js @@ -0,0 +1,20 @@ +document.addEventListener("DOMContentLoaded", function() { + document.querySelectorAll('.code-source').forEach(function(marker) { + let sourceUrl = marker.getAttribute('data-source'); + let nextPre = marker.nextElementSibling; + + if (nextPre && nextPre.tagName === 'PRE') { + let codeElement = nextPre.querySelector('code'); + if (codeElement) { + // Use a span element for the source path if it's not a link. + let sourceElement = document.createElement(sourceUrl.startsWith('http') ? 'a' : 'span'); + sourceElement.textContent = sourceUrl; + sourceElement.className = 'source-path'; + if (sourceUrl.startsWith('http')) { + sourceElement.href = sourceUrl; + } + codeElement.prepend(sourceElement); + } + } + }); +}); diff --git a/js/addSrcToCodeBlock.min.js b/js/addSrcToCodeBlock.min.js new file mode 100644 index 0000000..ddd04ae --- /dev/null +++ b/js/addSrcToCodeBlock.min.js @@ -0,0 +1 @@ +document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".code-source").forEach(function(t){var e,n=t.getAttribute("data-source"),t=t.nextElementSibling;t&&"PRE"===t.tagName&&(t=t.querySelector("code"))&&((e=document.createElement(n.startsWith("http")?"a":"span")).textContent=n,e.className="source-path",n.startsWith("http")&&(e.href=n),t.prepend(e))})}); diff --git a/js/copyCodeToClipboard.js b/js/copyCodeToClipboard.js new file mode 100644 index 0000000..e22debe --- /dev/null +++ b/js/copyCodeToClipboard.js @@ -0,0 +1,47 @@ +const copiedText = document.getElementById('copy-success').textContent; +const initCopyText = document.getElementById('copy-init').textContent; + +const changeIcon = (copyDiv, className) => { + copyDiv.classList.add(className); + copyDiv.setAttribute('aria-label', copiedText); + setTimeout(() => { + copyDiv.classList.remove(className); + copyDiv.setAttribute('aria-label', initCopyText); + }, 2500); +}; + +const addCopyEventListenerToDiv = (copyDiv, block) => { + copyDiv.addEventListener('click', () => copyCodeAndChangeIcon(copyDiv, block)); +}; + +const copyCodeAndChangeIcon = async (copyDiv, block) => { + const code = block.querySelector('table') + ? getTableCode(block) + : getNonTableCode(block); + try { + await navigator.clipboard.writeText(code); + changeIcon(copyDiv, 'checked'); + } catch (error) { + changeIcon(copyDiv, 'error'); + } +}; + +const getNonTableCode = (block) => { + return [...block.querySelectorAll('code')].map((code) => code.textContent).join(''); +}; + +const getTableCode = (block) => { + return [...block.querySelectorAll('tr')] + .map((row) => row.querySelector('td:last-child')?.innerText ?? '') + .join(''); +}; + +document.querySelectorAll('pre').forEach((block) => { + const copyDiv = document.createElement('div'); + copyDiv.setAttribute('role', 'button'); + copyDiv.setAttribute('aria-label', initCopyText); + copyDiv.setAttribute('title', initCopyText); + copyDiv.className = 'copy-code'; + block.prepend(copyDiv); + addCopyEventListenerToDiv(copyDiv, block); +}); diff --git a/js/copyCodeToClipboard.min.js b/js/copyCodeToClipboard.min.js new file mode 100644 index 0000000..f27628a --- /dev/null +++ b/js/copyCodeToClipboard.min.js @@ -0,0 +1 @@ +const copiedText=document.getElementById("copy-success").textContent,initCopyText=document.getElementById("copy-init").textContent,changeIcon=(e,t)=>{e.classList.add(t),e.setAttribute("aria-label",copiedText),setTimeout(()=>{e.classList.remove(t),e.setAttribute("aria-label",initCopyText)},2500)},addCopyEventListenerToDiv=(e,t)=>{e.addEventListener("click",()=>copyCodeAndChangeIcon(e,t))},copyCodeAndChangeIcon=async(t,e)=>{e=(e.querySelector("table")?getTableCode:getNonTableCode)(e);try{await navigator.clipboard.writeText(e),changeIcon(t,"checked")}catch(e){changeIcon(t,"error")}},getNonTableCode=e=>[...e.querySelectorAll("code")].map(e=>e.textContent).join(""),getTableCode=e=>[...e.querySelectorAll("tr")].map(e=>e.querySelector("td:last-child")?.innerText??"").join("");document.querySelectorAll("pre").forEach(e=>{var t=document.createElement("div");t.setAttribute("role","button"),t.setAttribute("aria-label",initCopyText),t.setAttribute("title",initCopyText),t.className="copy-code",e.prepend(t),addCopyEventListenerToDiv(t,e)}); diff --git a/js/decodeMail.js b/js/decodeMail.js new file mode 100644 index 0000000..f26ac68 --- /dev/null +++ b/js/decodeMail.js @@ -0,0 +1,44 @@ +(function () { + 'use strict'; + + // Utility function: Base64 Decoding. + function decodeBase64(encodedString) { + try { + // Can't use atob() directly because it doesn't support non-ascii characters. + // And non-ascii characters are allowed in email addresses and domains. + // See https://en.wikipedia.org/wiki/Email_address#Internationalization + // Code below adapted from Jackie Han: https://stackoverflow.com/a/64752311 + const byteString = atob(encodedString); + + // Convert byteString to an array of char codes. + const charCodes = [...byteString].map((char) => char.charCodeAt(0)); + + // Use TypedArray.prototype.set() to copy the char codes into a Uint8Array. + const bytes = new Uint8Array(charCodes.length); + bytes.set(charCodes); + + const decoder = new TextDecoder('utf-8'); + return decoder.decode(bytes); + } catch (e) { + console.error('Failed to decode Base64 string: ', e); + return null; + } + } + + // Utility function: Update href of an element with a decoded email. + function updateEmailHref(element) { + const encodedEmail = element.getAttribute('data-encoded-email'); + const decodedEmail = decodeBase64(encodedEmail); + + if (decodedEmail) { + element.setAttribute('href', `mailto:${decodedEmail}`); + } else { + // If the decoding fails, hide the email link. + element.style.display = 'none'; + } + } + + // Fetch and process email elements with the "data-encoded-email" attribute. + const encodedEmailElements = document.querySelectorAll('[data-encoded-email]'); + encodedEmailElements.forEach(updateEmailHref); +})(); diff --git a/js/decodeMail.min.js b/js/decodeMail.min.js new file mode 100644 index 0000000..2b766a0 --- /dev/null +++ b/js/decodeMail.min.js @@ -0,0 +1 @@ +!function(){"use strict";document.querySelectorAll("[data-encoded-email]").forEach(function(e){var t=function(e){try{var t=[...atob(e)].map(e=>e.charCodeAt(0)),r=new Uint8Array(t.length);return r.set(t),new TextDecoder("utf-8").decode(r)}catch(e){return console.error("Failed to decode Base64 string: ",e),null}}(e.getAttribute("data-encoded-email"));t?e.setAttribute("href","mailto:"+t):e.style.display="none"})}(); diff --git a/js/footnoteBacklinks.js b/js/footnoteBacklinks.js new file mode 100644 index 0000000..8c20098 --- /dev/null +++ b/js/footnoteBacklinks.js @@ -0,0 +1,33 @@ +// Assign unique IDs to the footnote references based on their hashes. +function assignReferenceIds() { + const references = document.querySelectorAll('.footnote-reference'); + for (const ref of references) { + ref.id = `ref:${ref.children[0].hash.substring(1)}`; + } +} + +// Create backlinks for each footnote definition if a corresponding reference exists. +function createFootnoteBacklinks() { + const footnotes = document.querySelectorAll('.footnote-definition'); + for (const footnote of footnotes) { + const backlinkId = `ref:${footnote.id}`; + + // Skip if there's no corresponding reference in the text (i.e. the footnote doesn't reference anything). + if (!document.getElementById(backlinkId)) continue; + + const backlink = document.createElement('a'); + backlink.href = `#${backlinkId}`; + backlink.className = 'footnote-backlink'; + backlink.textContent = '↩'; + footnote.lastElementChild.appendChild(backlink); + } +} + +// Initialise the handlers for the footnote references and definitions. +function initFootnotes() { + assignReferenceIds(); + createFootnoteBacklinks(); +} + +// Wait for the window to load, then execute the main function. +window.addEventListener('load', initFootnotes); diff --git a/js/footnoteBacklinks.min.js b/js/footnoteBacklinks.min.js new file mode 100644 index 0000000..c2175a7 --- /dev/null +++ b/js/footnoteBacklinks.min.js @@ -0,0 +1 @@ +function assignReferenceIds(){for(const e of document.querySelectorAll(".footnote-reference"))e.id="ref:"+e.children[0].hash.substring(1)}function createFootnoteBacklinks(){for(const n of document.querySelectorAll(".footnote-definition")){var e,t="ref:"+n.id;document.getElementById(t)&&((e=document.createElement("a")).href="#"+t,e.className="footnote-backlink",e.textContent="↩",n.lastElementChild.appendChild(e))}}function initFootnotes(){assignReferenceIds(),createFootnoteBacklinks()}window.addEventListener("load",initFootnotes); diff --git a/js/giscus.js b/js/giscus.js new file mode 100644 index 0000000..1fbe837 --- /dev/null +++ b/js/giscus.js @@ -0,0 +1,81 @@ +function setGiscusTheme(newTheme) { + // Get the giscus iframe. + const frame = document.querySelector('iframe.giscus-frame'); + + if (frame) { + // If the iframe exists, send a message to set the theme. + frame.contentWindow.postMessage( + { giscus: { setConfig: { theme: newTheme } } }, + 'https://giscus.app' + ); + } +} + +// Function to initialize Giscus. This function is run when the window loads. +function initGiscus() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('.comments'); + if (commentsDiv) { + // Get the various settings from data attributes on the div. + const repo = commentsDiv.getAttribute('data-repo'); + const repoId = commentsDiv.getAttribute('data-repo-id'); + const category = commentsDiv.getAttribute('data-category'); + const categoryId = commentsDiv.getAttribute('data-category-id'); + const strictTitleMatching = commentsDiv.getAttribute('data-strict'); + const term = commentsDiv.getAttribute('data-term'); + const reactionsEnabled = commentsDiv.getAttribute('data-reactions-enabled'); + const inputPosition = commentsDiv.getAttribute('data-input-position'); + const lightTheme = commentsDiv.getAttribute('data-light-theme'); + const darkTheme = commentsDiv.getAttribute('data-dark-theme'); + const lang = commentsDiv.getAttribute('data-lang'); + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading'); + + // Create a new script tag that will load the Giscus script. + const script = document.createElement('script'); + script.src = 'https://giscus.app/client.js'; + script.async = true; + + // Set the various settings as data attributes on the script tag. + script.setAttribute('data-repo', repo); + script.setAttribute('data-repo-id', repoId); + script.setAttribute('data-category', category); + script.setAttribute('data-category-id', categoryId); + script.setAttribute('data-term', term); + script.setAttribute('data-strict', strictTitleMatching); + script.setAttribute('data-reactions-enabled', reactionsEnabled); + script.setAttribute('data-emit-metadata', '0'); + script.setAttribute('data-input-position', inputPosition); + script.setAttribute('data-lang', lang); + script.setAttribute('crossorigin', 'anonymous'); + + // Set the mapping if it is provided. + const mapping = commentsDiv.getAttribute('data-mapping'); + if (mapping) { + script.setAttribute('data-mapping', mapping); + } + + // Choose the correct theme based on the current theme of the document. + const currentTheme = + document.documentElement.getAttribute('data-theme') || 'light'; + const selectedTheme = currentTheme === 'dark' ? darkTheme : lightTheme; + script.setAttribute('data-theme', selectedTheme); + + // Set the loading attribute if lazy loading is enabled. + if (lazyLoading === 'true') { + script.setAttribute('data-loading', 'lazy'); + } + + // Add the script tag to the div. + commentsDiv.appendChild(script); + + // Listen for theme changes and update the Giscus theme when they occur. + window.addEventListener('themeChanged', (event) => { + const selectedTheme = + event.detail.theme === 'dark' ? darkTheme : lightTheme; + setGiscusTheme(selectedTheme); + }); + } +} + +// Initialize Giscus. +initGiscus(); diff --git a/js/giscus.min.js b/js/giscus.min.js new file mode 100644 index 0000000..2846f22 --- /dev/null +++ b/js/giscus.min.js @@ -0,0 +1 @@ +function setGiscusTheme(t){var e=document.querySelector("iframe.giscus-frame");e&&e.contentWindow.postMessage({giscus:{setConfig:{theme:t}}},"https://giscus.app")}function initGiscus(){var t=document.querySelector(".comments");if(t){var e=t.getAttribute("data-repo"),a=t.getAttribute("data-repo-id"),i=t.getAttribute("data-category"),r=t.getAttribute("data-category-id"),d=t.getAttribute("data-strict"),s=t.getAttribute("data-term"),u=t.getAttribute("data-reactions-enabled"),n=t.getAttribute("data-input-position");const b=t.getAttribute("data-light-theme"),A=t.getAttribute("data-dark-theme");var o=t.getAttribute("data-lang"),c=t.getAttribute("data-lazy-loading"),g=document.createElement("script"),e=(g.src="https://giscus.app/client.js",g.async=!0,g.setAttribute("data-repo",e),g.setAttribute("data-repo-id",a),g.setAttribute("data-category",i),g.setAttribute("data-category-id",r),g.setAttribute("data-term",s),g.setAttribute("data-strict",d),g.setAttribute("data-reactions-enabled",u),g.setAttribute("data-emit-metadata","0"),g.setAttribute("data-input-position",n),g.setAttribute("data-lang",o),g.setAttribute("crossorigin","anonymous"),t.getAttribute("data-mapping")),a=(e&&g.setAttribute("data-mapping",e),document.documentElement.getAttribute("data-theme")||"light"),i="dark"===a?A:b;g.setAttribute("data-theme",i),"true"===c&&g.setAttribute("data-loading","lazy"),t.appendChild(g),window.addEventListener("themeChanged",t=>{setGiscusTheme("dark"===t.detail.theme?A:b)})}}initGiscus(); diff --git a/js/hyvortalk.js b/js/hyvortalk.js new file mode 100644 index 0000000..3f9959d --- /dev/null +++ b/js/hyvortalk.js @@ -0,0 +1,44 @@ +function initHyvorTalk() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('.comments'); + if (commentsDiv) { + // Get the various settings from data attributes on the div. + const websiteId = commentsDiv.getAttribute('data-website-id'); + const pageId = commentsDiv.getAttribute('data-page-id'); + const pageLanguage = commentsDiv.getAttribute('data-page-language'); + const loading = commentsDiv.getAttribute('data-loading'); + const pageAuthor = commentsDiv.getAttribute('data-page-author'); + + // Create a new script tag that will load the Hyvor Talk script. + const script = document.createElement('script'); + script.src = 'https://talk.hyvor.com/embed/embed.js'; + script.async = true; + script.type = 'module'; + document.head.appendChild(script); + + // Create a new Hyvor Talk comments tag. + const comments = document.createElement('hyvor-talk-comments'); + comments.setAttribute('website-id', websiteId); + comments.setAttribute('page-id', pageId); + comments.setAttribute('page-language', pageLanguage); + comments.setAttribute('loading', loading); + comments.setAttribute('page-author', pageAuthor); + + // Choose the correct theme based on the current theme of the document. + const currentTheme = + document.documentElement.getAttribute('data-theme') || 'light'; + comments.setAttribute('colors', currentTheme); + + // Add the Hyvor Talk comments tag to the div. + commentsDiv.appendChild(comments); + + // Listen for theme changes and update the Hyvor Talk theme when they occur. + window.addEventListener('themeChanged', (event) => { + const selectedTheme = event.detail.theme; + comments.setAttribute('colors', selectedTheme); + }); + } +} + +// Initialize HyvorTalk. +initHyvorTalk(); diff --git a/js/hyvortalk.min.js b/js/hyvortalk.min.js new file mode 100644 index 0000000..f4ea4f5 --- /dev/null +++ b/js/hyvortalk.min.js @@ -0,0 +1 @@ +function initHyvorTalk(){var t=document.querySelector(".comments");if(t){var e=t.getAttribute("data-website-id"),a=t.getAttribute("data-page-id"),i=t.getAttribute("data-page-language"),d=t.getAttribute("data-loading"),r=t.getAttribute("data-page-author"),n=document.createElement("script");n.src="https://talk.hyvor.com/embed/embed.js",n.async=!0,n.type="module",document.head.appendChild(n);const o=document.createElement("hyvor-talk-comments");o.setAttribute("website-id",e),o.setAttribute("page-id",a),o.setAttribute("page-language",i),o.setAttribute("loading",d),o.setAttribute("page-author",r);n=document.documentElement.getAttribute("data-theme")||"light";o.setAttribute("colors",n),t.appendChild(o),window.addEventListener("themeChanged",t=>{t=t.detail.theme;o.setAttribute("colors",t)})}}initHyvorTalk(); diff --git a/js/initializeTheme.js b/js/initializeTheme.js new file mode 100644 index 0000000..95e754c --- /dev/null +++ b/js/initializeTheme.js @@ -0,0 +1,25 @@ +(function () { + // Get the default theme from the HTML data-theme attribute. + const defaultTheme = document.documentElement.getAttribute('data-theme'); + + // Set the data-default-theme attribute only if defaultTheme is not null. + if (defaultTheme) { + document.documentElement.setAttribute('data-default-theme', defaultTheme); + } + + // Attempt to retrieve the current theme from the browser's local storage. + const storedTheme = localStorage.getItem('theme'); + + if (storedTheme) { + document.documentElement.setAttribute('data-theme', storedTheme); + } else if (defaultTheme) { + document.documentElement.setAttribute('data-theme', defaultTheme); + } else { + // If no theme is found in local storage and no default theme is set, use user's system preference. + const isSystemDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + document.documentElement.setAttribute( + 'data-theme', + isSystemDark ? 'dark' : 'light' + ); + } +})(); diff --git a/js/initializeTheme.min.js b/js/initializeTheme.min.js new file mode 100644 index 0000000..3f65952 --- /dev/null +++ b/js/initializeTheme.min.js @@ -0,0 +1 @@ +!function(){var t=document.documentElement.getAttribute("data-theme"),e=(t&&document.documentElement.setAttribute("data-default-theme",t),localStorage.getItem("theme"));e?document.documentElement.setAttribute("data-theme",e):t?document.documentElement.setAttribute("data-theme",t):(e=window.matchMedia("(prefers-color-scheme: dark)").matches,document.documentElement.setAttribute("data-theme",e?"dark":"light"))}(); diff --git a/js/isso.js b/js/isso.js new file mode 100644 index 0000000..4666604 --- /dev/null +++ b/js/isso.js @@ -0,0 +1,81 @@ +// Function to initialise Isso. +function initIsso() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('.comments'); + if (commentsDiv) { + // Get the lazy-loading setting from the div. + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading') === 'true'; + + // If lazy-loading is enabled, create an Intersection Observer and use it. + if (lazyLoading) { + const observer = new IntersectionObserver((entries) => { + // Loop over the entries. + entries.forEach((entry) => { + // If the element is in the viewport, initialize Isso. + if (entry.isIntersecting) { + loadIsso(commentsDiv); + // Once the Isso is loaded, we don't need to observe the element anymore. + observer.unobserve(commentsDiv); + } + }); + }); + + // Start observing the comments div. + observer.observe(commentsDiv); + } else { + // If lazy-loading is not enabled, initialise Isso immediately. + loadIsso(commentsDiv); + } + } +} + +// Function to load Isso. +function loadIsso(commentsDiv) { + // Get the various settings from data attributes on the div. + const endpointUrl = commentsDiv.getAttribute('data-endpoint-url'); + const pageId = commentsDiv.getAttribute('data-isso-id'); + const title = commentsDiv.getAttribute('data-title'); + const lang = commentsDiv.getAttribute('data-page-language'); + const maxCommentsTop = commentsDiv.getAttribute('data-max-comments-top'); + const maxCommentsNested = commentsDiv.getAttribute('data-max-comments-nested'); + const avatar = commentsDiv.getAttribute('data-avatar'); + const voting = commentsDiv.getAttribute('data-voting'); + const hashes = commentsDiv.getAttribute('data-page-author-hashes'); + + // Create a new script tag that will load the Isso script. + const script = document.createElement('script'); + script.src = endpointUrl + 'js/embed.min.js'; + script.async = true; + + // Set the various settings as data attributes on the script tag. + script.setAttribute('data-isso', endpointUrl); + script.setAttribute('data-isso-lang', lang); + script.setAttribute('data-isso-max-comments-top', maxCommentsTop); + script.setAttribute('data-isso-max-comments-nested', maxCommentsNested); + script.setAttribute('data-isso-avatar', avatar); + script.setAttribute('data-isso-vote', voting); + script.setAttribute('data-isso-page-author-hashes', hashes); + script.setAttribute('data-isso-css', 'false'); + + // Set the id and data-isso-id of the Isso thread. + const section = document.createElement('section'); + section.id = 'isso-thread'; + section.setAttribute('data-isso-id', pageId); + section.setAttribute('data-title', title); + commentsDiv.appendChild(section); + + // Add the script tag to the div. + commentsDiv.appendChild(script); + + // Create a link tag for the Isso CSS. + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = '/isso.min.css'; + + // Add the CSS link tag to the head of the document. + document.head.appendChild(link); +} + +// Initialize Isso. +initIsso(); diff --git a/js/isso.min.js b/js/isso.min.js new file mode 100644 index 0000000..833eaff --- /dev/null +++ b/js/isso.min.js @@ -0,0 +1 @@ +function initIsso(){const e=document.querySelector(".comments");if(e)if("true"===e.getAttribute("data-lazy-loading")){const a=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(loadIsso(e),a.unobserve(e))})});a.observe(e)}else loadIsso(e)}function loadIsso(t){var e=t.getAttribute("data-endpoint-url"),a=t.getAttribute("data-isso-id"),s=t.getAttribute("data-title"),i=t.getAttribute("data-page-language"),o=t.getAttribute("data-max-comments-top"),r=(t.getAttribute("data-max-comments-nested"),t.getAttribute("data-avatar")),d=t.getAttribute("data-voting"),n=t.getAttribute("data-page-author-hashes"),u=document.createElement("script");u.src=e+"js/embed.min.js",u.async=!0,u.setAttribute("data-isso",e),u.setAttribute("data-isso-lang",i),u.setAttribute("data-isso-max-comments-top",o),u.setAttribute("data-isso-avatar",r),u.setAttribute("data-isso-vote",d),u.setAttribute("data-isso-page-author-hashes",n),u.setAttribute("data-isso-css","false"),(e=document.createElement("section")).id="isso-thread",e.setAttribute("data-isso-id",a),e.setAttribute("data-title",s),t.appendChild(e),t.appendChild(u),(i=document.createElement("link")).rel="stylesheet",i.type="text/css",i.href="/isso.min.css",document.head.appendChild(i)}initIsso(); diff --git a/js/katex.min.js b/js/katex.min.js new file mode 100644 index 0000000..4bc26de --- /dev/null +++ b/js/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,function(){"use strict";var E={d:function(e,t){for(var r in t)E.o(t,r)&&!E.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};E.d(t,{default:function(){return zr}});class L{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let r,n,a="KaTeX parse error: "+e;if((o=t&&t.loc)&&o.start<=o.end){const e=o.lexer.input,t=(r=o.start,n=o.end,r===e.length?a+=" at end of input: ":a+=" at position "+(r+1)+": ",e.slice(r,n).replace(/[^]/g,"$&̲"));var o=15":">","<":"<",'"':""","'":"'"},F=/[&><"']/g;var A={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(F,e=>V[e])},hyphenate:function(e){return e.replace(P,"-$1").toLowerCase()},getBaseElem:D,isCharacterBox:function(e){return"mathord"===(e=D(e)).type||"textord"===e.type||"atom"===e.type},protocolFromUrl:function(e){return(e=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e))?":"===e[2]&&/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(e[1])?e[1].toLowerCase():null:"_relative"}};const G={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};class U{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(const r in G){var t;G.hasOwnProperty(r)&&(t=G[r],this[r]=void 0!==e[r]?t.processor?t.processor(e[r]):e[r]:function(e){if(e.default)return e.default;if(e=e.type,"string"!=typeof(e=Array.isArray(e)?e[0]:e))return e.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}(t))}}reportNonstrict(e,t,r){let n=this.strict;if((n="function"==typeof n?n(e,t,r):n)&&"ignore"!==n){if(!0===n||"error"===n)throw new z("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n||!0!==n&&"error"!==n&&("warn"===n?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),1))}isTrusted(e){if(e.url&&!e.protocol){const t=A.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}class Y{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return X[W[this.id]]}sub(){return X[j[this.id]]}fracNum(){return X[_[this.id]]}fracDen(){return X[$[this.id]]}cramp(){return X[Z[this.id]]}text(){return X[K[this.id]]}isTight(){return 2<=this.size}}const X=[new Y(0,0,!1),new Y(1,0,!0),new Y(2,1,!1),new Y(3,1,!0),new Y(4,2,!1),new Y(5,2,!0),new Y(6,3,!1),new Y(7,3,!0)],W=[4,5,4,5,6,7,6,7],j=[5,5,5,5,7,7,7,7],_=[2,3,4,5,6,7,6,7],$=[3,3,5,5,7,7,7,7],Z=[1,1,3,3,5,5,7,7],K=[0,1,2,3,2,3,2,3];var T={DISPLAY:X[0],TEXT:X[2],SCRIPT:X[4],SCRIPTSCRIPT:X[6]};const J=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],Q=[];function ee(t){for(let e=0;e=Q[e]&&t<=Q[e+1])return 1}J.forEach(e=>e.blocks.forEach(e=>Q.push(...e)));const te=80,re={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class ne{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return A.contains(this.classes,e)}toNode(){var t=document.createDocumentFragment();for(let e=0;ee.toText()).join("")}}var ae={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};const oe={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},ie={"Å":"A","Ð":"D","Þ":"o","å":"a","ð":"d","þ":"o","А":"A","Б":"B","В":"B","Г":"F","Д":"A","Е":"E","Ж":"K","З":"3","И":"N","Й":"N","К":"K","Л":"N","М":"M","Н":"H","О":"O","П":"N","Р":"P","С":"C","Т":"T","У":"y","Ф":"O","Х":"X","Ц":"U","Ч":"h","Ш":"W","Щ":"W","Ъ":"B","Ы":"X","Ь":"B","Э":"3","Ю":"X","Я":"R","а":"a","б":"b","в":"a","г":"r","д":"y","е":"e","ж":"m","з":"e","и":"n","й":"n","к":"n","л":"n","м":"m","н":"n","о":"o","п":"n","р":"p","с":"c","т":"o","у":"y","ф":"b","х":"x","ц":"n","ч":"n","ш":"w","щ":"w","ъ":"a","ы":"m","ь":"a","э":"e","ю":"m","я":"r"};function se(e,t,r){if(!ae[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),a=ae[t][n];if(!a&&e[0]in ie&&(n=ie[e[0]].charCodeAt(0),a=ae[t][n]),a||"text"!==r||ee(n)&&(a=ae[t][77]),a)return{depth:a[0],height:a[1],italic:a[2],skew:a[3],width:a[4]}}function le(e,t){return t.size<2?e:me[e-1][t.size-1]}const he={},me=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],ce=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488];class pe{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||pe.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=ce[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(const r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new pe(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:le(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:ce[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=le(pe.BASESIZE,e);return this.size===t&&this.textSize===pe.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==pe.BASESIZE?["sizing","reset-size"+this.size,"size"+pe.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){var t=5<=e?0:3<=e?1:2;if(!he[t]){const e=he[t]={cssEmPerMu:oe.quad[t]/18};for(const r in oe)oe.hasOwnProperty(r)&&(e[r]=oe[r][t])}return he[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}pe.BASESIZE=6;var ue=pe;function de(e){return(e="string"!=typeof e?e.unit:e)in xe||e in we||"ex"===e}function B(e,t){let r;if(e.unit in xe)r=xe[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var n=t.style.isTight()?t.havingStyle(t.style.text()):t;if("ex"===e.unit)r=n.fontMetrics().xHeight;else{if("em"!==e.unit)throw new z("Invalid unit: '"+e.unit+"'");r=n.fontMetrics().quad}n!==t&&(r*=n.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)}function ge(e){return e.filter(e=>e).join(" ")}function fe(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");const e=t.getColor();e&&(this.style.color=e)}}function be(e){var t=document.createElement(e);t.className=ge(this.classes);for(const e in this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)this.attributes.hasOwnProperty(e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e"}const xe={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},we={ex:!0,em:!0,mu:!0},C=function(e){return+e.toFixed(4)+"em"};class ve{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,fe.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return A.contains(this.classes,e)}toNode(){return be.call(this,"span")}toMarkup(){return ye.call(this,"span")}}class ke{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,fe.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return A.contains(this.classes,e)}toNode(){return be.call(this,"a")}toMarkup(){return ye.call(this,"a")}}class Se{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return A.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=''+A.escape(this.alt)+'=n[0]&&t<=n[1])return r.name}}return null}(this.text.charCodeAt(0)))&&this.classes.push(e+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=Me[this.text])}hasClass(e){return A.contains(this.classes,e)}toNode(){const e=document.createTextNode(this.text);let t=null;0")+n+"":n}}class ze{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var t=document.createElementNS("http://www.w3.org/2000/svg","svg");for(const e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e':''}}class Te{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){let e="","\\gt",!0),r(n,o,u,"∈","\\in",!0),r(n,o,u,"","\\@not"),r(n,o,u,"⊂","\\subset",!0),r(n,o,u,"⊃","\\supset",!0),r(n,o,u,"⊆","\\subseteq",!0),r(n,o,u,"⊇","\\supseteq",!0),r(n,e,u,"⊈","\\nsubseteq",!0),r(n,e,u,"⊉","\\nsupseteq",!0),r(n,o,u,"⊨","\\models"),r(n,o,u,"←","\\leftarrow",!0),r(n,o,u,"≤","\\le"),r(n,o,u,"≤","\\leq",!0),r(n,o,u,"<","\\lt",!0),r(n,o,u,"→","\\rightarrow",!0),r(n,o,u,"→","\\to"),r(n,e,u,"≱","\\ngeq",!0),r(n,e,u,"≰","\\nleq",!0),r(n,o,He," ","\\ "),r(n,o,He," ","\\space"),r(n,o,He," ","\\nobreakspace"),r(a,o,He," ","\\ "),r(a,o,He," "," "),r(a,o,He," ","\\space"),r(a,o,He," ","\\nobreakspace"),r(n,o,He,null,"\\nobreak"),r(n,o,He,null,"\\allowbreak"),r(n,o,Re,",",","),r(n,o,Re,";",";"),r(n,e,s,"⊼","\\barwedge",!0),r(n,e,s,"⊻","\\veebar",!0),r(n,o,s,"⊙","\\odot",!0),r(n,o,s,"⊕","\\oplus",!0),r(n,o,s,"⊗","\\otimes",!0),r(n,o,g,"∂","\\partial",!0),r(n,o,s,"⊘","\\oslash",!0),r(n,e,s,"⊚","\\circledcirc",!0),r(n,e,s,"⊡","\\boxdot",!0),r(n,o,s,"△","\\bigtriangleup"),r(n,o,s,"▽","\\bigtriangledown"),r(n,o,s,"†","\\dagger"),r(n,o,s,"⋄","\\diamond"),r(n,o,s,"⋆","\\star"),r(n,o,s,"◃","\\triangleleft"),r(n,o,s,"▹","\\triangleright"),r(n,o,p,"{","\\{"),r(a,o,g,"{","\\{"),r(a,o,g,"{","\\textbraceleft"),r(n,o,l,"}","\\}"),r(a,o,g,"}","\\}"),r(a,o,g,"}","\\textbraceright"),r(n,o,p,"{","\\lbrace"),r(n,o,l,"}","\\rbrace"),r(n,o,p,"[","\\lbrack",!0),r(a,o,g,"[","\\lbrack",!0),r(n,o,l,"]","\\rbrack",!0),r(a,o,g,"]","\\rbrack",!0),r(n,o,p,"(","\\lparen",!0),r(n,o,l,")","\\rparen",!0),r(a,o,g,"<","\\textless",!0),r(a,o,g,">","\\textgreater",!0),r(n,o,p,"⌊","\\lfloor",!0),r(n,o,l,"⌋","\\rfloor",!0),r(n,o,p,"⌈","\\lceil",!0),r(n,o,l,"⌉","\\rceil",!0),r(n,o,g,"\\","\\backslash"),r(n,o,g,"∣","|"),r(n,o,g,"∣","\\vert"),r(a,o,g,"|","\\textbar",!0),r(n,o,g,"∥","\\|"),r(n,o,g,"∥","\\Vert"),r(a,o,g,"∥","\\textbardbl"),r(a,o,g,"~","\\textasciitilde"),r(a,o,g,"\\","\\textbackslash"),r(a,o,g,"^","\\textasciicircum"),r(n,o,u,"↑","\\uparrow",!0),r(n,o,u,"⇑","\\Uparrow",!0),r(n,o,u,"↓","\\downarrow",!0),r(n,o,u,"⇓","\\Downarrow",!0),r(n,o,u,"↕","\\updownarrow",!0),r(n,o,u,"⇕","\\Updownarrow",!0),r(n,o,c,"∐","\\coprod"),r(n,o,c,"⋁","\\bigvee"),r(n,o,c,"⋀","\\bigwedge"),r(n,o,c,"⨄","\\biguplus"),r(n,o,c,"⋂","\\bigcap"),r(n,o,c,"⋃","\\bigcup"),r(n,o,c,"∫","\\int"),r(n,o,c,"∫","\\intop"),r(n,o,c,"∬","\\iint"),r(n,o,c,"∭","\\iiint"),r(n,o,c,"∏","\\prod"),r(n,o,c,"∑","\\sum"),r(n,o,c,"⨂","\\bigotimes"),r(n,o,c,"⨁","\\bigoplus"),r(n,o,c,"⨀","\\bigodot"),r(n,o,c,"∮","\\oint"),r(n,o,c,"∯","\\oiint"),r(n,o,c,"∰","\\oiiint"),r(n,o,c,"⨆","\\bigsqcup"),r(n,o,c,"∫","\\smallint"),r(a,o,Ie,"…","\\textellipsis"),r(n,o,Ie,"…","\\mathellipsis"),r(a,o,Ie,"…","\\ldots",!0),r(n,o,Ie,"…","\\ldots",!0),r(n,o,Ie,"⋯","\\@cdots",!0),r(n,o,Ie,"⋱","\\ddots",!0),r(n,o,g,"⋮","\\varvdots"),r(n,o,i,"ˊ","\\acute"),r(n,o,i,"ˋ","\\grave"),r(n,o,i,"¨","\\ddot"),r(n,o,i,"~","\\tilde"),r(n,o,i,"ˉ","\\bar"),r(n,o,i,"˘","\\breve"),r(n,o,i,"ˇ","\\check"),r(n,o,i,"^","\\hat"),r(n,o,i,"⃗","\\vec"),r(n,o,i,"˙","\\dot"),r(n,o,i,"˚","\\mathring"),r(n,o,m,"","\\@imath"),r(n,o,m,"","\\@jmath"),r(n,o,g,"ı","ı"),r(n,o,g,"ȷ","ȷ"),r(a,o,g,"ı","\\i",!0),r(a,o,g,"ȷ","\\j",!0),r(a,o,g,"ß","\\ss",!0),r(a,o,g,"æ","\\ae",!0),r(a,o,g,"œ","\\oe",!0),r(a,o,g,"ø","\\o",!0),r(a,o,g,"Æ","\\AE",!0),r(a,o,g,"Œ","\\OE",!0),r(a,o,g,"Ø","\\O",!0),r(a,o,i,"ˊ","\\'"),r(a,o,i,"ˋ","\\`"),r(a,o,i,"ˆ","\\^"),r(a,o,i,"˜","\\~"),r(a,o,i,"ˉ","\\="),r(a,o,i,"˘","\\u"),r(a,o,i,"˙","\\."),r(a,o,i,"¸","\\c"),r(a,o,i,"˚","\\r"),r(a,o,i,"ˇ","\\v"),r(a,o,i,"¨",'\\"'),r(a,o,i,"˝","\\H"),r(a,o,i,"◯","\\textcircled");const Oe={"--":!0,"---":!0,"``":!0,"''":!0};r(a,o,g,"–","--",!0),r(a,o,g,"–","\\textendash"),r(a,o,g,"—","---",!0),r(a,o,g,"—","\\textemdash"),r(a,o,g,"‘","`",!0),r(a,o,g,"‘","\\textquoteleft"),r(a,o,g,"’","'",!0),r(a,o,g,"’","\\textquoteright"),r(a,o,g,"“","``",!0),r(a,o,g,"“","\\textquotedblleft"),r(a,o,g,"”","''",!0),r(a,o,g,"”","\\textquotedblright"),r(n,o,g,"°","\\degree",!0),r(a,o,g,"°","\\degree"),r(a,o,g,"°","\\textdegree",!0),r(n,o,g,"£","\\pounds"),r(n,o,g,"£","\\mathsterling",!0),r(a,o,g,"£","\\pounds"),r(a,o,g,"£","\\textsterling",!0),r(n,e,g,"✠","\\maltese"),r(a,e,g,"✠","\\maltese");var Ee='0123456789/@."';for(let e=0;er&&(r=o.height),o.depth>n&&(n=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=r,t.depth=n,t.maxFontSize=a}function b(e,t,r,n){return Fe(e=new ve(e,t,r,n)),e}function Ge(e){return Fe(e=new ne(e)),e}function Ue(e,t,r){let n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")}const Ye=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Xe=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],We=(e,t,r,n)=>new ve(e,t,r,n),je={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},_e={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var N={fontMap:je,makeSymbol:Ve,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Pe(e,"Main-Bold",t).metrics?Ve(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===h[t][e].font?Ve(e,"Main-Regular",t,r,n):Ve(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:b,makeSvgSpan:We,makeLineSpan:function(e,t,r){return(e=b([e],[],t)).height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),e.style.borderBottomWidth=C(e.height),e.maxFontSize=1,e},makeAnchor:function(e,t,r,n){return Fe(e=new ke(e,t,r,n)),e},makeFragment:Ge,wrapFragment:function(e,t){return e instanceof ne?b([],[e],t):e},makeVList:function(t,r){const{children:n,depth:a}=function(r){if("individualShift"===r.positionType){const o=r.children,s=[o[0]],l=-o[0].shift-o[0].elem.depth;let t=l;for(let e=1;e{var r=b(["mspace"],[],t),e=B(e,t);return r.style.marginRight=C(e),r},staticSvg:function(e,t){var[e,r,n]=_e[e],e=new Ae(e),e=new ze([e],{width:C(r),height:C(n),style:"width:"+C(r),viewBox:"0 0 "+1e3*r+" "+1e3*n,preserveAspectRatio:"xMinYMin"});return(e=We(["overlay"],[e],t)).height=n,e.style.height=C(n),e.style.width=C(r),e},svgData:_e,tryCombineChars:t=>{for(let e=0;e{if(ge(e.classes)!==ge(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){const t=e.classes[0];if("mbin"===t||"mord"===t)return!1}for(const r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(const n in t.style)if(t.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;return!0})(r,n)&&(r.text+=n.text,r.height=Math.max(r.height,n.height),r.depth=Math.max(r.depth,n.depth),r.italic=n.italic,t.splice(e+1,1),e--)}return t}};const y={number:3,unit:"mu"},$e={number:4,unit:"mu"},Ze={number:5,unit:"mu"},Ke={mord:{mop:y,mbin:$e,mrel:Ze,minner:y},mop:{mord:y,mop:y,mrel:Ze,minner:y},mbin:{mord:$e,mop:$e,mopen:$e,minner:$e},mrel:{mord:Ze,mop:Ze,mopen:Ze,minner:Ze},mopen:{},mclose:{mop:y,mbin:$e,mrel:Ze,minner:y},mpunct:{mord:y,mop:y,mrel:Ze,mopen:y,mclose:y,mpunct:y,minner:y},minner:{mord:y,mop:y,mbin:$e,mrel:Ze,mopen:y,mpunct:y,minner:y}},Je={mord:{mop:y},mop:{mord:y,mop:y},mbin:{},mrel:{},mopen:{},mclose:{mop:y},mpunct:{},minner:{mop:y}},Qe={},et={},tt={};function x(e){var{type:e,names:t,props:r,handler:n,htmlBuilder:a,mathmlBuilder:o}=e,i={type:e,numArgs:r.numArgs,argTypes:r.argTypes,allowedInArgument:!!r.allowedInArgument,allowedInText:!!r.allowedInText,allowedInMath:void 0===r.allowedInMath||r.allowedInMath,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,primitive:!!r.primitive,handler:n};for(let e=0;e{var r=t.classes[0],n=e.classes[0];"mbin"===r&&A.contains(st,n)?t.classes[0]="mord":"mbin"===n&&A.contains(it,r)&&(e.classes[0]="mord")},{node:i},a,e),mt(o,(e,t)=>{var t=ut(t),r=ut(e);if(e=t&&r?(e.hasClass("mtight")?Je:Ke)[t][r]:null)return N.makeGlue(e,n)},{node:i},a,e)}return o}function at(e,t){return e=["nulldelimiter"].concat(e.baseSizingClasses()),ot(t.concat(e))}const ot=N.makeSpan,it=["leftmost","mbin","mopen","mrel","mop","mpunct"],st=["rightmost","mrel","mclose","mpunct"],lt={display:T.DISPLAY,text:T.TEXT,script:T.SCRIPT,scriptscript:T.SCRIPTSCRIPT},ht={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},mt=function(r,e,t,n,a){n&&r.push(n);let o=0;for(;oe=>{r.splice(t+1,0,e),o++})(o)}}n&&r.pop()},ct=function(e){return e instanceof ne||e instanceof ke||e instanceof ve&&e.hasClass("enclosing")?e:null},pt=function(e,t){var r=ct(e);if(r){const e=r.children;if(e.length){if("right"===t)return pt(e[e.length-1],"right");if("left"===t)return pt(e[0],"left")}}return e},ut=function(e,t){return e&&(t&&(e=pt(e,t)),ht[e.classes[0]])||null},I=function(t,r,n){if(!t)return ot();if(et[t.type]){let e=et[t.type](t,r);if(n&&r.size!==n.size){e=ot(r.sizingClasses(n),[e],r);const t=r.sizeMultiplier/n.sizeMultiplier;e.height*=t,e.depth*=t}return e}throw new z("Got group of unknown type: '"+t.type+"'")};function dt(e,t){return e=ot(["base"],e,t),(t=ot(["strut"])).style.height=C(e.height+e.depth),e.depth&&(t.style.verticalAlign=C(-e.depth)),e.children.unshift(t),e}function gt(e,r){let t=null;1===e.length&&"tag"===e[0].type&&(t=e[0].tag,e=e[0].body);var n=q(e,r,"root");let a;2===n.length&&n[1].hasClass("tag")&&(a=n.pop());var o=[];let i,s=[];for(let t=0;t"}toText(){return this.children.map(e=>e.toText()).join("")}}class bt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return A.escape(this.toText())}toText(){return this.text}}var k={MathNode:v,TextNode:bt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=.05555<=e&&e<=.05556?" ":.1666<=e&&e<=.1667?" ":.2222<=e&&e<=.2223?" ":.2777<=e&&e<=.2778?"  ":-.05556<=e&&e<=-.05555?" ⁣":-.1667<=e&&e<=-.1666?" ⁣":-.2223<=e&&e<=-.2222?" ⁣":-.2778<=e&&e<=-.2777?" ⁣":null}toNode(){var e;return this.character?document.createTextNode(this.character):((e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace")).setAttribute("width",C(this.width)),e)}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character||" "}},newDocumentFragment:ft};function S(e,t,r){return!h[t][e]||!h[t][e].replace||55349===e.charCodeAt(0)||Oe.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=h[t][e].replace),new k.TextNode(e)}function yt(e){return 1===e.length?e[0]:new k.MathNode("mrow",e)}function xt(e,t){var r;return"texttt"===t.fontFamily?"monospace":"textsf"===t.fontFamily?"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif":"textit"===t.fontShape&&"textbf"===t.fontWeight?"bold-italic":"textit"===t.fontShape?"italic":"textbf"===t.fontWeight?"bold":(t=t.font)&&"mathnormal"!==t?(r=e.mode,"mathit"===t?"italic":"boldsymbol"===t?"textord"===e.type?"bold":"bold-italic":"mathbf"===t?"bold":"mathbb"===t?"double-struck":"mathfrak"===t?"fraktur":"mathscr"===t||"mathcal"===t?"script":"mathsf"===t?"sans-serif":"mathtt"===t?"monospace":(e=e.text,!A.contains(["\\imath","\\jmath"],e)&&se(e=h[r][e]&&h[r][e].replace?h[r][e].replace:e,N.fontMap[t].fontName,r)?N.fontMap[t].variant:null)):null}function M(t,r,e){if(1===t.length){const n=R(t[0],r);return e&&n instanceof v&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}const n=[];let a;for(let e=0;e{let e,o,i,s=(n&&"supsub"===n.type?(o=H(n.base,"accent"),e=o.base,n.base=e,i=function(e){if(e instanceof ve)return e;throw new Error("Expected span but got "+String(e)+".")}(I(n,a)),n.base=o):(o=H(n,"accent"),e=o.base),n=I(e,a.havingCrampedStyle()),0);if(o.isShifty&&A.isCharacterBox(e)){const n=A.getBaseElem(e);s=Be(I(n,a.havingCrampedStyle())).skew}var l="\\c"===o.label;let h,m=l?n.height+n.depth:Math.min(n.height,a.fontMetrics().xHeight);if(o.isStretchy)h=Tt(o,a),h=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:n},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:0{var r=e.isStretchy?At(e.label):new k.MathNode("mo",[S(e.label,e.mode)]);return(e=new k.MathNode("mover",[R(e.base,t),r])).setAttribute("accent","true"),e},It=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|")),Rt=(x({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var t=nt(t[0]),r=!It.test(e.funcName),n=!r||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:r,isShifty:n,base:t}},htmlBuilder:Nt,mathmlBuilder:qt}),x({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{t=t[0];let r=e.parser.mode;return"math"===r&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),r="text"),{type:"accent",mode:r,label:e.funcName,isStretchy:!1,isShifty:!0,base:t}},htmlBuilder:Nt,mathmlBuilder:qt}),x({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=t[0];return{type:"accentUnder",mode:e.mode,label:r,base:t}},htmlBuilder:(e,t)=>{var r=I(e.base,t),n=Tt(e,t),e="\\utilde"===e.label?.12:0,n=N.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:e},{type:"elem",elem:r}]},t);return N.makeSpan(["mord","accentunder"],[n],t)},mathmlBuilder:(e,t)=>{var r=At(e.label);return(e=new k.MathNode("munder",[R(e.base,t),r])).setAttribute("accentunder","true"),e}}),e=>((e=new k.MathNode("mpadded",e?[e]:[])).setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e)),Ht=(x({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:e,funcName:n}=e;return{type:"xArrow",mode:e.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r=t.style,n=t.havingStyle(r.sup()),a=N.wrapFragment(I(e.body,n,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";let i;a.classes.push(o+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),(i=N.wrapFragment(I(e.below,n,t),t)).classes.push(o+"-arrow-pad")),r=Tt(e,t),n=-t.fontMetrics().axisHeight+.5*r.height;let s,l=-t.fontMetrics().axisHeight-.5*r.height-.111;if((.25"atom"!==(e="ordgroup"===e.type&&e.body.length?e.body[0]:e).type||"bin"!==e.family&&"rel"!==e.family?"mord":"m"+e.family,Dt=(x({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){return{type:"mclass",mode:(e=e.parser).mode,mclass:Lt(t[0]),body:w(t[1]),isCharacterBox:A.isCharacterBox(t[1])}}}),x({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var{parser:e,funcName:r}=e,n=t[1],t=t[0],a="\\stackrel"!==r?Lt(n):"mrel",n={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==r,body:w(n)},n={type:"supsub",mode:t.mode,base:n,sup:"\\underset"===r?null:t,sub:"\\underset"===r?t:null};return{type:"mclass",mode:e.mode,mclass:a,body:[n],isCharacterBox:A.isCharacterBox(n)}},htmlBuilder:Ot,mathmlBuilder:Et}),x({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"pmb",mode:(e=e.parser).mode,mclass:Lt(t[0]),body:w(t[0])}},htmlBuilder(e,t){var r=q(e.body,t,!0);return(e=N.makeSpan([e.mclass],r,t)).style.textShadow="0.02em 0.01em 0.04px",e},mathmlBuilder(e,t){return e=M(e.body,t),(t=new k.MathNode("mstyle",e)).setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),t}}),{">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"}),Pt=e=>"textord"===e.type&&"@"===e.text;function Vt(e,t,r){if(r=se(h.math[e]&&h.math[e].replace||e,t,r))return r;throw new Error("Unsupported symbol "+e+" and font size "+t+".")}function Ft(e,t,r,n){return t=r.havingBaseStyle(t),n=N.makeSpan(n.concat(t.sizingClasses(r)),[e],r),e=t.sizeMultiplier/r.sizeMultiplier,n.height*=e,n.depth*=e,n.maxFontSize=t.sizeMultiplier,n}function Gt(e,t,r){r=t.havingBaseStyle(r),r=(1-t.sizeMultiplier/r.sizeMultiplier)*t.fontMetrics().axisHeight,e.classes.push("delimcenter"),e.style.top=C(r),e.height-=r,e.depth+=r}function Ut(e,t,r,n,a,o){return e=N.makeSymbol(e,"Size"+t+"-Regular",a,n),a=Ft(N.makeSpan(["delimsizing","size"+t],[e],n),T.TEXT,n,o),r&&Gt(a,n,T.TEXT),a}function Yt(e,t,r){return{type:"elem",elem:N.makeSpan(["delimsizinginner","Size1-Regular"===t?"delim-size1":"delim-size4"],[N.makeSpan([],[N.makeSymbol(e,t,r)])])}}function Xt(e,t,r){var n=(ae["Size4-Regular"][e.charCodeAt(0)]?ae["Size4-Regular"]:ae["Size1-Regular"])[e.charCodeAt(0)][4],e=new Ae("inner",function(e,t){switch(e){case"⎜":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"∣":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"∥":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"⎟":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"⎢":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"⎥":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"⎪":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"⏐":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"‖":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),e=new ze([e],{width:C(n),height:C(t),style:"width:"+C(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"});return(e=N.makeSvgSpan([],[e],r)).height=t,e.style.height=C(t),e.style.width=C(n),{type:"elem",elem:e}}function Wt(e,t,r,n,a,o){let i,s,l,h,m="",c=0,p=(i=l=h=e,s=null,"Size1-Regular");"\\uparrow"===e?l=h="⏐":"\\Uparrow"===e?l=h="‖":"\\downarrow"===e?i=l="⏐":"\\Downarrow"===e?i=l="‖":"\\updownarrow"===e?(i="\\uparrow",l="⏐",h="\\downarrow"):"\\Updownarrow"===e?(i="\\Uparrow",l="‖",h="\\Downarrow"):A.contains(e0,e)?(l="∣",m="vert",c=333):A.contains(t0,e)?(l="∥",m="doublevert",c=556):"["===e||"\\lbrack"===e?(i="⎡",l="⎢",h="⎣",p="Size4-Regular",m="lbrack",c=667):"]"===e||"\\rbrack"===e?(i="⎤",l="⎥",h="⎦",p="Size4-Regular",m="rbrack",c=667):"\\lfloor"===e||"⌊"===e?(l=i="⎢",h="⎣",p="Size4-Regular",m="lfloor",c=667):"\\lceil"===e||"⌈"===e?(i="⎡",l=h="⎢",p="Size4-Regular",m="lceil",c=667):"\\rfloor"===e||"⌋"===e?(l=i="⎥",h="⎦",p="Size4-Regular",m="rfloor",c=667):"\\rceil"===e||"⌉"===e?(i="⎤",l=h="⎥",p="Size4-Regular",m="rceil",c=667):"("===e||"\\lparen"===e?(i="⎛",l="⎜",h="⎝",p="Size4-Regular",m="lparen",c=875):")"===e||"\\rparen"===e?(i="⎞",l="⎟",h="⎠",p="Size4-Regular",m="rparen",c=875):"\\{"===e||"\\lbrace"===e?(i="⎧",s="⎨",h="⎩",l="⎪",p="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(i="⎫",s="⎬",h="⎭",l="⎪",p="Size4-Regular"):"\\lgroup"===e||"⟮"===e?(i="⎧",h="⎩",l="⎪",p="Size4-Regular"):"\\rgroup"===e||"⟯"===e?(i="⎫",h="⎭",l="⎪",p="Size4-Regular"):"\\lmoustache"===e||"⎰"===e?(i="⎧",h="⎭",l="⎪",p="Size4-Regular"):"\\rmoustache"!==e&&"⎱"!==e||(i="⎫",h="⎩",l="⎪",p="Size4-Regular");var e=Vt(i,p,a),u=e.height+e.depth,e=Vt(l,p,a),e=e.height+e.depth,d=(d=Vt(h,p,a)).height+d.depth;let g=0,f=1;if(null!==s){const e=Vt(s,p,a);g=e.height+e.depth,f=2}var b=(b=u+d+g)+Math.max(0,Math.ceil((t-b)/(f*e)))*f*e;let y=n.fontMetrics().axisHeight;r&&(y*=n.sizeMultiplier);var t=b/2-y,x=[];if(0n)return a[t]}return a[a.length-1]}function $t(e,t,r,n,a,o){var i,s,l,h,m,c;return"<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),"small"===(c=_t(e,t,A.contains(a0,e)?i0:A.contains(r0,e)?l0:s0,n)).type?(i=e,s=c.style,l=r,m=o,i=Ft(N.makeSymbol(i,"Main-Regular",a,h=n),s,h,m),l&&Gt(i,h,s),i):"large"===c.type?Ut(e,c.size,r,n,a,o):Wt(e,t,r,n,a,o)}x({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"cdlabel",mode:e.mode,side:r.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup());return(r=N.wrapFragment(I(e.label,r,t),t)).classes.push("cd-label-"+e.side),r.style.bottom=C(.8-r.depth),r.height=0,r.depth=0,r},mathmlBuilder(e,t){let r=new k.MathNode("mrow",[R(e.label,t)]);return(r=new k.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new k.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),x({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){return{type:"cdlabelparent",mode:(e=e.parser).mode,fragment:t[0]}},htmlBuilder(e,t){return(e=N.wrapFragment(I(e.fragment,t),t)).classes.push("cd-vert-arrow"),e},mathmlBuilder(e,t){return new k.MathNode("mrow",[R(e.fragment,t)])}}),x({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){var e=e.parser,r=H(t[0],"ordgroup").body;let n="";for(let e=0;e>10),56320+(1023&t))),{type:"textord",mode:e.mode,text:t}}}),x({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var e=e.parser,r=H(t[0],"color-token").color,t=t[1];return{type:"color",mode:e.mode,color:r,body:w(t)}},htmlBuilder:He=(e,t)=>(t=q(e.body,t.withColor(e.color),!1),N.makeFragment(t)),mathmlBuilder:Re=(e,t)=>(t=M(e.body,t.withColor(e.color)),(t=new k.MathNode("mstyle",t)).setAttribute("mathcolor",e.color),t)}),x({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:e,breakOnTokenText:r}=e,t=H(t[0],"color-token").color,r=(e.gullet.macros.set("\\current@color",t),e.parseExpression(!0,r));return{type:"color",mode:e.mode,color:t,body:r}},htmlBuilder:He,mathmlBuilder:Re}),x({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var n="["===(e=e.parser).gullet.future().text?e.parseSizeGroup(!0):null,a=!e.settings.displayMode||!e.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:e.mode,newLine:a,size:n&&H(n,"size").value}},htmlBuilder(e,t){var r=N.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size)&&(r.style.marginTop=C(B(e.size,t))),r},mathmlBuilder(e,t){var r=new k.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size)&&r.setAttribute("height",C(B(e.size,t))),r}});const Zt={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Kt=e=>{var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new z("Expected a control sequence",e);return t},Jt=(e,t,r,n)=>{let a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)},Qt=(x({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:e,funcName:t}=e,r=(e.consumeSpaces(),e.fetch());if(Zt[r.text])return"\\global"!==t&&"\\\\globallong"!==t||(r.text=Zt[r.text]),H(e.parseFunction(),"internal");throw new z("Invalid token after macro prefix",r)}}),x({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,n=t.gullet.popToken();if(e=n.text,/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new z("Expected a control sequence",n);let a,o=0;for(var i=[[]];"{"!==t.gullet.future().text;)if("#"===(n=t.gullet.popToken()).text){if("{"===t.gullet.future().text){a=t.gullet.future(),i[o].push("{");break}if(n=t.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new z('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==o+1)throw new z('Argument number "'+n.text+'" out of order');o++,i.push([])}else{if("EOF"===n.text)throw new z("Expected a macro definition");i[o].push(n.text)}let s=t.gullet.consumeArg().tokens;return a&&s.unshift(a),"\\edef"!==r&&"\\xdef"!==r||(s=t.gullet.expandTokens(s)).reverse(),t.gullet.macros.set(e,{tokens:s,numArgs:o,delimiters:i},r===Zt[r]),{type:"internal",mode:t.mode}}}),x({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=Kt(e.gullet.popToken()),n=(e.gullet.consumeSpaces(),(e=>{let t=e.gullet.popToken();return t="="===t.text&&" "===(t=e.gullet.popToken()).text?e.gullet.popToken():t})(e));return Jt(e,r,n,"\\\\globallet"===t),{type:"internal",mode:e.mode}}}),x({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:e,funcName:t}=e,r=Kt(e.gullet.popToken()),n=e.gullet.popToken(),a=e.gullet.popToken();return Jt(e,r,a,"\\\\globalfuture"===t),e.gullet.pushToken(a),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}}),{type:"kern",size:-.008}),e0=["|","\\lvert","\\rvert","\\vert"],t0=["\\|","\\lVert","\\rVert","\\Vert"],r0=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"],n0=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"],a0=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],o0=[0,1.2,1.8,2.4,3],i0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],s0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"stack"}],l0=[{type:"small",style:T.SCRIPTSCRIPT},{type:"small",style:T.SCRIPT},{type:"small",style:T.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}];var h0={sqrtImage:function(e,t){var r=t.havingBaseSizing(),n=_t("\\surd",e*r.sizeMultiplier,l0,r);let a=r.sizeMultiplier;r=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let o,i,s=0,l=0,h=0;return i="small"===n.type?(h=1e3+1e3*r+80,e<1?a=1:e<1.4&&(a=.7),s=(1+r+.08)/a,l=(1+r)/a,(o=jt("sqrtMain",s,h,r,t)).style.minWidth="0.853em",.833/a):"large"===n.type?(h=1080*o0[n.size],l=(o0[n.size]+r)/a,s=(o0[n.size]+r+.08)/a,(o=jt("sqrtSize"+n.size,s,h,r,t)).style.minWidth="1.02em",1/a):(s=e+r+.08,l=e+r,h=Math.floor(1e3*e+r)+80,(o=jt("sqrtTall",s,h,r,t)).style.minWidth="0.742em",1.056),o.height=l,o.style.height=C(s),{span:o,advanceWidth:i,ruleWidth:(t.fontMetrics().sqrtRuleThickness+r)*a}},sizedDelim:function(e,t,r,n,a){if("<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),A.contains(r0,e)||A.contains(a0,e))return Ut(e,t,!1,r,n,a);if(A.contains(n0,e))return Wt(e,o0[t],!1,r,n,a);throw new z("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:o0,customSizedDelim:$t,leftRightDelim:function(e,t,r,n,a,o){var i=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,t=Math.max(t-i,r+i);return $t(e,r=Math.max(t/500*901,2*t-s),!0,n,a,o)}};const m0={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},c0=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function p0(e,t){var r=Ct(e);if(r&&A.contains(c0,r.text))return r;throw new z(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function u0(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}x({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>(t=p0(t[0],e),{type:"delimsizing",mode:e.parser.mode,size:m0[e.funcName].size,mclass:m0[e.funcName].mclass,delim:t.text}),htmlBuilder:(e,t)=>"."===e.delim?N.makeSpan([e.mclass]):h0.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[],t=("."!==e.delim&&t.push(S(e.delim,e.mode)),new k.MathNode("mo",t)),e=("mopen"===e.mclass||"mclose"===e.mclass?t.setAttribute("fence","true"):t.setAttribute("fence","false"),t.setAttribute("stretchy","true"),C(h0.sizeToMaxHeight[e.size]));return t.setAttribute("minsize",e),t.setAttribute("maxsize",e),t}}),x({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new z("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:p0(t[0],e).text,color:r}}}),x({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var t=p0(t[0],e),r=(++(e=e.parser).leftrightDepth,e.parseExpression(!1)),n=(--e.leftrightDepth,e.expect("\\right",!1),H(e.parseFunction(),"leftright-right"));return{type:"leftright",mode:e.mode,body:r,left:t.text,right:n.delim,rightColor:n.color}},htmlBuilder:(t,e)=>{u0(t);const r=q(t.body,e,!0,["mopen","mclose"]);let n,a,o=0,i=0,s=!1;for(let e=0;e{u0(e);var r=M(e.body,t);if("."!==e.left){const t=new k.MathNode("mo",[S(e.left,e.mode)]);t.setAttribute("fence","true"),r.unshift(t)}if("."!==e.right){const t=new k.MathNode("mo",[S(e.right,e.mode)]);t.setAttribute("fence","true"),e.rightColor&&t.setAttribute("mathcolor",e.rightColor),r.push(t)}return yt(r)}}),x({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{if(t=p0(t[0],e),e.parser.leftrightDepth)return{type:"middle",mode:e.parser.mode,delim:t.text};throw new z("\\middle without preceding \\left",t)},htmlBuilder:(e,t)=>{let r;return"."===e.delim?r=at(t,[]):(r=h0.sizedDelim(e.delim,1,t,e.mode,[]),e={delim:e.delim,options:t},r.isMiddle=e),r},mathmlBuilder:(e,t)=>(e="\\vert"===e.delim||"|"===e.delim?S("|","text"):S(e.delim,e.mode),(e=new k.MathNode("mo",[e])).setAttribute("fence","true"),e.setAttribute("lspace","0.05em"),e.setAttribute("rspace","0.05em"),e)}),x({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){var{parser:e,funcName:n}=e,a=H(t[0],"color-token").color,t=t[1];return{type:"enclose",mode:e.mode,label:n,backgroundColor:a,body:t}},htmlBuilder:s=(r,n)=>{const a=N.wrapFragment(I(r.body,n),n),o=r.label.slice(1);let s,e=n.sizeMultiplier,l=0;const h=A.isCharacterBox(r.body);if("sout"===o)(s=N.makeSpan(["stretchy","sout"])).height=n.fontMetrics().defaultRuleThickness/e,l=-.5*n.fontMetrics().xHeight;else if("phase"===o){const r=B({number:.6,unit:"pt"},n),o=B({number:.35,unit:"ex"},n),h=(e/=n.havingBaseSizing().sizeMultiplier,a.height+a.depth+r+o),A=(a.style.paddingLeft=C(h/2+r),Math.floor(1e3*h*e)),t="M400000 "+A+" H0 L"+A/2+" 0 l65 45 L145 "+(A-80)+" H400000z",i=new ze([new Ae("phase",t)],{width:"400em",height:C(A/1e3),viewBox:"0 0 400000 "+A,preserveAspectRatio:"xMinYMin slice"});(s=N.makeSvgSpan(["hide-tail"],[i],n)).style.height=C(h),l=a.depth+r+o}else{/cancel/.test(o)?h||a.classes.push("cancel-pad"):"angl"===o?a.classes.push("anglpad"):a.classes.push("boxpad");let e=0,i,t=0;i=/box/.test(o)?(t=Math.max(n.fontMetrics().fboxrule,n.minRuleThickness),e=n.fontMetrics().fboxsep+("colorbox"===o?0:t)):"angl"===o?(t=Math.max(n.fontMetrics().defaultRuleThickness,n.minRuleThickness),e=4*t,Math.max(0,.25-a.depth)):e=h?.2:0,s=function(e,t,r,n,a){let o;if(n=e.height+e.depth+r+i,/fbox|color|angl/.test(t)){if(o=N.makeSpan(["stretchy",t],[],a),"fbox"===t){const e=a.color&&a.getColor();e&&(o.style.borderColor=e)}}else{const e=[],r=(/^[bx]cancel$/.test(t)&&e.push(new Te({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&e.push(new Te({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"})),new ze(e,{width:"100%",height:C(n)}));o=N.makeSvgSpan([],[r],a)}return o.height=n,o.style.height=C(n),o}(a,o,e,i,n),/fbox|boxed|fcolorbox/.test(o)?(s.style.borderStyle="solid",s.style.borderWidth=C(t)):"angl"===o&&.049!==t&&(s.style.borderTopWidth=C(t),s.style.borderRightWidth=C(t)),l=a.depth+i,r.backgroundColor&&(s.style.backgroundColor=r.backgroundColor,r.borderColor)&&(s.style.borderColor=r.borderColor)}let t;if(r.backgroundColor)t=N.makeVList({positionType:"individualShift",children:[{type:"elem",elem:s,shift:l},{type:"elem",elem:a,shift:0}]},n);else{const r=/cancel|phase/.test(o)?["svg-align"]:[];t=N.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:s,shift:l,wrapperClasses:r}]},n)}return/cancel/.test(o)&&(t.height=a.height,t.depth=a.depth),/cancel/.test(o)&&!h?N.makeSpan(["mord","cancel-lap"],[t],n):N.makeSpan(["mord"],[t],n)},mathmlBuilder:p=(e,t)=>{let r=0;var n=new k.MathNode(-1{if(!e.parser.settings.displayMode)throw new z("{"+e.envName+"} can be used only in display mode.")};function v0(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function k0(t,e,r){let{hskipBeforeAndAfter:n,addJot:a,cols:o,arraystretch:i,colSeparationType:s,autoTag:l,singleRow:h,emptySingleRow:m,maxNumCols:c,leqno:p}=e;if(t.gullet.beginGroup(),h||t.gullet.macros.set("\\cr","\\\\\\relax"),!i){const e=t.gullet.expandMacroAsText("\\arraystretch");if(null==e)i=1;else if(!(i=parseFloat(e))||i<0)throw new z("Invalid \\arraystretch: "+e)}t.gullet.beginGroup();let u=[];const d=[u],g=[],f=[],b=null!=l?[]:void 0;function y(){l&&t.gullet.macros.set("\\@eqnsw","1",!0)}function x(){b&&(t.gullet.macros.get("\\df@tag")?(b.push(t.subparse([new y0("\\df@tag")])),t.gullet.macros.set("\\df@tag",void 0,!0)):b.push(Boolean(l)&&"1"===t.gullet.macros.get("\\@eqnsw")))}for(y(),f.push(x0(t));;){let e=t.parseExpression(!1,h?"\\end":"\\\\");t.gullet.endGroup(),t.gullet.beginGroup(),e={type:"ordgroup",mode:t.mode,body:e},r&&(e={type:"styling",mode:t.mode,style:r,body:[e]}),u.push(e);const n=t.fetch().text;if("&"===n){if(c&&u.length===c){if(h||s)throw new z("Too many tab characters: &",t.nextToken);t.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}t.consume()}else{if("\\end"===n){x(),1===u.length&&"styling"===e.type&&0===e.body[0].body.length&&(1e))for(o=0;o=h)){(0e.length));return n.cols=new Array(a).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[n],left:t[0],right:t[1],rightColor:void 0}:n},htmlBuilder:M0,mathmlBuilder:z0}),g0({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){return(e=k0(e.parser,{arraystretch:.5},"script")).colSeparationType="small",e},htmlBuilder:M0,mathmlBuilder:z0}),g0({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){if(1<(t=(Ct(t[0])?[t[0]]:H(t[0],"ordgroup").body).map(function(e){var t=Bt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new z("Unknown column alignment: "+t,e)})).length)throw new z("{subarray} can contain only one column");if(0<(e=k0(e.parser,{cols:t,hskipBeforeAndAfter:!1,arraystretch:.5},"script")).body.length&&1AV".indexOf(l)))throw new z('Expected one of "<>AV=|." after @',s[n]);for(let r=0;r<2;r++){let t=!0;for(let e=n+1;e{var r=e.font,t=t.withFont(r);return I(e.body,t)},I0=(e,t)=>{var r=e.font,t=t.withFont(r);return R(e.body,t)},R0={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"},H0=(x({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,t=nt(t[0]);let n=r;return n in R0&&(n=R0[n]),{type:"font",mode:e.mode,font:n.slice(1),body:t}},htmlBuilder:q0,mathmlBuilder:I0}),x({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var e=e.parser,t=t[0],r=A.isCharacterBox(t);return{type:"mclass",mode:e.mode,mclass:Lt(t),body:[{type:"font",mode:e.mode,font:"boldsymbol",body:t}],isCharacterBox:r}}}),x({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:e,funcName:r,breakOnTokenText:n}=e,a=e.mode,n=e.parseExpression(!0,n);return{type:"font",mode:a,font:"math"+r.slice(1),body:{type:"ordgroup",mode:e.mode,body:n}}},htmlBuilder:q0,mathmlBuilder:I0}),(e,t)=>{let r=t;return"display"===e?r=r.id>=T.SCRIPT.id?r.text():T.DISPLAY:"text"===e&&r.size===T.DISPLAY.size?r=T.TEXT:"script"===e?r=T.SCRIPT:"scriptscript"===e&&(r=T.SCRIPTSCRIPT),r}),O0=(e,t)=>{const r=H0(e.size,t.style),n=r.fracNum(),a=r.fracDen();var o=t.havingStyle(n),i=I(e.numer,o,t);if(e.continued){const e=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm;i.height=i.height{let r=new k.MathNode("mfrac",[R(e.numer,t),R(e.denom,t)]);if(e.hasBarLine){if(e.barSize){const n=B(e.barSize,t);r.setAttribute("linethickness",C(n))}}else r.setAttribute("linethickness","0px");const n=H0(e.size,t.style);if(n.size!==t.style.size){r=new k.MathNode("mstyle",[r]);const e=n.size===T.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",e),r.setAttribute("scriptlevel","0")}if(null==e.leftDelim&&null==e.rightDelim)return r;{const t=[];if(null!=e.leftDelim){const r=new k.MathNode("mo",[new k.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(r),null!=e.rightDelim){const r=new k.MathNode("mo",[new k.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}return yt(t)}},L0=(x({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var{parser:e,funcName:r}=e,n=t[0],t=t[1];let a,o=null,i=null,s="auto";switch(r){case"\\dfrac":case"\\frac":case"\\tfrac":a=!0;break;case"\\\\atopfrac":a=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":a=!1,o="(",i=")";break;case"\\\\bracefrac":a=!1,o="\\{",i="\\}";break;case"\\\\brackfrac":a=!1,o="[",i="]";break;default:throw new Error("Unrecognized genfrac command")}switch(r){case"\\dfrac":case"\\dbinom":s="display";break;case"\\tfrac":case"\\tbinom":s="text"}return{type:"genfrac",mode:e.mode,continued:!1,numer:n,denom:t,hasBarLine:a,leftDelim:o,rightDelim:i,size:s,barSize:null}},htmlBuilder:O0,mathmlBuilder:E0}),x({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{var e=e.parser,r=t[0],t=t[1];return{type:"genfrac",mode:e.mode,continued:!0,numer:r,denom:t,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),x({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:a}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:a}}}),["display","text","script","scriptscript"]),D0=(x({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var e=e.parser,r=t[4],n=t[5],a="atom"===(a=nt(t[0])).type&&"open"===a.family?C0(a.text):null,o="atom"===(o=nt(t[1])).type&&"close"===o.family?C0(o.text):null,i=H(t[2],"size");let s,l=null,h=(s=!!i.isBlank||0<(l=i.value).number,"auto"),m=t[3];if("ordgroup"===m.type){if(0{var e=e.parser,r=t[0],n=function(e){if(e)return e;throw new Error("Expected non-null, but got "+String(e))}(H(t[1],"infix").size),t=t[2],a=0{var r=t.style;let n,a;a="supsub"===e.type?(n=e.sup?I(e.sup,t.havingStyle(r.sup()),t):I(e.sub,t.havingStyle(r.sub()),t),H(e.base,"horizBrace")):H(e,"horizBrace"),r=I(a.base,t.havingBaseStyle(T.DISPLAY)),e=Tt(a,t);let o;if((a.isOver?(o=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:.1},{type:"elem",elem:e}]},t)).children[0].children[0].children[1]:(o=N.makeVList({positionType:"bottom",positionData:r.depth+.1+e.height,children:[{type:"elem",elem:e},{type:"kern",size:.1},{type:"elem",elem:r}]},t)).children[0].children[0].children[0]).classes.push("svg-align"),n){const e=N.makeSpan(["mord",a.isOver?"mover":"munder"],[o],t);o=a.isOver?N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):N.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)}return N.makeSpan(["mord",a.isOver?"mover":"munder"],[o],t)}),P0=(x({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:e,funcName:r}=e;return{type:"horizBrace",mode:e.mode,label:r,isOver:/^\\over/.test(r),base:t[0]}},htmlBuilder:D0,mathmlBuilder:(e,t)=>{var r=At(e.label);return new k.MathNode(e.isOver?"mover":"munder",[R(e.base,t),r])}}),x({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=t[1],t=H(t[0],"url").url;return e.settings.isTrusted({command:"\\href",url:t})?{type:"href",mode:e.mode,href:t,body:w(r)}:e.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=q(e.body,t,!1);return N.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=wt(e.body,t);return(r=r instanceof v?r:new v("mrow",[r])).setAttribute("href",e.href),r}}),x({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var e=e.parser,r=H(t[0],"url").url;if(!e.settings.isTrusted({command:"\\url",url:r}))return e.formatUnsupportedCmd("\\url");var n=[];for(let t=0;t{let{parser:r,funcName:n}=t;var a=H(e[0],"raw").string,t=e[1];let o;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var i={};switch(n){case"\\htmlClass":i.class=a,o={command:"\\htmlClass",class:a};break;case"\\htmlId":i.id=a,o={command:"\\htmlId",id:a};break;case"\\htmlStyle":i.style=a,o={command:"\\htmlStyle",style:a};break;case"\\htmlData":{const t=a.split(",");for(let e=0;e{var r=q(e.body,t,!1),n=["enclosing"],a=(e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/)),N.makeSpan(n,r,t));for(const t in e.attributes)"class"!==t&&e.attributes.hasOwnProperty(t)&&a.setAttribute(t,e.attributes[t]);return a},mathmlBuilder:(e,t)=>wt(e.body,t)}),x({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>({type:"htmlmathml",mode:(e=e.parser).mode,html:w(t[0]),mathml:w(t[1])}),htmlBuilder:(e,t)=>(e=q(e.html,t,!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>wt(e.mathml,t)}),x({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(t,e,r)=>{let n=t.parser,a={number:0,unit:"em"},o={number:.9,unit:"em"},i={number:0,unit:"em"},s="";if(r[0]){const t=H(r[0],"raw").string.split(",");for(let e=0;e{var r=B(e.height,t);let n=0,a=(0{var r=new k.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);const n=B(e.height,t);let a=0;if(0{var{parser:e,funcName:r}=e,t=t[0];return{type:"lap",mode:e.mode,alignment:r.slice(5),body:t}},htmlBuilder:(e,t)=>{let r;r="clap"===e.alignment?(r=N.makeSpan([],[I(e.body,t)]),N.makeSpan(["inner"],[r],t)):N.makeSpan(["inner"],[I(e.body,t)]);var n=N.makeSpan(["fix"],[]);let a=N.makeSpan([e.alignment],[r,n],t);return(e=N.makeSpan(["strut"])).style.height=C(a.height+a.depth),a.depth&&(e.style.verticalAlign=C(-a.depth)),a.children.unshift(e),a=N.makeSpan(["thinbox"],[a],t),N.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:(e,t)=>{var r=new k.MathNode("mpadded",[R(e.body,t)]);if("rlap"!==e.alignment){const t="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",t+"width")}return r.setAttribute("width","0px"),r}}),x({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:e,parser:r}=e,n=r.mode,e=(r.switchMode("math"),"\\("===e?"\\)":"$"),a=r.parseExpression(!1,e);return r.expect(e),r.switchMode(n),{type:"styling",mode:r.mode,style:"text",body:a}}}),x({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new z("Mismatched "+e.funcName)}}),(e,t)=>{switch(t.style.size){case T.DISPLAY.size:return e.display;case T.TEXT.size:return e.text;case T.SCRIPT.size:return e.script;case T.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}}),V0=(x({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>({type:"mathchoice",mode:(e=e.parser).mode,display:w(t[0]),text:w(t[1]),script:w(t[2]),scriptscript:w(t[3])}),htmlBuilder:(e,t)=>(e=q(e=P0(e,t),t,!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>wt(e=P0(e,t),t)}),(e,t,r,n,a,o,i)=>{e=N.makeSpan([],[e]);var s=r&&A.isCharacterBox(r);let l,h,m;if(t){const e=I(t,n.havingStyle(a.sup()),n);h={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-e.depth)}}if(r){const e=I(r,n.havingStyle(a.sub()),n);l={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-e.height)}}if(h&&l){const t=n.fontMetrics().bigOpSpacing5+l.elem.height+l.elem.depth+l.kern+e.depth+i;m=N.makeVList({positionType:"bottom",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:C(-o)},{type:"kern",size:l.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:C(o)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(l){const t=e.height-i;m=N.makeVList({positionType:"top",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:l.elem,marginLeft:C(-o)},{type:"kern",size:l.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;{const t=e.depth+i;m=N.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:C(o)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}}if(t=[m],l&&0!==o&&!s){const e=N.makeSpan(["mspace"],[],n);e.style.marginRight=C(o),t.unshift(e)}return N.makeSpan(["mop","op-limits"],t,n)}),F0=["\\smallint"],G0=(t,r)=>{let e,n,a,o=!1;"supsub"===t.type?(e=t.sup,n=t.sub,a=H(t.base,"op"),o=!0):a=H(t,"op");let i,s=!1;if((t=r.style).size===T.DISPLAY.size&&a.symbol&&!A.contains(F0,a.name)&&(s=!0),a.symbol){const t=s?"Size2-Regular":"Size1-Regular";let e="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(e=a.name.slice(1),a.name="oiint"===e?"\\iint":"\\iiint"),i=N.makeSymbol(a.name,t,"math",r,["mop","op-symbol",s?"large-op":"small-op"]),0{let r;if(e.symbol)r=new v("mo",[S(e.name,e.mode)]),A.contains(F0,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new v("mo",M(e.body,t));else{r=new v("mi",[new bt(e.name.slice(1))]);const t=new v("mo",[S("⁡","text")]);r=e.parentIsSupSub?new v("mrow",[r,t]):ft([r,t])}return r},Y0={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"},X0=(x({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,a=n;return 1===a.length&&(a=Y0[a]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:w(t)}),htmlBuilder:G0,mathmlBuilder:U0}),{"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"}),W0=(x({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:e,funcName:t}=e;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:t}},htmlBuilder:G0,mathmlBuilder:U0}),x({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=X0[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:G0,mathmlBuilder:U0}),(e,t)=>{let r,n,a,o,i=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,a=H(e.base,"operatorname"),i=!0):a=H(e,"operatorname"),0{var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),r=q(e,t.withFont("mathrm"),!0);for(let e=0;e{var{parser:e,funcName:r}=e,t=t[0];return{type:"operatorname",mode:e.mode,body:w(t),alwaysHandleSupSub:"\\operatornamewithlimits"===r,limits:!1,parentIsSupSub:!1}},htmlBuilder:W0,mathmlBuilder:(t,r)=>{let n=M(t.body,r.withFont("mathrm")),a=!0;for(let e=0;ee.toText()).join("");n=[new k.TextNode(t)]}var r=new k.MathNode("mi",n),e=(r.setAttribute("mathvariant","normal"),new k.MathNode("mo",[S("⁡","text")]));return t.parentIsSupSub?new k.MathNode("mrow",[r,e]):k.newDocumentFragment([r,e])}}),O("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),rt({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?N.makeFragment(q(e.body,t,!1)):N.makeSpan(["mord"],q(e.body,t,!0),t)},mathmlBuilder(e,t){return wt(e.body,t,!0)}}),x({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){return e=e.parser,t=t[0],{type:"overline",mode:e.mode,body:t}},htmlBuilder(e,t){var e=I(e.body,t.havingCrampedStyle()),r=N.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,e=N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:3*n},{type:"elem",elem:r},{type:"kern",size:n}]},t);return N.makeSpan(["mord","overline"],[e],t)},mathmlBuilder(e,t){var r=new k.MathNode("mo",[new k.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new k.MathNode("mover",[R(e.body,t),r])).setAttribute("accent","true"),e}}),x({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"phantom",mode:e.mode,body:w(t)}),htmlBuilder:(e,t)=>(e=q(e.body,t.withPhantom(),!1),N.makeFragment(e)),mathmlBuilder:(e,t)=>(e=M(e.body,t),new k.MathNode("mphantom",e))}),x({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"hphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{let r=N.makeSpan([],[I(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e(e=M(w(e.body),t),t=new k.MathNode("mphantom",e),(e=new k.MathNode("mpadded",[t])).setAttribute("height","0px"),e.setAttribute("depth","0px"),e)}),x({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>(e=e.parser,t=t[0],{type:"vphantom",mode:e.mode,body:t}),htmlBuilder:(e,t)=>{var e=N.makeSpan(["inner"],[I(e.body,t.withPhantom())]),r=N.makeSpan(["fix"],[]);return N.makeSpan(["mord","rlap"],[e,r],t)},mathmlBuilder:(e,t)=>(e=M(w(e.body),t),t=new k.MathNode("mphantom",e),(e=new k.MathNode("mpadded",[t])).setAttribute("width","0px"),e)}),x({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var e=e.parser,r=H(t[0],"size").value,t=t[1];return{type:"raisebox",mode:e.mode,dy:r,body:t}},htmlBuilder(e,t){var r=I(e.body,t),e=B(e.dy,t);return N.makeVList({positionType:"shift",positionData:-e,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return t=new k.MathNode("mpadded",[R(e.body,t)]),e=e.dy.number+e.dy.unit,t.setAttribute("voffset",e),t}}),x({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(e){return{type:"internal",mode:(e=e.parser).mode}}}),x({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(e,t,r){var e=e.parser,r=r[0],n=H(t[0],"size"),t=H(t[1],"size");return{type:"rule",mode:e.mode,shift:r&&H(r,"size").value,width:n.value,height:t.value}},htmlBuilder(e,t){var r=N.makeSpan(["mord","rule"],[],t),n=B(e.width,t),a=B(e.height,t),e=e.shift?B(e.shift,t):0;return r.style.borderRightWidth=C(n),r.style.borderTopWidth=C(a),r.style.bottom=C(e),r.width=n,r.height=a+e,r.depth=-e,r.maxFontSize=1.125*a*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=B(e.width,t),n=B(e.height,t),e=e.shift?B(e.shift,t):0,t=t.color&&t.getColor()||"black",a=new k.MathNode("mspace"),t=(a.setAttribute("mathbackground",t),a.setAttribute("width",C(r)),a.setAttribute("height",C(n)),new k.MathNode("mpadded",[a]));return 0<=e?t.setAttribute("height",C(e)):(t.setAttribute("height",C(e)),t.setAttribute("depth",C(-e))),t.setAttribute("voffset",C(e)),t}});const _0=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],$0=(x({type:"sizing",names:_0,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!1,e);return{type:"sizing",mode:n.mode,size:_0.indexOf(r)+1,body:e}},htmlBuilder:(e,t)=>{var r=t.havingSize(e.size);return j0(e.body,r,t)},mathmlBuilder:(e,t)=>(t=t.havingSize(e.size),e=M(e.body,t),(e=new k.MathNode("mstyle",e)).setAttribute("mathsize",C(t.sizeMultiplier)),e)}),x({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let n=e.parser,a=!1,o=!1;var i,s=r[0]&&H(r[0],"ordgroup");if(s)for(let e=0;e{var r=N.makeSpan([],[I(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e(t=new k.MathNode("mpadded",[R(e.body,t)]),e.smashHeight&&t.setAttribute("height","0px"),e.smashDepth&&t.setAttribute("depth","0px"),t)}),x({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){return e=e.parser,r=r[0],t=t[0],{type:"sqrt",mode:e.mode,body:t,index:r}},htmlBuilder(e,t){let r=I(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=N.wrapFragment(r,t);const n=t.fontMetrics().defaultRuleThickness;let a=n,o=(t.style.idr.height+r.depth+o&&(o=(o+m-r.height-r.depth)/2);var c=s.height-r.height-o-l,c=(r.style.paddingLeft=C(h),N.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+c)},{type:"elem",elem:s},{type:"kern",size:l}]},t));if(e.index){const r=t.havingStyle(T.SCRIPTSCRIPT),n=I(e.index,r,t),a=.6*(c.height-c.depth),o=N.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:n}]},t),i=N.makeSpan(["root"],[o]);return N.makeSpan(["mord","sqrt"],[i,c],t)}return N.makeSpan(["mord","sqrt"],[c],t)},mathmlBuilder(e,t){var{body:e,index:r}=e;return r?new k.MathNode("mroot",[R(e,t),R(r,t)]):new k.MathNode("msqrt",[R(e,t)])}}),{display:T.DISPLAY,text:T.TEXT,script:T.SCRIPT,scriptscript:T.SCRIPTSCRIPT}),Z0=(x({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:e,funcName:r,parser:n}=e,e=n.parseExpression(!0,e),r=r.slice(1,r.length-5);return{type:"styling",mode:n.mode,style:r,body:e}},htmlBuilder(e,t){var r=$0[e.style],r=t.havingStyle(r).withFont("");return j0(e.body,r,t)},mathmlBuilder(e,t){var r=$0[e.style],t=t.havingStyle(r),r=M(e.body,t),t=new k.MathNode("mstyle",r),r={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return t.setAttribute("scriptlevel",r[0]),t.setAttribute("displaystyle",r[1]),t}}),rt({type:"supsub",htmlBuilder(e,t){n=t;const r=(o=(a=e).base)?"op"===o.type?o.limits&&(n.style.size===T.DISPLAY.size||o.alwaysHandleSupSub)?G0:null:"operatorname"===o.type?o.alwaysHandleSupSub&&(n.style.size===T.DISPLAY.size||o.limits)?W0:null:"accent"===o.type?A.isCharacterBox(o.base)?Nt:null:"horizBrace"===o.type&&!a.sub===o.isOver?D0:null:null;if(r)return r(e,t);var{base:n,sup:a,sub:o}=e,i=I(n,t);let s,l;var h=t.fontMetrics();let m=0,c=0;if(n=n&&A.isCharacterBox(n),a){const e=t.havingStyle(t.style.sup());s=I(a,e,t),n||(m=i.height-e.fontMetrics().supDrop*e.sizeMultiplier/t.sizeMultiplier)}if(o){const e=t.havingStyle(t.style.sub());l=I(o,e,t),n||(c=i.depth+e.fontMetrics().subDrop*e.sizeMultiplier/t.sizeMultiplier)}a=t.style===T.DISPLAY?h.sup1:t.style.cramped?h.sup3:h.sup2,o=t.sizeMultiplier,n=C(.5/h.ptPerEm/o);let p,u=null;if(l){const t=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(i instanceof d||t)&&(u=C(-i.italic))}if(s&&l){m=Math.max(m,a,s.depth+.25*h.xHeight),c=Math.max(c,h.sub2);const e=4*h.defaultRuleThickness;if(m-s.depth-(l.height-c){var e=new k.MathNode("mtd",[]);return e.setAttribute("width","50%"),e}),er=(rt({type:"tag",mathmlBuilder(e,t){return(e=new k.MathNode("mtable",[new k.MathNode("mtr",[Q0(),new k.MathNode("mtd",[wt(e.body,t)]),Q0(),new k.MathNode("mtd",[wt(e.tag,t)])])])).setAttribute("width","100%"),e}}),{"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"}),tr={"\\textbf":"textbf","\\textmd":"textmd"},rr={"\\textit":"textit","\\textup":"textup"},nr=(e,t)=>(e=e.font)?er[e]?t.withTextFontFamily(er[e]):tr[e]?t.withTextFontWeight(tr[e]):"\\emph"===e?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(rr[e]):t,ar=(x({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:e,funcName:r}=e,t=t[0];return{type:"text",mode:e.mode,body:w(t),font:r}},htmlBuilder(e,t){return t=nr(e,t),e=q(e.body,t,!0),N.makeSpan(["mord","text"],e,t)},mathmlBuilder(e,t){return t=nr(e,t),wt(e.body,t)}}),x({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){return{type:"underline",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=I(e.body,t),r=N.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,r=N.makeVList({positionType:"top",positionData:e.height,children:[{type:"kern",size:n},{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:e}]},t);return N.makeSpan(["mord","underline"],[r],t)},mathmlBuilder(e,t){var r=new k.MathNode("mo",[new k.TextNode("‾")]);return r.setAttribute("stretchy","true"),(e=new k.MathNode("munder",[R(e.body,t),r])).setAttribute("accentunder","true"),e}}),x({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){return{type:"vcenter",mode:(e=e.parser).mode,body:t[0]}},htmlBuilder(e,t){var e=I(e.body,t),r=t.fontMetrics().axisHeight,r=.5*(e.height-r-(e.depth+r));return N.makeVList({positionType:"shift",positionData:r,children:[{type:"elem",elem:e}]},t)},mathmlBuilder(e,t){return new k.MathNode("mpadded",[R(e.body,t)],["vcenter"])}}),x({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new z("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(r,e){var n=ar(r),a=[],o=e.havingStyle(e.style.text());for(let t=0;te.body.replace(/ /g,e.star?"␣":" "));var or=Qe;const ir=new RegExp("[̀-ͯ]+$");class sr{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp("([ \r\n\t]+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-‧‪-퟿豈-￿][̀-ͯ]*|[\ud800-\udbff][\udc00-\udfff][̀-ͯ]*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|(\\\\[a-zA-Z@]+)[ \r\n\t]*|\\\\[^\ud800-\udfff])","g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new y0("EOF",new b0(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new z("Unexpected character: '"+e[t]+"'",new y0(e[t],new b0(this,t,t+1)));if(r=r[6]||r[3]||(r[2]?"\\ ":" "),14!==this.catcodes[r])return new y0(r,new b0(this,t,this.tokenRegex.lastIndex));{const t=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===t?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=t+1,this.lex()}}}class lr{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(const t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;0=t)throw new z("Invalid base-"+t+" digit "+r.text);for(var a;null!=(a=mr[e.future().text])&&a{let n=r.consumeArg().tokens;if(1!==n.length)throw new z("\\newcommand's first argument must be a macro name");var a=n[0].text,o=r.isDefined(a);if(o&&!e)throw new z("\\newcommand{"+a+"} attempting to redefine "+a+"; use \\renewcommand");if(!o&&!t)throw new z("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");let i=0;if(1===(n=r.consumeArg().tokens).length&&"["===n[0].text){let e="",t=r.expandNextToken();for(;"]"!==t.text&&"EOF"!==t.text;)e+=t.text,t=r.expandNextToken();if(!e.match(/^\s*[0-9]+\s*$/))throw new z("Invalid number of arguments: "+e);i=parseInt(e),n=r.consumeArg().tokens}return r.macros.set(a,{tokens:n,numArgs:i}),""}),pr=(O("\\newcommand",e=>cr(e,!1,!0)),O("\\renewcommand",e=>cr(e,!0,!1)),O("\\providecommand",e=>cr(e,!0,!0)),O("\\message",e=>(e=e.consumeArgs(1)[0],console.log(e.reverse().map(e=>e.text).join("")),"")),O("\\errmessage",e=>(e=e.consumeArgs(1)[0],console.error(e.reverse().map(e=>e.text).join("")),"")),O("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),or[r],h.math[r],h.text[r]),""}),O("\\bgroup","{"),O("\\egroup","}"),O("~","\\nobreakspace"),O("\\lq","`"),O("\\rq","'"),O("\\aa","\\r a"),O("\\AA","\\r A"),O("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`©}"),O("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),O("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"),O("ℬ","\\mathscr{B}"),O("ℰ","\\mathscr{E}"),O("ℱ","\\mathscr{F}"),O("ℋ","\\mathscr{H}"),O("ℐ","\\mathscr{I}"),O("ℒ","\\mathscr{L}"),O("ℳ","\\mathscr{M}"),O("ℛ","\\mathscr{R}"),O("ℭ","\\mathfrak{C}"),O("ℌ","\\mathfrak{H}"),O("ℨ","\\mathfrak{Z}"),O("\\Bbbk","\\Bbb{k}"),O("·","\\cdotp"),O("\\llap","\\mathllap{\\textrm{#1}}"),O("\\rlap","\\mathrlap{\\textrm{#1}}"),O("\\clap","\\mathclap{\\textrm{#1}}"),O("\\mathstrut","\\vphantom{(}"),O("\\underbar","\\underline{\\text{#1}}"),O("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),O("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"),O("\\ne","\\neq"),O("≠","\\neq"),O("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}"),O("∉","\\notin"),O("≘","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}"),O("≙","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}"),O("≚","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}"),O("≛","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}"),O("≝","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}"),O("≞","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}"),O("≟","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}"),O("⟂","\\perp"),O("‼","\\mathclose{!\\mkern-0.8mu!}"),O("∌","\\notni"),O("⌜","\\ulcorner"),O("⌝","\\urcorner"),O("⌞","\\llcorner"),O("⌟","\\lrcorner"),O("©","\\copyright"),O("®","\\textregistered"),O("️","\\textregistered"),O("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),O("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),O("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),O("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),O("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}"),O("⋮","\\vdots"),O("\\varGamma","\\mathit{\\Gamma}"),O("\\varDelta","\\mathit{\\Delta}"),O("\\varTheta","\\mathit{\\Theta}"),O("\\varLambda","\\mathit{\\Lambda}"),O("\\varXi","\\mathit{\\Xi}"),O("\\varPi","\\mathit{\\Pi}"),O("\\varSigma","\\mathit{\\Sigma}"),O("\\varUpsilon","\\mathit{\\Upsilon}"),O("\\varPhi","\\mathit{\\Phi}"),O("\\varPsi","\\mathit{\\Psi}"),O("\\varOmega","\\mathit{\\Omega}"),O("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),O("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),O("\\boxed","\\fbox{$\\displaystyle{#1}$}"),O("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),O("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),O("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),{",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"}),ur=(O("\\dots",function(e){let t="\\dotso";return(e=e.expandAfterFuture().text)in pr?t=pr[e]:("\\not"===e.slice(0,4)||e in h.math&&A.contains(["bin","rel"],h.math[e].group))&&(t="\\dotsb"),t}),{")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0}),dr=(O("\\dotso",function(e){return e.future().text in ur?"\\ldots\\,":"\\ldots"}),O("\\dotsc",function(e){return(e=e.future().text)in ur&&","!==e?"\\ldots\\,":"\\ldots"}),O("\\cdots",function(e){return e.future().text in ur?"\\@cdots\\,":"\\@cdots"}),O("\\dotsb","\\cdots"),O("\\dotsm","\\cdots"),O("\\dotsi","\\!\\cdots"),O("\\dotsx","\\ldots\\,"),O("\\DOTSI","\\relax"),O("\\DOTSB","\\relax"),O("\\DOTSX","\\relax"),O("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),O("\\,","\\tmspace+{3mu}{.1667em}"),O("\\thinspace","\\,"),O("\\>","\\mskip{4mu}"),O("\\:","\\tmspace+{4mu}{.2222em}"),O("\\medspace","\\:"),O("\\;","\\tmspace+{5mu}{.2777em}"),O("\\thickspace","\\;"),O("\\!","\\tmspace-{3mu}{.1667em}"),O("\\negthinspace","\\!"),O("\\negmedspace","\\tmspace-{4mu}{.2222em}"),O("\\negthickspace","\\tmspace-{5mu}{.277em}"),O("\\enspace","\\kern.5em "),O("\\enskip","\\hskip.5em\\relax"),O("\\quad","\\hskip1em\\relax"),O("\\qquad","\\hskip2em\\relax"),O("\\tag","\\@ifstar\\tag@literal\\tag@paren"),O("\\tag@paren","\\tag@literal{({#1})}"),O("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new z("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),O("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),O("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),O("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),O("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),O("\\newline","\\\\\\relax"),O("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}"),O("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+(l=C(ae["Main-Regular"]["T".charCodeAt(0)][1]-.7*ae["Main-Regular"]["A".charCodeAt(0)][1]))+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),O("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+l+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),O("\\hspace","\\@ifstar\\@hspacer\\@hspace"),O("\\@hspace","\\hskip #1\\relax"),O("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),O("\\ordinarycolon",":"),O("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),O("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),O("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),O("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),O("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),O("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),O("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),O("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),O("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),O("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),O("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),O("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),O("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),O("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),O("∷","\\dblcolon"),O("∹","\\eqcolon"),O("≔","\\coloneqq"),O("≕","\\eqqcolon"),O("⩴","\\Coloneqq"),O("\\ratio","\\vcentcolon"),O("\\coloncolon","\\dblcolon"),O("\\colonequals","\\coloneqq"),O("\\coloncolonequals","\\Coloneqq"),O("\\equalscolon","\\eqqcolon"),O("\\equalscoloncolon","\\Eqqcolon"),O("\\colonminus","\\coloneq"),O("\\coloncolonminus","\\Coloneq"),O("\\minuscolon","\\eqcolon"),O("\\minuscoloncolon","\\Eqcolon"),O("\\coloncolonapprox","\\Colonapprox"),O("\\coloncolonsim","\\Colonsim"),O("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),O("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),O("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),O("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),O("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}"),O("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),O("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),O("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),O("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),O("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),O("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),O("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),O("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),O("\\gvertneqq","\\html@mathml{\\@gvertneqq}{≩}"),O("\\lvertneqq","\\html@mathml{\\@lvertneqq}{≨}"),O("\\ngeqq","\\html@mathml{\\@ngeqq}{≱}"),O("\\ngeqslant","\\html@mathml{\\@ngeqslant}{≱}"),O("\\nleqq","\\html@mathml{\\@nleqq}{≰}"),O("\\nleqslant","\\html@mathml{\\@nleqslant}{≰}"),O("\\nshortmid","\\html@mathml{\\@nshortmid}{∤}"),O("\\nshortparallel","\\html@mathml{\\@nshortparallel}{∦}"),O("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{⊈}"),O("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{⊉}"),O("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{⊊}"),O("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{⫋}"),O("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{⊋}"),O("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{⫌}"),O("\\imath","\\html@mathml{\\@imath}{ı}"),O("\\jmath","\\html@mathml{\\@jmath}{ȷ}"),O("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}"),O("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}"),O("⟦","\\llbracket"),O("⟧","\\rrbracket"),O("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}"),O("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}"),O("⦃","\\lBrace"),O("⦄","\\rBrace"),O("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}"),O("⦵","\\minuso"),O("\\darr","\\downarrow"),O("\\dArr","\\Downarrow"),O("\\Darr","\\Downarrow"),O("\\lang","\\langle"),O("\\rang","\\rangle"),O("\\uarr","\\uparrow"),O("\\uArr","\\Uparrow"),O("\\Uarr","\\Uparrow"),O("\\N","\\mathbb{N}"),O("\\R","\\mathbb{R}"),O("\\Z","\\mathbb{Z}"),O("\\alef","\\aleph"),O("\\alefsym","\\aleph"),O("\\Alpha","\\mathrm{A}"),O("\\Beta","\\mathrm{B}"),O("\\bull","\\bullet"),O("\\Chi","\\mathrm{X}"),O("\\clubs","\\clubsuit"),O("\\cnums","\\mathbb{C}"),O("\\Complex","\\mathbb{C}"),O("\\Dagger","\\ddagger"),O("\\diamonds","\\diamondsuit"),O("\\empty","\\emptyset"),O("\\Epsilon","\\mathrm{E}"),O("\\Eta","\\mathrm{H}"),O("\\exist","\\exists"),O("\\harr","\\leftrightarrow"),O("\\hArr","\\Leftrightarrow"),O("\\Harr","\\Leftrightarrow"),O("\\hearts","\\heartsuit"),O("\\image","\\Im"),O("\\infin","\\infty"),O("\\Iota","\\mathrm{I}"),O("\\isin","\\in"),O("\\Kappa","\\mathrm{K}"),O("\\larr","\\leftarrow"),O("\\lArr","\\Leftarrow"),O("\\Larr","\\Leftarrow"),O("\\lrarr","\\leftrightarrow"),O("\\lrArr","\\Leftrightarrow"),O("\\Lrarr","\\Leftrightarrow"),O("\\Mu","\\mathrm{M}"),O("\\natnums","\\mathbb{N}"),O("\\Nu","\\mathrm{N}"),O("\\Omicron","\\mathrm{O}"),O("\\plusmn","\\pm"),O("\\rarr","\\rightarrow"),O("\\rArr","\\Rightarrow"),O("\\Rarr","\\Rightarrow"),O("\\real","\\Re"),O("\\reals","\\mathbb{R}"),O("\\Reals","\\mathbb{R}"),O("\\Rho","\\mathrm{P}"),O("\\sdot","\\cdot"),O("\\sect","\\S"),O("\\spades","\\spadesuit"),O("\\sub","\\subset"),O("\\sube","\\subseteq"),O("\\supe","\\supseteq"),O("\\Tau","\\mathrm{T}"),O("\\thetasym","\\vartheta"),O("\\weierp","\\wp"),O("\\Zeta","\\mathrm{Z}"),O("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),O("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),O("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),O("\\bra","\\mathinner{\\langle{#1}|}"),O("\\ket","\\mathinner{|{#1}\\rangle}"),O("\\braket","\\mathinner{\\langle{#1}\\rangle}"),O("\\Bra","\\left\\langle#1\\right|"),O("\\Ket","\\left|#1\\right\\rangle"),O("\\bra@ket",(u=l=>e=>{const t=e.consumeArg().tokens,n=e.consumeArg().tokens,a=e.consumeArg().tokens,r=e.consumeArg().tokens,o=e.macros.get("|"),i=e.macros.get("\\|");e.macros.beginGroup();var s=r=>e=>{l&&(e.macros.set("|",o),a.length)&&e.macros.set("\\|",i);let t=r;return!r&&a.length&&"|"===e.future().text&&(e.popToken(),t=!0),{tokens:t?a:n,numArgs:0}},s=(e.macros.set("|",s(!1)),a.length&&e.macros.set("\\|",s(!0)),e.consumeArg().tokens),s=e.expandTokens([...r,...s,...t]);return e.macros.endGroup(),{tokens:s.reverse(),numArgs:0}})(!1)),O("\\bra@set",u(!0)),O("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),O("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),O("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),O("\\angln","{\\angl n}"),O("\\blue","\\textcolor{##6495ed}{#1}"),O("\\orange","\\textcolor{##ffa500}{#1}"),O("\\pink","\\textcolor{##ff00af}{#1}"),O("\\red","\\textcolor{##df0030}{#1}"),O("\\green","\\textcolor{##28ae7b}{#1}"),O("\\gray","\\textcolor{gray}{#1}"),O("\\purple","\\textcolor{##9d38bd}{#1}"),O("\\blueA","\\textcolor{##ccfaff}{#1}"),O("\\blueB","\\textcolor{##80f6ff}{#1}"),O("\\blueC","\\textcolor{##63d9ea}{#1}"),O("\\blueD","\\textcolor{##11accd}{#1}"),O("\\blueE","\\textcolor{##0c7f99}{#1}"),O("\\tealA","\\textcolor{##94fff5}{#1}"),O("\\tealB","\\textcolor{##26edd5}{#1}"),O("\\tealC","\\textcolor{##01d1c1}{#1}"),O("\\tealD","\\textcolor{##01a995}{#1}"),O("\\tealE","\\textcolor{##208170}{#1}"),O("\\greenA","\\textcolor{##b6ffb0}{#1}"),O("\\greenB","\\textcolor{##8af281}{#1}"),O("\\greenC","\\textcolor{##74cf70}{#1}"),O("\\greenD","\\textcolor{##1fab54}{#1}"),O("\\greenE","\\textcolor{##0d923f}{#1}"),O("\\goldA","\\textcolor{##ffd0a9}{#1}"),O("\\goldB","\\textcolor{##ffbb71}{#1}"),O("\\goldC","\\textcolor{##ff9c39}{#1}"),O("\\goldD","\\textcolor{##e07d10}{#1}"),O("\\goldE","\\textcolor{##a75a05}{#1}"),O("\\redA","\\textcolor{##fca9a9}{#1}"),O("\\redB","\\textcolor{##ff8482}{#1}"),O("\\redC","\\textcolor{##f9685d}{#1}"),O("\\redD","\\textcolor{##e84d39}{#1}"),O("\\redE","\\textcolor{##bc2612}{#1}"),O("\\maroonA","\\textcolor{##ffbde0}{#1}"),O("\\maroonB","\\textcolor{##ff92c6}{#1}"),O("\\maroonC","\\textcolor{##ed5fa6}{#1}"),O("\\maroonD","\\textcolor{##ca337c}{#1}"),O("\\maroonE","\\textcolor{##9e034e}{#1}"),O("\\purpleA","\\textcolor{##ddd7ff}{#1}"),O("\\purpleB","\\textcolor{##c6b9fc}{#1}"),O("\\purpleC","\\textcolor{##aa87ff}{#1}"),O("\\purpleD","\\textcolor{##7854ab}{#1}"),O("\\purpleE","\\textcolor{##543b78}{#1}"),O("\\mintA","\\textcolor{##f5f9e8}{#1}"),O("\\mintB","\\textcolor{##edf2df}{#1}"),O("\\mintC","\\textcolor{##e0e5cc}{#1}"),O("\\grayA","\\textcolor{##f6f7f7}{#1}"),O("\\grayB","\\textcolor{##f0f1f2}{#1}"),O("\\grayC","\\textcolor{##e3e5e6}{#1}"),O("\\grayD","\\textcolor{##d6d8da}{#1}"),O("\\grayE","\\textcolor{##babec2}{#1}"),O("\\grayF","\\textcolor{##888d93}{#1}"),O("\\grayG","\\textcolor{##626569}{#1}"),O("\\grayH","\\textcolor{##3b3e40}{#1}"),O("\\grayI","\\textcolor{##21242c}{#1}"),O("\\kaBlue","\\textcolor{##314453}{#1}"),O("\\kaGreen","\\textcolor{##71B307}{#1}"),{"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0});class gr{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new lr(hr,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new sr(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),{tokens:n,end:r}=this.consumeArg(["]"])}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new y0("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;" "===this.future().text;)this.stack.pop()}consumeArg(e){var t=[],r=e&&0this.settings.maxExpand)throw new z("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,n=t.noexpand?null:this._getExpansion(r);if(null==n||e&&n.unexpandable){if(e&&null==n&&"\\"===r[0]&&!this.isDefined(r))throw new z("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let a=n.tokens;var o=this.consumeArgs(n.numArgs,n.delimiters);if(n.numArgs)for(let e=(a=a.slice()).length-1;0<=e;--e){var i=a[e];if("#"===i.text){if(0===e)throw new z("Incomplete placeholder at end of macro body",i);if("#"===(i=a[--e]).text)a.splice(e+1,1);else{if(!/^[1-9]$/.test(i.text))throw new z("Not a valid argument number",i);a.splice(e,2,...o[+i.text-1])}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;){var e;if(!1===this.expandOnce())return(e=this.stack.pop()).treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new y0(e)]):void 0}expandTokens(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return this.countExpansion(t.length),t}expandMacroAsText(e){return(e=this.expandMacro(e))&&e.map(e=>e.text).join("")}_getExpansion(r){const n=this.macros.get(r);if(null==n)return n;if(1===r.length){const n=this.lexer.catcodes[r];if(null!=n&&13!==n)return}if("string"!=typeof(r="function"==typeof n?n(this):n))return r;{let e=0;if(-1!==r.indexOf("#")){const n=r.replace(/##/g,"");for(;-1!==n.indexOf("#"+(e+1));)++e}const n=new sr(r,this.settings),a=[];let t=n.lex();for(;"EOF"!==t.text;)a.push(t),t=n.lex();return a.reverse(),{tokens:a,numArgs:e}}}isDefined(e){return this.macros.has(e)||or.hasOwnProperty(e)||h.math.hasOwnProperty(e)||h.text.hasOwnProperty(e)||dr.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:or.hasOwnProperty(e)&&!or[e].primitive}}const fr=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,br=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g","ʰ":"h","ⁱ":"i","ʲ":"j","ᵏ":"k","ˡ":"l","ᵐ":"m","ⁿ":"n","ᵒ":"o","ᵖ":"p","ʳ":"r","ˢ":"s","ᵗ":"t","ᵘ":"u","ᵛ":"v","ʷ":"w","ˣ":"x","ʸ":"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),yr={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},xr={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","ḉ":"ḉ","č":"č","ĉ":"ĉ","ċ":"ċ","ç":"ç","ď":"ď","ḋ":"ḋ","ḑ":"ḑ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ḝ":"ḝ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ȩ":"ȩ","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ģ":"ģ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","ḩ":"ḩ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ķ":"ķ","ĺ":"ĺ","ľ":"ľ","ļ":"ļ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ņ":"ņ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ŗ":"ŗ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ş":"ş","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ţ":"ţ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Ḉ":"Ḉ","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ç":"Ç","Ď":"Ď","Ḋ":"Ḋ","Ḑ":"Ḑ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ḝ":"Ḝ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ȩ":"Ȩ","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ģ":"Ģ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Ḩ":"Ḩ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ķ":"Ķ","Ĺ":"Ĺ","Ľ":"Ľ","Ļ":"Ļ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ņ":"Ņ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ŗ":"Ŗ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ş":"Ş","Ť":"Ť","Ṫ":"Ṫ","Ţ":"Ţ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"};class wr{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new gr(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new z("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken,e=(this.consume(),this.gullet.pushToken(new y0("}")),this.gullet.pushTokens(e),this.parseExpression(!1));return this.expect("}"),this.nextToken=t,e}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var n=this.fetch();if(-1!==wr.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&or[n.text]&&or[n.text].infix)break;if(!(n=this.parseAtom(t)))break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(t){let r,n=-1;for(let e=0;e { + // Retrieve the button element. + const loadCommentsButton = document.querySelector('#load-comments'); + + // If the button exists… + if (loadCommentsButton) { + // Add a "click" event listener to the button. + loadCommentsButton.addEventListener('click', () => { + // Create a new "script" HTML element. + const script = document.createElement('script'); + + // Set the source of the script to the URL in the button's "data-script-src" attribute. + script.src = loadCommentsButton.dataset.scriptSrc; + + // Load asynchronously. + script.async = true; + + // Add the script element to the end of the document body, which causes the script to start loading and executing. + document.body.appendChild(script); + + // Hide the button after it's clicked. + loadCommentsButton.style.display = 'none'; + }); + } +}); diff --git a/js/loadComments.min.js b/js/loadComments.min.js new file mode 100644 index 0000000..ef14653 --- /dev/null +++ b/js/loadComments.min.js @@ -0,0 +1 @@ +document.addEventListener("DOMContentLoaded",()=>{const t=document.querySelector("#load-comments");t&&t.addEventListener("click",()=>{var e=document.createElement("script");e.src=t.dataset.scriptSrc,e.async=!0,document.body.appendChild(e),t.style.display="none"})}); diff --git a/js/lunr/lunr.da.js b/js/lunr/lunr.da.js new file mode 100644 index 0000000..32c6d01 --- /dev/null +++ b/js/lunr/lunr.da.js @@ -0,0 +1,280 @@ +/*! + * Lunr languages, `Danish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.da = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.da.trimmer, + lunr.da.stopWordFilter, + lunr.da.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.da.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.da.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.da.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.da.trimmer, 'trimmer-da'); + + /* lunr stemmer function */ + lunr.da.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function DanishStemmer() { + var a_0 = [new Among("hed", -1, 1), new Among("ethed", 0, 1), + new Among("ered", -1, 1), new Among("e", -1, 1), + new Among("erede", 3, 1), new Among("ende", 3, 1), + new Among("erende", 5, 1), new Among("ene", 3, 1), + new Among("erne", 3, 1), new Among("ere", 3, 1), + new Among("en", -1, 1), new Among("heden", 10, 1), + new Among("eren", 10, 1), new Among("er", -1, 1), + new Among("heder", 13, 1), new Among("erer", 13, 1), + new Among("s", -1, 2), new Among("heds", 16, 1), + new Among("es", 16, 1), new Among("endes", 18, 1), + new Among("erendes", 19, 1), new Among("enes", 18, 1), + new Among("ernes", 18, 1), new Among("eres", 18, 1), + new Among("ens", 16, 1), new Among("hedens", 24, 1), + new Among("erens", 24, 1), new Among("ers", 16, 1), + new Among("ets", 16, 1), new Among("erets", 28, 1), + new Among("et", -1, 1), new Among("eret", 30, 1) + ], + a_1 = [ + new Among("gd", -1, -1), new Among("dt", -1, -1), + new Among("gt", -1, -1), new Among("kt", -1, -1) + ], + a_2 = [ + new Among("ig", -1, 1), new Among("lig", 0, 1), + new Among("elig", 1, 1), new Among("els", -1, 1), + new Among("l\u00F8st", -1, 2) + ], + g_v = [17, 65, 16, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 + ], + g_s_ending = [239, 254, 42, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 + ], + I_x, I_p1, S_ch, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_mark_regions() { + var v_1, c = sbp.cursor + 3; + I_p1 = sbp.limit; + if (0 <= c && c <= sbp.limit) { + I_x = c; + while (true) { + v_1 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 248)) { + sbp.cursor = v_1; + break; + } + sbp.cursor = v_1; + if (v_1 >= sbp.limit) + return; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 248)) { + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_p1 = sbp.cursor; + if (I_p1 < I_x) + I_p1 = I_x; + } + } + + function r_main_suffix() { + var among_var, v_1; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_0, 32); + sbp.limit_backward = v_1; + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + if (sbp.in_grouping_b(g_s_ending, 97, 229)) + sbp.slice_del(); + break; + } + } + } + } + + function r_consonant_pair() { + var v_1 = sbp.limit - sbp.cursor, + v_2; + if (sbp.cursor >= I_p1) { + v_2 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_1, 4)) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_2; + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } else + sbp.limit_backward = v_2; + } + } + + function r_other_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor, + v_2, v_3; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "st")) { + sbp.bra = sbp.cursor; + if (sbp.eq_s_b(2, "ig")) + sbp.slice_del(); + } + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor >= I_p1) { + v_2 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 5); + sbp.limit_backward = v_2; + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + v_3 = sbp.limit - sbp.cursor; + r_consonant_pair(); + sbp.cursor = sbp.limit - v_3; + break; + case 2: + sbp.slice_from("l\u00F8s"); + break; + } + } + } + } + + function r_undouble() { + var v_1; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + if (sbp.out_grouping_b(g_v, 97, 248)) { + sbp.bra = sbp.cursor; + S_ch = sbp.slice_to(S_ch); + sbp.limit_backward = v_1; + if (sbp.eq_v_b(S_ch)) + sbp.slice_del(); + } else + sbp.limit_backward = v_1; + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_main_suffix(); + sbp.cursor = sbp.limit; + r_consonant_pair(); + sbp.cursor = sbp.limit; + r_other_suffix(); + sbp.cursor = sbp.limit; + r_undouble(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.da.stemmer, 'stemmer-da'); + + /* stop word filter function */ + lunr.da.stopWordFilter = function(token) { + if (lunr.da.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.da.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.da.stopWordFilter.stopWords.length = 95; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.da.stopWordFilter.stopWords.elements = ' ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været'.split(' '); + + lunr.Pipeline.registerFunction(lunr.da.stopWordFilter, 'stopWordFilter-da'); + }; +})) diff --git a/js/lunr/lunr.da.min.js b/js/lunr/lunr.da.min.js new file mode 100644 index 0000000..eb41d29 --- /dev/null +++ b/js/lunr/lunr.da.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,t,i;r.da=function(){this.pipeline.reset(),this.pipeline.add(r.da.trimmer,r.da.stopWordFilter,r.da.stemmer)},r.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.da.trimmer=r.trimmerSupport.generateTrimmer(r.da.wordCharacters),r.Pipeline.registerFunction(r.da.trimmer,"trimmer-da"),r.da.stemmer=(e=r.stemmerSupport.Among,t=r.stemmerSupport.SnowballProgram,i=new function(){var n,s,o,d=[new e("hed",-1,1),new e("ethed",0,1),new e("ered",-1,1),new e("e",-1,1),new e("erede",3,1),new e("ende",3,1),new e("erende",5,1),new e("ene",3,1),new e("erne",3,1),new e("ere",3,1),new e("en",-1,1),new e("heden",10,1),new e("eren",10,1),new e("er",-1,1),new e("heder",13,1),new e("erer",13,1),new e("s",-1,2),new e("heds",16,1),new e("es",16,1),new e("endes",18,1),new e("erendes",19,1),new e("enes",18,1),new e("ernes",18,1),new e("eres",18,1),new e("ens",16,1),new e("hedens",24,1),new e("erens",24,1),new e("ers",16,1),new e("ets",16,1),new e("erets",28,1),new e("et",-1,1),new e("eret",30,1)],i=[new e("gd",-1,-1),new e("dt",-1,-1),new e("gt",-1,-1),new e("kt",-1,-1)],a=[new e("ig",-1,1),new e("lig",0,1),new e("elig",1,1),new e("els",-1,1),new e("løst",-1,2)],u=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],l=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new t;function m(){var e,r=c.limit-c.cursor;c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(i,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;if(function(){var e,r=c.cursor+3;if(s=c.limit,0<=r&&r<=c.limit){for(n=r;;){if(e=c.cursor,c.in_grouping(u,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(d,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(l,97,229)&&c.slice_del()}c.cursor=c.limit,m(),c.cursor=c.limit;var i,t,r=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig"))&&c.slice_del(),c.cursor=c.limit-r,c.cursor>=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,i=c.find_among_b(a,5),c.limit_backward=r,i))switch(c.bra=c.cursor,i){case 1:c.slice_del(),t=c.limit-c.cursor,m(),c.cursor=c.limit-t;break;case 2:c.slice_from("løs")}return c.cursor=c.limit,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.out_grouping_b(u,97,248)?(c.bra=c.cursor,o=c.slice_to(o),c.limit_backward=e,c.eq_v_b(o)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}),r.Pipeline.registerFunction(r.da.stemmer,"stemmer-da"),r.da.stopWordFilter=function(e){if(-1===r.da.stopWordFilter.stopWords.indexOf(e))return e},r.da.stopWordFilter.stopWords=new r.SortedSet,r.da.stopWordFilter.stopWords.length=95,r.da.stopWordFilter.stopWords.elements=" ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" "),r.Pipeline.registerFunction(r.da.stopWordFilter,"stopWordFilter-da")}}); diff --git a/js/lunr/lunr.de.js b/js/lunr/lunr.de.js new file mode 100644 index 0000000..5cd9243 --- /dev/null +++ b/js/lunr/lunr.de.js @@ -0,0 +1,380 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.de = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.de.trimmer, + lunr.de.stopWordFilter, + lunr.de.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.de.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.de.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.de.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.de.trimmer, 'trimmer-de'); + + /* lunr stemmer function */ + lunr.de.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function GermanStemmer() { + var a_0 = [new Among("", -1, 6), new Among("U", 0, 2), + new Among("Y", 0, 1), new Among("\u00E4", 0, 3), + new Among("\u00F6", 0, 4), new Among("\u00FC", 0, 5) + ], + a_1 = [ + new Among("e", -1, 2), new Among("em", -1, 1), + new Among("en", -1, 2), new Among("ern", -1, 1), + new Among("er", -1, 1), new Among("s", -1, 3), + new Among("es", 5, 2) + ], + a_2 = [new Among("en", -1, 1), + new Among("er", -1, 1), new Among("st", -1, 2), + new Among("est", 2, 1) + ], + a_3 = [new Among("ig", -1, 1), + new Among("lich", -1, 1) + ], + a_4 = [new Among("end", -1, 1), + new Among("ig", -1, 2), new Among("ung", -1, 1), + new Among("lich", -1, 3), new Among("isch", -1, 2), + new Among("ik", -1, 2), new Among("heit", -1, 3), + new Among("keit", -1, 4) + ], + g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 + ], + g_s_ending = [117, 30, 5], + g_st_ending = [ + 117, 30, 4 + ], + I_x, I_p2, I_p1, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(c1, c2, v_1) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 252)) { + sbp.slice_from(c2); + sbp.cursor = v_1; + return true; + } + } + return false; + } + + function r_prelude() { + var v_1 = sbp.cursor, + v_2, v_3, v_4, v_5; + while (true) { + v_2 = sbp.cursor; + sbp.bra = v_2; + if (sbp.eq_s(1, "\u00DF")) { + sbp.ket = sbp.cursor; + sbp.slice_from("ss"); + } else { + if (v_2 >= sbp.limit) + break; + sbp.cursor = v_2 + 1; + } + } + sbp.cursor = v_1; + while (true) { + v_3 = sbp.cursor; + while (true) { + v_4 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 252)) { + v_5 = sbp.cursor; + sbp.bra = v_5; + if (habr1("u", "U", v_4)) + break; + sbp.cursor = v_5; + if (habr1("y", "Y", v_4)) + break; + } + if (v_4 >= sbp.limit) { + sbp.cursor = v_3; + return; + } + sbp.cursor = v_4 + 1; + } + } + } + + function habr2() { + while (!sbp.in_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + + function r_mark_regions() { + I_p1 = sbp.limit; + I_p2 = I_p1; + var c = sbp.cursor + 3; + if (0 <= c && c <= sbp.limit) { + I_x = c; + if (!habr2()) { + I_p1 = sbp.cursor; + if (I_p1 < I_x) + I_p1 = I_x; + if (!habr2()) + I_p2 = sbp.cursor; + } + } + } + + function r_postlude() { + var among_var, v_1; + while (true) { + v_1 = sbp.cursor; + sbp.bra = v_1; + among_var = sbp.find_among(a_0, 6); + if (!among_var) + return; + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("y"); + break; + case 2: + case 5: + sbp.slice_from("u"); + break; + case 3: + sbp.slice_from("a"); + break; + case 4: + sbp.slice_from("o"); + break; + case 6: + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + break; + } + } + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_standard_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor, + v_2, v_3, v_4; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_1, 7); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "s")) { + sbp.bra = sbp.cursor; + if (sbp.eq_s_b(3, "nis")) + sbp.slice_del(); + } + break; + case 3: + if (sbp.in_grouping_b(g_s_ending, 98, 116)) + sbp.slice_del(); + break; + } + } + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 4); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + if (sbp.in_grouping_b(g_st_ending, 98, 116)) { + var c = sbp.cursor - 3; + if (sbp.limit_backward <= c && c <= sbp.limit) { + sbp.cursor = c; + sbp.slice_del(); + } + } + break; + } + } + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 8); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + switch (among_var) { + case 1: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ig")) { + sbp.bra = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_2; + if (r_R2()) + sbp.slice_del(); + } + } + break; + case 2: + v_3 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_3; + sbp.slice_del(); + } + break; + case 3: + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_4 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(2, "er")) { + sbp.cursor = sbp.limit - v_4; + if (!sbp.eq_s_b(2, "en")) + break; + } + sbp.bra = sbp.cursor; + if (r_R1()) + sbp.slice_del(); + break; + case 4: + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2() && among_var == 1) + sbp.slice_del(); + } + break; + } + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_standard_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.de.stemmer, 'stemmer-de'); + + /* stop word filter function */ + lunr.de.stopWordFilter = function(token) { + if (lunr.de.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.de.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.de.stopWordFilter.stopWords.length = 232; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.de.stopWordFilter.stopWords.elements = ' aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über'.split(' '); + + lunr.Pipeline.registerFunction(lunr.de.stopWordFilter, 'stopWordFilter-de'); + }; +})) diff --git a/js/lunr/lunr.de.min.js b/js/lunr/lunr.de.min.js new file mode 100644 index 0000000..7d099c6 --- /dev/null +++ b/js/lunr/lunr.de.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,n,i;r.de=function(){this.pipeline.reset(),this.pipeline.add(r.de.trimmer,r.de.stopWordFilter,r.de.stemmer)},r.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.de.trimmer=r.trimmerSupport.generateTrimmer(r.de.wordCharacters),r.Pipeline.registerFunction(r.de.trimmer,"trimmer-de"),r.de.stemmer=(e=r.stemmerSupport.Among,n=r.stemmerSupport.SnowballProgram,i=new function(){var t,o,c,u=[new e("",-1,6),new e("U",0,2),new e("Y",0,1),new e("ä",0,3),new e("ö",0,4),new e("ü",0,5)],d=[new e("e",-1,2),new e("em",-1,1),new e("en",-1,2),new e("ern",-1,1),new e("er",-1,1),new e("s",-1,3),new e("es",5,2)],l=[new e("en",-1,1),new e("er",-1,1),new e("st",-1,2),new e("est",2,1)],a=[new e("ig",-1,1),new e("lich",-1,1)],m=[new e("end",-1,1),new e("ig",-1,2),new e("ung",-1,1),new e("lich",-1,3),new e("isch",-1,2),new e("ik",-1,2),new e("heit",-1,3),new e("keit",-1,4)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],h=[117,30,5],b=[117,30,4],f=new n;function _(e,r,n){return f.eq_s(1,e)&&(f.ket=f.cursor,f.in_grouping(w,97,252))&&(f.slice_from(r),f.cursor=n,1)}function p(){for(;!f.in_grouping(w,97,252);){if(f.cursor>=f.limit)return 1;f.cursor++}for(;!f.out_grouping(w,97,252);){if(f.cursor>=f.limit)return 1;f.cursor++}}function g(){return c<=f.cursor}function k(){return o<=f.cursor}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;!function(){for(var e,r,n,i,s=f.cursor;;)if(e=f.cursor,f.bra=e,f.eq_s(1,"ß"))f.ket=f.cursor,f.slice_from("ss");else{if(e>=f.limit)break;f.cursor=e+1}for(f.cursor=s;;)for(r=f.cursor;;){if(n=f.cursor,f.in_grouping(w,97,252)){if(i=f.cursor,f.bra=i,_("u","U",n))break;if(f.cursor=i,_("y","Y",n))break}if(n>=f.limit)return f.cursor=r;f.cursor=n+1}}(),f.cursor=e,c=f.limit,o=c,0<=(s=f.cursor+3)&&s<=f.limit&&(t=s,p()||((c=f.cursor)=f.limit)return;f.cursor++}}}(),!0}},function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}),r.Pipeline.registerFunction(r.de.stemmer,"stemmer-de"),r.de.stopWordFilter=function(e){if(-1===r.de.stopWordFilter.stopWords.indexOf(e))return e},r.de.stopWordFilter.stopWords=new r.SortedSet,r.de.stopWordFilter.stopWords.length=232,r.de.stopWordFilter.stopWords.elements=" aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" "),r.Pipeline.registerFunction(r.de.stopWordFilter,"stopWordFilter-de")}}); diff --git a/js/lunr/lunr.du.js b/js/lunr/lunr.du.js new file mode 100644 index 0000000..cf4eda5 --- /dev/null +++ b/js/lunr/lunr.du.js @@ -0,0 +1,444 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.du = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.du.trimmer, + lunr.du.stopWordFilter, + lunr.du.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.du.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.du.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.du.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.du.trimmer, 'trimmer-du'); + + /* lunr stemmer function */ + lunr.du.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function DutchStemmer() { + var a_0 = [new Among("", -1, 6), new Among("\u00E1", 0, 1), + new Among("\u00E4", 0, 1), new Among("\u00E9", 0, 2), + new Among("\u00EB", 0, 2), new Among("\u00ED", 0, 3), + new Among("\u00EF", 0, 3), new Among("\u00F3", 0, 4), + new Among("\u00F6", 0, 4), new Among("\u00FA", 0, 5), + new Among("\u00FC", 0, 5) + ], + a_1 = [new Among("", -1, 3), + new Among("I", 0, 2), new Among("Y", 0, 1) + ], + a_2 = [ + new Among("dd", -1, -1), new Among("kk", -1, -1), + new Among("tt", -1, -1) + ], + a_3 = [new Among("ene", -1, 2), + new Among("se", -1, 3), new Among("en", -1, 2), + new Among("heden", 2, 1), new Among("s", -1, 3) + ], + a_4 = [ + new Among("end", -1, 1), new Among("ig", -1, 2), + new Among("ing", -1, 1), new Among("lijk", -1, 3), + new Among("baar", -1, 4), new Among("bar", -1, 5) + ], + a_5 = [ + new Among("aa", -1, -1), new Among("ee", -1, -1), + new Among("oo", -1, -1), new Among("uu", -1, -1) + ], + g_v = [17, 65, + 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 + ], + g_v_I = [1, 0, 0, + 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 + ], + g_v_j = [ + 17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 + ], + I_p2, I_p1, B_e_found, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_prelude() { + var among_var, v_1 = sbp.cursor, + v_2, v_3; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_0, 11); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("a"); + continue; + case 2: + sbp.slice_from("e"); + continue; + case 3: + sbp.slice_from("i"); + continue; + case 4: + sbp.slice_from("o"); + continue; + case 5: + sbp.slice_from("u"); + continue; + case 6: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + sbp.cursor = v_1; + sbp.bra = v_1; + if (sbp.eq_s(1, "y")) { + sbp.ket = sbp.cursor; + sbp.slice_from("Y"); + } else + sbp.cursor = v_1; + while (true) { + v_2 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 232)) { + v_3 = sbp.cursor; + sbp.bra = v_3; + if (sbp.eq_s(1, "i")) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 232)) { + sbp.slice_from("I"); + sbp.cursor = v_2; + } + } else { + sbp.cursor = v_3; + if (sbp.eq_s(1, "y")) { + sbp.ket = sbp.cursor; + sbp.slice_from("Y"); + sbp.cursor = v_2; + } else if (habr1(v_2)) + break; + } + } else if (habr1(v_2)) + break; + } + } + + function habr1(v_1) { + sbp.cursor = v_1; + if (v_1 >= sbp.limit) + return true; + sbp.cursor++; + return false; + } + + function r_mark_regions() { + I_p1 = sbp.limit; + I_p2 = I_p1; + if (!habr2()) { + I_p1 = sbp.cursor; + if (I_p1 < 3) + I_p1 = 3; + if (!habr2()) + I_p2 = sbp.cursor; + } + } + + function habr2() { + while (!sbp.in_grouping(g_v, 97, 232)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 232)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + + function r_postlude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_1, 3); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("y"); + break; + case 2: + sbp.slice_from("i"); + break; + case 3: + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + break; + } + } + } + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_undouble() { + var v_1 = sbp.limit - sbp.cursor; + if (sbp.find_among_b(a_2, 3)) { + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } + } + + function r_e_ending() { + var v_1; + B_e_found = false; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "e")) { + sbp.bra = sbp.cursor; + if (r_R1()) { + v_1 = sbp.limit - sbp.cursor; + if (sbp.out_grouping_b(g_v, 97, 232)) { + sbp.cursor = sbp.limit - v_1; + sbp.slice_del(); + B_e_found = true; + r_undouble(); + } + } + } + } + + function r_en_ending() { + var v_1; + if (r_R1()) { + v_1 = sbp.limit - sbp.cursor; + if (sbp.out_grouping_b(g_v, 97, 232)) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(3, "gem")) { + sbp.cursor = sbp.limit - v_1; + sbp.slice_del(); + r_undouble(); + } + } + } + } + + function r_standard_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor, + v_2, v_3, v_4, v_5, v_6; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 5); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_R1()) + sbp.slice_from("heid"); + break; + case 2: + r_en_ending(); + break; + case 3: + if (r_R1() && sbp.out_grouping_b(g_v_j, 97, 232)) + sbp.slice_del(); + break; + } + } + sbp.cursor = sbp.limit - v_1; + r_e_ending(); + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(4, "heid")) { + sbp.bra = sbp.cursor; + if (r_R2()) { + v_2 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "c")) { + sbp.cursor = sbp.limit - v_2; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "en")) { + sbp.bra = sbp.cursor; + r_en_ending(); + } + } + } + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 6); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_R2()) { + sbp.slice_del(); + v_3 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ig")) { + sbp.bra = sbp.cursor; + if (r_R2()) { + v_4 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_4; + sbp.slice_del(); + break; + } + } + } + sbp.cursor = sbp.limit - v_3; + r_undouble(); + } + break; + case 2: + if (r_R2()) { + v_5 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "e")) { + sbp.cursor = sbp.limit - v_5; + sbp.slice_del(); + } + } + break; + case 3: + if (r_R2()) { + sbp.slice_del(); + r_e_ending(); + } + break; + case 4: + if (r_R2()) + sbp.slice_del(); + break; + case 5: + if (r_R2() && B_e_found) + sbp.slice_del(); + break; + } + } + sbp.cursor = sbp.limit - v_1; + if (sbp.out_grouping_b(g_v_I, 73, 232)) { + v_6 = sbp.limit - sbp.cursor; + if (sbp.find_among_b(a_5, 4) && sbp.out_grouping_b(g_v, 97, 232)) { + sbp.cursor = sbp.limit - v_6; + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_standard_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.du.stemmer, 'stemmer-du'); + + /* stop word filter function */ + lunr.du.stopWordFilter = function(token) { + if (lunr.du.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.du.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.du.stopWordFilter.stopWords.length = 103; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.du.stopWordFilter.stopWords.elements = ' aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou'.split(' '); + + lunr.Pipeline.registerFunction(lunr.du.stopWordFilter, 'stopWordFilter-du'); + }; +})) diff --git a/js/lunr/lunr.du.min.js b/js/lunr/lunr.du.min.js new file mode 100644 index 0000000..8ac0d07 --- /dev/null +++ b/js/lunr/lunr.du.min.js @@ -0,0 +1 @@ +!function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,i,o;e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer)},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=(r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,o=new function(){var c,a,l,m=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],d=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],e=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],f=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],w=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],b=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],p=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],g=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],k=new i;function h(r){if((k.cursor=r)>=k.limit)return 1;k.cursor++}function v(){for(;!k.in_grouping(b,97,232);){if(k.cursor>=k.limit)return 1;k.cursor++}for(;!k.out_grouping(b,97,232);){if(k.cursor>=k.limit)return 1;k.cursor++}}function q(){return a<=k.cursor}function z(){return c<=k.cursor}function W(){var r=k.limit-k.cursor;k.find_among_b(e,3)&&(k.cursor=k.limit-r,k.ket=k.cursor,k.cursor>k.limit_backward)&&(k.cursor--,k.bra=k.cursor,k.slice_del())}function j(){var r;l=!1,k.ket=k.cursor,k.eq_s_b(1,"e")&&(k.bra=k.cursor,q())&&(r=k.limit-k.cursor,k.out_grouping_b(b,97,232))&&(k.cursor=k.limit-r,k.slice_del(),l=!0,W())}function F(){var r;q()&&(r=k.limit-k.cursor,k.out_grouping_b(b,97,232))&&(k.cursor=k.limit-r,k.eq_s_b(3,"gem")||(k.cursor=k.limit-r,k.slice_del(),W()))}this.setCurrent=function(r){k.setCurrent(r)},this.getCurrent=function(){return k.getCurrent()},this.stem=function(){for(var r,e,i,o=k.cursor,t=k.cursor;;){if(k.bra=k.cursor,r=k.find_among(m,11))switch(k.ket=k.cursor,r){case 1:k.slice_from("a");continue;case 2:k.slice_from("e");continue;case 3:k.slice_from("i");continue;case 4:k.slice_from("o");continue;case 5:k.slice_from("u");continue;case 6:if(!(k.cursor>=k.limit)){k.cursor++;continue}}break}for(k.cursor=t,k.bra=t,k.eq_s(1,"y")?(k.ket=k.cursor,k.slice_from("Y")):k.cursor=t;;)if(e=k.cursor,k.in_grouping(b,97,232)){if(i=k.cursor,k.bra=i,k.eq_s(1,"i"))k.ket=k.cursor,k.in_grouping(b,97,232)&&(k.slice_from("I"),k.cursor=e);else if(k.cursor=i,k.eq_s(1,"y"))k.ket=k.cursor,k.slice_from("Y"),k.cursor=e;else if(h(e))break}else if(h(e))break;k.cursor=o,a=k.limit,c=a,v()||((a=k.cursor)<3&&(a=3),v())||(c=k.cursor),k.limit_backward=o,k.cursor=k.limit;var s,n,u,t=k.limit-k.cursor;if(k.ket=k.cursor,o=k.find_among_b(f,5))switch(k.bra=k.cursor,o){case 1:q()&&k.slice_from("heid");break;case 2:F();break;case 3:q()&&k.out_grouping_b(g,97,232)&&k.slice_del()}if(k.cursor=k.limit-t,j(),k.cursor=k.limit-t,k.ket=k.cursor,k.eq_s_b(4,"heid")&&(k.bra=k.cursor,z())&&(u=k.limit-k.cursor,k.eq_s_b(1,"c")||(k.cursor=k.limit-u,k.slice_del(),k.ket=k.cursor,k.eq_s_b(2,"en")&&(k.bra=k.cursor,F()))),k.cursor=k.limit-t,k.ket=k.cursor,o=k.find_among_b(_,6))switch(k.bra=k.cursor,o){case 1:if(z()){if(k.slice_del(),s=k.limit-k.cursor,k.ket=k.cursor,k.eq_s_b(2,"ig")&&(k.bra=k.cursor,z())&&(n=k.limit-k.cursor,!k.eq_s_b(1,"e"))){k.cursor=k.limit-n,k.slice_del();break}k.cursor=k.limit-s,W()}break;case 2:z()&&(n=k.limit-k.cursor,k.eq_s_b(1,"e")||(k.cursor=k.limit-n,k.slice_del()));break;case 3:z()&&(k.slice_del(),j());break;case 4:z()&&k.slice_del();break;case 5:z()&&l&&k.slice_del()}return k.cursor=k.limit-t,k.out_grouping_b(p,73,232)&&(u=k.limit-k.cursor,k.find_among_b(w,4))&&k.out_grouping_b(b,97,232)&&(k.cursor=k.limit-u,k.ket=k.cursor,k.cursor>k.limit_backward)&&(k.cursor--,k.bra=k.cursor,k.slice_del()),k.cursor=k.limit_backward,function(){for(var r;;)if(k.bra=k.cursor,r=k.find_among(d,3))switch(k.ket=k.cursor,r){case 1:k.slice_from("y");break;case 2:k.slice_from("i");break;case 3:if(k.cursor>=k.limit)return;k.cursor++}}(),!0}},function(r){return o.setCurrent(r),o.stem(),o.getCurrent()}),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=function(r){if(-1===e.du.stopWordFilter.stopWords.indexOf(r))return r},e.du.stopWordFilter.stopWords=new e.SortedSet,e.du.stopWordFilter.stopWords.length=103,e.du.stopWordFilter.stopWords.elements=" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" "),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); diff --git a/js/lunr/lunr.es.js b/js/lunr/lunr.es.js new file mode 100644 index 0000000..aa43b27 --- /dev/null +++ b/js/lunr/lunr.es.js @@ -0,0 +1,595 @@ +/*! + * Lunr languages, `Spanish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.es = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.es.trimmer, + lunr.es.stopWordFilter, + lunr.es.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.es.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.es.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.es.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.es.trimmer, 'trimmer-es'); + + /* lunr stemmer function */ + lunr.es.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function SpanishStemmer() { + var a_0 = [new Among("", -1, 6), new Among("\u00E1", 0, 1), + new Among("\u00E9", 0, 2), new Among("\u00ED", 0, 3), + new Among("\u00F3", 0, 4), new Among("\u00FA", 0, 5) + ], + a_1 = [ + new Among("la", -1, -1), new Among("sela", 0, -1), + new Among("le", -1, -1), new Among("me", -1, -1), + new Among("se", -1, -1), new Among("lo", -1, -1), + new Among("selo", 5, -1), new Among("las", -1, -1), + new Among("selas", 7, -1), new Among("les", -1, -1), + new Among("los", -1, -1), new Among("selos", 10, -1), + new Among("nos", -1, -1) + ], + a_2 = [new Among("ando", -1, 6), + new Among("iendo", -1, 6), new Among("yendo", -1, 7), + new Among("\u00E1ndo", -1, 2), new Among("i\u00E9ndo", -1, 1), + new Among("ar", -1, 6), new Among("er", -1, 6), + new Among("ir", -1, 6), new Among("\u00E1r", -1, 3), + new Among("\u00E9r", -1, 4), new Among("\u00EDr", -1, 5) + ], + a_3 = [ + new Among("ic", -1, -1), new Among("ad", -1, -1), + new Among("os", -1, -1), new Among("iv", -1, 1) + ], + a_4 = [ + new Among("able", -1, 1), new Among("ible", -1, 1), + new Among("ante", -1, 1) + ], + a_5 = [new Among("ic", -1, 1), + new Among("abil", -1, 1), new Among("iv", -1, 1) + ], + a_6 = [ + new Among("ica", -1, 1), new Among("ancia", -1, 2), + new Among("encia", -1, 5), new Among("adora", -1, 2), + new Among("osa", -1, 1), new Among("ista", -1, 1), + new Among("iva", -1, 9), new Among("anza", -1, 1), + new Among("log\u00EDa", -1, 3), new Among("idad", -1, 8), + new Among("able", -1, 1), new Among("ible", -1, 1), + new Among("ante", -1, 2), new Among("mente", -1, 7), + new Among("amente", 13, 6), new Among("aci\u00F3n", -1, 2), + new Among("uci\u00F3n", -1, 4), new Among("ico", -1, 1), + new Among("ismo", -1, 1), new Among("oso", -1, 1), + new Among("amiento", -1, 1), new Among("imiento", -1, 1), + new Among("ivo", -1, 9), new Among("ador", -1, 2), + new Among("icas", -1, 1), new Among("ancias", -1, 2), + new Among("encias", -1, 5), new Among("adoras", -1, 2), + new Among("osas", -1, 1), new Among("istas", -1, 1), + new Among("ivas", -1, 9), new Among("anzas", -1, 1), + new Among("log\u00EDas", -1, 3), new Among("idades", -1, 8), + new Among("ables", -1, 1), new Among("ibles", -1, 1), + new Among("aciones", -1, 2), new Among("uciones", -1, 4), + new Among("adores", -1, 2), new Among("antes", -1, 2), + new Among("icos", -1, 1), new Among("ismos", -1, 1), + new Among("osos", -1, 1), new Among("amientos", -1, 1), + new Among("imientos", -1, 1), new Among("ivos", -1, 9) + ], + a_7 = [ + new Among("ya", -1, 1), new Among("ye", -1, 1), + new Among("yan", -1, 1), new Among("yen", -1, 1), + new Among("yeron", -1, 1), new Among("yendo", -1, 1), + new Among("yo", -1, 1), new Among("yas", -1, 1), + new Among("yes", -1, 1), new Among("yais", -1, 1), + new Among("yamos", -1, 1), new Among("y\u00F3", -1, 1) + ], + a_8 = [ + new Among("aba", -1, 2), new Among("ada", -1, 2), + new Among("ida", -1, 2), new Among("ara", -1, 2), + new Among("iera", -1, 2), new Among("\u00EDa", -1, 2), + new Among("ar\u00EDa", 5, 2), new Among("er\u00EDa", 5, 2), + new Among("ir\u00EDa", 5, 2), new Among("ad", -1, 2), + new Among("ed", -1, 2), new Among("id", -1, 2), + new Among("ase", -1, 2), new Among("iese", -1, 2), + new Among("aste", -1, 2), new Among("iste", -1, 2), + new Among("an", -1, 2), new Among("aban", 16, 2), + new Among("aran", 16, 2), new Among("ieran", 16, 2), + new Among("\u00EDan", 16, 2), new Among("ar\u00EDan", 20, 2), + new Among("er\u00EDan", 20, 2), new Among("ir\u00EDan", 20, 2), + new Among("en", -1, 1), new Among("asen", 24, 2), + new Among("iesen", 24, 2), new Among("aron", -1, 2), + new Among("ieron", -1, 2), new Among("ar\u00E1n", -1, 2), + new Among("er\u00E1n", -1, 2), new Among("ir\u00E1n", -1, 2), + new Among("ado", -1, 2), new Among("ido", -1, 2), + new Among("ando", -1, 2), new Among("iendo", -1, 2), + new Among("ar", -1, 2), new Among("er", -1, 2), + new Among("ir", -1, 2), new Among("as", -1, 2), + new Among("abas", 39, 2), new Among("adas", 39, 2), + new Among("idas", 39, 2), new Among("aras", 39, 2), + new Among("ieras", 39, 2), new Among("\u00EDas", 39, 2), + new Among("ar\u00EDas", 45, 2), new Among("er\u00EDas", 45, 2), + new Among("ir\u00EDas", 45, 2), new Among("es", -1, 1), + new Among("ases", 49, 2), new Among("ieses", 49, 2), + new Among("abais", -1, 2), new Among("arais", -1, 2), + new Among("ierais", -1, 2), new Among("\u00EDais", -1, 2), + new Among("ar\u00EDais", 55, 2), new Among("er\u00EDais", 55, 2), + new Among("ir\u00EDais", 55, 2), new Among("aseis", -1, 2), + new Among("ieseis", -1, 2), new Among("asteis", -1, 2), + new Among("isteis", -1, 2), new Among("\u00E1is", -1, 2), + new Among("\u00E9is", -1, 1), new Among("ar\u00E9is", 64, 2), + new Among("er\u00E9is", 64, 2), new Among("ir\u00E9is", 64, 2), + new Among("ados", -1, 2), new Among("idos", -1, 2), + new Among("amos", -1, 2), new Among("\u00E1bamos", 70, 2), + new Among("\u00E1ramos", 70, 2), new Among("i\u00E9ramos", 70, 2), + new Among("\u00EDamos", 70, 2), new Among("ar\u00EDamos", 74, 2), + new Among("er\u00EDamos", 74, 2), new Among("ir\u00EDamos", 74, 2), + new Among("emos", -1, 1), new Among("aremos", 78, 2), + new Among("eremos", 78, 2), new Among("iremos", 78, 2), + new Among("\u00E1semos", 78, 2), new Among("i\u00E9semos", 78, 2), + new Among("imos", -1, 2), new Among("ar\u00E1s", -1, 2), + new Among("er\u00E1s", -1, 2), new Among("ir\u00E1s", -1, 2), + new Among("\u00EDs", -1, 2), new Among("ar\u00E1", -1, 2), + new Among("er\u00E1", -1, 2), new Among("ir\u00E1", -1, 2), + new Among("ar\u00E9", -1, 2), new Among("er\u00E9", -1, 2), + new Among("ir\u00E9", -1, 2), new Among("i\u00F3", -1, 2) + ], + a_9 = [ + new Among("a", -1, 1), new Among("e", -1, 2), + new Among("o", -1, 1), new Among("os", -1, 1), + new Among("\u00E1", -1, 1), new Among("\u00E9", -1, 2), + new Among("\u00ED", -1, 1), new Among("\u00F3", -1, 1) + ], + g_v = [17, + 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10 + ], + I_p2, I_p1, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1() { + if (sbp.out_grouping(g_v, 97, 252)) { + while (!sbp.in_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + return true; + } + + function habr2() { + if (sbp.in_grouping(g_v, 97, 252)) { + var v_1 = sbp.cursor; + if (habr1()) { + sbp.cursor = v_1; + if (!sbp.in_grouping(g_v, 97, 252)) + return true; + while (!sbp.out_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + } + return false; + } + return true; + } + + function habr3() { + var v_1 = sbp.cursor, + v_2; + if (habr2()) { + sbp.cursor = v_1; + if (!sbp.out_grouping(g_v, 97, 252)) + return; + v_2 = sbp.cursor; + if (habr1()) { + sbp.cursor = v_2; + if (!sbp.in_grouping(g_v, 97, 252) || sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + } + I_pV = sbp.cursor; + } + + function habr4() { + while (!sbp.in_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + var v_1 = sbp.cursor; + I_pV = sbp.limit; + I_p1 = I_pV; + I_p2 = I_pV; + habr3(); + sbp.cursor = v_1; + if (habr4()) { + I_p1 = sbp.cursor; + if (habr4()) + I_p2 = sbp.cursor; + } + } + + function r_postlude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_0, 6); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("a"); + continue; + case 2: + sbp.slice_from("e"); + continue; + case 3: + sbp.slice_from("i"); + continue; + case 4: + sbp.slice_from("o"); + continue; + case 5: + sbp.slice_from("u"); + continue; + case 6: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + } + + function r_RV() { + return I_pV <= sbp.cursor; + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_attached_pronoun() { + var among_var; + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_1, 13)) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among_b(a_2, 11); + if (among_var && r_RV()) + switch (among_var) { + case 1: + sbp.bra = sbp.cursor; + sbp.slice_from("iendo"); + break; + case 2: + sbp.bra = sbp.cursor; + sbp.slice_from("ando"); + break; + case 3: + sbp.bra = sbp.cursor; + sbp.slice_from("ar"); + break; + case 4: + sbp.bra = sbp.cursor; + sbp.slice_from("er"); + break; + case 5: + sbp.bra = sbp.cursor; + sbp.slice_from("ir"); + break; + case 6: + sbp.slice_del(); + break; + case 7: + if (sbp.eq_s_b(1, "u")) + sbp.slice_del(); + break; + } + } + } + + function habr5(a, n) { + if (!r_R2()) + return true; + sbp.slice_del(); + sbp.ket = sbp.cursor; + var among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1 && r_R2()) + sbp.slice_del(); + } + return false; + } + + function habr6(c1) { + if (!r_R2()) + return true; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, c1)) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + return false; + } + + function r_standard_suffix() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 46); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + return false; + sbp.slice_del(); + break; + case 2: + if (habr6("ic")) + return false; + break; + case 3: + if (!r_R2()) + return false; + sbp.slice_from("log"); + break; + case 4: + if (!r_R2()) + return false; + sbp.slice_from("u"); + break; + case 5: + if (!r_R2()) + return false; + sbp.slice_from("ente"); + break; + case 6: + if (!r_R1()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 4); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + sbp.slice_del(); + if (among_var == 1) { + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + } + } + } + break; + case 7: + if (habr5(a_4, 3)) + return false; + break; + case 8: + if (habr5(a_5, 3)) + return false; + break; + case 9: + if (habr6("at")) + return false; + break; + } + return true; + } + return false; + } + + function r_y_verb_suffix() { + var among_var, v_1; + if (sbp.cursor >= I_pV) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 12); + sbp.limit_backward = v_1; + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) { + if (!sbp.eq_s_b(1, "u")) + return false; + sbp.slice_del(); + } + return true; + } + } + return false; + } + + function r_verb_suffix() { + var among_var, v_1, v_2, v_3; + if (sbp.cursor >= I_pV) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_8, 96); + sbp.limit_backward = v_1; + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + v_2 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(1, "u")) { + v_3 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(1, "g")) + sbp.cursor = sbp.limit - v_3; + else + sbp.cursor = sbp.limit - v_2; + } else + sbp.cursor = sbp.limit - v_2; + sbp.bra = sbp.cursor; + case 2: + sbp.slice_del(); + break; + } + } + } + } + + function r_residual_suffix() { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_9, 8); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_RV()) + sbp.slice_del(); + break; + case 2: + if (r_RV()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "u")) { + sbp.bra = sbp.cursor; + v_1 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(1, "g")) { + sbp.cursor = sbp.limit - v_1; + if (r_RV()) + sbp.slice_del(); + } + } + } + break; + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_attached_pronoun(); + sbp.cursor = sbp.limit; + if (!r_standard_suffix()) { + sbp.cursor = sbp.limit; + if (!r_y_verb_suffix()) { + sbp.cursor = sbp.limit; + r_verb_suffix(); + } + } + sbp.cursor = sbp.limit; + r_residual_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.es.stemmer, 'stemmer-es'); + + /* stop word filter function */ + lunr.es.stopWordFilter = function(token) { + if (lunr.es.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.es.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.es.stopWordFilter.stopWords.length = 309; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.es.stopWordFilter.stopWords.elements = ' a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos'.split(' '); + + lunr.Pipeline.registerFunction(lunr.es.stopWordFilter, 'stopWordFilter-es'); + }; +})) diff --git a/js/lunr/lunr.es.min.js b/js/lunr/lunr.es.min.js new file mode 100644 index 0000000..dc48558 --- /dev/null +++ b/js/lunr/lunr.es.min.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(s){if(void 0===s)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===s.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,r,n;s.es=function(){this.pipeline.reset(),this.pipeline.add(s.es.trimmer,s.es.stopWordFilter,s.es.stemmer)},s.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",s.es.trimmer=s.trimmerSupport.generateTrimmer(s.es.wordCharacters),s.Pipeline.registerFunction(s.es.trimmer,"trimmer-es"),s.es.stemmer=(e=s.stemmerSupport.Among,r=s.stemmerSupport.SnowballProgram,n=new function(){var u,w,c,m=[new e("",-1,6),new e("á",0,1),new e("é",0,2),new e("í",0,3),new e("ó",0,4),new e("ú",0,5)],l=[new e("la",-1,-1),new e("sela",0,-1),new e("le",-1,-1),new e("me",-1,-1),new e("se",-1,-1),new e("lo",-1,-1),new e("selo",5,-1),new e("las",-1,-1),new e("selas",7,-1),new e("les",-1,-1),new e("los",-1,-1),new e("selos",10,-1),new e("nos",-1,-1)],d=[new e("ando",-1,6),new e("iendo",-1,6),new e("yendo",-1,7),new e("ándo",-1,2),new e("iéndo",-1,1),new e("ar",-1,6),new e("er",-1,6),new e("ir",-1,6),new e("ár",-1,3),new e("ér",-1,4),new e("ír",-1,5)],b=[new e("ic",-1,-1),new e("ad",-1,-1),new e("os",-1,-1),new e("iv",-1,1)],f=[new e("able",-1,1),new e("ible",-1,1),new e("ante",-1,1)],_=[new e("ic",-1,1),new e("abil",-1,1),new e("iv",-1,1)],h=[new e("ica",-1,1),new e("ancia",-1,2),new e("encia",-1,5),new e("adora",-1,2),new e("osa",-1,1),new e("ista",-1,1),new e("iva",-1,9),new e("anza",-1,1),new e("logía",-1,3),new e("idad",-1,8),new e("able",-1,1),new e("ible",-1,1),new e("ante",-1,2),new e("mente",-1,7),new e("amente",13,6),new e("ación",-1,2),new e("ución",-1,4),new e("ico",-1,1),new e("ismo",-1,1),new e("oso",-1,1),new e("amiento",-1,1),new e("imiento",-1,1),new e("ivo",-1,9),new e("ador",-1,2),new e("icas",-1,1),new e("ancias",-1,2),new e("encias",-1,5),new e("adoras",-1,2),new e("osas",-1,1),new e("istas",-1,1),new e("ivas",-1,9),new e("anzas",-1,1),new e("logías",-1,3),new e("idades",-1,8),new e("ables",-1,1),new e("ibles",-1,1),new e("aciones",-1,2),new e("uciones",-1,4),new e("adores",-1,2),new e("antes",-1,2),new e("icos",-1,1),new e("ismos",-1,1),new e("osos",-1,1),new e("amientos",-1,1),new e("imientos",-1,1),new e("ivos",-1,9)],p=[new e("ya",-1,1),new e("ye",-1,1),new e("yan",-1,1),new e("yen",-1,1),new e("yeron",-1,1),new e("yendo",-1,1),new e("yo",-1,1),new e("yas",-1,1),new e("yes",-1,1),new e("yais",-1,1),new e("yamos",-1,1),new e("yó",-1,1)],v=[new e("aba",-1,2),new e("ada",-1,2),new e("ida",-1,2),new e("ara",-1,2),new e("iera",-1,2),new e("ía",-1,2),new e("aría",5,2),new e("ería",5,2),new e("iría",5,2),new e("ad",-1,2),new e("ed",-1,2),new e("id",-1,2),new e("ase",-1,2),new e("iese",-1,2),new e("aste",-1,2),new e("iste",-1,2),new e("an",-1,2),new e("aban",16,2),new e("aran",16,2),new e("ieran",16,2),new e("ían",16,2),new e("arían",20,2),new e("erían",20,2),new e("irían",20,2),new e("en",-1,1),new e("asen",24,2),new e("iesen",24,2),new e("aron",-1,2),new e("ieron",-1,2),new e("arán",-1,2),new e("erán",-1,2),new e("irán",-1,2),new e("ado",-1,2),new e("ido",-1,2),new e("ando",-1,2),new e("iendo",-1,2),new e("ar",-1,2),new e("er",-1,2),new e("ir",-1,2),new e("as",-1,2),new e("abas",39,2),new e("adas",39,2),new e("idas",39,2),new e("aras",39,2),new e("ieras",39,2),new e("ías",39,2),new e("arías",45,2),new e("erías",45,2),new e("irías",45,2),new e("es",-1,1),new e("ases",49,2),new e("ieses",49,2),new e("abais",-1,2),new e("arais",-1,2),new e("ierais",-1,2),new e("íais",-1,2),new e("aríais",55,2),new e("eríais",55,2),new e("iríais",55,2),new e("aseis",-1,2),new e("ieseis",-1,2),new e("asteis",-1,2),new e("isteis",-1,2),new e("áis",-1,2),new e("éis",-1,1),new e("aréis",64,2),new e("eréis",64,2),new e("iréis",64,2),new e("ados",-1,2),new e("idos",-1,2),new e("amos",-1,2),new e("ábamos",70,2),new e("áramos",70,2),new e("iéramos",70,2),new e("íamos",70,2),new e("aríamos",74,2),new e("eríamos",74,2),new e("iríamos",74,2),new e("emos",-1,1),new e("aremos",78,2),new e("eremos",78,2),new e("iremos",78,2),new e("ásemos",78,2),new e("iésemos",78,2),new e("imos",-1,2),new e("arás",-1,2),new e("erás",-1,2),new e("irás",-1,2),new e("ís",-1,2),new e("ará",-1,2),new e("erá",-1,2),new e("irá",-1,2),new e("aré",-1,2),new e("eré",-1,2),new e("iré",-1,2),new e("ió",-1,2)],g=[new e("a",-1,1),new e("e",-1,2),new e("o",-1,1),new e("os",-1,1),new e("á",-1,1),new e("é",-1,2),new e("í",-1,1),new e("ó",-1,1)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],y=new r;function q(){if(!y.out_grouping(k,97,252))return 1;for(;!y.in_grouping(k,97,252);){if(y.cursor>=y.limit)return 1;y.cursor++}}function W(){for(;!y.in_grouping(k,97,252);){if(y.cursor>=y.limit)return;y.cursor++}for(;!y.out_grouping(k,97,252);){if(y.cursor>=y.limit)return;y.cursor++}return 1}function F(){return c<=y.cursor}function C(){return u<=y.cursor}function S(e,s){if(!C())return 1;y.slice_del(),y.ket=y.cursor,(e=y.find_among_b(e,s))&&(y.bra=y.cursor,1==e)&&C()&&y.slice_del()}function P(e){if(!C())return 1;y.slice_del(),y.ket=y.cursor,y.eq_s_b(2,e)&&(y.bra=y.cursor,C())&&y.slice_del()}this.setCurrent=function(e){y.setCurrent(e)},this.getCurrent=function(){return y.getCurrent()},this.stem=function(){var e,s,r,n,i,a,o=y.cursor,t=y.cursor;if(c=y.limit,u=w=c,function(){var e=y.cursor;if(function(){if(!y.in_grouping(k,97,252))return 1;var e=y.cursor;if(q()){if(y.cursor=e,!y.in_grouping(k,97,252))return 1;for(;!y.out_grouping(k,97,252);){if(y.cursor>=y.limit)return 1;y.cursor++}}}()){if(y.cursor=e,!y.out_grouping(k,97,252))return;if(e=y.cursor,q()){if(y.cursor=e,!y.in_grouping(k,97,252)||y.cursor>=y.limit)return;y.cursor++}}c=y.cursor}(),y.cursor=t,W()&&(w=y.cursor,W())&&(u=y.cursor),y.limit_backward=o,y.cursor=y.limit,y.ket=y.cursor,y.find_among_b(l,13)&&(y.bra=y.cursor,e=y.find_among_b(d,11))&&F())switch(e){case 1:y.bra=y.cursor,y.slice_from("iendo");break;case 2:y.bra=y.cursor,y.slice_from("ando");break;case 3:y.bra=y.cursor,y.slice_from("ar");break;case 4:y.bra=y.cursor,y.slice_from("er");break;case 5:y.bra=y.cursor,y.slice_from("ir");break;case 6:y.slice_del();break;case 7:y.eq_s_b(1,"u")&&y.slice_del()}if(y.cursor=y.limit,!function(){var e;if(y.ket=y.cursor,e=y.find_among_b(h,46)){switch(y.bra=y.cursor,e){case 1:if(!C())return;y.slice_del();break;case 2:if(P("ic"))return;break;case 3:if(!C())return;y.slice_from("log");break;case 4:if(!C())return;y.slice_from("u");break;case 5:if(!C())return;y.slice_from("ente");break;case 6:if(!(w<=y.cursor))return;y.slice_del(),y.ket=y.cursor,(e=y.find_among_b(b,4))&&(y.bra=y.cursor,C())&&(y.slice_del(),1==e)&&(y.ket=y.cursor,y.eq_s_b(2,"at"))&&(y.bra=y.cursor,C())&&y.slice_del();break;case 7:if(S(f,3))return;break;case 8:if(S(_,3))return;break;case 9:if(P("at"))return}return 1}}()&&(y.cursor=y.limit,!function(){var e,s;if(y.cursor>=c&&(s=y.limit_backward,y.limit_backward=c,y.ket=y.cursor,e=y.find_among_b(p,12),y.limit_backward=s,e)){if(y.bra=y.cursor,1==e){if(!y.eq_s_b(1,"u"))return;y.slice_del()}return 1}}())&&(y.cursor=y.limit,y.cursor>=c)&&(t=y.limit_backward,y.limit_backward=c,y.ket=y.cursor,s=y.find_among_b(v,96),y.limit_backward=t,s))switch(y.bra=y.cursor,s){case 1:r=y.limit-y.cursor,y.eq_s_b(1,"u")&&(n=y.limit-y.cursor,y.eq_s_b(1,"g"))?y.cursor=y.limit-n:y.cursor=y.limit-r,y.bra=y.cursor;case 2:y.slice_del()}if(y.cursor=y.limit,y.ket=y.cursor,o=y.find_among_b(g,8))switch(y.bra=y.cursor,o){case 1:F()&&y.slice_del();break;case 2:F()&&(y.slice_del(),y.ket=y.cursor,y.eq_s_b(1,"u"))&&(y.bra=y.cursor,i=y.limit-y.cursor,y.eq_s_b(1,"g"))&&(y.cursor=y.limit-i,F())&&y.slice_del()}for(y.cursor=y.limit_backward;;){if(y.bra=y.cursor,a=y.find_among(m,6))switch(y.ket=y.cursor,a){case 1:y.slice_from("a");continue;case 2:y.slice_from("e");continue;case 3:y.slice_from("i");continue;case 4:y.slice_from("o");continue;case 5:y.slice_from("u");continue;case 6:if(!(y.cursor>=y.limit)){y.cursor++;continue}}break}return!0}},function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}),s.Pipeline.registerFunction(s.es.stemmer,"stemmer-es"),s.es.stopWordFilter=function(e){if(-1===s.es.stopWordFilter.stopWords.indexOf(e))return e},s.es.stopWordFilter.stopWords=new s.SortedSet,s.es.stopWordFilter.stopWords.length=309,s.es.stopWordFilter.stopWords.elements=" a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" "),s.Pipeline.registerFunction(s.es.stopWordFilter,"stopWordFilter-es")}}); diff --git a/js/lunr/lunr.fi.js b/js/lunr/lunr.fi.js new file mode 100644 index 0000000..8f78b5d --- /dev/null +++ b/js/lunr/lunr.fi.js @@ -0,0 +1,536 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.fi = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.fi.trimmer, + lunr.fi.stopWordFilter, + lunr.fi.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.fi.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.fi.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.fi.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.fi.trimmer, 'trimmer-fi'); + + /* lunr stemmer function */ + lunr.fi.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function FinnishStemmer() { + var a_0 = [new Among("pa", -1, 1), new Among("sti", -1, 2), + new Among("kaan", -1, 1), new Among("han", -1, 1), + new Among("kin", -1, 1), new Among("h\u00E4n", -1, 1), + new Among("k\u00E4\u00E4n", -1, 1), new Among("ko", -1, 1), + new Among("p\u00E4", -1, 1), new Among("k\u00F6", -1, 1) + ], + a_1 = [ + new Among("lla", -1, -1), new Among("na", -1, -1), + new Among("ssa", -1, -1), new Among("ta", -1, -1), + new Among("lta", 3, -1), new Among("sta", 3, -1) + ], + a_2 = [ + new Among("ll\u00E4", -1, -1), new Among("n\u00E4", -1, -1), + new Among("ss\u00E4", -1, -1), new Among("t\u00E4", -1, -1), + new Among("lt\u00E4", 3, -1), new Among("st\u00E4", 3, -1) + ], + a_3 = [ + new Among("lle", -1, -1), new Among("ine", -1, -1) + ], + a_4 = [ + new Among("nsa", -1, 3), new Among("mme", -1, 3), + new Among("nne", -1, 3), new Among("ni", -1, 2), + new Among("si", -1, 1), new Among("an", -1, 4), + new Among("en", -1, 6), new Among("\u00E4n", -1, 5), + new Among("ns\u00E4", -1, 3) + ], + a_5 = [new Among("aa", -1, -1), + new Among("ee", -1, -1), new Among("ii", -1, -1), + new Among("oo", -1, -1), new Among("uu", -1, -1), + new Among("\u00E4\u00E4", -1, -1), + new Among("\u00F6\u00F6", -1, -1) + ], + a_6 = [new Among("a", -1, 8), + new Among("lla", 0, -1), new Among("na", 0, -1), + new Among("ssa", 0, -1), new Among("ta", 0, -1), + new Among("lta", 4, -1), new Among("sta", 4, -1), + new Among("tta", 4, 9), new Among("lle", -1, -1), + new Among("ine", -1, -1), new Among("ksi", -1, -1), + new Among("n", -1, 7), new Among("han", 11, 1), + new Among("den", 11, -1, r_VI), new Among("seen", 11, -1, r_LONG), + new Among("hen", 11, 2), new Among("tten", 11, -1, r_VI), + new Among("hin", 11, 3), new Among("siin", 11, -1, r_VI), + new Among("hon", 11, 4), new Among("h\u00E4n", 11, 5), + new Among("h\u00F6n", 11, 6), new Among("\u00E4", -1, 8), + new Among("ll\u00E4", 22, -1), new Among("n\u00E4", 22, -1), + new Among("ss\u00E4", 22, -1), new Among("t\u00E4", 22, -1), + new Among("lt\u00E4", 26, -1), new Among("st\u00E4", 26, -1), + new Among("tt\u00E4", 26, 9) + ], + a_7 = [new Among("eja", -1, -1), + new Among("mma", -1, 1), new Among("imma", 1, -1), + new Among("mpa", -1, 1), new Among("impa", 3, -1), + new Among("mmi", -1, 1), new Among("immi", 5, -1), + new Among("mpi", -1, 1), new Among("impi", 7, -1), + new Among("ej\u00E4", -1, -1), new Among("mm\u00E4", -1, 1), + new Among("imm\u00E4", 10, -1), new Among("mp\u00E4", -1, 1), + new Among("imp\u00E4", 12, -1) + ], + a_8 = [new Among("i", -1, -1), + new Among("j", -1, -1) + ], + a_9 = [new Among("mma", -1, 1), + new Among("imma", 0, -1) + ], + g_AEI = [17, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8 + ], + g_V1 = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 32 + ], + g_V2 = [17, 65, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, 32 + ], + g_particle_end = [17, 97, 24, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 + ], + B_ending_removed, S_x, I_p2, I_p1, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_mark_regions() { + I_p1 = sbp.limit; + I_p2 = I_p1; + if (!habr1()) { + I_p1 = sbp.cursor; + if (!habr1()) + I_p2 = sbp.cursor; + } + } + + function habr1() { + var v_1; + while (true) { + v_1 = sbp.cursor; + if (sbp.in_grouping(g_V1, 97, 246)) + break; + sbp.cursor = v_1; + if (v_1 >= sbp.limit) + return true; + sbp.cursor++; + } + sbp.cursor = v_1; + while (!sbp.out_grouping(g_V1, 97, 246)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_particle_etc() { + var among_var, v_1; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_0, 10); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + switch (among_var) { + case 1: + if (!sbp.in_grouping_b(g_particle_end, 97, 246)) + return; + break; + case 2: + if (!r_R2()) + return; + break; + } + sbp.slice_del(); + } else + sbp.limit_backward = v_1; + } + } + + function r_possessive() { + var among_var, v_1, v_2; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 9); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + switch (among_var) { + case 1: + v_2 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "k")) { + sbp.cursor = sbp.limit - v_2; + sbp.slice_del(); + } + break; + case 2: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(3, "kse")) { + sbp.bra = sbp.cursor; + sbp.slice_from("ksi"); + } + break; + case 3: + sbp.slice_del(); + break; + case 4: + if (sbp.find_among_b(a_1, 6)) + sbp.slice_del(); + break; + case 5: + if (sbp.find_among_b(a_2, 6)) + sbp.slice_del(); + break; + case 6: + if (sbp.find_among_b(a_3, 2)) + sbp.slice_del(); + break; + } + } else + sbp.limit_backward = v_1; + } + } + + function r_LONG() { + return sbp.find_among_b(a_5, 7); + } + + function r_VI() { + return sbp.eq_s_b(1, "i") && sbp.in_grouping_b(g_V2, 97, 246); + } + + function r_case_ending() { + var among_var, v_1, v_2; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 30); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + switch (among_var) { + case 1: + if (!sbp.eq_s_b(1, "a")) + return; + break; + case 2: + case 9: + if (!sbp.eq_s_b(1, "e")) + return; + break; + case 3: + if (!sbp.eq_s_b(1, "i")) + return; + break; + case 4: + if (!sbp.eq_s_b(1, "o")) + return; + break; + case 5: + if (!sbp.eq_s_b(1, "\u00E4")) + return; + break; + case 6: + if (!sbp.eq_s_b(1, "\u00F6")) + return; + break; + case 7: + v_2 = sbp.limit - sbp.cursor; + if (!r_LONG()) { + sbp.cursor = sbp.limit - v_2; + if (!sbp.eq_s_b(2, "ie")) { + sbp.cursor = sbp.limit - v_2; + break; + } + } + sbp.cursor = sbp.limit - v_2; + if (sbp.cursor <= sbp.limit_backward) { + sbp.cursor = sbp.limit - v_2; + break; + } + sbp.cursor--; + sbp.bra = sbp.cursor; + break; + case 8: + if (!sbp.in_grouping_b(g_V1, 97, 246) || !sbp.out_grouping_b(g_V1, 97, 246)) + return; + break; + } + sbp.slice_del(); + B_ending_removed = true; + } else + sbp.limit_backward = v_1; + } + } + + function r_other_endings() { + var among_var, v_1, v_2; + if (sbp.cursor >= I_p2) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p2; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 14); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + if (among_var == 1) { + v_2 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(2, "po")) + return; + sbp.cursor = sbp.limit - v_2; + } + sbp.slice_del(); + } else + sbp.limit_backward = v_1; + } + } + + function r_i_plural() { + var v_1; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_8, 2)) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + sbp.slice_del(); + } else + sbp.limit_backward = v_1; + } + } + + function r_t_plural() { + var among_var, v_1, v_2, v_3, v_4, v_5; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "t")) { + sbp.bra = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (sbp.in_grouping_b(g_V1, 97, 246)) { + sbp.cursor = sbp.limit - v_2; + sbp.slice_del(); + sbp.limit_backward = v_1; + v_3 = sbp.limit - sbp.cursor; + if (sbp.cursor >= I_p2) { + sbp.cursor = I_p2; + v_4 = sbp.limit_backward; + sbp.limit_backward = sbp.cursor; + sbp.cursor = sbp.limit - v_3; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_9, 2); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_4; + if (among_var == 1) { + v_5 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(2, "po")) + return; + sbp.cursor = sbp.limit - v_5; + } + sbp.slice_del(); + return; + } + } + } + } + sbp.limit_backward = v_1; + } + } + + function r_tidy() { + var v_1, v_2, v_3, v_4; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + v_2 = sbp.limit - sbp.cursor; + if (r_LONG()) { + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (sbp.in_grouping_b(g_AEI, 97, 228)) { + sbp.bra = sbp.cursor; + if (sbp.out_grouping_b(g_V1, 97, 246)) + sbp.slice_del(); + } + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "j")) { + sbp.bra = sbp.cursor; + v_3 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "o")) { + sbp.cursor = sbp.limit - v_3; + if (sbp.eq_s_b(1, "u")) + sbp.slice_del(); + } else + sbp.slice_del(); + } + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "o")) { + sbp.bra = sbp.cursor; + if (sbp.eq_s_b(1, "j")) + sbp.slice_del(); + } + sbp.cursor = sbp.limit - v_2; + sbp.limit_backward = v_1; + while (true) { + v_4 = sbp.limit - sbp.cursor; + if (sbp.out_grouping_b(g_V1, 97, 246)) { + sbp.cursor = sbp.limit - v_4; + break; + } + sbp.cursor = sbp.limit - v_4; + if (sbp.cursor <= sbp.limit_backward) + return; + sbp.cursor--; + } + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + S_x = sbp.slice_to(); + if (sbp.eq_v_b(S_x)) + sbp.slice_del(); + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + B_ending_removed = false; + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_particle_etc(); + sbp.cursor = sbp.limit; + r_possessive(); + sbp.cursor = sbp.limit; + r_case_ending(); + sbp.cursor = sbp.limit; + r_other_endings(); + sbp.cursor = sbp.limit; + if (B_ending_removed) { + r_i_plural(); + sbp.cursor = sbp.limit; + } else { + sbp.cursor = sbp.limit; + r_t_plural(); + sbp.cursor = sbp.limit; + } + r_tidy(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.fi.stemmer, 'stemmer-fi'); + + /* stop word filter function */ + lunr.fi.stopWordFilter = function(token) { + if (lunr.fi.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.fi.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.fi.stopWordFilter.stopWords.length = 236; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.fi.stopWordFilter.stopWords.elements = ' ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli'.split(' '); + + lunr.Pipeline.registerFunction(lunr.fi.stopWordFilter, 'stopWordFilter-fi'); + }; +})) diff --git a/js/lunr/lunr.fi.min.js b/js/lunr/lunr.fi.min.js new file mode 100644 index 0000000..a99beca --- /dev/null +++ b/js/lunr/lunr.fi.min.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var q,v,r;e.fi=function(){this.pipeline.reset(),this.pipeline.add(e.fi.trimmer,e.fi.stopWordFilter,e.fi.stemmer)},e.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fi.trimmer=e.trimmerSupport.generateTrimmer(e.fi.wordCharacters),e.Pipeline.registerFunction(e.fi.trimmer,"trimmer-fi"),e.fi.stemmer=(q=e.stemmerSupport.Among,v=e.stemmerSupport.SnowballProgram,r=new function(){var n,t,s,o,l=[new q("pa",-1,1),new q("sti",-1,2),new q("kaan",-1,1),new q("han",-1,1),new q("kin",-1,1),new q("hän",-1,1),new q("kään",-1,1),new q("ko",-1,1),new q("pä",-1,1),new q("kö",-1,1)],a=[new q("lla",-1,-1),new q("na",-1,-1),new q("ssa",-1,-1),new q("ta",-1,-1),new q("lta",3,-1),new q("sta",3,-1)],u=[new q("llä",-1,-1),new q("nä",-1,-1),new q("ssä",-1,-1),new q("tä",-1,-1),new q("ltä",3,-1),new q("stä",3,-1)],c=[new q("lle",-1,-1),new q("ine",-1,-1)],m=[new q("nsa",-1,3),new q("mme",-1,3),new q("nne",-1,3),new q("ni",-1,2),new q("si",-1,1),new q("an",-1,4),new q("en",-1,6),new q("än",-1,5),new q("nsä",-1,3)],i=[new q("aa",-1,-1),new q("ee",-1,-1),new q("ii",-1,-1),new q("oo",-1,-1),new q("uu",-1,-1),new q("ää",-1,-1),new q("öö",-1,-1)],w=[new q("a",-1,8),new q("lla",0,-1),new q("na",0,-1),new q("ssa",0,-1),new q("ta",0,-1),new q("lta",4,-1),new q("sta",4,-1),new q("tta",4,9),new q("lle",-1,-1),new q("ine",-1,-1),new q("ksi",-1,-1),new q("n",-1,7),new q("han",11,1),new q("den",11,-1,r),new q("seen",11,-1,j),new q("hen",11,2),new q("tten",11,-1,r),new q("hin",11,3),new q("siin",11,-1,r),new q("hon",11,4),new q("hän",11,5),new q("hön",11,6),new q("ä",-1,8),new q("llä",22,-1),new q("nä",22,-1),new q("ssä",22,-1),new q("tä",22,-1),new q("ltä",26,-1),new q("stä",26,-1),new q("ttä",26,9)],_=[new q("eja",-1,-1),new q("mma",-1,1),new q("imma",1,-1),new q("mpa",-1,1),new q("impa",3,-1),new q("mmi",-1,1),new q("immi",5,-1),new q("mpi",-1,1),new q("impi",7,-1),new q("ejä",-1,-1),new q("mmä",-1,1),new q("immä",10,-1),new q("mpä",-1,1),new q("impä",12,-1)],k=[new q("i",-1,-1),new q("j",-1,-1)],b=[new q("mma",-1,1),new q("imma",0,-1)],d=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],f=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],p=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new v;function g(){for(var i;i=h.cursor,!h.in_grouping(f,97,246);){if((h.cursor=i)>=h.limit)return 1;h.cursor++}for(h.cursor=i;!h.out_grouping(f,97,246);){if(h.cursor>=h.limit)return 1;h.cursor++}}function j(){return h.find_among_b(i,7)}function r(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e,r=h.cursor;if(o=h.limit,s=o,g()||(o=h.cursor,g())||(s=h.cursor),n=!1,h.limit_backward=r,h.cursor=h.limit,function(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(l,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(h.in_grouping_b(p,97,246))break;return;case 2:if(s<=h.cursor)break;return}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor>=o)if(r=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,e=h.find_among_b(m,9))switch(h.bra=h.cursor,h.limit_backward=r,e){case 1:i=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-i,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(a,6)&&h.slice_del();break;case 5:h.find_among_b(u,6)&&h.slice_del();break;case 6:h.find_among_b(c,2)&&h.slice_del()}else h.limit_backward=r;return h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(w,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(h.eq_s_b(1,"a"))break;return;case 2:case 9:if(h.eq_s_b(1,"e"))break;return;case 3:if(h.eq_s_b(1,"i"))break;return;case 4:if(h.eq_s_b(1,"o"))break;return;case 5:if(h.eq_s_b(1,"ä"))break;return;case 6:if(h.eq_s_b(1,"ö"))break;return;case 7:r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))||(h.cursor=h.limit-r,h.cursor<=h.limit_backward)?h.cursor=h.limit-r:(h.cursor--,h.bra=h.cursor);break;case 8:if(h.in_grouping_b(f,97,246)&&h.out_grouping_b(f,97,246))break;return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e;if(h.cursor>=s)if(i=h.limit_backward,h.limit_backward=s,h.ket=h.cursor,e=h.find_among_b(_,14)){if(h.bra=h.cursor,h.limit_backward=i,1==e){if(e=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-e}h.slice_del()}else h.limit_backward=i}(),h.cursor=h.limit,n?h.cursor>=o&&(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(k,2)?(h.bra=h.cursor,h.limit_backward=e,h.slice_del()):h.limit_backward=e):(h.cursor=h.limit,function(){var i,e,r,n;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,n=h.limit-h.cursor,h.in_grouping_b(f,97,246))&&(h.cursor=h.limit-n,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=s)&&(h.cursor=s,r=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(b,2))){if(h.bra=h.cursor,h.limit_backward=r,1==i){if(n=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-n}h.slice_del()}else h.limit_backward=e}()),h.cursor=h.limit,function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward)&&(h.cursor--,h.bra=h.cursor,h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(d,97,228)&&(h.bra=h.cursor,h.out_grouping_b(f,97,246))&&h.slice_del(),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")||(h.cursor=h.limit-r,h.eq_s_b(1,"u")))&&h.slice_del(),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j"))&&h.slice_del(),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(f,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t))&&h.slice_del()}}(),!0}},function(i){return r.setCurrent(i),r.stem(),r.getCurrent()}),e.Pipeline.registerFunction(e.fi.stemmer,"stemmer-fi"),e.fi.stopWordFilter=function(i){if(-1===e.fi.stopWordFilter.stopWords.indexOf(i))return i},e.fi.stopWordFilter.stopWords=new e.SortedSet,e.fi.stopWordFilter.stopWords.length=236,e.fi.stopWordFilter.stopWords.elements=" ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" "),e.Pipeline.registerFunction(e.fi.stopWordFilter,"stopWordFilter-fi")}}); diff --git a/js/lunr/lunr.fr.js b/js/lunr/lunr.fr.js new file mode 100644 index 0000000..13c2420 --- /dev/null +++ b/js/lunr/lunr.fr.js @@ -0,0 +1,698 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.fr = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.fr.trimmer, + lunr.fr.stopWordFilter, + lunr.fr.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.fr.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.fr.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.fr.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.fr.trimmer, 'trimmer-fr'); + + /* lunr stemmer function */ + lunr.fr.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function FrenchStemmer() { + var a_0 = [new Among("col", -1, -1), new Among("par", -1, -1), + new Among("tap", -1, -1) + ], + a_1 = [new Among("", -1, 4), + new Among("I", 0, 1), new Among("U", 0, 2), new Among("Y", 0, 3) + ], + a_2 = [ + new Among("iqU", -1, 3), new Among("abl", -1, 3), + new Among("I\u00E8r", -1, 4), new Among("i\u00E8r", -1, 4), + new Among("eus", -1, 2), new Among("iv", -1, 1) + ], + a_3 = [ + new Among("ic", -1, 2), new Among("abil", -1, 1), + new Among("iv", -1, 3) + ], + a_4 = [new Among("iqUe", -1, 1), + new Among("atrice", -1, 2), new Among("ance", -1, 1), + new Among("ence", -1, 5), new Among("logie", -1, 3), + new Among("able", -1, 1), new Among("isme", -1, 1), + new Among("euse", -1, 11), new Among("iste", -1, 1), + new Among("ive", -1, 8), new Among("if", -1, 8), + new Among("usion", -1, 4), new Among("ation", -1, 2), + new Among("ution", -1, 4), new Among("ateur", -1, 2), + new Among("iqUes", -1, 1), new Among("atrices", -1, 2), + new Among("ances", -1, 1), new Among("ences", -1, 5), + new Among("logies", -1, 3), new Among("ables", -1, 1), + new Among("ismes", -1, 1), new Among("euses", -1, 11), + new Among("istes", -1, 1), new Among("ives", -1, 8), + new Among("ifs", -1, 8), new Among("usions", -1, 4), + new Among("ations", -1, 2), new Among("utions", -1, 4), + new Among("ateurs", -1, 2), new Among("ments", -1, 15), + new Among("ements", 30, 6), new Among("issements", 31, 12), + new Among("it\u00E9s", -1, 7), new Among("ment", -1, 15), + new Among("ement", 34, 6), new Among("issement", 35, 12), + new Among("amment", 34, 13), new Among("emment", 34, 14), + new Among("aux", -1, 10), new Among("eaux", 39, 9), + new Among("eux", -1, 1), new Among("it\u00E9", -1, 7) + ], + a_5 = [ + new Among("ira", -1, 1), new Among("ie", -1, 1), + new Among("isse", -1, 1), new Among("issante", -1, 1), + new Among("i", -1, 1), new Among("irai", 4, 1), + new Among("ir", -1, 1), new Among("iras", -1, 1), + new Among("ies", -1, 1), new Among("\u00EEmes", -1, 1), + new Among("isses", -1, 1), new Among("issantes", -1, 1), + new Among("\u00EEtes", -1, 1), new Among("is", -1, 1), + new Among("irais", 13, 1), new Among("issais", 13, 1), + new Among("irions", -1, 1), new Among("issions", -1, 1), + new Among("irons", -1, 1), new Among("issons", -1, 1), + new Among("issants", -1, 1), new Among("it", -1, 1), + new Among("irait", 21, 1), new Among("issait", 21, 1), + new Among("issant", -1, 1), new Among("iraIent", -1, 1), + new Among("issaIent", -1, 1), new Among("irent", -1, 1), + new Among("issent", -1, 1), new Among("iront", -1, 1), + new Among("\u00EEt", -1, 1), new Among("iriez", -1, 1), + new Among("issiez", -1, 1), new Among("irez", -1, 1), + new Among("issez", -1, 1) + ], + a_6 = [new Among("a", -1, 3), + new Among("era", 0, 2), new Among("asse", -1, 3), + new Among("ante", -1, 3), new Among("\u00E9e", -1, 2), + new Among("ai", -1, 3), new Among("erai", 5, 2), + new Among("er", -1, 2), new Among("as", -1, 3), + new Among("eras", 8, 2), new Among("\u00E2mes", -1, 3), + new Among("asses", -1, 3), new Among("antes", -1, 3), + new Among("\u00E2tes", -1, 3), new Among("\u00E9es", -1, 2), + new Among("ais", -1, 3), new Among("erais", 15, 2), + new Among("ions", -1, 1), new Among("erions", 17, 2), + new Among("assions", 17, 3), new Among("erons", -1, 2), + new Among("ants", -1, 3), new Among("\u00E9s", -1, 2), + new Among("ait", -1, 3), new Among("erait", 23, 2), + new Among("ant", -1, 3), new Among("aIent", -1, 3), + new Among("eraIent", 26, 2), new Among("\u00E8rent", -1, 2), + new Among("assent", -1, 3), new Among("eront", -1, 2), + new Among("\u00E2t", -1, 3), new Among("ez", -1, 2), + new Among("iez", 32, 2), new Among("eriez", 33, 2), + new Among("assiez", 33, 3), new Among("erez", 32, 2), + new Among("\u00E9", -1, 2) + ], + a_7 = [new Among("e", -1, 3), + new Among("I\u00E8re", 0, 2), new Among("i\u00E8re", 0, 2), + new Among("ion", -1, 1), new Among("Ier", -1, 2), + new Among("ier", -1, 2), new Among("\u00EB", -1, 4) + ], + a_8 = [ + new Among("ell", -1, -1), new Among("eill", -1, -1), + new Among("enn", -1, -1), new Among("onn", -1, -1), + new Among("ett", -1, -1) + ], + g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 130, 103, 8, 5 + ], + g_keep_with_s = [1, 65, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 + ], + I_p2, I_p1, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(c1, c2, v_1) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 251)) { + sbp.slice_from(c2); + sbp.cursor = v_1; + return true; + } + } + return false; + } + + function habr2(c1, c2, v_1) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + sbp.slice_from(c2); + sbp.cursor = v_1; + return true; + } + return false; + } + + function r_prelude() { + var v_1, v_2; + while (true) { + v_1 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 251)) { + sbp.bra = sbp.cursor; + v_2 = sbp.cursor; + if (habr1("u", "U", v_1)) + continue; + sbp.cursor = v_2; + if (habr1("i", "I", v_1)) + continue; + sbp.cursor = v_2; + if (habr2("y", "Y", v_1)) + continue; + } + sbp.cursor = v_1; + sbp.bra = v_1; + if (!habr1("y", "Y", v_1)) { + sbp.cursor = v_1; + if (sbp.eq_s(1, "q")) { + sbp.bra = sbp.cursor; + if (habr2("u", "U", v_1)) + continue; + } + sbp.cursor = v_1; + if (v_1 >= sbp.limit) + return; + sbp.cursor++; + } + } + } + + function habr3() { + while (!sbp.in_grouping(g_v, 97, 251)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 251)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + + function r_mark_regions() { + var v_1 = sbp.cursor; + I_pV = sbp.limit; + I_p1 = I_pV; + I_p2 = I_pV; + if (sbp.in_grouping(g_v, 97, 251) && sbp.in_grouping(g_v, 97, 251) && sbp.cursor < sbp.limit) + sbp.cursor++; + else { + sbp.cursor = v_1; + if (!sbp.find_among(a_0, 3)) { + sbp.cursor = v_1; + do { + if (sbp.cursor >= sbp.limit) { + sbp.cursor = I_pV; + break; + } + sbp.cursor++; + } while (!sbp.in_grouping(g_v, 97, 251)); + } + } + I_pV = sbp.cursor; + sbp.cursor = v_1; + if (!habr3()) { + I_p1 = sbp.cursor; + if (!habr3()) + I_p2 = sbp.cursor; + } + } + + function r_postlude() { + var among_var, v_1; + while (true) { + v_1 = sbp.cursor; + sbp.bra = v_1; + among_var = sbp.find_among(a_1, 4); + if (!among_var) + break; + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("i"); + break; + case 2: + sbp.slice_from("u"); + break; + case 3: + sbp.slice_from("y"); + break; + case 4: + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + break; + } + } + } + + function r_RV() { + return I_pV <= sbp.cursor; + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_standard_suffix() { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 43); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + return false; + sbp.slice_del(); + break; + case 2: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ic")) { + sbp.bra = sbp.cursor; + if (!r_R2()) + sbp.slice_from("iqU"); + else + sbp.slice_del(); + } + break; + case 3: + if (!r_R2()) + return false; + sbp.slice_from("log"); + break; + case 4: + if (!r_R2()) + return false; + sbp.slice_from("u"); + break; + case 5: + if (!r_R2()) + return false; + sbp.slice_from("ent"); + break; + case 6: + if (!r_RV()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 6); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_R2()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + } + break; + case 2: + if (r_R2()) + sbp.slice_del(); + else if (r_R1()) + sbp.slice_from("eux"); + break; + case 3: + if (r_R2()) + sbp.slice_del(); + break; + case 4: + if (r_RV()) + sbp.slice_from("i"); + break; + } + } + break; + case 7: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 3); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_R2()) + sbp.slice_del(); + else + sbp.slice_from("abl"); + break; + case 2: + if (r_R2()) + sbp.slice_del(); + else + sbp.slice_from("iqU"); + break; + case 3: + if (r_R2()) + sbp.slice_del(); + break; + } + } + break; + case 8: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ic")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + else + sbp.slice_from("iqU"); + break; + } + } + } + break; + case 9: + sbp.slice_from("eau"); + break; + case 10: + if (!r_R1()) + return false; + sbp.slice_from("al"); + break; + case 11: + if (r_R2()) + sbp.slice_del(); + else if (!r_R1()) + return false; + else + sbp.slice_from("eux"); + break; + case 12: + if (!r_R1() || !sbp.out_grouping_b(g_v, 97, 251)) + return false; + sbp.slice_del(); + break; + case 13: + if (r_RV()) + sbp.slice_from("ant"); + return false; + case 14: + if (r_RV()) + sbp.slice_from("ent"); + return false; + case 15: + v_1 = sbp.limit - sbp.cursor; + if (sbp.in_grouping_b(g_v, 97, 251) && r_RV()) { + sbp.cursor = sbp.limit - v_1; + sbp.slice_del(); + } + return false; + } + return true; + } + return false; + } + + function r_i_verb_suffix() { + var among_var, v_1; + if (sbp.cursor < I_pV) + return false; + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_5, 35); + if (!among_var) { + sbp.limit_backward = v_1; + return false; + } + sbp.bra = sbp.cursor; + if (among_var == 1) { + if (!sbp.out_grouping_b(g_v, 97, 251)) { + sbp.limit_backward = v_1; + return false; + } + sbp.slice_del(); + } + sbp.limit_backward = v_1; + return true; + } + + function r_verb_suffix() { + var among_var, v_2, v_3; + if (sbp.cursor < I_pV) + return false; + v_2 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 38); + if (!among_var) { + sbp.limit_backward = v_2; + return false; + } + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (!r_R2()) { + sbp.limit_backward = v_2; + return false; + } + sbp.slice_del(); + break; + case 2: + sbp.slice_del(); + break; + case 3: + sbp.slice_del(); + v_3 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "e")) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else + sbp.cursor = sbp.limit - v_3; + break; + } + sbp.limit_backward = v_2; + return true; + } + + function r_residual_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor, + v_2, v_4, v_5; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "s")) { + sbp.bra = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (sbp.out_grouping_b(g_keep_with_s, 97, 232)) { + sbp.cursor = sbp.limit - v_2; + sbp.slice_del(); + } else + sbp.cursor = sbp.limit - v_1; + } else + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor >= I_pV) { + v_4 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 7); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_R2()) { + v_5 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "s")) { + sbp.cursor = sbp.limit - v_5; + if (!sbp.eq_s_b(1, "t")) + break; + } + sbp.slice_del(); + } + break; + case 2: + sbp.slice_from("i"); + break; + case 3: + sbp.slice_del(); + break; + case 4: + if (sbp.eq_s_b(2, "gu")) + sbp.slice_del(); + break; + } + } + sbp.limit_backward = v_4; + } + } + + function r_un_double() { + var v_1 = sbp.limit - sbp.cursor; + if (sbp.find_among_b(a_8, 5)) { + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } + } + + function r_un_accent() { + var v_1, v_2 = 1; + while (sbp.out_grouping_b(g_v, 97, 251)) + v_2--; + if (v_2 <= 0) { + sbp.ket = sbp.cursor; + v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "\u00E9")) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(1, "\u00E8")) + return; + } + sbp.bra = sbp.cursor; + sbp.slice_from("e"); + } + } + + function habr5() { + if (!r_standard_suffix()) { + sbp.cursor = sbp.limit; + if (!r_i_verb_suffix()) { + sbp.cursor = sbp.limit; + if (!r_verb_suffix()) { + sbp.cursor = sbp.limit; + r_residual_suffix(); + return; + } + } + } + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "Y")) { + sbp.bra = sbp.cursor; + sbp.slice_from("i"); + } else { + sbp.cursor = sbp.limit; + if (sbp.eq_s_b(1, "\u00E7")) { + sbp.bra = sbp.cursor; + sbp.slice_from("c"); + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + habr5(); + sbp.cursor = sbp.limit; + r_un_double(); + sbp.cursor = sbp.limit; + r_un_accent(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.fr.stemmer, 'stemmer-fr'); + + /* stop word filter function */ + lunr.fr.stopWordFilter = function(token) { + if (lunr.fr.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.fr.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.fr.stopWordFilter.stopWords.length = 164; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.fr.stopWordFilter.stopWords.elements = ' ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes'.split(' '); + + lunr.Pipeline.registerFunction(lunr.fr.stopWordFilter, 'stopWordFilter-fr'); + }; +})) diff --git a/js/lunr/lunr.fr.min.js b/js/lunr/lunr.fr.min.js new file mode 100644 index 0000000..4382cb7 --- /dev/null +++ b/js/lunr/lunr.fr.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,s,i;r.fr=function(){this.pipeline.reset(),this.pipeline.add(r.fr.trimmer,r.fr.stopWordFilter,r.fr.stemmer)},r.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.fr.trimmer=r.trimmerSupport.generateTrimmer(r.fr.wordCharacters),r.Pipeline.registerFunction(r.fr.trimmer,"trimmer-fr"),r.fr.stemmer=(e=r.stemmerSupport.Among,s=r.stemmerSupport.SnowballProgram,i=new function(){var o,u,c,a=[new e("col",-1,-1),new e("par",-1,-1),new e("tap",-1,-1)],l=[new e("",-1,4),new e("I",0,1),new e("U",0,2),new e("Y",0,3)],w=[new e("iqU",-1,3),new e("abl",-1,3),new e("Ièr",-1,4),new e("ièr",-1,4),new e("eus",-1,2),new e("iv",-1,1)],f=[new e("ic",-1,2),new e("abil",-1,1),new e("iv",-1,3)],m=[new e("iqUe",-1,1),new e("atrice",-1,2),new e("ance",-1,1),new e("ence",-1,5),new e("logie",-1,3),new e("able",-1,1),new e("isme",-1,1),new e("euse",-1,11),new e("iste",-1,1),new e("ive",-1,8),new e("if",-1,8),new e("usion",-1,4),new e("ation",-1,2),new e("ution",-1,4),new e("ateur",-1,2),new e("iqUes",-1,1),new e("atrices",-1,2),new e("ances",-1,1),new e("ences",-1,5),new e("logies",-1,3),new e("ables",-1,1),new e("ismes",-1,1),new e("euses",-1,11),new e("istes",-1,1),new e("ives",-1,8),new e("ifs",-1,8),new e("usions",-1,4),new e("ations",-1,2),new e("utions",-1,4),new e("ateurs",-1,2),new e("ments",-1,15),new e("ements",30,6),new e("issements",31,12),new e("ités",-1,7),new e("ment",-1,15),new e("ement",34,6),new e("issement",35,12),new e("amment",34,13),new e("emment",34,14),new e("aux",-1,10),new e("eaux",39,9),new e("eux",-1,1),new e("ité",-1,7)],_=[new e("ira",-1,1),new e("ie",-1,1),new e("isse",-1,1),new e("issante",-1,1),new e("i",-1,1),new e("irai",4,1),new e("ir",-1,1),new e("iras",-1,1),new e("ies",-1,1),new e("îmes",-1,1),new e("isses",-1,1),new e("issantes",-1,1),new e("îtes",-1,1),new e("is",-1,1),new e("irais",13,1),new e("issais",13,1),new e("irions",-1,1),new e("issions",-1,1),new e("irons",-1,1),new e("issons",-1,1),new e("issants",-1,1),new e("it",-1,1),new e("irait",21,1),new e("issait",21,1),new e("issant",-1,1),new e("iraIent",-1,1),new e("issaIent",-1,1),new e("irent",-1,1),new e("issent",-1,1),new e("iront",-1,1),new e("ît",-1,1),new e("iriez",-1,1),new e("issiez",-1,1),new e("irez",-1,1),new e("issez",-1,1)],b=[new e("a",-1,3),new e("era",0,2),new e("asse",-1,3),new e("ante",-1,3),new e("ée",-1,2),new e("ai",-1,3),new e("erai",5,2),new e("er",-1,2),new e("as",-1,3),new e("eras",8,2),new e("âmes",-1,3),new e("asses",-1,3),new e("antes",-1,3),new e("âtes",-1,3),new e("ées",-1,2),new e("ais",-1,3),new e("erais",15,2),new e("ions",-1,1),new e("erions",17,2),new e("assions",17,3),new e("erons",-1,2),new e("ants",-1,3),new e("és",-1,2),new e("ait",-1,3),new e("erait",23,2),new e("ant",-1,3),new e("aIent",-1,3),new e("eraIent",26,2),new e("èrent",-1,2),new e("assent",-1,3),new e("eront",-1,2),new e("ât",-1,3),new e("ez",-1,2),new e("iez",32,2),new e("eriez",33,2),new e("assiez",33,3),new e("erez",32,2),new e("é",-1,2)],d=[new e("e",-1,3),new e("Ière",0,2),new e("ière",0,2),new e("ion",-1,1),new e("Ier",-1,2),new e("ier",-1,2),new e("ë",-1,4)],k=[new e("ell",-1,-1),new e("eill",-1,-1),new e("enn",-1,-1),new e("onn",-1,-1),new e("ett",-1,-1)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],g=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],q=new s;function v(e,r,s){return q.eq_s(1,e)&&(q.ket=q.cursor,q.in_grouping(p,97,251))&&(q.slice_from(r),q.cursor=s,1)}function z(e,r,s){return q.eq_s(1,e)&&(q.ket=q.cursor,q.slice_from(r),q.cursor=s,1)}function h(){for(;!q.in_grouping(p,97,251);){if(q.cursor>=q.limit)return 1;q.cursor++}for(;!q.out_grouping(p,97,251);){if(q.cursor>=q.limit)return 1;q.cursor++}}function W(){return c<=q.cursor}function y(){return u<=q.cursor}function F(){return o<=q.cursor}this.setCurrent=function(e){q.setCurrent(e)},this.getCurrent=function(){return q.getCurrent()},this.stem=function(){var e=q.cursor,r=(function(){for(var e,r;;){if(e=q.cursor,q.in_grouping(p,97,251)){if(q.bra=q.cursor,r=q.cursor,v("u","U",e))continue;if(q.cursor=r,v("i","I",e))continue;if(q.cursor=r,z("y","Y",e))continue}if(q.cursor=e,q.bra=e,!v("y","Y",e)&&(q.cursor=e,!q.eq_s(1,"q")||(q.bra=q.cursor,!z("u","U",e)))){if((q.cursor=e)>=q.limit)return;q.cursor++}}}(),q.cursor=e,q.cursor);if(c=q.limit,o=u=c,q.in_grouping(p,97,251)&&q.in_grouping(p,97,251)&&q.cursor=q.limit){q.cursor=c;break}}while(q.cursor++,!q.in_grouping(p,97,251))}if(c=q.cursor,q.cursor=r,h()||(u=q.cursor,h())||(o=q.cursor),q.limit_backward=e,q.cursor=q.limit,function(){var e,r;if(q.ket=q.cursor,e=q.find_among_b(m,43)){switch(q.bra=q.cursor,e){case 1:if(!F())return;q.slice_del();break;case 2:if(!F())return;q.slice_del(),q.ket=q.cursor,q.eq_s_b(2,"ic")&&(q.bra=q.cursor,F()?q.slice_del():q.slice_from("iqU"));break;case 3:if(!F())return;q.slice_from("log");break;case 4:if(!F())return;q.slice_from("u");break;case 5:if(!F())return;q.slice_from("ent");break;case 6:if(!W())return;if(q.slice_del(),q.ket=q.cursor,e=q.find_among_b(w,6))switch(q.bra=q.cursor,e){case 1:F()&&(q.slice_del(),q.ket=q.cursor,q.eq_s_b(2,"at"))&&(q.bra=q.cursor,F())&&q.slice_del();break;case 2:F()?q.slice_del():y()&&q.slice_from("eux");break;case 3:F()&&q.slice_del();break;case 4:W()&&q.slice_from("i")}break;case 7:if(!F())return;if(q.slice_del(),q.ket=q.cursor,e=q.find_among_b(f,3))switch(q.bra=q.cursor,e){case 1:F()?q.slice_del():q.slice_from("abl");break;case 2:F()?q.slice_del():q.slice_from("iqU");break;case 3:F()&&q.slice_del()}break;case 8:if(!F())return;q.slice_del(),q.ket=q.cursor,q.eq_s_b(2,"at")&&(q.bra=q.cursor,F())&&(q.slice_del(),q.ket=q.cursor,q.eq_s_b(2,"ic"))&&(q.bra=q.cursor,F()?q.slice_del():q.slice_from("iqU"));break;case 9:q.slice_from("eau");break;case 10:if(!y())return;q.slice_from("al");break;case 11:if(F())q.slice_del();else{if(!y())return;q.slice_from("eux")}break;case 12:if(!y()||!q.out_grouping_b(p,97,251))return;q.slice_del();break;case 13:return W()&&q.slice_from("ant"),0;case 14:return W()&&q.slice_from("ent"),0;case 15:return r=q.limit-q.cursor,q.in_grouping_b(p,97,251)&&W()&&(q.cursor=q.limit-r,q.slice_del()),0}return 1}}()||(q.cursor=q.limit,function(){var e,r;if(!(q.cursor=c){if(s=q.limit_backward,q.limit_backward=c,q.ket=q.cursor,n=q.find_among_b(d,7))switch(q.bra=q.cursor,n){case 1:if(F()){if(i=q.limit-q.cursor,!q.eq_s_b(1,"s")&&(q.cursor=q.limit-i,!q.eq_s_b(1,"t")))break;q.slice_del()}break;case 2:q.slice_from("i");break;case 3:q.slice_del();break;case 4:q.eq_s_b(2,"gu")&&q.slice_del()}q.limit_backward=s}}q.cursor=q.limit,r=q.limit-q.cursor,q.find_among_b(k,5)&&(q.cursor=q.limit-r,q.ket=q.cursor,q.cursor>q.limit_backward)&&(q.cursor--,q.bra=q.cursor,q.slice_del()),q.cursor=q.limit;for(var t=1;q.out_grouping_b(p,97,251);)t--;return t<=0&&(q.ket=q.cursor,e=q.limit-q.cursor,q.eq_s_b(1,"é")||(q.cursor=q.limit-e,q.eq_s_b(1,"è")))&&(q.bra=q.cursor,q.slice_from("e")),q.cursor=q.limit_backward,function(){for(var e;e=q.cursor,q.bra=e,e=q.find_among(l,4);)switch(q.ket=q.cursor,e){case 1:q.slice_from("i");break;case 2:q.slice_from("u");break;case 3:q.slice_from("y");break;case 4:if(q.cursor>=q.limit)return;q.cursor++}}(),!0}},function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}),r.Pipeline.registerFunction(r.fr.stemmer,"stemmer-fr"),r.fr.stopWordFilter=function(e){if(-1===r.fr.stopWordFilter.stopWords.indexOf(e))return e},r.fr.stopWordFilter.stopWords=new r.SortedSet,r.fr.stopWordFilter.stopWords.length=164,r.fr.stopWordFilter.stopWords.elements=" ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" "),r.Pipeline.registerFunction(r.fr.stopWordFilter,"stopWordFilter-fr")}}); diff --git a/js/lunr/lunr.hu.js b/js/lunr/lunr.hu.js new file mode 100644 index 0000000..986ddb0 --- /dev/null +++ b/js/lunr/lunr.hu.js @@ -0,0 +1,561 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.hu = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.hu.trimmer, + lunr.hu.stopWordFilter, + lunr.hu.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.hu.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.hu.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.hu.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.hu.trimmer, 'trimmer-hu'); + + /* lunr stemmer function */ + lunr.hu.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function HungarianStemmer() { + var a_0 = [new Among("cs", -1, -1), new Among("dzs", -1, -1), + new Among("gy", -1, -1), new Among("ly", -1, -1), + new Among("ny", -1, -1), new Among("sz", -1, -1), + new Among("ty", -1, -1), new Among("zs", -1, -1) + ], + a_1 = [ + new Among("\u00E1", -1, 1), new Among("\u00E9", -1, 2) + ], + a_2 = [ + new Among("bb", -1, -1), new Among("cc", -1, -1), + new Among("dd", -1, -1), new Among("ff", -1, -1), + new Among("gg", -1, -1), new Among("jj", -1, -1), + new Among("kk", -1, -1), new Among("ll", -1, -1), + new Among("mm", -1, -1), new Among("nn", -1, -1), + new Among("pp", -1, -1), new Among("rr", -1, -1), + new Among("ccs", -1, -1), new Among("ss", -1, -1), + new Among("zzs", -1, -1), new Among("tt", -1, -1), + new Among("vv", -1, -1), new Among("ggy", -1, -1), + new Among("lly", -1, -1), new Among("nny", -1, -1), + new Among("tty", -1, -1), new Among("ssz", -1, -1), + new Among("zz", -1, -1) + ], + a_3 = [new Among("al", -1, 1), + new Among("el", -1, 2) + ], + a_4 = [new Among("ba", -1, -1), + new Among("ra", -1, -1), new Among("be", -1, -1), + new Among("re", -1, -1), new Among("ig", -1, -1), + new Among("nak", -1, -1), new Among("nek", -1, -1), + new Among("val", -1, -1), new Among("vel", -1, -1), + new Among("ul", -1, -1), new Among("n\u00E1l", -1, -1), + new Among("n\u00E9l", -1, -1), new Among("b\u00F3l", -1, -1), + new Among("r\u00F3l", -1, -1), new Among("t\u00F3l", -1, -1), + new Among("b\u00F5l", -1, -1), new Among("r\u00F5l", -1, -1), + new Among("t\u00F5l", -1, -1), new Among("\u00FCl", -1, -1), + new Among("n", -1, -1), new Among("an", 19, -1), + new Among("ban", 20, -1), new Among("en", 19, -1), + new Among("ben", 22, -1), new Among("k\u00E9ppen", 22, -1), + new Among("on", 19, -1), new Among("\u00F6n", 19, -1), + new Among("k\u00E9pp", -1, -1), new Among("kor", -1, -1), + new Among("t", -1, -1), new Among("at", 29, -1), + new Among("et", 29, -1), new Among("k\u00E9nt", 29, -1), + new Among("ank\u00E9nt", 32, -1), new Among("enk\u00E9nt", 32, -1), + new Among("onk\u00E9nt", 32, -1), new Among("ot", 29, -1), + new Among("\u00E9rt", 29, -1), new Among("\u00F6t", 29, -1), + new Among("hez", -1, -1), new Among("hoz", -1, -1), + new Among("h\u00F6z", -1, -1), new Among("v\u00E1", -1, -1), + new Among("v\u00E9", -1, -1) + ], + a_5 = [new Among("\u00E1n", -1, 2), + new Among("\u00E9n", -1, 1), new Among("\u00E1nk\u00E9nt", -1, 3) + ], + a_6 = [ + new Among("stul", -1, 2), new Among("astul", 0, 1), + new Among("\u00E1stul", 0, 3), new Among("st\u00FCl", -1, 2), + new Among("est\u00FCl", 3, 1), new Among("\u00E9st\u00FCl", 3, 4) + ], + a_7 = [ + new Among("\u00E1", -1, 1), new Among("\u00E9", -1, 2) + ], + a_8 = [ + new Among("k", -1, 7), new Among("ak", 0, 4), + new Among("ek", 0, 6), new Among("ok", 0, 5), + new Among("\u00E1k", 0, 1), new Among("\u00E9k", 0, 2), + new Among("\u00F6k", 0, 3) + ], + a_9 = [new Among("\u00E9i", -1, 7), + new Among("\u00E1\u00E9i", 0, 6), new Among("\u00E9\u00E9i", 0, 5), + new Among("\u00E9", -1, 9), new Among("k\u00E9", 3, 4), + new Among("ak\u00E9", 4, 1), new Among("ek\u00E9", 4, 1), + new Among("ok\u00E9", 4, 1), new Among("\u00E1k\u00E9", 4, 3), + new Among("\u00E9k\u00E9", 4, 2), new Among("\u00F6k\u00E9", 4, 1), + new Among("\u00E9\u00E9", 3, 8) + ], + a_10 = [new Among("a", -1, 18), + new Among("ja", 0, 17), new Among("d", -1, 16), + new Among("ad", 2, 13), new Among("ed", 2, 13), + new Among("od", 2, 13), new Among("\u00E1d", 2, 14), + new Among("\u00E9d", 2, 15), new Among("\u00F6d", 2, 13), + new Among("e", -1, 18), new Among("je", 9, 17), + new Among("nk", -1, 4), new Among("unk", 11, 1), + new Among("\u00E1nk", 11, 2), new Among("\u00E9nk", 11, 3), + new Among("\u00FCnk", 11, 1), new Among("uk", -1, 8), + new Among("juk", 16, 7), new Among("\u00E1juk", 17, 5), + new Among("\u00FCk", -1, 8), new Among("j\u00FCk", 19, 7), + new Among("\u00E9j\u00FCk", 20, 6), new Among("m", -1, 12), + new Among("am", 22, 9), new Among("em", 22, 9), + new Among("om", 22, 9), new Among("\u00E1m", 22, 10), + new Among("\u00E9m", 22, 11), new Among("o", -1, 18), + new Among("\u00E1", -1, 19), new Among("\u00E9", -1, 20) + ], + a_11 = [ + new Among("id", -1, 10), new Among("aid", 0, 9), + new Among("jaid", 1, 6), new Among("eid", 0, 9), + new Among("jeid", 3, 6), new Among("\u00E1id", 0, 7), + new Among("\u00E9id", 0, 8), new Among("i", -1, 15), + new Among("ai", 7, 14), new Among("jai", 8, 11), + new Among("ei", 7, 14), new Among("jei", 10, 11), + new Among("\u00E1i", 7, 12), new Among("\u00E9i", 7, 13), + new Among("itek", -1, 24), new Among("eitek", 14, 21), + new Among("jeitek", 15, 20), new Among("\u00E9itek", 14, 23), + new Among("ik", -1, 29), new Among("aik", 18, 26), + new Among("jaik", 19, 25), new Among("eik", 18, 26), + new Among("jeik", 21, 25), new Among("\u00E1ik", 18, 27), + new Among("\u00E9ik", 18, 28), new Among("ink", -1, 20), + new Among("aink", 25, 17), new Among("jaink", 26, 16), + new Among("eink", 25, 17), new Among("jeink", 28, 16), + new Among("\u00E1ink", 25, 18), new Among("\u00E9ink", 25, 19), + new Among("aitok", -1, 21), new Among("jaitok", 32, 20), + new Among("\u00E1itok", -1, 22), new Among("im", -1, 5), + new Among("aim", 35, 4), new Among("jaim", 36, 1), + new Among("eim", 35, 4), new Among("jeim", 38, 1), + new Among("\u00E1im", 35, 2), new Among("\u00E9im", 35, 3) + ], + g_v = [ + 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 52, 14 + ], + I_p1, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_mark_regions() { + var v_1 = sbp.cursor, + v_2; + I_p1 = sbp.limit; + if (sbp.in_grouping(g_v, 97, 252)) { + while (true) { + v_2 = sbp.cursor; + if (sbp.out_grouping(g_v, 97, 252)) { + sbp.cursor = v_2; + if (!sbp.find_among(a_0, 8)) { + sbp.cursor = v_2; + if (v_2 < sbp.limit) + sbp.cursor++; + } + I_p1 = sbp.cursor; + return; + } + sbp.cursor = v_2; + if (v_2 >= sbp.limit) { + I_p1 = v_2; + return; + } + sbp.cursor++; + } + } + sbp.cursor = v_1; + if (sbp.out_grouping(g_v, 97, 252)) { + while (!sbp.in_grouping(g_v, 97, 252)) { + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_p1 = sbp.cursor; + } + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_v_ending() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_1, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_from("a"); + break; + case 2: + sbp.slice_from("e"); + break; + } + } + } + } + + function r_double() { + var v_1 = sbp.limit - sbp.cursor; + if (!sbp.find_among_b(a_2, 23)) + return false; + sbp.cursor = sbp.limit - v_1; + return true; + } + + function r_undouble() { + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.ket = sbp.cursor; + var c = sbp.cursor - 1; + if (sbp.limit_backward <= c && c <= sbp.limit) { + sbp.cursor = c; + sbp.bra = c; + sbp.slice_del(); + } + } + } + + function r_instrum() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + if (among_var == 1 || among_var == 2) + if (!r_double()) + return; + sbp.slice_del(); + r_undouble(); + } + } + } + + function r_case() { + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_4, 44)) { + sbp.bra = sbp.cursor; + if (r_R1()) { + sbp.slice_del(); + r_v_ending(); + } + } + } + + function r_case_special() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_5, 3); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_from("e"); + break; + case 2: + case 3: + sbp.slice_from("a"); + break; + } + } + } + } + + function r_case_other() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 6); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + case 2: + sbp.slice_del(); + break; + case 3: + sbp.slice_from("a"); + break; + case 4: + sbp.slice_from("e"); + break; + } + } + } + } + + function r_factive() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + if (among_var == 1 || among_var == 2) + if (!r_double()) + return; + sbp.slice_del(); + r_undouble() + } + } + } + + function r_plural() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_8, 7); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_from("a"); + break; + case 2: + sbp.slice_from("e"); + break; + case 3: + case 4: + case 5: + case 6: + case 7: + sbp.slice_del(); + break; + } + } + } + } + + function r_owned() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_9, 12); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + case 4: + case 7: + case 9: + sbp.slice_del(); + break; + case 2: + case 5: + case 8: + sbp.slice_from("e"); + break; + case 3: + case 6: + sbp.slice_from("a"); + break; + } + } + } + } + + function r_sing_owner() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_10, 31); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + case 4: + case 7: + case 8: + case 9: + case 12: + case 13: + case 16: + case 17: + case 18: + sbp.slice_del(); + break; + case 2: + case 5: + case 10: + case 14: + case 19: + sbp.slice_from("a"); + break; + case 3: + case 6: + case 11: + case 15: + case 20: + sbp.slice_from("e"); + break; + } + } + } + } + + function r_plur_owner() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_11, 42); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + case 4: + case 5: + case 6: + case 9: + case 10: + case 11: + case 14: + case 15: + case 16: + case 17: + case 20: + case 21: + case 24: + case 25: + case 26: + case 29: + sbp.slice_del(); + break; + case 2: + case 7: + case 12: + case 18: + case 22: + case 27: + sbp.slice_from("a"); + break; + case 3: + case 8: + case 13: + case 19: + case 23: + case 28: + sbp.slice_from("e"); + break; + } + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_instrum(); + sbp.cursor = sbp.limit; + r_case(); + sbp.cursor = sbp.limit; + r_case_special(); + sbp.cursor = sbp.limit; + r_case_other(); + sbp.cursor = sbp.limit; + r_factive(); + sbp.cursor = sbp.limit; + r_owned(); + sbp.cursor = sbp.limit; + r_sing_owner(); + sbp.cursor = sbp.limit; + r_plur_owner(); + sbp.cursor = sbp.limit; + r_plural(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.hu.stemmer, 'stemmer-hu'); + + /* stop word filter function */ + lunr.hu.stopWordFilter = function(token) { + if (lunr.hu.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.hu.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.hu.stopWordFilter.stopWords.length = 200; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.hu.stopWordFilter.stopWords.elements = ' a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra'.split(' '); + + lunr.Pipeline.registerFunction(lunr.hu.stopWordFilter, 'stopWordFilter-hu'); + }; +})) diff --git a/js/lunr/lunr.hu.min.js b/js/lunr/lunr.hu.min.js new file mode 100644 index 0000000..1825c26 --- /dev/null +++ b/js/lunr/lunr.hu.min.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(n){if(void 0===n)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===n.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,p,r;n.hu=function(){this.pipeline.reset(),this.pipeline.add(n.hu.trimmer,n.hu.stopWordFilter,n.hu.stemmer)},n.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",n.hu.trimmer=n.trimmerSupport.generateTrimmer(n.hu.wordCharacters),n.Pipeline.registerFunction(n.hu.trimmer,"trimmer-hu"),n.hu.stemmer=(e=n.stemmerSupport.Among,p=n.stemmerSupport.SnowballProgram,r=new function(){var r,i=[new e("cs",-1,-1),new e("dzs",-1,-1),new e("gy",-1,-1),new e("ly",-1,-1),new e("ny",-1,-1),new e("sz",-1,-1),new e("ty",-1,-1),new e("zs",-1,-1)],s=[new e("á",-1,1),new e("é",-1,2)],n=[new e("bb",-1,-1),new e("cc",-1,-1),new e("dd",-1,-1),new e("ff",-1,-1),new e("gg",-1,-1),new e("jj",-1,-1),new e("kk",-1,-1),new e("ll",-1,-1),new e("mm",-1,-1),new e("nn",-1,-1),new e("pp",-1,-1),new e("rr",-1,-1),new e("ccs",-1,-1),new e("ss",-1,-1),new e("zzs",-1,-1),new e("tt",-1,-1),new e("vv",-1,-1),new e("ggy",-1,-1),new e("lly",-1,-1),new e("nny",-1,-1),new e("tty",-1,-1),new e("ssz",-1,-1),new e("zz",-1,-1)],a=[new e("al",-1,1),new e("el",-1,2)],t=[new e("ba",-1,-1),new e("ra",-1,-1),new e("be",-1,-1),new e("re",-1,-1),new e("ig",-1,-1),new e("nak",-1,-1),new e("nek",-1,-1),new e("val",-1,-1),new e("vel",-1,-1),new e("ul",-1,-1),new e("nál",-1,-1),new e("nél",-1,-1),new e("ból",-1,-1),new e("ról",-1,-1),new e("tól",-1,-1),new e("bõl",-1,-1),new e("rõl",-1,-1),new e("tõl",-1,-1),new e("ül",-1,-1),new e("n",-1,-1),new e("an",19,-1),new e("ban",20,-1),new e("en",19,-1),new e("ben",22,-1),new e("képpen",22,-1),new e("on",19,-1),new e("ön",19,-1),new e("képp",-1,-1),new e("kor",-1,-1),new e("t",-1,-1),new e("at",29,-1),new e("et",29,-1),new e("ként",29,-1),new e("anként",32,-1),new e("enként",32,-1),new e("onként",32,-1),new e("ot",29,-1),new e("ért",29,-1),new e("öt",29,-1),new e("hez",-1,-1),new e("hoz",-1,-1),new e("höz",-1,-1),new e("vá",-1,-1),new e("vé",-1,-1)],w=[new e("án",-1,2),new e("én",-1,1),new e("ánként",-1,3)],o=[new e("stul",-1,2),new e("astul",0,1),new e("ástul",0,3),new e("stül",-1,2),new e("estül",3,1),new e("éstül",3,4)],c=[new e("á",-1,1),new e("é",-1,2)],l=[new e("k",-1,7),new e("ak",0,4),new e("ek",0,6),new e("ok",0,5),new e("ák",0,1),new e("ék",0,2),new e("ök",0,3)],m=[new e("éi",-1,7),new e("áéi",0,6),new e("ééi",0,5),new e("é",-1,9),new e("ké",3,4),new e("aké",4,1),new e("eké",4,1),new e("oké",4,1),new e("áké",4,3),new e("éké",4,2),new e("öké",4,1),new e("éé",3,8)],u=[new e("a",-1,18),new e("ja",0,17),new e("d",-1,16),new e("ad",2,13),new e("ed",2,13),new e("od",2,13),new e("ád",2,14),new e("éd",2,15),new e("öd",2,13),new e("e",-1,18),new e("je",9,17),new e("nk",-1,4),new e("unk",11,1),new e("ánk",11,2),new e("énk",11,3),new e("ünk",11,1),new e("uk",-1,8),new e("juk",16,7),new e("ájuk",17,5),new e("ük",-1,8),new e("jük",19,7),new e("éjük",20,6),new e("m",-1,12),new e("am",22,9),new e("em",22,9),new e("om",22,9),new e("ám",22,10),new e("ém",22,11),new e("o",-1,18),new e("á",-1,19),new e("é",-1,20)],k=[new e("id",-1,10),new e("aid",0,9),new e("jaid",1,6),new e("eid",0,9),new e("jeid",3,6),new e("áid",0,7),new e("éid",0,8),new e("i",-1,15),new e("ai",7,14),new e("jai",8,11),new e("ei",7,14),new e("jei",10,11),new e("ái",7,12),new e("éi",7,13),new e("itek",-1,24),new e("eitek",14,21),new e("jeitek",15,20),new e("éitek",14,23),new e("ik",-1,29),new e("aik",18,26),new e("jaik",19,25),new e("eik",18,26),new e("jeik",21,25),new e("áik",18,27),new e("éik",18,28),new e("ink",-1,20),new e("aink",25,17),new e("jaink",26,16),new e("eink",25,17),new e("jeink",28,16),new e("áink",25,18),new e("éink",25,19),new e("aitok",-1,21),new e("jaitok",32,20),new e("áitok",-1,22),new e("im",-1,5),new e("aim",35,4),new e("jaim",36,1),new e("eim",35,4),new e("jeim",38,1),new e("áim",35,2),new e("éim",35,3)],d=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],b=new p;function f(){return r<=b.cursor}function g(){var e=b.limit-b.cursor;return b.find_among_b(n,23)&&(b.cursor=b.limit-e,1)}function h(){var e;b.cursor>b.limit_backward&&(b.cursor--,b.ket=b.cursor,e=b.cursor-1,b.limit_backward<=e)&&e<=b.limit&&(b.cursor=e,b.bra=e,b.slice_del())}this.setCurrent=function(e){b.setCurrent(e)},this.getCurrent=function(){return b.getCurrent()},this.stem=function(){var e,n=b.cursor;if(function(){var e,n=b.cursor;if(r=b.limit,b.in_grouping(d,97,252))for(;;){if(e=b.cursor,b.out_grouping(d,97,252))return b.cursor=e,b.find_among(i,8)||(b.cursor=e)=b.limit)return r=e;b.cursor++}if(b.cursor=n,b.out_grouping(d,97,252)){for(;!b.in_grouping(d,97,252);){if(b.cursor>=b.limit)return;b.cursor++}r=b.cursor}}(),b.limit_backward=n,b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(a,2))&&(b.bra=b.cursor,f())&&(1!=n&&2!=n||g())&&(b.slice_del(),h()),b.cursor=b.limit,b.ket=b.cursor,b.find_among_b(t,44)&&(b.bra=b.cursor,f())&&(b.slice_del(),b.ket=b.cursor,e=b.find_among_b(s,2))&&(b.bra=b.cursor,f()))switch(e){case 1:b.slice_from("a");break;case 2:b.slice_from("e")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(w,3))&&(b.bra=b.cursor,f()))switch(n){case 1:b.slice_from("e");break;case 2:case 3:b.slice_from("a")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(o,6))&&(b.bra=b.cursor,f()))switch(n){case 1:case 2:b.slice_del();break;case 3:b.slice_from("a");break;case 4:b.slice_from("e")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(c,2))&&(b.bra=b.cursor,f())&&(1!=n&&2!=n||g())&&(b.slice_del(),h()),b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(m,12))&&(b.bra=b.cursor,f()))switch(n){case 1:case 4:case 7:case 9:b.slice_del();break;case 2:case 5:case 8:b.slice_from("e");break;case 3:case 6:b.slice_from("a")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(u,31))&&(b.bra=b.cursor,f()))switch(n){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:b.slice_del();break;case 2:case 5:case 10:case 14:case 19:b.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:b.slice_from("e")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(k,42))&&(b.bra=b.cursor,f()))switch(n){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:b.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:b.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:b.slice_from("e")}if(b.cursor=b.limit,b.ket=b.cursor,(n=b.find_among_b(l,7))&&(b.bra=b.cursor,f()))switch(n){case 1:b.slice_from("a");break;case 2:b.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:b.slice_del()}return!0}},function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}),n.Pipeline.registerFunction(n.hu.stemmer,"stemmer-hu"),n.hu.stopWordFilter=function(e){if(-1===n.hu.stopWordFilter.stopWords.indexOf(e))return e},n.hu.stopWordFilter.stopWords=new n.SortedSet,n.hu.stopWordFilter.stopWords.length=200,n.hu.stopWordFilter.stopWords.elements=" a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" "),n.Pipeline.registerFunction(n.hu.stopWordFilter,"stopWordFilter-hu")}}); diff --git a/js/lunr/lunr.it.js b/js/lunr/lunr.it.js new file mode 100644 index 0000000..90014d7 --- /dev/null +++ b/js/lunr/lunr.it.js @@ -0,0 +1,612 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.it = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.it.trimmer, + lunr.it.stopWordFilter, + lunr.it.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.it.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.it.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.it.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.it.trimmer, 'trimmer-it'); + + /* lunr stemmer function */ + lunr.it.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function ItalianStemmer() { + var a_0 = [new Among("", -1, 7), new Among("qu", 0, 6), + new Among("\u00E1", 0, 1), new Among("\u00E9", 0, 2), + new Among("\u00ED", 0, 3), new Among("\u00F3", 0, 4), + new Among("\u00FA", 0, 5) + ], + a_1 = [new Among("", -1, 3), + new Among("I", 0, 1), new Among("U", 0, 2) + ], + a_2 = [ + new Among("la", -1, -1), new Among("cela", 0, -1), + new Among("gliela", 0, -1), new Among("mela", 0, -1), + new Among("tela", 0, -1), new Among("vela", 0, -1), + new Among("le", -1, -1), new Among("cele", 6, -1), + new Among("gliele", 6, -1), new Among("mele", 6, -1), + new Among("tele", 6, -1), new Among("vele", 6, -1), + new Among("ne", -1, -1), new Among("cene", 12, -1), + new Among("gliene", 12, -1), new Among("mene", 12, -1), + new Among("sene", 12, -1), new Among("tene", 12, -1), + new Among("vene", 12, -1), new Among("ci", -1, -1), + new Among("li", -1, -1), new Among("celi", 20, -1), + new Among("glieli", 20, -1), new Among("meli", 20, -1), + new Among("teli", 20, -1), new Among("veli", 20, -1), + new Among("gli", 20, -1), new Among("mi", -1, -1), + new Among("si", -1, -1), new Among("ti", -1, -1), + new Among("vi", -1, -1), new Among("lo", -1, -1), + new Among("celo", 31, -1), new Among("glielo", 31, -1), + new Among("melo", 31, -1), new Among("telo", 31, -1), + new Among("velo", 31, -1) + ], + a_3 = [new Among("ando", -1, 1), + new Among("endo", -1, 1), new Among("ar", -1, 2), + new Among("er", -1, 2), new Among("ir", -1, 2) + ], + a_4 = [ + new Among("ic", -1, -1), new Among("abil", -1, -1), + new Among("os", -1, -1), new Among("iv", -1, 1) + ], + a_5 = [ + new Among("ic", -1, 1), new Among("abil", -1, 1), + new Among("iv", -1, 1) + ], + a_6 = [new Among("ica", -1, 1), + new Among("logia", -1, 3), new Among("osa", -1, 1), + new Among("ista", -1, 1), new Among("iva", -1, 9), + new Among("anza", -1, 1), new Among("enza", -1, 5), + new Among("ice", -1, 1), new Among("atrice", 7, 1), + new Among("iche", -1, 1), new Among("logie", -1, 3), + new Among("abile", -1, 1), new Among("ibile", -1, 1), + new Among("usione", -1, 4), new Among("azione", -1, 2), + new Among("uzione", -1, 4), new Among("atore", -1, 2), + new Among("ose", -1, 1), new Among("ante", -1, 1), + new Among("mente", -1, 1), new Among("amente", 19, 7), + new Among("iste", -1, 1), new Among("ive", -1, 9), + new Among("anze", -1, 1), new Among("enze", -1, 5), + new Among("ici", -1, 1), new Among("atrici", 25, 1), + new Among("ichi", -1, 1), new Among("abili", -1, 1), + new Among("ibili", -1, 1), new Among("ismi", -1, 1), + new Among("usioni", -1, 4), new Among("azioni", -1, 2), + new Among("uzioni", -1, 4), new Among("atori", -1, 2), + new Among("osi", -1, 1), new Among("anti", -1, 1), + new Among("amenti", -1, 6), new Among("imenti", -1, 6), + new Among("isti", -1, 1), new Among("ivi", -1, 9), + new Among("ico", -1, 1), new Among("ismo", -1, 1), + new Among("oso", -1, 1), new Among("amento", -1, 6), + new Among("imento", -1, 6), new Among("ivo", -1, 9), + new Among("it\u00E0", -1, 8), new Among("ist\u00E0", -1, 1), + new Among("ist\u00E8", -1, 1), new Among("ist\u00EC", -1, 1) + ], + a_7 = [ + new Among("isca", -1, 1), new Among("enda", -1, 1), + new Among("ata", -1, 1), new Among("ita", -1, 1), + new Among("uta", -1, 1), new Among("ava", -1, 1), + new Among("eva", -1, 1), new Among("iva", -1, 1), + new Among("erebbe", -1, 1), new Among("irebbe", -1, 1), + new Among("isce", -1, 1), new Among("ende", -1, 1), + new Among("are", -1, 1), new Among("ere", -1, 1), + new Among("ire", -1, 1), new Among("asse", -1, 1), + new Among("ate", -1, 1), new Among("avate", 16, 1), + new Among("evate", 16, 1), new Among("ivate", 16, 1), + new Among("ete", -1, 1), new Among("erete", 20, 1), + new Among("irete", 20, 1), new Among("ite", -1, 1), + new Among("ereste", -1, 1), new Among("ireste", -1, 1), + new Among("ute", -1, 1), new Among("erai", -1, 1), + new Among("irai", -1, 1), new Among("isci", -1, 1), + new Among("endi", -1, 1), new Among("erei", -1, 1), + new Among("irei", -1, 1), new Among("assi", -1, 1), + new Among("ati", -1, 1), new Among("iti", -1, 1), + new Among("eresti", -1, 1), new Among("iresti", -1, 1), + new Among("uti", -1, 1), new Among("avi", -1, 1), + new Among("evi", -1, 1), new Among("ivi", -1, 1), + new Among("isco", -1, 1), new Among("ando", -1, 1), + new Among("endo", -1, 1), new Among("Yamo", -1, 1), + new Among("iamo", -1, 1), new Among("avamo", -1, 1), + new Among("evamo", -1, 1), new Among("ivamo", -1, 1), + new Among("eremo", -1, 1), new Among("iremo", -1, 1), + new Among("assimo", -1, 1), new Among("ammo", -1, 1), + new Among("emmo", -1, 1), new Among("eremmo", 54, 1), + new Among("iremmo", 54, 1), new Among("immo", -1, 1), + new Among("ano", -1, 1), new Among("iscano", 58, 1), + new Among("avano", 58, 1), new Among("evano", 58, 1), + new Among("ivano", 58, 1), new Among("eranno", -1, 1), + new Among("iranno", -1, 1), new Among("ono", -1, 1), + new Among("iscono", 65, 1), new Among("arono", 65, 1), + new Among("erono", 65, 1), new Among("irono", 65, 1), + new Among("erebbero", -1, 1), new Among("irebbero", -1, 1), + new Among("assero", -1, 1), new Among("essero", -1, 1), + new Among("issero", -1, 1), new Among("ato", -1, 1), + new Among("ito", -1, 1), new Among("uto", -1, 1), + new Among("avo", -1, 1), new Among("evo", -1, 1), + new Among("ivo", -1, 1), new Among("ar", -1, 1), + new Among("ir", -1, 1), new Among("er\u00E0", -1, 1), + new Among("ir\u00E0", -1, 1), new Among("er\u00F2", -1, 1), + new Among("ir\u00F2", -1, 1) + ], + g_v = [17, 65, 16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1 + ], + g_AEIO = [17, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2 + ], + g_CG = [17], + I_p2, I_p1, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(c1, c2, v_1) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 249)) { + sbp.slice_from(c2); + sbp.cursor = v_1; + return true; + } + } + return false; + } + + function r_prelude() { + var among_var, v_1 = sbp.cursor, + v_2, v_3, v_4; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_0, 7); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("\u00E0"); + continue; + case 2: + sbp.slice_from("\u00E8"); + continue; + case 3: + sbp.slice_from("\u00EC"); + continue; + case 4: + sbp.slice_from("\u00F2"); + continue; + case 5: + sbp.slice_from("\u00F9"); + continue; + case 6: + sbp.slice_from("qU"); + continue; + case 7: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + sbp.cursor = v_1; + while (true) { + v_2 = sbp.cursor; + while (true) { + v_3 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 249)) { + sbp.bra = sbp.cursor; + v_4 = sbp.cursor; + if (habr1("u", "U", v_3)) + break; + sbp.cursor = v_4; + if (habr1("i", "I", v_3)) + break; + } + sbp.cursor = v_3; + if (sbp.cursor >= sbp.limit) { + sbp.cursor = v_2; + return; + } + sbp.cursor++; + } + } + } + + function habr2(v_1) { + sbp.cursor = v_1; + if (!sbp.in_grouping(g_v, 97, 249)) + return false; + while (!sbp.out_grouping(g_v, 97, 249)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function habr3() { + if (sbp.in_grouping(g_v, 97, 249)) { + var v_1 = sbp.cursor; + if (sbp.out_grouping(g_v, 97, 249)) { + while (!sbp.in_grouping(g_v, 97, 249)) { + if (sbp.cursor >= sbp.limit) + return habr2(v_1); + sbp.cursor++; + } + return true; + } + return habr2(v_1); + } + return false; + } + + function habr4() { + var v_1 = sbp.cursor, + v_2; + if (!habr3()) { + sbp.cursor = v_1; + if (!sbp.out_grouping(g_v, 97, 249)) + return; + v_2 = sbp.cursor; + if (sbp.out_grouping(g_v, 97, 249)) { + while (!sbp.in_grouping(g_v, 97, 249)) { + if (sbp.cursor >= sbp.limit) { + sbp.cursor = v_2; + if (sbp.in_grouping(g_v, 97, 249) && sbp.cursor < sbp.limit) + sbp.cursor++; + return; + } + sbp.cursor++; + } + I_pV = sbp.cursor; + return; + } + sbp.cursor = v_2; + if (!sbp.in_grouping(g_v, 97, 249) || sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_pV = sbp.cursor; + } + + function habr5() { + while (!sbp.in_grouping(g_v, 97, 249)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 249)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + var v_1 = sbp.cursor; + I_pV = sbp.limit; + I_p1 = I_pV; + I_p2 = I_pV; + habr4(); + sbp.cursor = v_1; + if (habr5()) { + I_p1 = sbp.cursor; + if (habr5()) + I_p2 = sbp.cursor; + } + } + + function r_postlude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_1, 3); + if (!among_var) + break; + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("i"); + break; + case 2: + sbp.slice_from("u"); + break; + case 3: + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + break; + } + } + } + + function r_RV() { + return I_pV <= sbp.cursor; + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_attached_pronoun() { + var among_var; + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_2, 37)) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among_b(a_3, 5); + if (among_var && r_RV()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + sbp.slice_from("e"); + break; + } + } + } + } + + function r_standard_suffix() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 51); + if (!among_var) + return false; + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + return false; + sbp.slice_del(); + break; + case 2: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ic")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + break; + case 3: + if (!r_R2()) + return false; + sbp.slice_from("log"); + break; + case 4: + if (!r_R2()) + return false; + sbp.slice_from("u"); + break; + case 5: + if (!r_R2()) + return false; + sbp.slice_from("ente"); + break; + case 6: + if (!r_RV()) + return false; + sbp.slice_del(); + break; + case 7: + if (!r_R1()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 4); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + sbp.slice_del(); + if (among_var == 1) { + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + } + } + } + break; + case 8: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_5, 3); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + if (r_R2()) + sbp.slice_del(); + } + break; + case 9: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "ic")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + } + } + break; + } + return true; + } + + function r_verb_suffix() { + var among_var, v_1; + if (sbp.cursor >= I_pV) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 87); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + sbp.slice_del(); + } + sbp.limit_backward = v_1; + } + } + + function habr6() { + var v_1 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (sbp.in_grouping_b(g_AEIO, 97, 242)) { + sbp.bra = sbp.cursor; + if (r_RV()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "i")) { + sbp.bra = sbp.cursor; + if (r_RV()) { + sbp.slice_del(); + return; + } + } + } + } + sbp.cursor = sbp.limit - v_1; + } + + function r_vowel_suffix() { + habr6(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "h")) { + sbp.bra = sbp.cursor; + if (sbp.in_grouping_b(g_CG, 99, 103)) + if (r_RV()) + sbp.slice_del(); + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_attached_pronoun(); + sbp.cursor = sbp.limit; + if (!r_standard_suffix()) { + sbp.cursor = sbp.limit; + r_verb_suffix(); + } + sbp.cursor = sbp.limit; + r_vowel_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.it.stemmer, 'stemmer-it'); + + /* stop word filter function */ + lunr.it.stopWordFilter = function(token) { + if (lunr.it.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.it.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.it.stopWordFilter.stopWords.length = 280; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.it.stopWordFilter.stopWords.elements = ' a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è'.split(' '); + + lunr.Pipeline.registerFunction(lunr.it.stopWordFilter, 'stopWordFilter-it'); + }; +})) diff --git a/js/lunr/lunr.it.min.js b/js/lunr/lunr.it.min.js new file mode 100644 index 0000000..36b30b5 --- /dev/null +++ b/js/lunr/lunr.it.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,i,n;r.it=function(){this.pipeline.reset(),this.pipeline.add(r.it.trimmer,r.it.stopWordFilter,r.it.stemmer)},r.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.it.trimmer=r.trimmerSupport.generateTrimmer(r.it.wordCharacters),r.Pipeline.registerFunction(r.it.trimmer,"trimmer-it"),r.it.stemmer=(e=r.stemmerSupport.Among,i=r.stemmerSupport.SnowballProgram,n=new function(){var n,o,s,t=[new e("",-1,7),new e("qu",0,6),new e("á",0,1),new e("é",0,2),new e("í",0,3),new e("ó",0,4),new e("ú",0,5)],a=[new e("",-1,3),new e("I",0,1),new e("U",0,2)],u=[new e("la",-1,-1),new e("cela",0,-1),new e("gliela",0,-1),new e("mela",0,-1),new e("tela",0,-1),new e("vela",0,-1),new e("le",-1,-1),new e("cele",6,-1),new e("gliele",6,-1),new e("mele",6,-1),new e("tele",6,-1),new e("vele",6,-1),new e("ne",-1,-1),new e("cene",12,-1),new e("gliene",12,-1),new e("mene",12,-1),new e("sene",12,-1),new e("tene",12,-1),new e("vene",12,-1),new e("ci",-1,-1),new e("li",-1,-1),new e("celi",20,-1),new e("glieli",20,-1),new e("meli",20,-1),new e("teli",20,-1),new e("veli",20,-1),new e("gli",20,-1),new e("mi",-1,-1),new e("si",-1,-1),new e("ti",-1,-1),new e("vi",-1,-1),new e("lo",-1,-1),new e("celo",31,-1),new e("glielo",31,-1),new e("melo",31,-1),new e("telo",31,-1),new e("velo",31,-1)],c=[new e("ando",-1,1),new e("endo",-1,1),new e("ar",-1,2),new e("er",-1,2),new e("ir",-1,2)],w=[new e("ic",-1,-1),new e("abil",-1,-1),new e("os",-1,-1),new e("iv",-1,1)],l=[new e("ic",-1,1),new e("abil",-1,1),new e("iv",-1,1)],m=[new e("ica",-1,1),new e("logia",-1,3),new e("osa",-1,1),new e("ista",-1,1),new e("iva",-1,9),new e("anza",-1,1),new e("enza",-1,5),new e("ice",-1,1),new e("atrice",7,1),new e("iche",-1,1),new e("logie",-1,3),new e("abile",-1,1),new e("ibile",-1,1),new e("usione",-1,4),new e("azione",-1,2),new e("uzione",-1,4),new e("atore",-1,2),new e("ose",-1,1),new e("ante",-1,1),new e("mente",-1,1),new e("amente",19,7),new e("iste",-1,1),new e("ive",-1,9),new e("anze",-1,1),new e("enze",-1,5),new e("ici",-1,1),new e("atrici",25,1),new e("ichi",-1,1),new e("abili",-1,1),new e("ibili",-1,1),new e("ismi",-1,1),new e("usioni",-1,4),new e("azioni",-1,2),new e("uzioni",-1,4),new e("atori",-1,2),new e("osi",-1,1),new e("anti",-1,1),new e("amenti",-1,6),new e("imenti",-1,6),new e("isti",-1,1),new e("ivi",-1,9),new e("ico",-1,1),new e("ismo",-1,1),new e("oso",-1,1),new e("amento",-1,6),new e("imento",-1,6),new e("ivo",-1,9),new e("ità",-1,8),new e("istà",-1,1),new e("istè",-1,1),new e("istì",-1,1)],f=[new e("isca",-1,1),new e("enda",-1,1),new e("ata",-1,1),new e("ita",-1,1),new e("uta",-1,1),new e("ava",-1,1),new e("eva",-1,1),new e("iva",-1,1),new e("erebbe",-1,1),new e("irebbe",-1,1),new e("isce",-1,1),new e("ende",-1,1),new e("are",-1,1),new e("ere",-1,1),new e("ire",-1,1),new e("asse",-1,1),new e("ate",-1,1),new e("avate",16,1),new e("evate",16,1),new e("ivate",16,1),new e("ete",-1,1),new e("erete",20,1),new e("irete",20,1),new e("ite",-1,1),new e("ereste",-1,1),new e("ireste",-1,1),new e("ute",-1,1),new e("erai",-1,1),new e("irai",-1,1),new e("isci",-1,1),new e("endi",-1,1),new e("erei",-1,1),new e("irei",-1,1),new e("assi",-1,1),new e("ati",-1,1),new e("iti",-1,1),new e("eresti",-1,1),new e("iresti",-1,1),new e("uti",-1,1),new e("avi",-1,1),new e("evi",-1,1),new e("ivi",-1,1),new e("isco",-1,1),new e("ando",-1,1),new e("endo",-1,1),new e("Yamo",-1,1),new e("iamo",-1,1),new e("avamo",-1,1),new e("evamo",-1,1),new e("ivamo",-1,1),new e("eremo",-1,1),new e("iremo",-1,1),new e("assimo",-1,1),new e("ammo",-1,1),new e("emmo",-1,1),new e("eremmo",54,1),new e("iremmo",54,1),new e("immo",-1,1),new e("ano",-1,1),new e("iscano",58,1),new e("avano",58,1),new e("evano",58,1),new e("ivano",58,1),new e("eranno",-1,1),new e("iranno",-1,1),new e("ono",-1,1),new e("iscono",65,1),new e("arono",65,1),new e("erono",65,1),new e("irono",65,1),new e("erebbero",-1,1),new e("irebbero",-1,1),new e("assero",-1,1),new e("essero",-1,1),new e("issero",-1,1),new e("ato",-1,1),new e("ito",-1,1),new e("uto",-1,1),new e("avo",-1,1),new e("evo",-1,1),new e("ivo",-1,1),new e("ar",-1,1),new e("ir",-1,1),new e("erà",-1,1),new e("irà",-1,1),new e("erò",-1,1),new e("irò",-1,1)],v=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],b=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],d=[17],_=new i;function g(e,r,i){return _.eq_s(1,e)&&(_.ket=_.cursor,_.in_grouping(v,97,249))&&(_.slice_from(r),_.cursor=i,1)}function p(e){if(_.cursor=e,!_.in_grouping(v,97,249))return!1;for(;!_.out_grouping(v,97,249);){if(_.cursor>=_.limit)return!1;_.cursor++}return!0}function k(){for(;!_.in_grouping(v,97,249);){if(_.cursor>=_.limit)return;_.cursor++}for(;!_.out_grouping(v,97,249);){if(_.cursor>=_.limit)return;_.cursor++}return 1}function h(){return s<=_.cursor}function q(){return n<=_.cursor}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e,r,i=_.cursor;if(function(){for(var e,r,i,n,o=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(t,7))switch(_.ket=_.cursor,e){case 1:_.slice_from("à");continue;case 2:_.slice_from("è");continue;case 3:_.slice_from("ì");continue;case 4:_.slice_from("ò");continue;case 5:_.slice_from("ù");continue;case 6:_.slice_from("qU");continue;case 7:if(!(_.cursor>=_.limit)){_.cursor++;continue}}break}for(_.cursor=o;;)for(r=_.cursor;;){if(i=_.cursor,_.in_grouping(v,97,249)){if(_.bra=_.cursor,n=_.cursor,g("u","U",i))break;if(_.cursor=n,g("i","I",i))break}if(_.cursor=i,_.cursor>=_.limit)return _.cursor=r;_.cursor++}}(),_.cursor=i,e=_.cursor,s=_.limit,n=o=s,function(){var e,r=_.cursor;if(!function(){if(_.in_grouping(v,97,249)){var e=_.cursor;if(_.out_grouping(v,97,249)){for(;!_.in_grouping(v,97,249);){if(_.cursor>=_.limit)return p(e);_.cursor++}return 1}return p(e)}}()){if(_.cursor=r,!_.out_grouping(v,97,249))return;if(e=_.cursor,_.out_grouping(v,97,249)){for(;!_.in_grouping(v,97,249);){if(_.cursor>=_.limit)return _.cursor=e,_.in_grouping(v,97,249)&&_.cursor<_.limit&&_.cursor++;_.cursor++}return s=_.cursor}if(_.cursor=e,!_.in_grouping(v,97,249)||_.cursor>=_.limit)return;_.cursor++}s=_.cursor}(),_.cursor=e,k()&&(o=_.cursor,k())&&(n=_.cursor),_.limit_backward=i,_.cursor=_.limit,_.ket=_.cursor,_.find_among_b(u,37)&&(_.bra=_.cursor,r=_.find_among_b(c,5))&&h())switch(r){case 1:_.slice_del();break;case 2:_.slice_from("e")}return _.cursor=_.limit,function(){var e;if(_.ket=_.cursor,e=_.find_among_b(m,51)){switch(_.bra=_.cursor,e){case 1:if(!q())return;_.slice_del();break;case 2:if(!q())return;_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"ic")&&(_.bra=_.cursor,q())&&_.slice_del();break;case 3:if(!q())return;_.slice_from("log");break;case 4:if(!q())return;_.slice_from("u");break;case 5:if(!q())return;_.slice_from("ente");break;case 6:if(!h())return;_.slice_del();break;case 7:if(!(o<=_.cursor))return;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(w,4))&&(_.bra=_.cursor,q())&&(_.slice_del(),1==e)&&(_.ket=_.cursor,_.eq_s_b(2,"at"))&&(_.bra=_.cursor,q())&&_.slice_del();break;case 8:if(!q())return;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(l,3))&&(_.bra=_.cursor,1==e)&&q()&&_.slice_del();break;case 9:if(!q())return;_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"at")&&(_.bra=_.cursor,q())&&(_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"ic"))&&(_.bra=_.cursor,q())&&_.slice_del()}return 1}}()||(_.cursor=_.limit,_.cursor>=s&&(e=_.limit_backward,_.limit_backward=s,_.ket=_.cursor,(i=_.find_among_b(f,87))&&(_.bra=_.cursor,1==i)&&_.slice_del(),_.limit_backward=e)),_.cursor=_.limit,r=_.limit-_.cursor,_.ket=_.cursor,_.in_grouping_b(b,97,242)&&(_.bra=_.cursor,h())&&(_.slice_del(),_.ket=_.cursor,_.eq_s_b(1,"i"))&&(_.bra=_.cursor,h())?_.slice_del():_.cursor=_.limit-r,_.ket=_.cursor,_.eq_s_b(1,"h")&&(_.bra=_.cursor,_.in_grouping_b(d,99,103))&&h()&&_.slice_del(),_.cursor=_.limit_backward,function(){for(var e;_.bra=_.cursor,e=_.find_among(a,3);)switch(_.ket=_.cursor,e){case 1:_.slice_from("i");break;case 2:_.slice_from("u");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}),r.Pipeline.registerFunction(r.it.stemmer,"stemmer-it"),r.it.stopWordFilter=function(e){if(-1===r.it.stopWordFilter.stopWords.indexOf(e))return e},r.it.stopWordFilter.stopWords=new r.SortedSet,r.it.stopWordFilter.stopWords.length=280,r.it.stopWordFilter.stopWords.elements=" a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" "),r.Pipeline.registerFunction(r.it.stopWordFilter,"stopWordFilter-it")}}); diff --git a/js/lunr/lunr.jp.js b/js/lunr/lunr.jp.js new file mode 100644 index 0000000..90a7629 --- /dev/null +++ b/js/lunr/lunr.jp.js @@ -0,0 +1,120 @@ +/*! + * Lunr languages, `Japanese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Chad Liu + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.jp = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.jp.stopWordFilter, + lunr.jp.stemmer + ); + // change the tokenizer for japanese one + lunr.tokenizer = lunr.jp.tokenizer; + }; + var segmenter = new TinySegmenter(); // インスタンス生成 + + lunr.jp.tokenizer = function (obj) { + if (!arguments.length || obj == null || obj == undefined) return []; + if (Array.isArray(obj)) + return obj.map(function (t) { + return t.toLowerCase(); + }); + + var str = obj.toString().replace(/^\s+/, ''); + + for (var i = str.length - 1; i >= 0; i--) { + if (/\S/.test(str.charAt(i))) { + str = str.substring(0, i + 1); + break; + } + } + + var segs = segmenter.segment(str); // 単語の配列が返る + return segs + .filter(function (token) { + return !!token; + }) + .map(function (token) { + return token; + }); + }; + + /* lunr stemmer function */ + lunr.jp.stemmer = (function () { + /* TODO japanese stemmer */ + return function (word) { + return word; + }; + })(); + + lunr.Pipeline.registerFunction(lunr.jp.stemmer, 'stemmer-jp'); + + /* stop word filter function */ + lunr.jp.stopWordFilter = function(token) { + if (lunr.jp.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.jp.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.jp.stopWordFilter.stopWords.length = 45; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + // stopword for japanese is from http://www.ranks.nl/stopwords/japanese + lunr.jp.stopWordFilter.stopWords.elements = ' これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし'.split(' '); + lunr.Pipeline.registerFunction(lunr.jp.stopWordFilter, 'stopWordFilter-jp'); + }; +})) diff --git a/js/lunr/lunr.jp.min.js b/js/lunr/lunr.jp.min.js new file mode 100644 index 0000000..a978f34 --- /dev/null +++ b/js/lunr/lunr.jp.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.jp=function(){this.pipeline.reset(),this.pipeline.add(r.jp.stopWordFilter,r.jp.stemmer),r.tokenizer=r.jp.tokenizer};var n=new TinySegmenter;r.jp.tokenizer=function(e){if(!arguments.length||null==e)return[];if(Array.isArray(e))return e.map(function(e){return e.toLowerCase()});for(var r=e.toString().replace(/^\s+/,""),t=r.length-1;0<=t;t--)if(/\S/.test(r.charAt(t))){r=r.substring(0,t+1);break}return n.segment(r).filter(function(e){return!!e}).map(function(e){return e})},r.jp.stemmer=function(e){return e},r.Pipeline.registerFunction(r.jp.stemmer,"stemmer-jp"),r.jp.stopWordFilter=function(e){if(-1===r.jp.stopWordFilter.stopWords.indexOf(e))return e},r.jp.stopWordFilter.stopWords=new r.SortedSet,r.jp.stopWordFilter.stopWords.length=45,r.jp.stopWordFilter.stopWords.elements=" これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" "),r.Pipeline.registerFunction(r.jp.stopWordFilter,"stopWordFilter-jp")}}); diff --git a/js/lunr/lunr.no.js b/js/lunr/lunr.no.js new file mode 100644 index 0000000..5917006 --- /dev/null +++ b/js/lunr/lunr.no.js @@ -0,0 +1,253 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.no = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.no.trimmer, + lunr.no.stopWordFilter, + lunr.no.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.no.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.no.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.no.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.no.trimmer, 'trimmer-no'); + + /* lunr stemmer function */ + lunr.no.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function NorwegianStemmer() { + var a_0 = [new Among("a", -1, 1), new Among("e", -1, 1), + new Among("ede", 1, 1), new Among("ande", 1, 1), + new Among("ende", 1, 1), new Among("ane", 1, 1), + new Among("ene", 1, 1), new Among("hetene", 6, 1), + new Among("erte", 1, 3), new Among("en", -1, 1), + new Among("heten", 9, 1), new Among("ar", -1, 1), + new Among("er", -1, 1), new Among("heter", 12, 1), + new Among("s", -1, 2), new Among("as", 14, 1), + new Among("es", 14, 1), new Among("edes", 16, 1), + new Among("endes", 16, 1), new Among("enes", 16, 1), + new Among("hetenes", 19, 1), new Among("ens", 14, 1), + new Among("hetens", 21, 1), new Among("ers", 14, 1), + new Among("ets", 14, 1), new Among("et", -1, 1), + new Among("het", 25, 1), new Among("ert", -1, 3), + new Among("ast", -1, 1) + ], + a_1 = [new Among("dt", -1, -1), + new Among("vt", -1, -1) + ], + a_2 = [new Among("leg", -1, 1), + new Among("eleg", 0, 1), new Among("ig", -1, 1), + new Among("eig", 2, 1), new Among("lig", 2, 1), + new Among("elig", 4, 1), new Among("els", -1, 1), + new Among("lov", -1, 1), new Among("elov", 7, 1), + new Among("slov", 7, 1), new Among("hetslov", 9, 1) + ], + g_v = [17, + 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 + ], + g_s_ending = [ + 119, 125, 149, 1 + ], + I_x, I_p1, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_mark_regions() { + var v_1, c = sbp.cursor + 3; + I_p1 = sbp.limit; + if (0 <= c || c <= sbp.limit) { + I_x = c; + while (true) { + v_1 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 248)) { + sbp.cursor = v_1; + break; + } + if (v_1 >= sbp.limit) + return; + sbp.cursor = v_1 + 1; + } + while (!sbp.out_grouping(g_v, 97, 248)) { + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_p1 = sbp.cursor; + if (I_p1 < I_x) + I_p1 = I_x; + } + } + + function r_main_suffix() { + var among_var, v_1, v_2; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_0, 29); + sbp.limit_backward = v_1; + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + v_2 = sbp.limit - sbp.cursor; + if (sbp.in_grouping_b(g_s_ending, 98, 122)) + sbp.slice_del(); + else { + sbp.cursor = sbp.limit - v_2; + if (sbp.eq_s_b(1, "k") && sbp.out_grouping_b(g_v, 97, 248)) + sbp.slice_del(); + } + break; + case 3: + sbp.slice_from("er"); + break; + } + } + } + } + + function r_consonant_pair() { + var v_1 = sbp.limit - sbp.cursor, + v_2; + if (sbp.cursor >= I_p1) { + v_2 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + if (sbp.find_among_b(a_1, 2)) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_2; + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + } else + sbp.limit_backward = v_2; + } + } + + function r_other_suffix() { + var among_var, v_1; + if (sbp.cursor >= I_p1) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 11); + if (among_var) { + sbp.bra = sbp.cursor; + sbp.limit_backward = v_1; + if (among_var == 1) + sbp.slice_del(); + } else + sbp.limit_backward = v_1; + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_main_suffix(); + sbp.cursor = sbp.limit; + r_consonant_pair(); + sbp.cursor = sbp.limit; + r_other_suffix(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.no.stemmer, 'stemmer-no'); + + /* stop word filter function */ + lunr.no.stopWordFilter = function(token) { + if (lunr.no.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.no.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.no.stopWordFilter.stopWords.length = 177; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.no.stopWordFilter.stopWords.elements = ' alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å'.split(' '); + + lunr.Pipeline.registerFunction(lunr.no.stopWordFilter, 'stopWordFilter-no'); + }; +})) diff --git a/js/lunr/lunr.no.min.js b/js/lunr/lunr.no.min.js new file mode 100644 index 0000000..f809a60 --- /dev/null +++ b/js/lunr/lunr.no.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,n,i;r.no=function(){this.pipeline.reset(),this.pipeline.add(r.no.trimmer,r.no.stopWordFilter,r.no.stemmer)},r.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.no.trimmer=r.trimmerSupport.generateTrimmer(r.no.wordCharacters),r.Pipeline.registerFunction(r.no.trimmer,"trimmer-no"),r.no.stemmer=(e=r.stemmerSupport.Among,n=r.stemmerSupport.SnowballProgram,i=new function(){var i,t,o=[new e("a",-1,1),new e("e",-1,1),new e("ede",1,1),new e("ande",1,1),new e("ende",1,1),new e("ane",1,1),new e("ene",1,1),new e("hetene",6,1),new e("erte",1,3),new e("en",-1,1),new e("heten",9,1),new e("ar",-1,1),new e("er",-1,1),new e("heter",12,1),new e("s",-1,2),new e("as",14,1),new e("es",14,1),new e("edes",16,1),new e("endes",16,1),new e("enes",16,1),new e("hetenes",19,1),new e("ens",14,1),new e("hetens",21,1),new e("ers",14,1),new e("ets",14,1),new e("et",-1,1),new e("het",25,1),new e("ert",-1,3),new e("ast",-1,1)],s=[new e("dt",-1,-1),new e("vt",-1,-1)],m=[new e("leg",-1,1),new e("eleg",0,1),new e("ig",-1,1),new e("eig",2,1),new e("lig",2,1),new e("elig",4,1),new e("els",-1,1),new e("lov",-1,1),new e("elov",7,1),new e("slov",7,1),new e("hetslov",9,1)],a=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],l=[119,125,149,1],d=new n;this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r,n=d.cursor;if(function(){var e,r=d.cursor+3;if(t=d.limit,0<=r||r<=d.limit){for(i=r;;){if(e=d.cursor,d.in_grouping(a,97,248)){d.cursor=e;break}if(e>=d.limit)return;d.cursor=e+1}for(;!d.out_grouping(a,97,248);){if(d.cursor>=d.limit)return;d.cursor++}(t=d.cursor)=t&&(n=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,r=d.find_among_b(o,29),d.limit_backward=n,r))switch(d.bra=d.cursor,r){case 1:d.slice_del();break;case 2:e=d.limit-d.cursor,(d.in_grouping_b(l,98,122)||(d.cursor=d.limit-e,d.eq_s_b(1,"k")&&d.out_grouping_b(a,97,248)))&&d.slice_del();break;case 3:d.slice_from("er")}return d.cursor=d.limit,n=d.limit-d.cursor,d.cursor>=t&&(r=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,d.find_among_b(s,2)?(d.bra=d.cursor,d.limit_backward=r,d.cursor=d.limit-n,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())):d.limit_backward=r),d.cursor=d.limit,d.cursor>=t&&(n=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,(r=d.find_among_b(m,11))?(d.bra=d.cursor,d.limit_backward=n,1==r&&d.slice_del()):d.limit_backward=n),!0}},function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}),r.Pipeline.registerFunction(r.no.stemmer,"stemmer-no"),r.no.stopWordFilter=function(e){if(-1===r.no.stopWordFilter.stopWords.indexOf(e))return e},r.no.stopWordFilter.stopWords=new r.SortedSet,r.no.stopWordFilter.stopWords.length=177,r.no.stopWordFilter.stopWords.elements=" alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" "),r.Pipeline.registerFunction(r.no.stopWordFilter,"stopWordFilter-no")}}); diff --git a/js/lunr/lunr.pt.js b/js/lunr/lunr.pt.js new file mode 100644 index 0000000..d960d97 --- /dev/null +++ b/js/lunr/lunr.pt.js @@ -0,0 +1,566 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.pt = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.pt.trimmer, + lunr.pt.stopWordFilter, + lunr.pt.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.pt.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.pt.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.pt.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.pt.trimmer, 'trimmer-pt'); + + /* lunr stemmer function */ + lunr.pt.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function PortugueseStemmer() { + var a_0 = [new Among("", -1, 3), new Among("\u00E3", 0, 1), + new Among("\u00F5", 0, 2) + ], + a_1 = [new Among("", -1, 3), + new Among("a~", 0, 1), new Among("o~", 0, 2) + ], + a_2 = [ + new Among("ic", -1, -1), new Among("ad", -1, -1), + new Among("os", -1, -1), new Among("iv", -1, 1) + ], + a_3 = [ + new Among("ante", -1, 1), new Among("avel", -1, 1), + new Among("\u00EDvel", -1, 1) + ], + a_4 = [new Among("ic", -1, 1), + new Among("abil", -1, 1), new Among("iv", -1, 1) + ], + a_5 = [ + new Among("ica", -1, 1), new Among("\u00E2ncia", -1, 1), + new Among("\u00EAncia", -1, 4), new Among("ira", -1, 9), + new Among("adora", -1, 1), new Among("osa", -1, 1), + new Among("ista", -1, 1), new Among("iva", -1, 8), + new Among("eza", -1, 1), new Among("log\u00EDa", -1, 2), + new Among("idade", -1, 7), new Among("ante", -1, 1), + new Among("mente", -1, 6), new Among("amente", 12, 5), + new Among("\u00E1vel", -1, 1), new Among("\u00EDvel", -1, 1), + new Among("uci\u00F3n", -1, 3), new Among("ico", -1, 1), + new Among("ismo", -1, 1), new Among("oso", -1, 1), + new Among("amento", -1, 1), new Among("imento", -1, 1), + new Among("ivo", -1, 8), new Among("a\u00E7a~o", -1, 1), + new Among("ador", -1, 1), new Among("icas", -1, 1), + new Among("\u00EAncias", -1, 4), new Among("iras", -1, 9), + new Among("adoras", -1, 1), new Among("osas", -1, 1), + new Among("istas", -1, 1), new Among("ivas", -1, 8), + new Among("ezas", -1, 1), new Among("log\u00EDas", -1, 2), + new Among("idades", -1, 7), new Among("uciones", -1, 3), + new Among("adores", -1, 1), new Among("antes", -1, 1), + new Among("a\u00E7o~es", -1, 1), new Among("icos", -1, 1), + new Among("ismos", -1, 1), new Among("osos", -1, 1), + new Among("amentos", -1, 1), new Among("imentos", -1, 1), + new Among("ivos", -1, 8) + ], + a_6 = [new Among("ada", -1, 1), + new Among("ida", -1, 1), new Among("ia", -1, 1), + new Among("aria", 2, 1), new Among("eria", 2, 1), + new Among("iria", 2, 1), new Among("ara", -1, 1), + new Among("era", -1, 1), new Among("ira", -1, 1), + new Among("ava", -1, 1), new Among("asse", -1, 1), + new Among("esse", -1, 1), new Among("isse", -1, 1), + new Among("aste", -1, 1), new Among("este", -1, 1), + new Among("iste", -1, 1), new Among("ei", -1, 1), + new Among("arei", 16, 1), new Among("erei", 16, 1), + new Among("irei", 16, 1), new Among("am", -1, 1), + new Among("iam", 20, 1), new Among("ariam", 21, 1), + new Among("eriam", 21, 1), new Among("iriam", 21, 1), + new Among("aram", 20, 1), new Among("eram", 20, 1), + new Among("iram", 20, 1), new Among("avam", 20, 1), + new Among("em", -1, 1), new Among("arem", 29, 1), + new Among("erem", 29, 1), new Among("irem", 29, 1), + new Among("assem", 29, 1), new Among("essem", 29, 1), + new Among("issem", 29, 1), new Among("ado", -1, 1), + new Among("ido", -1, 1), new Among("ando", -1, 1), + new Among("endo", -1, 1), new Among("indo", -1, 1), + new Among("ara~o", -1, 1), new Among("era~o", -1, 1), + new Among("ira~o", -1, 1), new Among("ar", -1, 1), + new Among("er", -1, 1), new Among("ir", -1, 1), + new Among("as", -1, 1), new Among("adas", 47, 1), + new Among("idas", 47, 1), new Among("ias", 47, 1), + new Among("arias", 50, 1), new Among("erias", 50, 1), + new Among("irias", 50, 1), new Among("aras", 47, 1), + new Among("eras", 47, 1), new Among("iras", 47, 1), + new Among("avas", 47, 1), new Among("es", -1, 1), + new Among("ardes", 58, 1), new Among("erdes", 58, 1), + new Among("irdes", 58, 1), new Among("ares", 58, 1), + new Among("eres", 58, 1), new Among("ires", 58, 1), + new Among("asses", 58, 1), new Among("esses", 58, 1), + new Among("isses", 58, 1), new Among("astes", 58, 1), + new Among("estes", 58, 1), new Among("istes", 58, 1), + new Among("is", -1, 1), new Among("ais", 71, 1), + new Among("eis", 71, 1), new Among("areis", 73, 1), + new Among("ereis", 73, 1), new Among("ireis", 73, 1), + new Among("\u00E1reis", 73, 1), new Among("\u00E9reis", 73, 1), + new Among("\u00EDreis", 73, 1), new Among("\u00E1sseis", 73, 1), + new Among("\u00E9sseis", 73, 1), new Among("\u00EDsseis", 73, 1), + new Among("\u00E1veis", 73, 1), new Among("\u00EDeis", 73, 1), + new Among("ar\u00EDeis", 84, 1), new Among("er\u00EDeis", 84, 1), + new Among("ir\u00EDeis", 84, 1), new Among("ados", -1, 1), + new Among("idos", -1, 1), new Among("amos", -1, 1), + new Among("\u00E1ramos", 90, 1), new Among("\u00E9ramos", 90, 1), + new Among("\u00EDramos", 90, 1), new Among("\u00E1vamos", 90, 1), + new Among("\u00EDamos", 90, 1), new Among("ar\u00EDamos", 95, 1), + new Among("er\u00EDamos", 95, 1), new Among("ir\u00EDamos", 95, 1), + new Among("emos", -1, 1), new Among("aremos", 99, 1), + new Among("eremos", 99, 1), new Among("iremos", 99, 1), + new Among("\u00E1ssemos", 99, 1), new Among("\u00EAssemos", 99, 1), + new Among("\u00EDssemos", 99, 1), new Among("imos", -1, 1), + new Among("armos", -1, 1), new Among("ermos", -1, 1), + new Among("irmos", -1, 1), new Among("\u00E1mos", -1, 1), + new Among("ar\u00E1s", -1, 1), new Among("er\u00E1s", -1, 1), + new Among("ir\u00E1s", -1, 1), new Among("eu", -1, 1), + new Among("iu", -1, 1), new Among("ou", -1, 1), + new Among("ar\u00E1", -1, 1), new Among("er\u00E1", -1, 1), + new Among("ir\u00E1", -1, 1) + ], + a_7 = [new Among("a", -1, 1), + new Among("i", -1, 1), new Among("o", -1, 1), + new Among("os", -1, 1), new Among("\u00E1", -1, 1), + new Among("\u00ED", -1, 1), new Among("\u00F3", -1, 1) + ], + a_8 = [ + new Among("e", -1, 1), new Among("\u00E7", -1, 2), + new Among("\u00E9", -1, 1), new Among("\u00EA", -1, 1) + ], + g_v = [17, + 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2 + ], + I_p2, I_p1, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function r_prelude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_0, 3); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("a~"); + continue; + case 2: + sbp.slice_from("o~"); + continue; + case 3: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + } + + function habr2() { + if (sbp.out_grouping(g_v, 97, 250)) { + while (!sbp.in_grouping(g_v, 97, 250)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + return true; + } + + function habr3() { + if (sbp.in_grouping(g_v, 97, 250)) { + while (!sbp.out_grouping(g_v, 97, 250)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + } + I_pV = sbp.cursor; + return true; + } + + function habr4() { + var v_1 = sbp.cursor, + v_2, v_3; + if (sbp.in_grouping(g_v, 97, 250)) { + v_2 = sbp.cursor; + if (habr2()) { + sbp.cursor = v_2; + if (habr3()) + return; + } else + I_pV = sbp.cursor; + } + sbp.cursor = v_1; + if (sbp.out_grouping(g_v, 97, 250)) { + v_3 = sbp.cursor; + if (habr2()) { + sbp.cursor = v_3; + if (!sbp.in_grouping(g_v, 97, 250) || sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_pV = sbp.cursor; + } + } + + function habr5() { + while (!sbp.in_grouping(g_v, 97, 250)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 250)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + var v_1 = sbp.cursor; + I_pV = sbp.limit; + I_p1 = I_pV; + I_p2 = I_pV; + habr4(); + sbp.cursor = v_1; + if (habr5()) { + I_p1 = sbp.cursor; + if (habr5()) + I_p2 = sbp.cursor; + } + } + + function r_postlude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_1, 3); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("\u00E3"); + continue; + case 2: + sbp.slice_from("\u00F5"); + continue; + case 3: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + } + + function r_RV() { + return I_pV <= sbp.cursor; + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_standard_suffix() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_5, 45); + if (!among_var) + return false; + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (!r_R2()) + return false; + sbp.slice_del(); + break; + case 2: + if (!r_R2()) + return false; + sbp.slice_from("log"); + break; + case 3: + if (!r_R2()) + return false; + sbp.slice_from("u"); + break; + case 4: + if (!r_R2()) + return false; + sbp.slice_from("ente"); + break; + case 5: + if (!r_R1()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 4); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + sbp.slice_del(); + if (among_var == 1) { + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + } + } + } + break; + case 6: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 3); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + if (r_R2()) + sbp.slice_del(); + } + break; + case 7: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 3); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + if (r_R2()) + sbp.slice_del(); + } + break; + case 8: + if (!r_R2()) + return false; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(2, "at")) { + sbp.bra = sbp.cursor; + if (r_R2()) + sbp.slice_del(); + } + break; + case 9: + if (!r_RV() || !sbp.eq_s_b(1, "e")) + return false; + sbp.slice_from("ir"); + break; + } + return true; + } + + function r_verb_suffix() { + var among_var, v_1; + if (sbp.cursor >= I_pV) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 120); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + sbp.slice_del(); + sbp.limit_backward = v_1; + return true; + } + sbp.limit_backward = v_1; + } + return false; + } + + function r_residual_suffix() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 7); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + if (r_RV()) + sbp.slice_del(); + } + } + + function habr6(c1, c2) { + if (sbp.eq_s_b(1, c1)) { + sbp.bra = sbp.cursor; + var v_1 = sbp.limit - sbp.cursor; + if (sbp.eq_s_b(1, c2)) { + sbp.cursor = sbp.limit - v_1; + if (r_RV()) + sbp.slice_del(); + return false; + } + } + return true; + } + + function r_residual_form() { + var among_var, v_1, v_2, v_3; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_8, 4); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + if (r_RV()) { + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_1 = sbp.limit - sbp.cursor; + if (habr6("u", "g")) + habr6("i", "c") + } + break; + case 2: + sbp.slice_from("c"); + break; + } + } + } + + function habr1() { + if (!r_standard_suffix()) { + sbp.cursor = sbp.limit; + if (!r_verb_suffix()) { + sbp.cursor = sbp.limit; + r_residual_suffix(); + return; + } + } + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "i")) { + sbp.bra = sbp.cursor; + if (sbp.eq_s_b(1, "c")) { + sbp.cursor = sbp.limit; + if (r_RV()) + sbp.slice_del(); + } + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + habr1(); + sbp.cursor = sbp.limit; + r_residual_form(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.pt.stemmer, 'stemmer-pt'); + + /* stop word filter function */ + lunr.pt.stopWordFilter = function(token) { + if (lunr.pt.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.pt.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.pt.stopWordFilter.stopWords.length = 204; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.pt.stopWordFilter.stopWords.elements = ' a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos'.split(' '); + + lunr.Pipeline.registerFunction(lunr.pt.stopWordFilter, 'stopWordFilter-pt'); + }; +})) diff --git a/js/lunr/lunr.pt.min.js b/js/lunr/lunr.pt.min.js new file mode 100644 index 0000000..9776adc --- /dev/null +++ b/js/lunr/lunr.pt.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,s,n;r.pt=function(){this.pipeline.reset(),this.pipeline.add(r.pt.trimmer,r.pt.stopWordFilter,r.pt.stemmer)},r.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.pt.trimmer=r.trimmerSupport.generateTrimmer(r.pt.wordCharacters),r.Pipeline.registerFunction(r.pt.trimmer,"trimmer-pt"),r.pt.stemmer=(e=r.stemmerSupport.Among,s=r.stemmerSupport.SnowballProgram,n=new function(){var o,i,t,a=[new e("",-1,3),new e("ã",0,1),new e("õ",0,2)],u=[new e("",-1,3),new e("a~",0,1),new e("o~",0,2)],w=[new e("ic",-1,-1),new e("ad",-1,-1),new e("os",-1,-1),new e("iv",-1,1)],m=[new e("ante",-1,1),new e("avel",-1,1),new e("ível",-1,1)],c=[new e("ic",-1,1),new e("abil",-1,1),new e("iv",-1,1)],l=[new e("ica",-1,1),new e("ância",-1,1),new e("ência",-1,4),new e("ira",-1,9),new e("adora",-1,1),new e("osa",-1,1),new e("ista",-1,1),new e("iva",-1,8),new e("eza",-1,1),new e("logía",-1,2),new e("idade",-1,7),new e("ante",-1,1),new e("mente",-1,6),new e("amente",12,5),new e("ável",-1,1),new e("ível",-1,1),new e("ución",-1,3),new e("ico",-1,1),new e("ismo",-1,1),new e("oso",-1,1),new e("amento",-1,1),new e("imento",-1,1),new e("ivo",-1,8),new e("aça~o",-1,1),new e("ador",-1,1),new e("icas",-1,1),new e("ências",-1,4),new e("iras",-1,9),new e("adoras",-1,1),new e("osas",-1,1),new e("istas",-1,1),new e("ivas",-1,8),new e("ezas",-1,1),new e("logías",-1,2),new e("idades",-1,7),new e("uciones",-1,3),new e("adores",-1,1),new e("antes",-1,1),new e("aço~es",-1,1),new e("icos",-1,1),new e("ismos",-1,1),new e("osos",-1,1),new e("amentos",-1,1),new e("imentos",-1,1),new e("ivos",-1,8)],f=[new e("ada",-1,1),new e("ida",-1,1),new e("ia",-1,1),new e("aria",2,1),new e("eria",2,1),new e("iria",2,1),new e("ara",-1,1),new e("era",-1,1),new e("ira",-1,1),new e("ava",-1,1),new e("asse",-1,1),new e("esse",-1,1),new e("isse",-1,1),new e("aste",-1,1),new e("este",-1,1),new e("iste",-1,1),new e("ei",-1,1),new e("arei",16,1),new e("erei",16,1),new e("irei",16,1),new e("am",-1,1),new e("iam",20,1),new e("ariam",21,1),new e("eriam",21,1),new e("iriam",21,1),new e("aram",20,1),new e("eram",20,1),new e("iram",20,1),new e("avam",20,1),new e("em",-1,1),new e("arem",29,1),new e("erem",29,1),new e("irem",29,1),new e("assem",29,1),new e("essem",29,1),new e("issem",29,1),new e("ado",-1,1),new e("ido",-1,1),new e("ando",-1,1),new e("endo",-1,1),new e("indo",-1,1),new e("ara~o",-1,1),new e("era~o",-1,1),new e("ira~o",-1,1),new e("ar",-1,1),new e("er",-1,1),new e("ir",-1,1),new e("as",-1,1),new e("adas",47,1),new e("idas",47,1),new e("ias",47,1),new e("arias",50,1),new e("erias",50,1),new e("irias",50,1),new e("aras",47,1),new e("eras",47,1),new e("iras",47,1),new e("avas",47,1),new e("es",-1,1),new e("ardes",58,1),new e("erdes",58,1),new e("irdes",58,1),new e("ares",58,1),new e("eres",58,1),new e("ires",58,1),new e("asses",58,1),new e("esses",58,1),new e("isses",58,1),new e("astes",58,1),new e("estes",58,1),new e("istes",58,1),new e("is",-1,1),new e("ais",71,1),new e("eis",71,1),new e("areis",73,1),new e("ereis",73,1),new e("ireis",73,1),new e("áreis",73,1),new e("éreis",73,1),new e("íreis",73,1),new e("ásseis",73,1),new e("ésseis",73,1),new e("ísseis",73,1),new e("áveis",73,1),new e("íeis",73,1),new e("aríeis",84,1),new e("eríeis",84,1),new e("iríeis",84,1),new e("ados",-1,1),new e("idos",-1,1),new e("amos",-1,1),new e("áramos",90,1),new e("éramos",90,1),new e("íramos",90,1),new e("ávamos",90,1),new e("íamos",90,1),new e("aríamos",95,1),new e("eríamos",95,1),new e("iríamos",95,1),new e("emos",-1,1),new e("aremos",99,1),new e("eremos",99,1),new e("iremos",99,1),new e("ássemos",99,1),new e("êssemos",99,1),new e("íssemos",99,1),new e("imos",-1,1),new e("armos",-1,1),new e("ermos",-1,1),new e("irmos",-1,1),new e("ámos",-1,1),new e("arás",-1,1),new e("erás",-1,1),new e("irás",-1,1),new e("eu",-1,1),new e("iu",-1,1),new e("ou",-1,1),new e("ará",-1,1),new e("erá",-1,1),new e("irá",-1,1)],d=[new e("a",-1,1),new e("i",-1,1),new e("o",-1,1),new e("os",-1,1),new e("á",-1,1),new e("í",-1,1),new e("ó",-1,1)],p=[new e("e",-1,1),new e("ç",-1,2),new e("é",-1,1),new e("ê",-1,1)],v=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],_=new s;function h(){if(!_.out_grouping(v,97,250))return 1;for(;!_.in_grouping(v,97,250);){if(_.cursor>=_.limit)return 1;_.cursor++}}function b(){for(;!_.in_grouping(v,97,250);){if(_.cursor>=_.limit)return;_.cursor++}for(;!_.out_grouping(v,97,250);){if(_.cursor>=_.limit)return;_.cursor++}return 1}function g(){return t<=_.cursor}function k(){return o<=_.cursor}function q(e,r){return!_.eq_s_b(1,e)||(_.bra=_.cursor,e=_.limit-_.cursor,!_.eq_s_b(1,r))||(_.cursor=_.limit-e,g()&&_.slice_del(),0)}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){for(var e,r,s,n=_.cursor;;){if(_.bra=_.cursor,e=_.find_among(a,3))switch(_.ket=_.cursor,e){case 1:_.slice_from("a~");continue;case 2:_.slice_from("o~");continue;case 3:if(!(_.cursor>=_.limit)){_.cursor++;continue}}break}if(_.cursor=n,r=_.cursor,t=_.limit,o=i=t,function(){var e,r=_.cursor;if(_.in_grouping(v,97,250))if(e=_.cursor,h()){if(_.cursor=e,function(){if(_.in_grouping(v,97,250))for(;!_.out_grouping(v,97,250);){if(_.cursor>=_.limit)return;_.cursor++}return t=_.cursor,1}())return}else t=_.cursor;if(_.cursor=r,_.out_grouping(v,97,250)){if(e=_.cursor,h()){if(_.cursor=e,!_.in_grouping(v,97,250)||_.cursor>=_.limit)return;_.cursor++}t=_.cursor}}(),_.cursor=r,b()&&(i=_.cursor,b())&&(o=_.cursor),_.limit_backward=n,_.cursor=_.limit,function(){var e;if(_.ket=_.cursor,e=_.find_among_b(l,45)){switch(_.bra=_.cursor,e){case 1:if(!k())return;_.slice_del();break;case 2:if(!k())return;_.slice_from("log");break;case 3:if(!k())return;_.slice_from("u");break;case 4:if(!k())return;_.slice_from("ente");break;case 5:if(!(i<=_.cursor))return;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(w,4))&&(_.bra=_.cursor,k())&&(_.slice_del(),1==e)&&(_.ket=_.cursor,_.eq_s_b(2,"at"))&&(_.bra=_.cursor,k())&&_.slice_del();break;case 6:if(!k())return;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(m,3))&&(_.bra=_.cursor,1==e)&&k()&&_.slice_del();break;case 7:if(!k())return;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(c,3))&&(_.bra=_.cursor,1==e)&&k()&&_.slice_del();break;case 8:if(!k())return;_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"at")&&(_.bra=_.cursor,k())&&_.slice_del();break;case 9:if(!g()||!_.eq_s_b(1,"e"))return;_.slice_from("ir")}return 1}}()||(_.cursor=_.limit,function(){var e,r;if(_.cursor>=t){if(r=_.limit_backward,_.limit_backward=t,_.ket=_.cursor,e=_.find_among_b(f,120))return _.bra=_.cursor,1==e&&_.slice_del(),_.limit_backward=r,1;_.limit_backward=r}}())?(_.cursor=_.limit,_.ket=_.cursor,_.eq_s_b(1,"i")&&(_.bra=_.cursor,_.eq_s_b(1,"c"))&&(_.cursor=_.limit,g())&&_.slice_del()):(_.cursor=_.limit,_.ket=_.cursor,(n=_.find_among_b(d,7))&&(_.bra=_.cursor,1==n)&&g()&&_.slice_del()),_.cursor=_.limit,_.ket=_.cursor,r=_.find_among_b(p,4))switch(_.bra=_.cursor,r){case 1:g()&&(_.slice_del(),_.ket=_.cursor,_.limit,_.cursor,q("u","g"))&&q("i","c");break;case 2:_.slice_from("c")}for(_.cursor=_.limit_backward;;){if(_.bra=_.cursor,s=_.find_among(u,3))switch(_.ket=_.cursor,s){case 1:_.slice_from("ã");continue;case 2:_.slice_from("õ");continue;case 3:if(!(_.cursor>=_.limit)){_.cursor++;continue}}break}return!0}},function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}),r.Pipeline.registerFunction(r.pt.stemmer,"stemmer-pt"),r.pt.stopWordFilter=function(e){if(-1===r.pt.stopWordFilter.stopWords.indexOf(e))return e},r.pt.stopWordFilter.stopWords=new r.SortedSet,r.pt.stopWordFilter.stopWords.length=204,r.pt.stopWordFilter.stopWords.elements=" a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" "),r.Pipeline.registerFunction(r.pt.stopWordFilter,"stopWordFilter-pt")}}); diff --git a/js/lunr/lunr.ro.js b/js/lunr/lunr.ro.js new file mode 100644 index 0000000..9638278 --- /dev/null +++ b/js/lunr/lunr.ro.js @@ -0,0 +1,554 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.ro = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.ro.trimmer, + lunr.ro.stopWordFilter, + lunr.ro.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.ro.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.ro.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.ro.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.ro.trimmer, 'trimmer-ro'); + + /* lunr stemmer function */ + lunr.ro.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function RomanianStemmer() { + var a_0 = [new Among("", -1, 3), new Among("I", 0, 1), new Among("U", 0, 2)], + a_1 = [ + new Among("ea", -1, 3), new Among("a\u0163ia", -1, 7), + new Among("aua", -1, 2), new Among("iua", -1, 4), + new Among("a\u0163ie", -1, 7), new Among("ele", -1, 3), + new Among("ile", -1, 5), new Among("iile", 6, 4), + new Among("iei", -1, 4), new Among("atei", -1, 6), + new Among("ii", -1, 4), new Among("ului", -1, 1), + new Among("ul", -1, 1), new Among("elor", -1, 3), + new Among("ilor", -1, 4), new Among("iilor", 14, 4) + ], + a_2 = [ + new Among("icala", -1, 4), new Among("iciva", -1, 4), + new Among("ativa", -1, 5), new Among("itiva", -1, 6), + new Among("icale", -1, 4), new Among("a\u0163iune", -1, 5), + new Among("i\u0163iune", -1, 6), new Among("atoare", -1, 5), + new Among("itoare", -1, 6), new Among("\u0103toare", -1, 5), + new Among("icitate", -1, 4), new Among("abilitate", -1, 1), + new Among("ibilitate", -1, 2), new Among("ivitate", -1, 3), + new Among("icive", -1, 4), new Among("ative", -1, 5), + new Among("itive", -1, 6), new Among("icali", -1, 4), + new Among("atori", -1, 5), new Among("icatori", 18, 4), + new Among("itori", -1, 6), new Among("\u0103tori", -1, 5), + new Among("icitati", -1, 4), new Among("abilitati", -1, 1), + new Among("ivitati", -1, 3), new Among("icivi", -1, 4), + new Among("ativi", -1, 5), new Among("itivi", -1, 6), + new Among("icit\u0103i", -1, 4), new Among("abilit\u0103i", -1, 1), + new Among("ivit\u0103i", -1, 3), + new Among("icit\u0103\u0163i", -1, 4), + new Among("abilit\u0103\u0163i", -1, 1), + new Among("ivit\u0103\u0163i", -1, 3), new Among("ical", -1, 4), + new Among("ator", -1, 5), new Among("icator", 35, 4), + new Among("itor", -1, 6), new Among("\u0103tor", -1, 5), + new Among("iciv", -1, 4), new Among("ativ", -1, 5), + new Among("itiv", -1, 6), new Among("ical\u0103", -1, 4), + new Among("iciv\u0103", -1, 4), new Among("ativ\u0103", -1, 5), + new Among("itiv\u0103", -1, 6) + ], + a_3 = [new Among("ica", -1, 1), + new Among("abila", -1, 1), new Among("ibila", -1, 1), + new Among("oasa", -1, 1), new Among("ata", -1, 1), + new Among("ita", -1, 1), new Among("anta", -1, 1), + new Among("ista", -1, 3), new Among("uta", -1, 1), + new Among("iva", -1, 1), new Among("ic", -1, 1), + new Among("ice", -1, 1), new Among("abile", -1, 1), + new Among("ibile", -1, 1), new Among("isme", -1, 3), + new Among("iune", -1, 2), new Among("oase", -1, 1), + new Among("ate", -1, 1), new Among("itate", 17, 1), + new Among("ite", -1, 1), new Among("ante", -1, 1), + new Among("iste", -1, 3), new Among("ute", -1, 1), + new Among("ive", -1, 1), new Among("ici", -1, 1), + new Among("abili", -1, 1), new Among("ibili", -1, 1), + new Among("iuni", -1, 2), new Among("atori", -1, 1), + new Among("osi", -1, 1), new Among("ati", -1, 1), + new Among("itati", 30, 1), new Among("iti", -1, 1), + new Among("anti", -1, 1), new Among("isti", -1, 3), + new Among("uti", -1, 1), new Among("i\u015Fti", -1, 3), + new Among("ivi", -1, 1), new Among("it\u0103i", -1, 1), + new Among("o\u015Fi", -1, 1), new Among("it\u0103\u0163i", -1, 1), + new Among("abil", -1, 1), new Among("ibil", -1, 1), + new Among("ism", -1, 3), new Among("ator", -1, 1), + new Among("os", -1, 1), new Among("at", -1, 1), + new Among("it", -1, 1), new Among("ant", -1, 1), + new Among("ist", -1, 3), new Among("ut", -1, 1), + new Among("iv", -1, 1), new Among("ic\u0103", -1, 1), + new Among("abil\u0103", -1, 1), new Among("ibil\u0103", -1, 1), + new Among("oas\u0103", -1, 1), new Among("at\u0103", -1, 1), + new Among("it\u0103", -1, 1), new Among("ant\u0103", -1, 1), + new Among("ist\u0103", -1, 3), new Among("ut\u0103", -1, 1), + new Among("iv\u0103", -1, 1) + ], + a_4 = [new Among("ea", -1, 1), + new Among("ia", -1, 1), new Among("esc", -1, 1), + new Among("\u0103sc", -1, 1), new Among("ind", -1, 1), + new Among("\u00E2nd", -1, 1), new Among("are", -1, 1), + new Among("ere", -1, 1), new Among("ire", -1, 1), + new Among("\u00E2re", -1, 1), new Among("se", -1, 2), + new Among("ase", 10, 1), new Among("sese", 10, 2), + new Among("ise", 10, 1), new Among("use", 10, 1), + new Among("\u00E2se", 10, 1), new Among("e\u015Fte", -1, 1), + new Among("\u0103\u015Fte", -1, 1), new Among("eze", -1, 1), + new Among("ai", -1, 1), new Among("eai", 19, 1), + new Among("iai", 19, 1), new Among("sei", -1, 2), + new Among("e\u015Fti", -1, 1), new Among("\u0103\u015Fti", -1, 1), + new Among("ui", -1, 1), new Among("ezi", -1, 1), + new Among("\u00E2i", -1, 1), new Among("a\u015Fi", -1, 1), + new Among("se\u015Fi", -1, 2), new Among("ase\u015Fi", 29, 1), + new Among("sese\u015Fi", 29, 2), new Among("ise\u015Fi", 29, 1), + new Among("use\u015Fi", 29, 1), + new Among("\u00E2se\u015Fi", 29, 1), new Among("i\u015Fi", -1, 1), + new Among("u\u015Fi", -1, 1), new Among("\u00E2\u015Fi", -1, 1), + new Among("a\u0163i", -1, 2), new Among("ea\u0163i", 38, 1), + new Among("ia\u0163i", 38, 1), new Among("e\u0163i", -1, 2), + new Among("i\u0163i", -1, 2), new Among("\u00E2\u0163i", -1, 2), + new Among("ar\u0103\u0163i", -1, 1), + new Among("ser\u0103\u0163i", -1, 2), + new Among("aser\u0103\u0163i", 45, 1), + new Among("seser\u0103\u0163i", 45, 2), + new Among("iser\u0103\u0163i", 45, 1), + new Among("user\u0103\u0163i", 45, 1), + new Among("\u00E2ser\u0103\u0163i", 45, 1), + new Among("ir\u0103\u0163i", -1, 1), + new Among("ur\u0103\u0163i", -1, 1), + new Among("\u00E2r\u0103\u0163i", -1, 1), new Among("am", -1, 1), + new Among("eam", 54, 1), new Among("iam", 54, 1), + new Among("em", -1, 2), new Among("asem", 57, 1), + new Among("sesem", 57, 2), new Among("isem", 57, 1), + new Among("usem", 57, 1), new Among("\u00E2sem", 57, 1), + new Among("im", -1, 2), new Among("\u00E2m", -1, 2), + new Among("\u0103m", -1, 2), new Among("ar\u0103m", 65, 1), + new Among("ser\u0103m", 65, 2), new Among("aser\u0103m", 67, 1), + new Among("seser\u0103m", 67, 2), new Among("iser\u0103m", 67, 1), + new Among("user\u0103m", 67, 1), + new Among("\u00E2ser\u0103m", 67, 1), + new Among("ir\u0103m", 65, 1), new Among("ur\u0103m", 65, 1), + new Among("\u00E2r\u0103m", 65, 1), new Among("au", -1, 1), + new Among("eau", 76, 1), new Among("iau", 76, 1), + new Among("indu", -1, 1), new Among("\u00E2ndu", -1, 1), + new Among("ez", -1, 1), new Among("easc\u0103", -1, 1), + new Among("ar\u0103", -1, 1), new Among("ser\u0103", -1, 2), + new Among("aser\u0103", 84, 1), new Among("seser\u0103", 84, 2), + new Among("iser\u0103", 84, 1), new Among("user\u0103", 84, 1), + new Among("\u00E2ser\u0103", 84, 1), new Among("ir\u0103", -1, 1), + new Among("ur\u0103", -1, 1), new Among("\u00E2r\u0103", -1, 1), + new Among("eaz\u0103", -1, 1) + ], + a_5 = [new Among("a", -1, 1), + new Among("e", -1, 1), new Among("ie", 1, 1), + new Among("i", -1, 1), new Among("\u0103", -1, 1) + ], + g_v = [17, 65, + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 4 + ], + B_standard_suffix_removed, I_p2, I_p1, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(c1, c2) { + if (sbp.eq_s(1, c1)) { + sbp.ket = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 259)) + sbp.slice_from(c2); + } + } + + function r_prelude() { + var v_1, v_2; + while (true) { + v_1 = sbp.cursor; + if (sbp.in_grouping(g_v, 97, 259)) { + v_2 = sbp.cursor; + sbp.bra = v_2; + habr1("u", "U"); + sbp.cursor = v_2; + habr1("i", "I"); + } + sbp.cursor = v_1; + if (sbp.cursor >= sbp.limit) { + break; + } + sbp.cursor++; + } + } + + function habr2() { + if (sbp.out_grouping(g_v, 97, 259)) { + while (!sbp.in_grouping(g_v, 97, 259)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + return false; + } + return true; + } + + function habr3() { + if (sbp.in_grouping(g_v, 97, 259)) { + while (!sbp.out_grouping(g_v, 97, 259)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + } + return false; + } + + function habr4() { + var v_1 = sbp.cursor, + v_2, v_3; + if (sbp.in_grouping(g_v, 97, 259)) { + v_2 = sbp.cursor; + if (habr2()) { + sbp.cursor = v_2; + if (!habr3()) { + I_pV = sbp.cursor; + return; + } + } else { + I_pV = sbp.cursor; + return; + } + } + sbp.cursor = v_1; + if (sbp.out_grouping(g_v, 97, 259)) { + v_3 = sbp.cursor; + if (habr2()) { + sbp.cursor = v_3; + if (sbp.in_grouping(g_v, 97, 259) && sbp.cursor < sbp.limit) + sbp.cursor++; + } + I_pV = sbp.cursor; + } + } + + function habr5() { + while (!sbp.in_grouping(g_v, 97, 259)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 259)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + var v_1 = sbp.cursor; + I_pV = sbp.limit; + I_p1 = I_pV; + I_p2 = I_pV; + habr4(); + sbp.cursor = v_1; + if (habr5()) { + I_p1 = sbp.cursor; + if (habr5()) + I_p2 = sbp.cursor; + } + } + + function r_postlude() { + var among_var; + while (true) { + sbp.bra = sbp.cursor; + among_var = sbp.find_among(a_0, 3); + if (among_var) { + sbp.ket = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("i"); + continue; + case 2: + sbp.slice_from("u"); + continue; + case 3: + if (sbp.cursor >= sbp.limit) + break; + sbp.cursor++; + continue; + } + } + break; + } + } + + function r_RV() { + return I_pV <= sbp.cursor; + } + + function r_R1() { + return I_p1 <= sbp.cursor; + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function r_step_0() { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_1, 16); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + sbp.slice_from("a"); + break; + case 3: + sbp.slice_from("e"); + break; + case 4: + sbp.slice_from("i"); + break; + case 5: + v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(2, "ab")) { + sbp.cursor = sbp.limit - v_1; + sbp.slice_from("i"); + } + break; + case 6: + sbp.slice_from("at"); + break; + case 7: + sbp.slice_from("a\u0163i"); + break; + } + } + } + } + + function r_combo_suffix() { + var among_var, v_1 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 46); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R1()) { + switch (among_var) { + case 1: + sbp.slice_from("abil"); + break; + case 2: + sbp.slice_from("ibil"); + break; + case 3: + sbp.slice_from("iv"); + break; + case 4: + sbp.slice_from("ic"); + break; + case 5: + sbp.slice_from("at"); + break; + case 6: + sbp.slice_from("it"); + break; + } + B_standard_suffix_removed = true; + sbp.cursor = sbp.limit - v_1; + return true; + } + } + return false; + } + + function r_standard_suffix() { + var among_var, v_1; + B_standard_suffix_removed = false; + while (true) { + v_1 = sbp.limit - sbp.cursor; + if (!r_combo_suffix()) { + sbp.cursor = sbp.limit - v_1; + break; + } + } + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_3, 62); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2()) { + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + if (sbp.eq_s_b(1, "\u0163")) { + sbp.bra = sbp.cursor; + sbp.slice_from("t"); + } + break; + case 3: + sbp.slice_from("ist"); + break; + } + B_standard_suffix_removed = true; + } + } + } + + function r_verb_suffix() { + var among_var, v_1, v_2; + if (sbp.cursor >= I_pV) { + v_1 = sbp.limit_backward; + sbp.limit_backward = I_pV; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_4, 94); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + v_2 = sbp.limit - sbp.cursor; + if (!sbp.out_grouping_b(g_v, 97, 259)) { + sbp.cursor = sbp.limit - v_2; + if (!sbp.eq_s_b(1, "u")) + break; + } + case 2: + sbp.slice_del(); + break; + } + } + sbp.limit_backward = v_1; + } + } + + function r_vowel_suffix() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_5, 5); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_RV() && among_var == 1) + sbp.slice_del(); + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_prelude(); + sbp.cursor = v_1; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_step_0(); + sbp.cursor = sbp.limit; + r_standard_suffix(); + sbp.cursor = sbp.limit; + if (!B_standard_suffix_removed) { + sbp.cursor = sbp.limit; + r_verb_suffix(); + sbp.cursor = sbp.limit; + } + r_vowel_suffix(); + sbp.cursor = sbp.limit_backward; + r_postlude(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.ro.stemmer, 'stemmer-ro'); + + /* stop word filter function */ + lunr.ro.stopWordFilter = function(token) { + if (lunr.ro.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.ro.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.ro.stopWordFilter.stopWords.length = 282; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.ro.stopWordFilter.stopWords.elements = ' acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie'.split(' '); + + lunr.Pipeline.registerFunction(lunr.ro.stopWordFilter, 'stopWordFilter-ro'); + }; +})) diff --git a/js/lunr/lunr.ro.min.js b/js/lunr/lunr.ro.min.js new file mode 100644 index 0000000..4fe0c44 --- /dev/null +++ b/js/lunr/lunr.ro.min.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,r,n;i.ro=function(){this.pipeline.reset(),this.pipeline.add(i.ro.trimmer,i.ro.stopWordFilter,i.ro.stemmer)},i.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.ro.trimmer=i.trimmerSupport.generateTrimmer(i.ro.wordCharacters),i.Pipeline.registerFunction(i.ro.trimmer,"trimmer-ro"),i.ro.stemmer=(e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){var u,w,m,l,f=[new e("",-1,3),new e("I",0,1),new e("U",0,2)],p=[new e("ea",-1,3),new e("aţia",-1,7),new e("aua",-1,2),new e("iua",-1,4),new e("aţie",-1,7),new e("ele",-1,3),new e("ile",-1,5),new e("iile",6,4),new e("iei",-1,4),new e("atei",-1,6),new e("ii",-1,4),new e("ului",-1,1),new e("ul",-1,1),new e("elor",-1,3),new e("ilor",-1,4),new e("iilor",14,4)],d=[new e("icala",-1,4),new e("iciva",-1,4),new e("ativa",-1,5),new e("itiva",-1,6),new e("icale",-1,4),new e("aţiune",-1,5),new e("iţiune",-1,6),new e("atoare",-1,5),new e("itoare",-1,6),new e("ătoare",-1,5),new e("icitate",-1,4),new e("abilitate",-1,1),new e("ibilitate",-1,2),new e("ivitate",-1,3),new e("icive",-1,4),new e("ative",-1,5),new e("itive",-1,6),new e("icali",-1,4),new e("atori",-1,5),new e("icatori",18,4),new e("itori",-1,6),new e("ători",-1,5),new e("icitati",-1,4),new e("abilitati",-1,1),new e("ivitati",-1,3),new e("icivi",-1,4),new e("ativi",-1,5),new e("itivi",-1,6),new e("icităi",-1,4),new e("abilităi",-1,1),new e("ivităi",-1,3),new e("icităţi",-1,4),new e("abilităţi",-1,1),new e("ivităţi",-1,3),new e("ical",-1,4),new e("ator",-1,5),new e("icator",35,4),new e("itor",-1,6),new e("ător",-1,5),new e("iciv",-1,4),new e("ativ",-1,5),new e("itiv",-1,6),new e("icală",-1,4),new e("icivă",-1,4),new e("ativă",-1,5),new e("itivă",-1,6)],b=[new e("ica",-1,1),new e("abila",-1,1),new e("ibila",-1,1),new e("oasa",-1,1),new e("ata",-1,1),new e("ita",-1,1),new e("anta",-1,1),new e("ista",-1,3),new e("uta",-1,1),new e("iva",-1,1),new e("ic",-1,1),new e("ice",-1,1),new e("abile",-1,1),new e("ibile",-1,1),new e("isme",-1,3),new e("iune",-1,2),new e("oase",-1,1),new e("ate",-1,1),new e("itate",17,1),new e("ite",-1,1),new e("ante",-1,1),new e("iste",-1,3),new e("ute",-1,1),new e("ive",-1,1),new e("ici",-1,1),new e("abili",-1,1),new e("ibili",-1,1),new e("iuni",-1,2),new e("atori",-1,1),new e("osi",-1,1),new e("ati",-1,1),new e("itati",30,1),new e("iti",-1,1),new e("anti",-1,1),new e("isti",-1,3),new e("uti",-1,1),new e("işti",-1,3),new e("ivi",-1,1),new e("ităi",-1,1),new e("oşi",-1,1),new e("ităţi",-1,1),new e("abil",-1,1),new e("ibil",-1,1),new e("ism",-1,3),new e("ator",-1,1),new e("os",-1,1),new e("at",-1,1),new e("it",-1,1),new e("ant",-1,1),new e("ist",-1,3),new e("ut",-1,1),new e("iv",-1,1),new e("ică",-1,1),new e("abilă",-1,1),new e("ibilă",-1,1),new e("oasă",-1,1),new e("ată",-1,1),new e("ită",-1,1),new e("antă",-1,1),new e("istă",-1,3),new e("ută",-1,1),new e("ivă",-1,1)],_=[new e("ea",-1,1),new e("ia",-1,1),new e("esc",-1,1),new e("ăsc",-1,1),new e("ind",-1,1),new e("ând",-1,1),new e("are",-1,1),new e("ere",-1,1),new e("ire",-1,1),new e("âre",-1,1),new e("se",-1,2),new e("ase",10,1),new e("sese",10,2),new e("ise",10,1),new e("use",10,1),new e("âse",10,1),new e("eşte",-1,1),new e("ăşte",-1,1),new e("eze",-1,1),new e("ai",-1,1),new e("eai",19,1),new e("iai",19,1),new e("sei",-1,2),new e("eşti",-1,1),new e("ăşti",-1,1),new e("ui",-1,1),new e("ezi",-1,1),new e("âi",-1,1),new e("aşi",-1,1),new e("seşi",-1,2),new e("aseşi",29,1),new e("seseşi",29,2),new e("iseşi",29,1),new e("useşi",29,1),new e("âseşi",29,1),new e("işi",-1,1),new e("uşi",-1,1),new e("âşi",-1,1),new e("aţi",-1,2),new e("eaţi",38,1),new e("iaţi",38,1),new e("eţi",-1,2),new e("iţi",-1,2),new e("âţi",-1,2),new e("arăţi",-1,1),new e("serăţi",-1,2),new e("aserăţi",45,1),new e("seserăţi",45,2),new e("iserăţi",45,1),new e("userăţi",45,1),new e("âserăţi",45,1),new e("irăţi",-1,1),new e("urăţi",-1,1),new e("ârăţi",-1,1),new e("am",-1,1),new e("eam",54,1),new e("iam",54,1),new e("em",-1,2),new e("asem",57,1),new e("sesem",57,2),new e("isem",57,1),new e("usem",57,1),new e("âsem",57,1),new e("im",-1,2),new e("âm",-1,2),new e("ăm",-1,2),new e("arăm",65,1),new e("serăm",65,2),new e("aserăm",67,1),new e("seserăm",67,2),new e("iserăm",67,1),new e("userăm",67,1),new e("âserăm",67,1),new e("irăm",65,1),new e("urăm",65,1),new e("ârăm",65,1),new e("au",-1,1),new e("eau",76,1),new e("iau",76,1),new e("indu",-1,1),new e("ându",-1,1),new e("ez",-1,1),new e("ească",-1,1),new e("ară",-1,1),new e("seră",-1,2),new e("aseră",84,1),new e("seseră",84,2),new e("iseră",84,1),new e("useră",84,1),new e("âseră",84,1),new e("iră",-1,1),new e("ură",-1,1),new e("âră",-1,1),new e("ează",-1,1)],v=[new e("a",-1,1),new e("e",-1,1),new e("ie",1,1),new e("i",-1,1),new e("ă",-1,1)],g=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],k=new r;function h(e,i){k.eq_s(1,e)&&(k.ket=k.cursor,k.in_grouping(g,97,259))&&k.slice_from(i)}function W(){if(!k.out_grouping(g,97,259))return 1;for(;!k.in_grouping(g,97,259);){if(k.cursor>=k.limit)return 1;k.cursor++}}function z(){for(;!k.in_grouping(g,97,259);){if(k.cursor>=k.limit)return;k.cursor++}for(;!k.out_grouping(g,97,259);){if(k.cursor>=k.limit)return;k.cursor++}return 1}function F(){return m<=k.cursor}this.setCurrent=function(e){k.setCurrent(e)},this.getCurrent=function(){return k.getCurrent()},this.stem=function(){for(var e,i,r,n,t,a,o,s,c=k.cursor;e=k.cursor,k.in_grouping(g,97,259)&&(i=k.cursor,k.bra=i,h("u","U"),k.cursor=i,h("i","I")),k.cursor=e,!(k.cursor>=k.limit);)k.cursor++;if(k.cursor=c,n=k.cursor,l=k.limit,w=m=l,function(){var e,i=k.cursor;if(k.in_grouping(g,97,259)){if(e=k.cursor,!W())return l=k.cursor;if(k.cursor=e,!function(){if(k.in_grouping(g,97,259))for(;!k.out_grouping(g,97,259);){if(k.cursor>=k.limit)return 1;k.cursor++}}())return l=k.cursor}k.cursor=i,k.out_grouping(g,97,259)&&(e=k.cursor,W()&&(k.cursor=e,k.in_grouping(g,97,259))&&k.cursor=l){if(c=k.limit_backward,k.limit_backward=l,k.ket=k.cursor,n=k.find_among_b(_,94))switch(k.bra=k.cursor,n){case 1:if(t=k.limit-k.cursor,!k.out_grouping_b(g,97,259)&&(k.cursor=k.limit-t,!k.eq_s_b(1,"u")))break;case 2:k.slice_del()}k.limit_backward=c}k.cursor=k.limit}for(k.ket=k.cursor,(s=k.find_among_b(v,5))&&(k.bra=k.cursor,l<=k.cursor)&&1==s&&k.slice_del(),k.cursor=k.limit_backward;;){if(k.bra=k.cursor,a=k.find_among(f,3))switch(k.ket=k.cursor,a){case 1:k.slice_from("i");continue;case 2:k.slice_from("u");continue;case 3:if(!(k.cursor>=k.limit)){k.cursor++;continue}}break}return!0}},function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}),i.Pipeline.registerFunction(i.ro.stemmer,"stemmer-ro"),i.ro.stopWordFilter=function(e){if(-1===i.ro.stopWordFilter.stopWords.indexOf(e))return e},i.ro.stopWordFilter.stopWords=new i.SortedSet,i.ro.stopWordFilter.stopWords.length=282,i.ro.stopWordFilter.stopWords.elements=" acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" "),i.Pipeline.registerFunction(i.ro.stopWordFilter,"stopWordFilter-ro")}}); diff --git a/js/lunr/lunr.ru.js b/js/lunr/lunr.ru.js new file mode 100644 index 0000000..4a0c415 --- /dev/null +++ b/js/lunr/lunr.ru.js @@ -0,0 +1,387 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.ru = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.ru.trimmer, + lunr.ru.stopWordFilter, + lunr.ru.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.ru.wordCharacters = "\u0400-\u0484\u0487-\u052F\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F"; + lunr.ru.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.ru.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.ru.trimmer, 'trimmer-ru'); + + /* lunr stemmer function */ + lunr.ru.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function RussianStemmer() { + var a_0 = [new Among("\u0432", -1, 1), new Among("\u0438\u0432", 0, 2), + new Among("\u044B\u0432", 0, 2), + new Among("\u0432\u0448\u0438", -1, 1), + new Among("\u0438\u0432\u0448\u0438", 3, 2), + new Among("\u044B\u0432\u0448\u0438", 3, 2), + new Among("\u0432\u0448\u0438\u0441\u044C", -1, 1), + new Among("\u0438\u0432\u0448\u0438\u0441\u044C", 6, 2), + new Among("\u044B\u0432\u0448\u0438\u0441\u044C", 6, 2) + ], + a_1 = [ + new Among("\u0435\u0435", -1, 1), new Among("\u0438\u0435", -1, 1), + new Among("\u043E\u0435", -1, 1), new Among("\u044B\u0435", -1, 1), + new Among("\u0438\u043C\u0438", -1, 1), + new Among("\u044B\u043C\u0438", -1, 1), + new Among("\u0435\u0439", -1, 1), new Among("\u0438\u0439", -1, 1), + new Among("\u043E\u0439", -1, 1), new Among("\u044B\u0439", -1, 1), + new Among("\u0435\u043C", -1, 1), new Among("\u0438\u043C", -1, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044B\u043C", -1, 1), + new Among("\u0435\u0433\u043E", -1, 1), + new Among("\u043E\u0433\u043E", -1, 1), + new Among("\u0435\u043C\u0443", -1, 1), + new Among("\u043E\u043C\u0443", -1, 1), + new Among("\u0438\u0445", -1, 1), new Among("\u044B\u0445", -1, 1), + new Among("\u0435\u044E", -1, 1), new Among("\u043E\u044E", -1, 1), + new Among("\u0443\u044E", -1, 1), new Among("\u044E\u044E", -1, 1), + new Among("\u0430\u044F", -1, 1), new Among("\u044F\u044F", -1, 1) + ], + a_2 = [ + new Among("\u0435\u043C", -1, 1), new Among("\u043D\u043D", -1, 1), + new Among("\u0432\u0448", -1, 1), + new Among("\u0438\u0432\u0448", 2, 2), + new Among("\u044B\u0432\u0448", 2, 2), new Among("\u0449", -1, 1), + new Among("\u044E\u0449", 5, 1), + new Among("\u0443\u044E\u0449", 6, 2) + ], + a_3 = [ + new Among("\u0441\u044C", -1, 1), new Among("\u0441\u044F", -1, 1) + ], + a_4 = [ + new Among("\u043B\u0430", -1, 1), + new Among("\u0438\u043B\u0430", 0, 2), + new Among("\u044B\u043B\u0430", 0, 2), + new Among("\u043D\u0430", -1, 1), + new Among("\u0435\u043D\u0430", 3, 2), + new Among("\u0435\u0442\u0435", -1, 1), + new Among("\u0438\u0442\u0435", -1, 2), + new Among("\u0439\u0442\u0435", -1, 1), + new Among("\u0435\u0439\u0442\u0435", 7, 2), + new Among("\u0443\u0439\u0442\u0435", 7, 2), + new Among("\u043B\u0438", -1, 1), + new Among("\u0438\u043B\u0438", 10, 2), + new Among("\u044B\u043B\u0438", 10, 2), new Among("\u0439", -1, 1), + new Among("\u0435\u0439", 13, 2), new Among("\u0443\u0439", 13, 2), + new Among("\u043B", -1, 1), new Among("\u0438\u043B", 16, 2), + new Among("\u044B\u043B", 16, 2), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u043C", -1, 2), new Among("\u044B\u043C", -1, 2), + new Among("\u043D", -1, 1), new Among("\u0435\u043D", 22, 2), + new Among("\u043B\u043E", -1, 1), + new Among("\u0438\u043B\u043E", 24, 2), + new Among("\u044B\u043B\u043E", 24, 2), + new Among("\u043D\u043E", -1, 1), + new Among("\u0435\u043D\u043E", 27, 2), + new Among("\u043D\u043D\u043E", 27, 1), + new Among("\u0435\u0442", -1, 1), + new Among("\u0443\u0435\u0442", 30, 2), + new Among("\u0438\u0442", -1, 2), new Among("\u044B\u0442", -1, 2), + new Among("\u044E\u0442", -1, 1), + new Among("\u0443\u044E\u0442", 34, 2), + new Among("\u044F\u0442", -1, 2), new Among("\u043D\u044B", -1, 1), + new Among("\u0435\u043D\u044B", 37, 2), + new Among("\u0442\u044C", -1, 1), + new Among("\u0438\u0442\u044C", 39, 2), + new Among("\u044B\u0442\u044C", 39, 2), + new Among("\u0435\u0448\u044C", -1, 1), + new Among("\u0438\u0448\u044C", -1, 2), new Among("\u044E", -1, 2), + new Among("\u0443\u044E", 44, 2) + ], + a_5 = [ + new Among("\u0430", -1, 1), new Among("\u0435\u0432", -1, 1), + new Among("\u043E\u0432", -1, 1), new Among("\u0435", -1, 1), + new Among("\u0438\u0435", 3, 1), new Among("\u044C\u0435", 3, 1), + new Among("\u0438", -1, 1), new Among("\u0435\u0438", 6, 1), + new Among("\u0438\u0438", 6, 1), + new Among("\u0430\u043C\u0438", 6, 1), + new Among("\u044F\u043C\u0438", 6, 1), + new Among("\u0438\u044F\u043C\u0438", 10, 1), + new Among("\u0439", -1, 1), new Among("\u0435\u0439", 12, 1), + new Among("\u0438\u0435\u0439", 13, 1), + new Among("\u0438\u0439", 12, 1), new Among("\u043E\u0439", 12, 1), + new Among("\u0430\u043C", -1, 1), new Among("\u0435\u043C", -1, 1), + new Among("\u0438\u0435\u043C", 18, 1), + new Among("\u043E\u043C", -1, 1), new Among("\u044F\u043C", -1, 1), + new Among("\u0438\u044F\u043C", 21, 1), new Among("\u043E", -1, 1), + new Among("\u0443", -1, 1), new Among("\u0430\u0445", -1, 1), + new Among("\u044F\u0445", -1, 1), + new Among("\u0438\u044F\u0445", 26, 1), new Among("\u044B", -1, 1), + new Among("\u044C", -1, 1), new Among("\u044E", -1, 1), + new Among("\u0438\u044E", 30, 1), new Among("\u044C\u044E", 30, 1), + new Among("\u044F", -1, 1), new Among("\u0438\u044F", 33, 1), + new Among("\u044C\u044F", 33, 1) + ], + a_6 = [ + new Among("\u043E\u0441\u0442", -1, 1), + new Among("\u043E\u0441\u0442\u044C", -1, 1) + ], + a_7 = [ + new Among("\u0435\u0439\u0448\u0435", -1, 1), + new Among("\u043D", -1, 2), new Among("\u0435\u0439\u0448", -1, 1), + new Among("\u044C", -1, 3) + ], + g_v = [33, 65, 8, 232], + I_p2, I_pV, sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr3() { + while (!sbp.in_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function habr4() { + while (!sbp.out_grouping(g_v, 1072, 1103)) { + if (sbp.cursor >= sbp.limit) + return false; + sbp.cursor++; + } + return true; + } + + function r_mark_regions() { + I_pV = sbp.limit; + I_p2 = I_pV; + if (habr3()) { + I_pV = sbp.cursor; + if (habr4()) + if (habr3()) + if (habr4()) + I_p2 = sbp.cursor; + } + } + + function r_R2() { + return I_p2 <= sbp.cursor; + } + + function habr2(a, n) { + var among_var, v_1; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "\u0430")) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(1, "\u044F")) + return false; + } + case 2: + sbp.slice_del(); + break; + } + return true; + } + return false; + } + + function r_perfective_gerund() { + return habr2(a_0, 9); + } + + function habr1(a, n) { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a, n); + if (among_var) { + sbp.bra = sbp.cursor; + if (among_var == 1) + sbp.slice_del(); + return true; + } + return false; + } + + function r_adjective() { + return habr1(a_1, 26); + } + + function r_adjectival() { + var among_var; + if (r_adjective()) { + habr2(a_2, 8); + return true; + } + return false; + } + + function r_reflexive() { + return habr1(a_3, 2); + } + + function r_verb() { + return habr2(a_4, 46); + } + + function r_noun() { + habr1(a_5, 36); + } + + function r_derivational() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_6, 2); + if (among_var) { + sbp.bra = sbp.cursor; + if (r_R2() && among_var == 1) + sbp.slice_del(); + } + } + + function r_tidy_up() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_7, 4); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (!sbp.eq_s_b(1, "\u043D")) + break; + sbp.bra = sbp.cursor; + case 2: + if (!sbp.eq_s_b(1, "\u043D")) + break; + case 3: + sbp.slice_del(); + break; + } + } + } + this.stem = function() { + r_mark_regions(); + sbp.cursor = sbp.limit; + if (sbp.cursor < I_pV) + return false; + sbp.limit_backward = I_pV; + if (!r_perfective_gerund()) { + sbp.cursor = sbp.limit; + if (!r_reflexive()) + sbp.cursor = sbp.limit; + if (!r_adjectival()) { + sbp.cursor = sbp.limit; + if (!r_verb()) { + sbp.cursor = sbp.limit; + r_noun(); + } + } + } + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.eq_s_b(1, "\u0438")) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else + sbp.cursor = sbp.limit; + r_derivational(); + sbp.cursor = sbp.limit; + r_tidy_up(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.ru.stemmer, 'stemmer-ru'); + + /* stop word filter function */ + lunr.ru.stopWordFilter = function(token) { + if (lunr.ru.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.ru.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.ru.stopWordFilter.stopWords.length = 422; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.ru.stopWordFilter.stopWords.elements = ' алло без близко более больше будем будет будете будешь будто буду будут будь бы бывает бывь был была были было быть в важная важное важные важный вам вами вас ваш ваша ваше ваши вверх вдали вдруг ведь везде весь вниз внизу во вокруг вон восемнадцатый восемнадцать восемь восьмой вот впрочем времени время все всегда всего всем всеми всему всех всею всю всюду вся всё второй вы г где говорил говорит год года году да давно даже далеко дальше даром два двадцатый двадцать две двенадцатый двенадцать двух девятнадцатый девятнадцать девятый девять действительно дел день десятый десять для до довольно долго должно другая другие других друго другое другой е его ее ей ему если есть еще ещё ею её ж же жизнь за занят занята занято заняты затем зато зачем здесь значит и из или им именно иметь ими имя иногда их к каждая каждое каждые каждый кажется как какая какой кем когда кого ком кому конечно которая которого которой которые который которых кроме кругом кто куда лет ли лишь лучше люди м мало между меля менее меньше меня миллионов мимо мира мне много многочисленная многочисленное многочисленные многочисленный мной мною мог могут мож может можно можхо мои мой мор мочь моя моё мы на наверху над надо назад наиболее наконец нам нами нас начала наш наша наше наши не него недавно недалеко нее ней нельзя нем немного нему непрерывно нередко несколько нет нею неё ни нибудь ниже низко никогда никуда ними них ничего но ну нужно нх о об оба обычно один одиннадцатый одиннадцать однажды однако одного одной около он она они оно опять особенно от отовсюду отсюда очень первый перед по под пожалуйста позже пока пор пора после посреди потом потому почему почти прекрасно при про просто против процентов пятнадцатый пятнадцать пятый пять раз разве рано раньше рядом с сам сама сами самим самими самих само самого самой самом самому саму свое своего своей свои своих свою сеаой себе себя сегодня седьмой сейчас семнадцатый семнадцать семь сих сказал сказала сказать сколько слишком сначала снова со собой собою совсем спасибо стал суть т та так такая также такие такое такой там твой твоя твоё те тебе тебя тем теми теперь тех то тобой тобою тогда того тоже только том тому тот тою третий три тринадцатый тринадцать ту туда тут ты тысяч у уж уже уметь хорошо хотеть хоть хотя хочешь часто чаще чего человек чем чему через четвертый четыре четырнадцатый четырнадцать что чтоб чтобы чуть шестнадцатый шестнадцать шестой шесть эта эти этим этими этих это этого этой этом этому этот эту я а'.split(' '); + + lunr.Pipeline.registerFunction(lunr.ru.stopWordFilter, 'stopWordFilter-ru'); + }; +})) diff --git a/js/lunr/lunr.ru.min.js b/js/lunr/lunr.ru.min.js new file mode 100644 index 0000000..f254753 --- /dev/null +++ b/js/lunr/lunr.ru.min.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(n){if(void 0===n)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===n.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,b,r;n.ru=function(){this.pipeline.reset(),this.pipeline.add(n.ru.trimmer,n.ru.stopWordFilter,n.ru.stemmer)},n.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",n.ru.trimmer=n.trimmerSupport.generateTrimmer(n.ru.wordCharacters),n.Pipeline.registerFunction(n.ru.trimmer,"trimmer-ru"),n.ru.stemmer=(_=n.stemmerSupport.Among,b=n.stemmerSupport.SnowballProgram,r=new function(){var n,r,w=[new _("в",-1,1),new _("ив",0,2),new _("ыв",0,2),new _("вши",-1,1),new _("ивши",3,2),new _("ывши",3,2),new _("вшись",-1,1),new _("ившись",6,2),new _("ывшись",6,2)],t=[new _("ее",-1,1),new _("ие",-1,1),new _("ое",-1,1),new _("ые",-1,1),new _("ими",-1,1),new _("ыми",-1,1),new _("ей",-1,1),new _("ий",-1,1),new _("ой",-1,1),new _("ый",-1,1),new _("ем",-1,1),new _("им",-1,1),new _("ом",-1,1),new _("ым",-1,1),new _("его",-1,1),new _("ого",-1,1),new _("ему",-1,1),new _("ому",-1,1),new _("их",-1,1),new _("ых",-1,1),new _("ею",-1,1),new _("ою",-1,1),new _("ую",-1,1),new _("юю",-1,1),new _("ая",-1,1),new _("яя",-1,1)],i=[new _("ем",-1,1),new _("нн",-1,1),new _("вш",-1,1),new _("ивш",2,2),new _("ывш",2,2),new _("щ",-1,1),new _("ющ",5,1),new _("ующ",6,2)],o=[new _("сь",-1,1),new _("ся",-1,1)],s=[new _("ла",-1,1),new _("ила",0,2),new _("ыла",0,2),new _("на",-1,1),new _("ена",3,2),new _("ете",-1,1),new _("ите",-1,2),new _("йте",-1,1),new _("ейте",7,2),new _("уйте",7,2),new _("ли",-1,1),new _("или",10,2),new _("ыли",10,2),new _("й",-1,1),new _("ей",13,2),new _("уй",13,2),new _("л",-1,1),new _("ил",16,2),new _("ыл",16,2),new _("ем",-1,1),new _("им",-1,2),new _("ым",-1,2),new _("н",-1,1),new _("ен",22,2),new _("ло",-1,1),new _("ило",24,2),new _("ыло",24,2),new _("но",-1,1),new _("ено",27,2),new _("нно",27,1),new _("ет",-1,1),new _("ует",30,2),new _("ит",-1,2),new _("ыт",-1,2),new _("ют",-1,1),new _("уют",34,2),new _("ят",-1,2),new _("ны",-1,1),new _("ены",37,2),new _("ть",-1,1),new _("ить",39,2),new _("ыть",39,2),new _("ешь",-1,1),new _("ишь",-1,2),new _("ю",-1,2),new _("ую",44,2)],u=[new _("а",-1,1),new _("ев",-1,1),new _("ов",-1,1),new _("е",-1,1),new _("ие",3,1),new _("ье",3,1),new _("и",-1,1),new _("еи",6,1),new _("ии",6,1),new _("ами",6,1),new _("ями",6,1),new _("иями",10,1),new _("й",-1,1),new _("ей",12,1),new _("ией",13,1),new _("ий",12,1),new _("ой",12,1),new _("ам",-1,1),new _("ем",-1,1),new _("ием",18,1),new _("ом",-1,1),new _("ям",-1,1),new _("иям",21,1),new _("о",-1,1),new _("у",-1,1),new _("ах",-1,1),new _("ях",-1,1),new _("иях",26,1),new _("ы",-1,1),new _("ь",-1,1),new _("ю",-1,1),new _("ию",30,1),new _("ью",30,1),new _("я",-1,1),new _("ия",33,1),new _("ья",33,1)],c=[new _("ост",-1,1),new _("ость",-1,1)],m=[new _("ейше",-1,1),new _("н",-1,2),new _("ейш",-1,1),new _("ь",-1,3)],e=[33,65,8,232],l=new b;function f(){for(;!l.in_grouping(e,1072,1103);){if(l.cursor>=l.limit)return;l.cursor++}return 1}function p(){for(;!l.out_grouping(e,1072,1103);){if(l.cursor>=l.limit)return;l.cursor++}return 1}function d(e,n){var r;if(l.ket=l.cursor,e=l.find_among_b(e,n)){switch(l.bra=l.cursor,e){case 1:if(r=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-r,!l.eq_s_b(1,"я")))return;case 2:l.slice_del()}return 1}}function a(e,n){return l.ket=l.cursor,(e=l.find_among_b(e,n))&&(l.bra=l.cursor,1==e&&l.slice_del(),1)}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){if(r=l.limit,n=r,f()&&(r=l.cursor,p())&&f()&&p()&&(n=l.cursor),l.cursor=l.limit,l.cursor= sbp.limit) + return; + sbp.cursor++; + } + while (!sbp.out_grouping(g_v, 97, 246)) { + if (sbp.cursor >= sbp.limit) + return; + sbp.cursor++; + } + I_p1 = sbp.cursor; + if (I_p1 < I_x) + I_p1 = I_x; + } + } + + function r_main_suffix() { + var among_var, v_2 = sbp.limit_backward; + if (sbp.cursor >= I_p1) { + sbp.limit_backward = I_p1; + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_0, 37); + sbp.limit_backward = v_2; + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + if (sbp.in_grouping_b(g_s_ending, 98, 121)) + sbp.slice_del(); + break; + } + } + } + } + + function r_consonant_pair() { + var v_1 = sbp.limit_backward; + if (sbp.cursor >= I_p1) { + sbp.limit_backward = I_p1; + sbp.cursor = sbp.limit; + if (sbp.find_among_b(a_1, 7)) { + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + if (sbp.cursor > sbp.limit_backward) { + sbp.bra = --sbp.cursor; + sbp.slice_del(); + } + } + sbp.limit_backward = v_1; + } + } + + function r_other_suffix() { + var among_var, v_2; + if (sbp.cursor >= I_p1) { + v_2 = sbp.limit_backward; + sbp.limit_backward = I_p1; + sbp.cursor = sbp.limit; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_2, 5); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_del(); + break; + case 2: + sbp.slice_from("l\u00F6s"); + break; + case 3: + sbp.slice_from("full"); + break; + } + } + sbp.limit_backward = v_2; + } + } + this.stem = function() { + var v_1 = sbp.cursor; + r_mark_regions(); + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_main_suffix(); + sbp.cursor = sbp.limit; + r_consonant_pair(); + sbp.cursor = sbp.limit; + r_other_suffix(); + return true; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.sv.stemmer, 'stemmer-sv'); + + /* stop word filter function */ + lunr.sv.stopWordFilter = function(token) { + if (lunr.sv.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.sv.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.sv.stopWordFilter.stopWords.length = 115; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.sv.stopWordFilter.stopWords.elements = ' alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över'.split(' '); + + lunr.Pipeline.registerFunction(lunr.sv.stopWordFilter, 'stopWordFilter-sv'); + }; +})) diff --git a/js/lunr/lunr.sv.min.js b/js/lunr/lunr.sv.min.js new file mode 100644 index 0000000..1e5c7a3 --- /dev/null +++ b/js/lunr/lunr.sv.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,d,n;r.sv=function(){this.pipeline.reset(),this.pipeline.add(r.sv.trimmer,r.sv.stopWordFilter,r.sv.stemmer)},r.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.sv.trimmer=r.trimmerSupport.generateTrimmer(r.sv.wordCharacters),r.Pipeline.registerFunction(r.sv.trimmer,"trimmer-sv"),r.sv.stemmer=(e=r.stemmerSupport.Among,d=r.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new e("a",-1,1),new e("arna",0,1),new e("erna",0,1),new e("heterna",2,1),new e("orna",0,1),new e("ad",-1,1),new e("e",-1,1),new e("ade",6,1),new e("ande",6,1),new e("arne",6,1),new e("are",6,1),new e("aste",6,1),new e("en",-1,1),new e("anden",12,1),new e("aren",12,1),new e("heten",12,1),new e("ern",-1,1),new e("ar",-1,1),new e("er",-1,1),new e("heter",18,1),new e("or",-1,1),new e("s",-1,2),new e("as",21,1),new e("arnas",22,1),new e("ernas",22,1),new e("ornas",22,1),new e("es",21,1),new e("ades",26,1),new e("andes",26,1),new e("ens",21,1),new e("arens",29,1),new e("hetens",29,1),new e("erns",21,1),new e("at",-1,1),new e("andet",-1,1),new e("het",-1,1),new e("ast",-1,1)],s=[new e("dd",-1,-1),new e("gd",-1,-1),new e("nn",-1,-1),new e("dt",-1,-1),new e("gt",-1,-1),new e("kt",-1,-1),new e("tt",-1,-1)],a=[new e("ig",-1,1),new e("lig",0,1),new e("els",-1,1),new e("fullt",-1,3),new e("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],l=new d;this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){var e=l.cursor;!function(){var e,r=l.cursor+3;if(t=l.limit,0<=r||r<=l.limit){for(n=r;;){if(e=l.cursor,l.in_grouping(o,97,246)){l.cursor=e;break}if(l.cursor=e,l.cursor>=l.limit)return;l.cursor++}for(;!l.out_grouping(o,97,246);){if(l.cursor>=l.limit)return;l.cursor++}(t=l.cursor)=t&&(l.limit_backward=t,l.cursor=l.limit,l.ket=l.cursor,r=l.find_among_b(i,37),l.limit_backward=e,r))switch(l.bra=l.cursor,r){case 1:l.slice_del();break;case 2:l.in_grouping_b(u,98,121)&&l.slice_del()}if(l.cursor=l.limit,e=l.limit_backward,l.cursor>=t&&(l.limit_backward=t,l.cursor=l.limit,l.find_among_b(s,7)&&(l.cursor=l.limit,l.ket=l.cursor,l.cursor>l.limit_backward)&&(l.bra=--l.cursor,l.slice_del()),l.limit_backward=e),l.cursor=l.limit,l.cursor>=t){if(r=l.limit_backward,l.limit_backward=t,l.cursor=l.limit,l.ket=l.cursor,e=l.find_among_b(a,5))switch(l.bra=l.cursor,e){case 1:l.slice_del();break;case 2:l.slice_from("lös");break;case 3:l.slice_from("full")}l.limit_backward=r}return!0}},function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}),r.Pipeline.registerFunction(r.sv.stemmer,"stemmer-sv"),r.sv.stopWordFilter=function(e){if(-1===r.sv.stopWordFilter.stopWords.indexOf(e))return e},r.sv.stopWordFilter.stopWords=new r.SortedSet,r.sv.stopWordFilter.stopWords.length=115,r.sv.stopWordFilter.stopWords.elements=" alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" "),r.Pipeline.registerFunction(r.sv.stopWordFilter,"stopWordFilter-sv")}}); diff --git a/js/lunr/lunr.tr.js b/js/lunr/lunr.tr.js new file mode 100644 index 0000000..ccecfad --- /dev/null +++ b/js/lunr/lunr.tr.js @@ -0,0 +1,1070 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function() { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function(lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* register specific locale function */ + lunr.tr = function() { + this.pipeline.reset(); + this.pipeline.add( + lunr.tr.trimmer, + lunr.tr.stopWordFilter, + lunr.tr.stemmer + ); + }; + + /* lunr trimmer function */ + lunr.tr.wordCharacters = "A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A"; + lunr.tr.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.tr.wordCharacters); + + lunr.Pipeline.registerFunction(lunr.tr.trimmer, 'trimmer-tr'); + + /* lunr stemmer function */ + lunr.tr.stemmer = (function() { + /* create the wrapped stemmer object */ + var Among = lunr.stemmerSupport.Among, + SnowballProgram = lunr.stemmerSupport.SnowballProgram, + st = new function TurkishStemmer() { + var a_0 = [new Among("m", -1, -1), new Among("n", -1, -1), + new Among("miz", -1, -1), new Among("niz", -1, -1), + new Among("muz", -1, -1), new Among("nuz", -1, -1), + new Among("m\u00FCz", -1, -1), new Among("n\u00FCz", -1, -1), + new Among("m\u0131z", -1, -1), new Among("n\u0131z", -1, -1) + ], + a_1 = [ + new Among("leri", -1, -1), new Among("lar\u0131", -1, -1) + ], + a_2 = [ + new Among("ni", -1, -1), new Among("nu", -1, -1), + new Among("n\u00FC", -1, -1), new Among("n\u0131", -1, -1) + ], + a_3 = [ + new Among("in", -1, -1), new Among("un", -1, -1), + new Among("\u00FCn", -1, -1), new Among("\u0131n", -1, -1) + ], + a_4 = [ + new Among("a", -1, -1), new Among("e", -1, -1) + ], + a_5 = [ + new Among("na", -1, -1), new Among("ne", -1, -1) + ], + a_6 = [ + new Among("da", -1, -1), new Among("ta", -1, -1), + new Among("de", -1, -1), new Among("te", -1, -1) + ], + a_7 = [ + new Among("nda", -1, -1), new Among("nde", -1, -1) + ], + a_8 = [ + new Among("dan", -1, -1), new Among("tan", -1, -1), + new Among("den", -1, -1), new Among("ten", -1, -1) + ], + a_9 = [ + new Among("ndan", -1, -1), new Among("nden", -1, -1) + ], + a_10 = [ + new Among("la", -1, -1), new Among("le", -1, -1) + ], + a_11 = [ + new Among("ca", -1, -1), new Among("ce", -1, -1) + ], + a_12 = [ + new Among("im", -1, -1), new Among("um", -1, -1), + new Among("\u00FCm", -1, -1), new Among("\u0131m", -1, -1) + ], + a_13 = [ + new Among("sin", -1, -1), new Among("sun", -1, -1), + new Among("s\u00FCn", -1, -1), new Among("s\u0131n", -1, -1) + ], + a_14 = [ + new Among("iz", -1, -1), new Among("uz", -1, -1), + new Among("\u00FCz", -1, -1), new Among("\u0131z", -1, -1) + ], + a_15 = [ + new Among("siniz", -1, -1), new Among("sunuz", -1, -1), + new Among("s\u00FCn\u00FCz", -1, -1), + new Among("s\u0131n\u0131z", -1, -1) + ], + a_16 = [ + new Among("lar", -1, -1), new Among("ler", -1, -1) + ], + a_17 = [ + new Among("niz", -1, -1), new Among("nuz", -1, -1), + new Among("n\u00FCz", -1, -1), new Among("n\u0131z", -1, -1) + ], + a_18 = [ + new Among("dir", -1, -1), new Among("tir", -1, -1), + new Among("dur", -1, -1), new Among("tur", -1, -1), + new Among("d\u00FCr", -1, -1), new Among("t\u00FCr", -1, -1), + new Among("d\u0131r", -1, -1), new Among("t\u0131r", -1, -1) + ], + a_19 = [ + new Among("cas\u0131na", -1, -1), new Among("cesine", -1, -1) + ], + a_20 = [ + new Among("di", -1, -1), new Among("ti", -1, -1), + new Among("dik", -1, -1), new Among("tik", -1, -1), + new Among("duk", -1, -1), new Among("tuk", -1, -1), + new Among("d\u00FCk", -1, -1), new Among("t\u00FCk", -1, -1), + new Among("d\u0131k", -1, -1), new Among("t\u0131k", -1, -1), + new Among("dim", -1, -1), new Among("tim", -1, -1), + new Among("dum", -1, -1), new Among("tum", -1, -1), + new Among("d\u00FCm", -1, -1), new Among("t\u00FCm", -1, -1), + new Among("d\u0131m", -1, -1), new Among("t\u0131m", -1, -1), + new Among("din", -1, -1), new Among("tin", -1, -1), + new Among("dun", -1, -1), new Among("tun", -1, -1), + new Among("d\u00FCn", -1, -1), new Among("t\u00FCn", -1, -1), + new Among("d\u0131n", -1, -1), new Among("t\u0131n", -1, -1), + new Among("du", -1, -1), new Among("tu", -1, -1), + new Among("d\u00FC", -1, -1), new Among("t\u00FC", -1, -1), + new Among("d\u0131", -1, -1), new Among("t\u0131", -1, -1) + ], + a_21 = [ + new Among("sa", -1, -1), new Among("se", -1, -1), + new Among("sak", -1, -1), new Among("sek", -1, -1), + new Among("sam", -1, -1), new Among("sem", -1, -1), + new Among("san", -1, -1), new Among("sen", -1, -1) + ], + a_22 = [ + new Among("mi\u015F", -1, -1), new Among("mu\u015F", -1, -1), + new Among("m\u00FC\u015F", -1, -1), + new Among("m\u0131\u015F", -1, -1) + ], + a_23 = [new Among("b", -1, 1), + new Among("c", -1, 2), new Among("d", -1, 3), + new Among("\u011F", -1, 4) + ], + g_vowel = [17, 65, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 1 + ], + g_U = [ + 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 1 + ], + g_vowel1 = [1, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 + ], + g_vowel2 = [17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130 + ], + g_vowel3 = [1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1 + ], + g_vowel4 = [17], + g_vowel5 = [65], + g_vowel6 = [65], + B_c_s_n_s, I_strlen, g_habr = [ + ["a", g_vowel1, 97, 305], + ["e", g_vowel2, 101, 252], + ["\u0131", g_vowel3, 97, 305], + ["i", g_vowel4, 101, 105], + ["o", g_vowel5, 111, 117], + ["\u00F6", g_vowel6, 246, 252], + ["u", g_vowel5, 111, 117] + ], + sbp = new SnowballProgram(); + this.setCurrent = function(word) { + sbp.setCurrent(word); + }; + this.getCurrent = function() { + return sbp.getCurrent(); + }; + + function habr1(g_v, n1, n2) { + while (true) { + var v_1 = sbp.limit - sbp.cursor; + if (sbp.in_grouping_b(g_v, n1, n2)) { + sbp.cursor = sbp.limit - v_1; + break; + } + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor <= sbp.limit_backward) + return false; + sbp.cursor--; + } + return true; + } + + function r_check_vowel_harmony() { + var v_1, v_2; + v_1 = sbp.limit - sbp.cursor; + habr1(g_vowel, 97, 305); + for (var i = 0; i < g_habr.length; i++) { + v_2 = sbp.limit - sbp.cursor; + var habr = g_habr[i]; + if (sbp.eq_s_b(1, habr[0]) && habr1(habr[1], habr[2], habr[3])) { + sbp.cursor = sbp.limit - v_1; + return true; + } + sbp.cursor = sbp.limit - v_2; + } + sbp.cursor = sbp.limit - v_2; + if (!sbp.eq_s_b(1, "\u00FC") || !habr1(g_vowel6, 246, 252)) + return false; + sbp.cursor = sbp.limit - v_1; + return true; + } + + function habr2(f1, f2) { + var v_1 = sbp.limit - sbp.cursor, + v_2; + if (f1()) { + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor > sbp.limit_backward) { + sbp.cursor--; + v_2 = sbp.limit - sbp.cursor; + if (f2()) { + sbp.cursor = sbp.limit - v_2; + return true; + } + } + } + sbp.cursor = sbp.limit - v_1; + if (f1()) { + sbp.cursor = sbp.limit - v_1; + return false; + } + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor <= sbp.limit_backward) + return false; + sbp.cursor--; + if (!f2()) + return false; + sbp.cursor = sbp.limit - v_1; + return true; + } + + function habr3(f1) { + return habr2(f1, function() { + return sbp.in_grouping_b(g_vowel, 97, 305); + }); + } + + function r_mark_suffix_with_optional_n_consonant() { + return habr3(function() { + return sbp.eq_s_b(1, "n"); + }); + } + + function r_mark_suffix_with_optional_s_consonant() { + return habr3(function() { + return sbp.eq_s_b(1, "s"); + }); + } + + function r_mark_suffix_with_optional_y_consonant() { + return habr3(function() { + return sbp.eq_s_b(1, "y"); + }); + } + + function r_mark_suffix_with_optional_U_vowel() { + return habr2(function() { + return sbp.in_grouping_b(g_U, 105, 305); + }, function() { + return sbp.out_grouping_b(g_vowel, 97, 305); + }); + } + + function r_mark_possessives() { + return sbp.find_among_b(a_0, 10) && r_mark_suffix_with_optional_U_vowel(); + } + + function r_mark_sU() { + return r_check_vowel_harmony() && sbp.in_grouping_b(g_U, 105, 305) && r_mark_suffix_with_optional_s_consonant(); + } + + function r_mark_lArI() { + return sbp.find_among_b(a_1, 2); + } + + function r_mark_yU() { + return r_check_vowel_harmony() && sbp.in_grouping_b(g_U, 105, 305) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_nU() { + return r_check_vowel_harmony() && sbp.find_among_b(a_2, 4); + } + + function r_mark_nUn() { + return r_check_vowel_harmony() && sbp.find_among_b(a_3, 4) && r_mark_suffix_with_optional_n_consonant(); + } + + function r_mark_yA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_4, 2) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_nA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_5, 2); + } + + function r_mark_DA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_6, 4); + } + + function r_mark_ndA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_7, 2); + } + + function r_mark_DAn() { + return r_check_vowel_harmony() && sbp.find_among_b(a_8, 4); + } + + function r_mark_ndAn() { + return r_check_vowel_harmony() && sbp.find_among_b(a_9, 2); + } + + function r_mark_ylA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_10, 2) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_ki() { + return sbp.eq_s_b(2, "ki"); + } + + function r_mark_ncA() { + return r_check_vowel_harmony() && sbp.find_among_b(a_11, 2) && r_mark_suffix_with_optional_n_consonant(); + } + + function r_mark_yUm() { + return r_check_vowel_harmony() && sbp.find_among_b(a_12, 4) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_sUn() { + return r_check_vowel_harmony() && sbp.find_among_b(a_13, 4); + } + + function r_mark_yUz() { + return r_check_vowel_harmony() && sbp.find_among_b(a_14, 4) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_sUnUz() { + return sbp.find_among_b(a_15, 4); + } + + function r_mark_lAr() { + return r_check_vowel_harmony() && sbp.find_among_b(a_16, 2); + } + + function r_mark_nUz() { + return r_check_vowel_harmony() && sbp.find_among_b(a_17, 4); + } + + function r_mark_DUr() { + return r_check_vowel_harmony() && sbp.find_among_b(a_18, 8); + } + + function r_mark_cAsInA() { + return sbp.find_among_b(a_19, 2); + } + + function r_mark_yDU() { + return r_check_vowel_harmony() && sbp.find_among_b(a_20, 32) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_ysA() { + return sbp.find_among_b(a_21, 8) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_ymUs_() { + return r_check_vowel_harmony() && sbp.find_among_b(a_22, 4) && r_mark_suffix_with_optional_y_consonant(); + } + + function r_mark_yken() { + return sbp.eq_s_b(3, "ken") && r_mark_suffix_with_optional_y_consonant(); + } + + function habr4() { + var v_1 = sbp.limit - sbp.cursor; + if (!r_mark_ymUs_()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yDU()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_ysA()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yken()) + return true; + } + } + } + return false; + } + + function habr5() { + if (r_mark_cAsInA()) { + var v_1 = sbp.limit - sbp.cursor; + if (!r_mark_sUnUz()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_lAr()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yUm()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_sUn()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yUz()) + sbp.cursor = sbp.limit - v_1; + } + } + } + } + if (r_mark_ymUs_()) + return false; + } + return true; + } + + function habr6() { + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + var v_1 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (!r_mark_DUr()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yDU()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_ysA()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_ymUs_()) + sbp.cursor = sbp.limit - v_1; + } + } + } + B_c_s_n_s = false; + return false; + } + return true; + } + + function habr7() { + if (!r_mark_nUz()) + return true; + var v_1 = sbp.limit - sbp.cursor; + if (!r_mark_yDU()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_ysA()) + return true; + } + return false; + } + + function habr8() { + var v_1 = sbp.limit - sbp.cursor, + v_2; + if (!r_mark_sUnUz()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yUz()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_sUn()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yUm()) + return true; + } + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + v_2 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (!r_mark_ymUs_()) + sbp.cursor = sbp.limit - v_2; + return false; + } + + function r_stem_nominal_verb_suffixes() { + var v_1 = sbp.limit - sbp.cursor, + v_2; + sbp.ket = sbp.cursor; + B_c_s_n_s = true; + if (habr4()) { + sbp.cursor = sbp.limit - v_1; + if (habr5()) { + sbp.cursor = sbp.limit - v_1; + if (habr6()) { + sbp.cursor = sbp.limit - v_1; + if (habr7()) { + sbp.cursor = sbp.limit - v_1; + if (habr8()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_DUr()) + return; + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (!r_mark_sUnUz()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_lAr()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_yUm()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_sUn()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_yUz()) + sbp.cursor = sbp.limit - v_2; + } + } + } + } + if (!r_mark_ymUs_()) + sbp.cursor = sbp.limit - v_2; + } + } + } + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + } + + function r_stem_suffix_chain_before_ki() { + var v_1, v_2, v_3, v_4; + sbp.ket = sbp.cursor; + if (r_mark_ki()) { + v_1 = sbp.limit - sbp.cursor; + if (r_mark_DA()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + v_2 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } else { + sbp.cursor = sbp.limit - v_2; + if (r_mark_possessives()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } + } + return true; + } + sbp.cursor = sbp.limit - v_1; + if (r_mark_nUn()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_3 = sbp.limit - sbp.cursor; + if (r_mark_lArI()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else { + sbp.cursor = sbp.limit - v_3; + sbp.ket = sbp.cursor; + if (!r_mark_possessives()) { + sbp.cursor = sbp.limit - v_3; + if (!r_mark_sU()) { + sbp.cursor = sbp.limit - v_3; + if (!r_stem_suffix_chain_before_ki()) + return true; + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki() + } + } + return true; + } + sbp.cursor = sbp.limit - v_1; + if (r_mark_ndA()) { + v_4 = sbp.limit - sbp.cursor; + if (r_mark_lArI()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else { + sbp.cursor = sbp.limit - v_4; + if (r_mark_sU()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } else { + sbp.cursor = sbp.limit - v_4; + if (!r_stem_suffix_chain_before_ki()) + return false; + } + } + return true; + } + } + return false; + } + + function habr9(v_1) { + sbp.ket = sbp.cursor; + if (!r_mark_ndA()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_nA()) + return false; + } + var v_2 = sbp.limit - sbp.cursor; + if (r_mark_lArI()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else { + sbp.cursor = sbp.limit - v_2; + if (r_mark_sU()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } else { + sbp.cursor = sbp.limit - v_2; + if (!r_stem_suffix_chain_before_ki()) + return false; + } + } + return true; + } + + function habr10(v_1) { + sbp.ket = sbp.cursor; + if (!r_mark_ndAn()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_nU()) + return false; + } + var v_2 = sbp.limit - sbp.cursor; + if (!r_mark_sU()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_lArI()) + return false; + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + return true; + } + + function habr11() { + var v_1 = sbp.limit - sbp.cursor, + v_2; + sbp.ket = sbp.cursor; + if (!r_mark_nUn()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_ylA()) + return false; + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + v_2 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + if (r_stem_suffix_chain_before_ki()) + return true; + } + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (!r_mark_possessives()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_sU()) { + sbp.cursor = sbp.limit - v_2; + if (!r_stem_suffix_chain_before_ki()) + return true; + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + return true; + } + + function habr12() { + var v_1 = sbp.limit - sbp.cursor, + v_2, v_3; + sbp.ket = sbp.cursor; + if (!r_mark_DA()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yU()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_yA()) + return false; + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_2 = sbp.limit - sbp.cursor; + if (r_mark_possessives()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + v_3 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (!r_mark_lAr()) + sbp.cursor = sbp.limit - v_3; + } else { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_lAr()) + return true; + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + r_stem_suffix_chain_before_ki(); + return true; + } + + function r_stem_noun_suffixes() { + var v_1 = sbp.limit - sbp.cursor, + v_2, v_3; + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + return; + } + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (r_mark_ncA()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + v_2 = sbp.limit - sbp.cursor; + sbp.ket = sbp.cursor; + if (r_mark_lArI()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + } else { + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (!r_mark_possessives()) { + sbp.cursor = sbp.limit - v_2; + if (!r_mark_sU()) { + sbp.cursor = sbp.limit - v_2; + sbp.ket = sbp.cursor; + if (!r_mark_lAr()) + return; + sbp.bra = sbp.cursor; + sbp.slice_del(); + if (!r_stem_suffix_chain_before_ki()) + return; + } + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } + return; + } + sbp.cursor = sbp.limit - v_1; + if (habr9(v_1)) + return; + sbp.cursor = sbp.limit - v_1; + if (habr10(v_1)) + return; + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (r_mark_DAn()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + v_3 = sbp.limit - sbp.cursor; + if (r_mark_possessives()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } else { + sbp.cursor = sbp.limit - v_3; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } else { + sbp.cursor = sbp.limit - v_3; + r_stem_suffix_chain_before_ki(); + } + } + return; + } + sbp.cursor = sbp.limit - v_1; + if (habr11()) + return; + sbp.cursor = sbp.limit - v_1; + if (r_mark_lArI()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + return; + } + sbp.cursor = sbp.limit - v_1; + if (r_stem_suffix_chain_before_ki()) + return; + sbp.cursor = sbp.limit - v_1; + if (habr12()) + return; + sbp.cursor = sbp.limit - v_1; + sbp.ket = sbp.cursor; + if (!r_mark_possessives()) { + sbp.cursor = sbp.limit - v_1; + if (!r_mark_sU()) + return; + } + sbp.bra = sbp.cursor; + sbp.slice_del(); + sbp.ket = sbp.cursor; + if (r_mark_lAr()) { + sbp.bra = sbp.cursor; + sbp.slice_del(); + r_stem_suffix_chain_before_ki(); + } + } + + function r_post_process_last_consonants() { + var among_var; + sbp.ket = sbp.cursor; + among_var = sbp.find_among_b(a_23, 4); + if (among_var) { + sbp.bra = sbp.cursor; + switch (among_var) { + case 1: + sbp.slice_from("p"); + break; + case 2: + sbp.slice_from("\u00E7"); + break; + case 3: + sbp.slice_from("t"); + break; + case 4: + sbp.slice_from("k"); + break; + } + } + } + + function habr13() { + while (true) { + var v_1 = sbp.limit - sbp.cursor; + if (sbp.in_grouping_b(g_vowel, 97, 305)) { + sbp.cursor = sbp.limit - v_1; + break; + } + sbp.cursor = sbp.limit - v_1; + if (sbp.cursor <= sbp.limit_backward) + return false; + sbp.cursor--; + } + return true; + } + + function habr14(v_1, c1, c2) { + sbp.cursor = sbp.limit - v_1; + if (habr13()) { + var v_2 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, c1)) { + sbp.cursor = sbp.limit - v_2; + if (!sbp.eq_s_b(1, c2)) + return true; + } + sbp.cursor = sbp.limit - v_1; + var c = sbp.cursor; + sbp.insert(sbp.cursor, sbp.cursor, c2); + sbp.cursor = c; + return false; + } + return true; + } + + function r_append_U_to_stems_ending_with_d_or_g() { + var v_1 = sbp.limit - sbp.cursor; + if (!sbp.eq_s_b(1, "d")) { + sbp.cursor = sbp.limit - v_1; + if (!sbp.eq_s_b(1, "g")) + return; + } + if (habr14(v_1, "a", "\u0131")) + if (habr14(v_1, "e", "i")) + if (habr14(v_1, "o", "u")) + habr14(v_1, "\u00F6", "\u00FC") + } + + function r_more_than_one_syllable_word() { + var v_1 = sbp.cursor, + v_2 = 2, + v_3; + while (true) { + v_3 = sbp.cursor; + while (!sbp.in_grouping(g_vowel, 97, 305)) { + if (sbp.cursor >= sbp.limit) { + sbp.cursor = v_3; + if (v_2 > 0) + return false; + sbp.cursor = v_1; + return true; + } + sbp.cursor++; + } + v_2--; + } + } + + function habr15(v_1, n1, c1) { + while (!sbp.eq_s(n1, c1)) { + if (sbp.cursor >= sbp.limit) + return true; + sbp.cursor++; + } + I_strlen = n1; + if (I_strlen != sbp.limit) + return true; + sbp.cursor = v_1; + return false; + } + + function r_is_reserved_word() { + var v_1 = sbp.cursor; + if (habr15(v_1, 2, "ad")) { + sbp.cursor = v_1; + if (habr15(v_1, 5, "soyad")) + return false; + } + return true; + } + + function r_postlude() { + var v_1 = sbp.cursor; + if (r_is_reserved_word()) + return false; + sbp.limit_backward = v_1; + sbp.cursor = sbp.limit; + r_append_U_to_stems_ending_with_d_or_g(); + sbp.cursor = sbp.limit; + r_post_process_last_consonants(); + return true; + } + this.stem = function() { + if (r_more_than_one_syllable_word()) { + sbp.limit_backward = sbp.cursor; + sbp.cursor = sbp.limit; + r_stem_nominal_verb_suffixes(); + sbp.cursor = sbp.limit; + if (B_c_s_n_s) { + r_stem_noun_suffixes(); + sbp.cursor = sbp.limit_backward; + if (r_postlude()) + return true; + } + } + return false; + } + }; + + /* and return a function that stems a word for the current locale */ + return function(word) { + st.setCurrent(word); + st.stem(); + return st.getCurrent(); + } + })(); + + lunr.Pipeline.registerFunction(lunr.tr.stemmer, 'stemmer-tr'); + + /* stop word filter function */ + lunr.tr.stopWordFilter = function(token) { + if (lunr.tr.stopWordFilter.stopWords.indexOf(token) === -1) { + return token; + } + }; + + lunr.tr.stopWordFilter.stopWords = new lunr.SortedSet(); + lunr.tr.stopWordFilter.stopWords.length = 210; + + // The space at the beginning is crucial: It marks the empty string + // as a stop word. lunr.js crashes during search when documents + // processed by the pipeline still contain the empty string. + lunr.tr.stopWordFilter.stopWords.elements = ' acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle'.split(' '); + + lunr.Pipeline.registerFunction(lunr.tr.stopWordFilter, 'stopWordFilter-tr'); + }; +})) diff --git a/js/lunr/lunr.tr.min.js b/js/lunr/lunr.tr.min.js new file mode 100644 index 0000000..c2d8fb6 --- /dev/null +++ b/js/lunr/lunr.tr.min.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,(function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i,e,n;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer)},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){var r,n=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],t=[new i("leri",-1,-1),new i("ları",-1,-1)],u=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],o=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],s=[new i("a",-1,-1),new i("e",-1,-1)],c=[new i("na",-1,-1),new i("ne",-1,-1)],l=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],m=[new i("nda",-1,-1),new i("nde",-1,-1)],a=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],d=[new i("ndan",-1,-1),new i("nden",-1,-1)],b=[new i("la",-1,-1),new i("le",-1,-1)],w=[new i("ca",-1,-1),new i("ce",-1,-1)],f=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],_=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],k=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],p=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],g=[new i("lar",-1,-1),new i("ler",-1,-1)],y=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],z=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],h=[new i("casına",-1,-1),new i("cesine",-1,-1)],v=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],q=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],W=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],F=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],C=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],S=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],P=[65],L=[65],x=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["i",[17],101,105],["o",P,111,117],["ö",L,246,252],["u",P,111,117]],A=new e;function E(r,i,e){for(;;){var n=A.limit-A.cursor;if(A.in_grouping_b(r,i,e)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}return 1}function j(){var r=A.limit-A.cursor;E(C,97,305);for(var i=0;iA.limit_backward)&&(A.cursor--,e=A.limit-A.cursor,i()))A.cursor=A.limit-e;else{if(A.cursor=A.limit-n,r())return A.cursor=A.limit-n,!1;if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return!1;if(A.cursor--,!i())return!1;A.cursor=A.limit-n}return!0}function T(r){return O(r,(function(){return A.in_grouping_b(C,97,305)}))}function Z(){return T((function(){return A.eq_s_b(1,"n")}))}function B(){return T((function(){return A.eq_s_b(1,"y")}))}function D(){return A.find_among_b(n,10)&&O((function(){return A.in_grouping_b(S,105,305)}),(function(){return A.out_grouping_b(C,97,305)}))}function G(){return j()&&A.in_grouping_b(S,105,305)&&T((function(){return A.eq_s_b(1,"s")}))}function H(){return A.find_among_b(t,2)}function I(){return j()&&A.find_among_b(o,4)&&Z()}function J(){return j()&&A.find_among_b(l,4)}function K(){return j()&&A.find_among_b(m,2)}function M(){return j()&&A.find_among_b(f,4)&&B()}function N(){return j()&&A.find_among_b(_,4)}function Q(){return j()&&A.find_among_b(k,4)&&B()}function R(){return A.find_among_b(p,4)}function U(){return j()&&A.find_among_b(g,2)}function V(){return j()&&A.find_among_b(z,8)}function X(){return j()&&A.find_among_b(v,32)&&B()}function Y(){return A.find_among_b(q,8)&&B()}function $(){return j()&&A.find_among_b(W,4)&&B()}function rr(){var r,i;if(A.ket=A.cursor,A.eq_s_b(2,"ki")){if(r=A.limit-A.cursor,J())return A.bra=A.cursor,A.slice_del(),i=A.limit-A.cursor,A.ket=A.cursor,(U()||(A.cursor=A.limit-i,D()&&(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U())))&&(A.bra=A.cursor,A.slice_del(),rr()),1;if(A.cursor=A.limit-r,I()){if(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,i=A.limit-A.cursor,H())A.bra=A.cursor,A.slice_del();else{if(A.cursor=A.limit-i,A.ket=A.cursor,!D()&&(A.cursor=A.limit-i,!G())&&(A.cursor=A.limit-i,!rr()))return 1;A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),rr())}return 1}if(A.cursor=A.limit-r,K()){if(i=A.limit-A.cursor,H())A.bra=A.cursor,A.slice_del();else if(A.cursor=A.limit-i,G())A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),rr());else if(A.cursor=A.limit-i,!rr())return;return 1}}}function ir(r,i,e){var n;return A.cursor=A.limit-r,!function(){for(;;){var r=A.limit-A.cursor;if(A.in_grouping_b(C,97,305)){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward)return;A.cursor--}return 1}()||(n=A.limit-A.cursor,!A.eq_s_b(1,i)&&(A.cursor=A.limit-n,!A.eq_s_b(1,e)))||(A.cursor=A.limit-r,i=A.cursor,A.insert(A.cursor,A.cursor,e),void(A.cursor=i))}function er(r,i,e){for(;!A.eq_s(i,e);){if(A.cursor>=A.limit)return 1;A.cursor++}if(i!=A.limit)return 1;A.cursor=r}this.setCurrent=function(r){A.setCurrent(r)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=A.cursor,e=2;;){for(r=A.cursor;!A.in_grouping(C,97,305);){if(A.cursor>=A.limit)return A.cursor=r,!(0 1.0.0 + this.tokenizerFn = lunr.zh.tokenizer; + } + } + }; + + lunr.zh.tokenizer = function(obj) { + if (!arguments.length || obj == null || obj == undefined) return [] + if (Array.isArray(obj)) return obj.map(function(t) { + return isLunr2 ? new lunr.Token(t.toLowerCase()) : t.toLowerCase() + }) + + nodejiebaDictJson && nodejieba.load(nodejiebaDictJson) + + var str = obj.toString().trim().toLowerCase(); + var tokens = []; + + nodejieba.cut(str, true).forEach(function(seg) { + tokens = tokens.concat(seg.split(' ')) + }) + + tokens = tokens.filter(function(token) { + return !!token; + }); + + var fromIndex = 0 + + return tokens.map(function(token, index) { + if (isLunr2) { + var start = str.indexOf(token, fromIndex) + + var tokenMetadata = {} + tokenMetadata["position"] = [start, token.length] + tokenMetadata["index"] = index + + fromIndex = start + + return new lunr.Token(token, tokenMetadata); + } else { + return token + } + }); + } + + /* lunr trimmer function */ + lunr.zh.wordCharacters = "\\w\u4e00-\u9fa5"; + lunr.zh.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.zh.wordCharacters); + lunr.Pipeline.registerFunction(lunr.zh.trimmer, 'trimmer-zh'); + + /* lunr stemmer function */ + lunr.zh.stemmer = (function() { + + /* TODO Chinese stemmer */ + return function(word) { + return word; + } + })(); + lunr.Pipeline.registerFunction(lunr.zh.stemmer, 'stemmer-zh'); + + /* lunr stop word filter. see https://www.ranks.nl/stopwords/chinese-stopwords */ + lunr.generateStopWordFilter = function (stopWords) { + var words = stopWords.reduce(function (memo, stopWord) { + memo[stopWord] = stopWord; + return memo; + }, {}); + + return function (token) { + if (token && words[token.toString()] !== token.toString()) return token; + }; + } + + lunr.zh.stopWordFilter = lunr.generateStopWordFilter( + '的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自'.split(' ')); + lunr.Pipeline.registerFunction(lunr.zh.stopWordFilter, 'stopWordFilter-zh'); + }; +})) diff --git a/js/lunr/lunr.zh.min.js b/js/lunr/lunr.zh.min.js new file mode 100644 index 0000000..387e69a --- /dev/null +++ b/js/lunr/lunr.zh.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("nodejieba")):r()(e.lunr)}(this,function(n){return function(u,t){if(void 0===u)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===u.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var s="2"==u.version[0];u.zh=function(){this.pipeline.reset(),this.pipeline.add(u.zh.trimmer,u.zh.stopWordFilter,u.zh.stemmer),s?this.tokenizer=u.zh.tokenizer:(u.tokenizer&&(u.tokenizer=u.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=u.zh.tokenizer))},u.zh.tokenizer=function(e){if(!arguments.length||null==e)return[];if(Array.isArray(e))return e.map(function(e){return s?new u.Token(e.toLowerCase()):e.toLowerCase()});t&&n.load(t);var i=e.toString().trim().toLowerCase(),r=[],o=(n.cut(i,!0).forEach(function(e){r=r.concat(e.split(" "))}),r=r.filter(function(e){return!!e}),0);return r.map(function(e,r){var t,n;return s?(t=i.indexOf(e,o),(n={}).position=[t,e.length],n.index=r,o=t,new u.Token(e,n)):e})},u.zh.wordCharacters="\\w一-龥",u.zh.trimmer=u.trimmerSupport.generateTrimmer(u.zh.wordCharacters),u.Pipeline.registerFunction(u.zh.trimmer,"trimmer-zh"),u.zh.stemmer=function(e){return e},u.Pipeline.registerFunction(u.zh.stemmer,"stemmer-zh"),u.generateStopWordFilter=function(e){var r=e.reduce(function(e,r){return e[r]=r,e},{});return function(e){if(e&&r[e.toString()]!==e.toString())return e}},u.zh.stopWordFilter=u.generateStopWordFilter("的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自".split(" ")),u.Pipeline.registerFunction(u.zh.stopWordFilter,"stopWordFilter-zh")}}); diff --git a/js/lunr/lunrStemmerSupport.js b/js/lunr/lunrStemmerSupport.js new file mode 100755 index 0000000..32959fb --- /dev/null +++ b/js/lunr/lunrStemmerSupport.js @@ -0,0 +1,304 @@ +/*! + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +; (function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function (lunr) { + /* provides utilities for the included stemmers */ + lunr.stemmerSupport = { + Among: function (s, substring_i, result, method) { + this.toCharArray = function (s) { + var sLength = s.length, charArr = new Array(sLength); + for (var i = 0; i < sLength; i++) + charArr[i] = s.charCodeAt(i); + return charArr; + }; + + if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result) + throw ("Bad Among initialisation: s:" + s + ", substring_i: " + + substring_i + ", result: " + result); + this.s_size = s.length; + this.s = this.toCharArray(s); + this.substring_i = substring_i; + this.result = result; + this.method = method; + }, + SnowballProgram: function () { + var current; + return { + bra: 0, + ket: 0, + limit: 0, + cursor: 0, + limit_backward: 0, + setCurrent: function (word) { + current = word; + this.cursor = 0; + this.limit = word.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }, + getCurrent: function () { + var result = current; + current = null; + return result; + }, + in_grouping: function (s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor++; + return true; + } + } + } + return false; + }, + in_grouping_b: function (s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor--; + return true; + } + } + } + return false; + }, + out_grouping: function (s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor++; + return true; + } + } + return false; + }, + out_grouping_b: function (s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor--; + return true; + } + } + return false; + }, + eq_s: function (s_size, s) { + if (this.limit - this.cursor < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i)) + return false; + this.cursor += s_size; + return true; + }, + eq_s_b: function (s_size, s) { + if (this.cursor - this.limit_backward < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor - s_size + i) != s + .charCodeAt(i)) + return false; + this.cursor -= s_size; + return true; + }, + find_among: function (v, v_size) { + var i = 0, j = v_size, c = this.cursor, l = this.limit, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = common; i2 < w.s_size; i2++) { + if (c + common == l) { + diff = -1; + break; + } + diff = current.charCodeAt(c + common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c + w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c + w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + find_among_b: function (v, v_size) { + var i = 0, j = v_size, c = this.cursor, lb = this.limit_backward, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common == lb) { + diff = -1; + break; + } + diff = current.charCodeAt(c - 1 - common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c - w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c - w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + replace_s: function (c_bra, c_ket, s) { + var adjustment = s.length - (c_ket - c_bra), left = current + .substring(0, c_bra), right = current.substring(c_ket); + current = left + s + right; + this.limit += adjustment; + if (this.cursor >= c_ket) + this.cursor += adjustment; + else if (this.cursor > c_bra) + this.cursor = c_bra; + return adjustment; + }, + slice_check: function () { + if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit + || this.limit > current.length) + throw ("faulty slice operation"); + }, + slice_from: function (s) { + this.slice_check(); + this.replace_s(this.bra, this.ket, s); + }, + slice_del: function () { + this.slice_from(""); + }, + insert: function (c_bra, c_ket, s) { + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) + this.bra += adjustment; + if (c_bra <= this.ket) + this.ket += adjustment; + }, + slice_to: function () { + this.slice_check(); + return current.substring(this.bra, this.ket); + }, + eq_v_b: function (s) { + return this.eq_s_b(s.length, s); + } + }; + } + }; + + lunr.trimmerSupport = { + generateTrimmer: function (wordCharacters) { + var startRegex = new RegExp("^[^" + wordCharacters + "]+") + var endRegex = new RegExp("[^" + wordCharacters + "]+$") + + return function (token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function (s) { + return s + .replace(startRegex, '') + .replace(endRegex, ''); + }) + } else { // for lunr version 1 + return token + .replace(startRegex, '') + .replace(endRegex, ''); + } + }; + } + } + } +})); diff --git a/js/lunr/lunrStemmerSupport.min.js b/js/lunr/lunrStemmerSupport.min.js new file mode 100755 index 0000000..3567a8c --- /dev/null +++ b/js/lunr/lunrStemmerSupport.min.js @@ -0,0 +1 @@ +!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),f=0,a=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c,f=i+(s-i>>1),a=0,l=u=(c=r[i]).s_size){if(this.cursor=e-c.s_size,!c.method)return c.result;var m=c.method();if(this.cursor=e-c.s_size,m)return c.result}if((i=c.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){t=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=t),r<=this.ket&&(this.ket+=t)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); diff --git a/js/searchElasticlunr.js b/js/searchElasticlunr.js new file mode 100644 index 0000000..12469d8 --- /dev/null +++ b/js/searchElasticlunr.js @@ -0,0 +1,3197 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +(function () { + /*! + * elasticlunr.js + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * Convenience function for instantiating a new elasticlunr index and configuring it + * with the default pipeline functions and the passed config function. + * + * When using this convenience function a new index will be created with the + * following functions already in the pipeline: + * + * 1. elasticlunr.trimmer - trim non-word character + * 2. elasticlunr.StopWordFilter - filters out any stop words before they enter the + * index + * 3. elasticlunr.stemmer - stems the tokens before entering the index. + * + * + * Example: + * + * var idx = elasticlunr(function () { + * this.addField('id'); + * this.addField('title'); + * this.addField('body'); + * + * //this.setRef('id'); // default ref is 'id' + * + * this.pipeline.add(function () { + * // some custom pipeline function + * }); + * }); + * + * idx.addDoc({ + * id: 1, + * title: 'Oracle released database 12g', + * body: 'Yestaday, Oracle has released their latest database, named 12g, more robust. this product will increase Oracle profit.' + * }); + * + * idx.addDoc({ + * id: 2, + * title: 'Oracle released annual profit report', + * body: 'Yestaday, Oracle has released their annual profit report of 2015, total profit is 12.5 Billion.' + * }); + * + * # simple search + * idx.search('oracle database'); + * + * # search with query-time boosting + * idx.search('oracle database', {fields: {title: {boost: 2}, body: {boost: 1}}}); + * + * @param {Function} config A function that will be called with the new instance + * of the elasticlunr.Index as both its context and first parameter. It can be used to + * customize the instance of new elasticlunr.Index. + * @namespace + * @module + * @return {elasticlunr.Index} + * + */ + const elasticlunr = function (config) { + const idx = new elasticlunr.Index(); + + idx.pipeline.add( + elasticlunr.trimmer, + elasticlunr.stopWordFilter, + elasticlunr.stemmer + ); + + if (config) config.call(idx, idx); + + return idx; + }; + + elasticlunr.version = '0.9.5'; + + // only used this to make elasticlunr.js compatible with lunr-languages + // this is a trick to define a global alias of elasticlunr + lunr = elasticlunr; + + /*! + * elasticlunr.utils + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * A namespace containing utils for the rest of the elasticlunr library + */ + elasticlunr.utils = {}; + + /** + * Print a warning message to the console. + * + * @param {String} message The message to be printed. + * @memberOf Utils + */ + elasticlunr.utils.warn = (function (global) { + return function (message) { + if (global.console && console.warn) { + console.warn(message); + } + }; + })(this); + + /** + * Convert an object to string. + * + * In the case of `null` and `undefined` the function returns + * an empty string, in all other cases the result of calling + * `toString` on the passed object is returned. + * + * @param {object} obj The object to convert to a string. + * @return {String} string representation of the passed object. + * @memberOf Utils + */ + elasticlunr.utils.toString = function (obj) { + if (obj === void 0 || obj === null) { + return ''; + } + + return obj.toString(); + }; + /*! + * elasticlunr.EventEmitter + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.EventEmitter is an event emitter for elasticlunr. + * It manages adding and removing event handlers and triggering events and their handlers. + * + * Each event could has multiple corresponding functions, + * these functions will be called as the sequence that they are added into the event. + * + * @constructor + */ + elasticlunr.EventEmitter = function () { + this.events = {}; + }; + + /** + * Binds a handler function to a specific event(s). + * + * Can bind a single function to many different events in one call. + * + * @param {String} [eventName] The name(s) of events to bind this function to. + * @param {Function} fn The function to call when an event is fired. + * @memberOf EventEmitter + */ + elasticlunr.EventEmitter.prototype.addListener = function () { + const args = Array.prototype.slice.call(arguments); + const fn = args.pop(); + const names = args; + + if (typeof fn !== 'function') + throw new TypeError('last argument must be a function'); + + names.forEach(function (name) { + if (!this.hasHandler(name)) this.events[name] = []; + this.events[name].push(fn); + }, this); + }; + + /** + * Removes a handler function from a specific event. + * + * @param {String} eventName The name of the event to remove this function from. + * @param {Function} fn The function to remove from an event. + * @memberOf EventEmitter + */ + elasticlunr.EventEmitter.prototype.removeListener = function (name, fn) { + if (!this.hasHandler(name)) return; + + const fnIndex = this.events[name].indexOf(fn); + if (fnIndex === -1) return; + + this.events[name].splice(fnIndex, 1); + + if (this.events[name].length === 0) delete this.events[name]; + }; + + /** + * Call all functions that bounded to the given event. + * + * Additional data can be passed to the event handler as arguments to `emit` + * after the event name. + * + * @param {String} eventName The name of the event to emit. + * @memberOf EventEmitter + */ + elasticlunr.EventEmitter.prototype.emit = function (name) { + if (!this.hasHandler(name)) return; + + const args = Array.prototype.slice.call(arguments, 1); + + this.events[name].forEach(function (fn) { + fn.apply(undefined, args); + }, this); + }; + + /** + * Checks whether a handler has ever been stored against an event. + * + * @param {String} eventName The name of the event to check. + * @private + * @memberOf EventEmitter + */ + elasticlunr.EventEmitter.prototype.hasHandler = function (name) { + return name in this.events; + }; + /*! + * elasticlunr.tokenizer + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * A function for splitting a string into tokens. + * Currently English is supported as default. + * Uses `elasticlunr.tokenizer.seperator` to split strings, you could change + * the value of this property to set how you want strings are split into tokens. + * IMPORTANT: use elasticlunr.tokenizer.seperator carefully, if you are not familiar with + * text process, then you'd better not change it. + * + * @module + * @param {String} str The string that you want to tokenize. + * @see elasticlunr.tokenizer.seperator + * @return {Array} + */ + elasticlunr.tokenizer = function (str) { + if (!arguments.length || str === null || str === undefined) return []; + if (Array.isArray(str)) { + let arr = str.filter(function (token) { + if (token === null || token === undefined) { + return false; + } + + return true; + }); + + arr = arr.map(function (t) { + return elasticlunr.utils.toString(t).toLowerCase(); + }); + + let out = []; + arr.forEach(function (item) { + const tokens = item.split(elasticlunr.tokenizer.seperator); + out = out.concat(tokens); + }, this); + + return out; + } + + return str + .toString() + .trim() + .toLowerCase() + .split(elasticlunr.tokenizer.seperator); + }; + + /** + * Default string seperator. + */ + elasticlunr.tokenizer.defaultSeperator = /[\s-]+/; + + /** + * The sperator used to split a string into tokens. Override this property to change the behaviour of + * `elasticlunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. + * + * @static + * @see elasticlunr.tokenizer + */ + elasticlunr.tokenizer.seperator = elasticlunr.tokenizer.defaultSeperator; + + /** + * Set up customized string seperator + * + * @param {Object} sep The customized seperator that you want to use to tokenize a string. + */ + elasticlunr.tokenizer.setSeperator = function (sep) { + if (sep !== null && sep !== undefined && typeof sep === 'object') { + elasticlunr.tokenizer.seperator = sep; + } + }; + + /** + * Reset string seperator + * + */ + elasticlunr.tokenizer.resetSeperator = function () { + elasticlunr.tokenizer.seperator = elasticlunr.tokenizer.defaultSeperator; + }; + + /** + * Get string seperator + * + */ + elasticlunr.tokenizer.getSeperator = function () { + return elasticlunr.tokenizer.seperator; + }; + /*! + * elasticlunr.Pipeline + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.Pipelines maintain an ordered list of functions to be applied to + * both documents tokens and query tokens. + * + * An instance of elasticlunr.Index will contain a pipeline + * with a trimmer, a stop word filter, an English stemmer. Extra + * functions can be added before or after either of these functions or these + * default functions can be removed. + * + * When run the pipeline, it will call each function in turn. + * + * The output of the functions in the pipeline will be passed to the next function + * in the pipeline. To exclude a token from entering the index the function + * should return undefined, the rest of the pipeline will not be called with + * this token. + * + * For serialisation of pipelines to work, all functions used in an instance of + * a pipeline should be registered with elasticlunr.Pipeline. Registered functions can + * then be loaded. If trying to load a serialised pipeline that uses functions + * that are not registered an error will be thrown. + * + * If not planning on serialising the pipeline then registering pipeline functions + * is not necessary. + * + * @constructor + */ + elasticlunr.Pipeline = function () { + this._queue = []; + }; + + elasticlunr.Pipeline.registeredFunctions = {}; + + /** + * Register a function in the pipeline. + * + * Functions that are used in the pipeline should be registered if the pipeline + * needs to be serialised, or a serialised pipeline needs to be loaded. + * + * Registering a function does not add it to a pipeline, functions must still be + * added to instances of the pipeline for them to be used when running a pipeline. + * + * @param {Function} fn The function to register. + * @param {String} label The label to register this function with + * @memberOf Pipeline + */ + elasticlunr.Pipeline.registerFunction = function (fn, label) { + if (label in elasticlunr.Pipeline.registeredFunctions) { + elasticlunr.utils.warn( + 'Overwriting existing registered function: ' + label + ); + } + + fn.label = label; + elasticlunr.Pipeline.registeredFunctions[label] = fn; + }; + + /** + * Get a registered function in the pipeline. + * + * @param {String} label The label of registered function. + * @return {Function} + * @memberOf Pipeline + */ + elasticlunr.Pipeline.getRegisteredFunction = function (label) { + if (label in elasticlunr.Pipeline.registeredFunctions !== true) { + return null; + } + + return elasticlunr.Pipeline.registeredFunctions[label]; + }; + + /** + * Warns if the function is not registered as a Pipeline function. + * + * @param {Function} fn The function to check for. + * @private + * @memberOf Pipeline + */ + elasticlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { + const isRegistered = fn.label && fn.label in this.registeredFunctions; + + if (!isRegistered) { + elasticlunr.utils.warn( + 'Function is not registered with pipeline. This may cause problems when serialising the index.\n', + fn + ); + } + }; + + /** + * Loads a previously serialised pipeline. + * + * All functions to be loaded must already be registered with elasticlunr.Pipeline. + * If any function from the serialised data has not been registered then an + * error will be thrown. + * + * @param {Object} serialised The serialised pipeline to load. + * @return {elasticlunr.Pipeline} + * @memberOf Pipeline + */ + elasticlunr.Pipeline.load = function (serialised) { + const pipeline = new elasticlunr.Pipeline(); + + serialised.forEach(function (fnName) { + const fn = elasticlunr.Pipeline.getRegisteredFunction(fnName); + + if (fn) { + pipeline.add(fn); + } else { + throw new Error('Cannot load un-registered function: ' + fnName); + } + }); + + return pipeline; + }; + + /** + * Adds new functions to the end of the pipeline. + * + * Logs a warning if the function has not been registered. + * + * @param {Function} functions Any number of functions to add to the pipeline. + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.add = function () { + const fns = Array.prototype.slice.call(arguments); + + fns.forEach(function (fn) { + elasticlunr.Pipeline.warnIfFunctionNotRegistered(fn); + this._queue.push(fn); + }, this); + }; + + /** + * Adds a single function after a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * If existingFn is not found, throw an Exception. + * + * @param {Function} existingFn A function that already exists in the pipeline. + * @param {Function} newFn The new function to add to the pipeline. + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.after = function (existingFn, newFn) { + elasticlunr.Pipeline.warnIfFunctionNotRegistered(newFn); + + const pos = this._queue.indexOf(existingFn); + if (pos === -1) { + throw new Error('Cannot find existingFn'); + } + + this._queue.splice(pos + 1, 0, newFn); + }; + + /** + * Adds a single function before a function that already exists in the + * pipeline. + * + * Logs a warning if the function has not been registered. + * If existingFn is not found, throw an Exception. + * + * @param {Function} existingFn A function that already exists in the pipeline. + * @param {Function} newFn The new function to add to the pipeline. + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.before = function (existingFn, newFn) { + elasticlunr.Pipeline.warnIfFunctionNotRegistered(newFn); + + const pos = this._queue.indexOf(existingFn); + if (pos === -1) { + throw new Error('Cannot find existingFn'); + } + + this._queue.splice(pos, 0, newFn); + }; + + /** + * Removes a function from the pipeline. + * + * @param {Function} fn The function to remove from the pipeline. + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.remove = function (fn) { + const pos = this._queue.indexOf(fn); + if (pos === -1) { + return; + } + + this._queue.splice(pos, 1); + }; + + /** + * Runs the current list of functions that registered in the pipeline against the + * input tokens. + * + * @param {Array} tokens The tokens to run through the pipeline. + * @return {Array} + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.run = function (tokens) { + const out = []; + const tokenLength = tokens.length; + const pipelineLength = this._queue.length; + + for (let i = 0; i < tokenLength; i++) { + let token = tokens[i]; + + for (let j = 0; j < pipelineLength; j++) { + token = this._queue[j](token, i, tokens); + if (token === void 0 || token === null) break; + } + + if (token !== void 0 && token !== null) out.push(token); + } + + return out; + }; + + /** + * Resets the pipeline by removing any existing processors. + * + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.reset = function () { + this._queue = []; + }; + + /** + * Get the pipeline if user want to check the pipeline. + * + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.get = function () { + return this._queue; + }; + + /** + * Returns a representation of the pipeline ready for serialisation. + * Only serialize pipeline function's name. Not storing function, so when + * loading the archived JSON index file, corresponding pipeline function is + * added by registered function of elasticlunr.Pipeline.registeredFunctions + * + * Logs a warning if the function has not been registered. + * + * @return {Array} + * @memberOf Pipeline + */ + elasticlunr.Pipeline.prototype.toJSON = function () { + return this._queue.map(function (fn) { + elasticlunr.Pipeline.warnIfFunctionNotRegistered(fn); + return fn.label; + }); + }; + /*! + * elasticlunr.Index + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.Index is object that manages a search index. It contains the indexes + * and stores all the tokens and document lookups. It also provides the main + * user facing API for the library. + * + * @constructor + */ + elasticlunr.Index = function () { + this._fields = []; + this._ref = 'id'; + this.pipeline = new elasticlunr.Pipeline(); + this.documentStore = new elasticlunr.DocumentStore(); + this.index = {}; + this.eventEmitter = new elasticlunr.EventEmitter(); + this._idfCache = {}; + + this.on( + 'add', + 'remove', + 'update', + function () { + this._idfCache = {}; + }.bind(this) + ); + }; + + /** + * Bind a handler to events being emitted by the index. + * + * The handler can be bound to many events at the same time. + * + * @param {String} [eventName] The name(s) of events to bind the function to. + * @param {Function} fn The serialised set to load. + * @memberOf Index + */ + elasticlunr.Index.prototype.on = function () { + const args = Array.prototype.slice.call(arguments); + return this.eventEmitter.addListener.apply(this.eventEmitter, args); + }; + + /** + * Removes a handler from an event being emitted by the index. + * + * @param {String} eventName The name of events to remove the function from. + * @param {Function} fn The serialised set to load. + * @memberOf Index + */ + elasticlunr.Index.prototype.off = function (name, fn) { + return this.eventEmitter.removeListener(name, fn); + }; + + /** + * Loads a previously serialised index. + * + * Issues a warning if the index being imported was serialised + * by a different version of elasticlunr. + * + * @param {Object} serialisedData The serialised set to load. + * @return {elasticlunr.Index} + * @memberOf Index + */ + elasticlunr.Index.load = function (serialisedData) { + if (serialisedData.version !== elasticlunr.version) { + elasticlunr.utils.warn( + 'version mismatch: current ' + + elasticlunr.version + + ' importing ' + + serialisedData.version + ); + } + + const idx = new this(); + + idx._fields = serialisedData.fields; + idx._ref = serialisedData.ref; + idx.documentStore = elasticlunr.DocumentStore.load( + serialisedData.documentStore + ); + idx.pipeline = elasticlunr.Pipeline.load(serialisedData.pipeline); + idx.index = {}; + for (const field in serialisedData.index) { + idx.index[field] = elasticlunr.InvertedIndex.load( + serialisedData.index[field] + ); + } + + return idx; + }; + + /** + * Adds a field to the list of fields that will be searchable within documents in the index. + * + * Remember that inner index is build based on field, which means each field has one inverted index. + * + * Fields should be added before any documents are added to the index, fields + * that are added after documents are added to the index will only apply to new + * documents added to the index. + * + * @param {String} fieldName The name of the field within the document that should be indexed + * @return {elasticlunr.Index} + * @memberOf Index + */ + elasticlunr.Index.prototype.addField = function (fieldName) { + this._fields.push(fieldName); + this.index[fieldName] = new elasticlunr.InvertedIndex(); + return this; + }; + + /** + * Sets the property used to uniquely identify documents added to the index, + * by default this property is 'id'. + * + * This should only be changed before adding documents to the index, changing + * the ref property without resetting the index can lead to unexpected results. + * + * @param {String} refName The property to use to uniquely identify the + * documents in the index. + * @param {Boolean} emitEvent Whether to emit add events, defaults to true + * @return {elasticlunr.Index} + * @memberOf Index + */ + elasticlunr.Index.prototype.setRef = function (refName) { + this._ref = refName; + return this; + }; + + /** + * + * Set if the JSON format original documents are save into elasticlunr.DocumentStore + * + * Defaultly save all the original JSON documents. + * + * @param {Boolean} save Whether to save the original JSON documents. + * @return {elasticlunr.Index} + * @memberOf Index + */ + elasticlunr.Index.prototype.saveDocument = function (save) { + this.documentStore = new elasticlunr.DocumentStore(save); + return this; + }; + + /** + * Add a JSON format document to the index. + * + * This is the way new documents enter the index, this function will run the + * fields from the document through the index's pipeline and then add it to + * the index, it will then show up in search results. + * + * An 'add' event is emitted with the document that has been added and the index + * the document has been added to. This event can be silenced by passing false + * as the second argument to add. + * + * @param {Object} doc The JSON format document to add to the index. + * @param {Boolean} emitEvent Whether or not to emit events, default true. + * @memberOf Index + */ + elasticlunr.Index.prototype.addDoc = function (doc, emitEvent) { + if (!doc) return; + var emitEvent = emitEvent === undefined ? true : emitEvent; + + const docRef = doc[this._ref]; + + this.documentStore.addDoc(docRef, doc); + this._fields.forEach(function (field) { + const fieldTokens = this.pipeline.run(elasticlunr.tokenizer(doc[field])); + this.documentStore.addFieldLength(docRef, field, fieldTokens.length); + + const tokenCount = {}; + fieldTokens.forEach(function (token) { + if (token in tokenCount) tokenCount[token] += 1; + else tokenCount[token] = 1; + }, this); + + for (const token in tokenCount) { + let termFrequency = tokenCount[token]; + termFrequency = Math.sqrt(termFrequency); + this.index[field].addToken(token, { ref: docRef, tf: termFrequency }); + } + }, this); + + if (emitEvent) this.eventEmitter.emit('add', doc, this); + }; + + /** + * Removes a document from the index by doc ref. + * + * To make sure documents no longer show up in search results they can be + * removed from the index using this method. + * + * A 'remove' event is emitted with the document that has been removed and the index + * the document has been removed from. This event can be silenced by passing false + * as the second argument to remove. + * + * If user setting DocumentStore not storing the documents, then remove doc by docRef is not allowed. + * + * @param {String|Integer} docRef The document ref to remove from the index. + * @param {Boolean} emitEvent Whether to emit remove events, defaults to true + * @memberOf Index + */ + elasticlunr.Index.prototype.removeDocByRef = function (docRef, emitEvent) { + if (!docRef) return; + if (this.documentStore.isDocStored() === false) { + return; + } + + if (!this.documentStore.hasDoc(docRef)) return; + const doc = this.documentStore.getDoc(docRef); + this.removeDoc(doc, false); + }; + + /** + * Removes a document from the index. + * This remove operation could work even the original doc is not store in the DocumentStore. + * + * To make sure documents no longer show up in search results they can be + * removed from the index using this method. + * + * A 'remove' event is emitted with the document that has been removed and the index + * the document has been removed from. This event can be silenced by passing false + * as the second argument to remove. + * + * + * @param {Object} doc The document ref to remove from the index. + * @param {Boolean} emitEvent Whether to emit remove events, defaults to true + * @memberOf Index + */ + elasticlunr.Index.prototype.removeDoc = function (doc, emitEvent) { + if (!doc) return; + + var emitEvent = emitEvent === undefined ? true : emitEvent; + + const docRef = doc[this._ref]; + if (!this.documentStore.hasDoc(docRef)) return; + + this.documentStore.removeDoc(docRef); + + this._fields.forEach(function (field) { + const fieldTokens = this.pipeline.run(elasticlunr.tokenizer(doc[field])); + fieldTokens.forEach(function (token) { + this.index[field].removeToken(token, docRef); + }, this); + }, this); + + if (emitEvent) this.eventEmitter.emit('remove', doc, this); + }; + + /** + * Updates a document in the index. + * + * When a document contained within the index gets updated, fields changed, + * added or removed, to make sure it correctly matched against search queries, + * it should be updated in the index. + * + * This method is just a wrapper around `remove` and `add` + * + * An 'update' event is emitted with the document that has been updated and the index. + * This event can be silenced by passing false as the second argument to update. Only + * an update event will be fired, the 'add' and 'remove' events of the underlying calls + * are silenced. + * + * @param {Object} doc The document to update in the index. + * @param {Boolean} emitEvent Whether to emit update events, defaults to true + * @see Index.prototype.remove + * @see Index.prototype.add + * @memberOf Index + */ + elasticlunr.Index.prototype.updateDoc = function (doc, emitEvent) { + var emitEvent = emitEvent === undefined ? true : emitEvent; + + this.removeDocByRef(doc[this._ref], false); + this.addDoc(doc, false); + + if (emitEvent) this.eventEmitter.emit('update', doc, this); + }; + + /** + * Calculates the inverse document frequency for a token within the index of a field. + * + * @param {String} token The token to calculate the idf of. + * @param {String} field The field to compute idf. + * @see Index.prototype.idf + * @private + * @memberOf Index + */ + elasticlunr.Index.prototype.idf = function (term, field) { + const cacheKey = '@' + field + '/' + term; + if (Object.prototype.hasOwnProperty.call(this._idfCache, cacheKey)) + return this._idfCache[cacheKey]; + + const df = this.index[field].getDocFreq(term); + const idf = 1 + Math.log(this.documentStore.length / (df + 1)); + this._idfCache[cacheKey] = idf; + + return idf; + }; + + /** + * get fields of current index instance + * + * @return {Array} + */ + elasticlunr.Index.prototype.getFields = function () { + return this._fields.slice(); + }; + + /** + * Searches the index using the passed query. + * Queries should be a string, multiple words are allowed. + * + * If config is null, will search all fields defaultly, and lead to OR based query. + * If config is specified, will search specified with query time boosting. + * + * All query tokens are passed through the same pipeline that document tokens + * are passed through, so any language processing involved will be run on every + * query term. + * + * Each query term is expanded, so that the term 'he' might be expanded to + * 'hello' and 'help' if those terms were already included in the index. + * + * Matching documents are returned as an array of objects, each object contains + * the matching document ref, as set for this index, and the similarity score + * for this document against the query. + * + * @param {String} query The query to search the index with. + * @param {JSON} userConfig The user query config, JSON format. + * @return {Object} + * @see Index.prototype.idf + * @see Index.prototype.documentVector + * @memberOf Index + */ + elasticlunr.Index.prototype.search = function (query, userConfig) { + if (!query) return []; + if (typeof query === 'string') { + query = { any: query }; + } else { + query = JSON.parse(JSON.stringify(query)); + } + + let configStr = null; + if (userConfig != null) { + configStr = JSON.stringify(userConfig); + } + + const config = new elasticlunr.Configuration(configStr, this.getFields()).get(); + + const queryTokens = {}; + const queryFields = Object.keys(query); + + for (let i = 0; i < queryFields.length; i++) { + const key = queryFields[i]; + + queryTokens[key] = this.pipeline.run(elasticlunr.tokenizer(query[key])); + } + + const queryResults = {}; + + for (const field in config) { + const tokens = queryTokens[field] || queryTokens.any; + if (!tokens) { + continue; + } + + const fieldSearchResults = this.fieldSearch(tokens, field, config); + const fieldBoost = config[field].boost; + + for (var docRef in fieldSearchResults) { + fieldSearchResults[docRef] = fieldSearchResults[docRef] * fieldBoost; + } + + for (var docRef in fieldSearchResults) { + if (docRef in queryResults) { + queryResults[docRef] += fieldSearchResults[docRef]; + } else { + queryResults[docRef] = fieldSearchResults[docRef]; + } + } + } + + const results = []; + let result; + for (var docRef in queryResults) { + result = { ref: docRef, score: queryResults[docRef] }; + if (this.documentStore.hasDoc(docRef)) { + result.doc = this.documentStore.getDoc(docRef); + } + results.push(result); + } + + results.sort(function (a, b) { + return b.score - a.score; + }); + return results; + }; + + /** + * search queryTokens in specified field. + * + * @param {Array} queryTokens The query tokens to query in this field. + * @param {String} field Field to query in. + * @param {elasticlunr.Configuration} config The user query config, JSON format. + * @return {Object} + */ + elasticlunr.Index.prototype.fieldSearch = function ( + queryTokens, + fieldName, + config + ) { + const booleanType = config[fieldName].bool; + const expand = config[fieldName].expand; + const boost = config[fieldName].boost; + let scores = null; + const docTokens = {}; + + // Do nothing if the boost is 0 + if (boost === 0) { + return; + } + + queryTokens.forEach(function (token) { + let tokens = [token]; + if (expand === true) { + tokens = this.index[fieldName].expandToken(token); + } + // Consider every query token in turn. If expanded, each query token + // corresponds to a set of tokens, which is all tokens in the + // index matching the pattern queryToken* . + // For the set of tokens corresponding to a query token, find and score + // all matching documents. Store those scores in queryTokenScores, + // keyed by docRef. + // Then, depending on the value of booleanType, combine the scores + // for this query token with previous scores. If booleanType is OR, + // then merge the scores by summing into the accumulated total, adding + // new document scores are required (effectively a union operator). + // If booleanType is AND, accumulate scores only if the document + // has previously been scored by another query token (an intersection + // operation0. + // Furthermore, since when booleanType is AND, additional + // query tokens can't add new documents to the result set, use the + // current document set to limit the processing of each new query + // token for efficiency (i.e., incremental intersection). + + const queryTokenScores = {}; + tokens.forEach(function (key) { + let docs = this.index[fieldName].getDocs(key); + const idf = this.idf(key, fieldName); + + if (scores && booleanType === 'AND') { + // special case, we can rule out documents that have been + // already been filtered out because they weren't scored + // by previous query token passes. + const filteredDocs = {}; + for (var docRef in scores) { + if (docRef in docs) { + filteredDocs[docRef] = docs[docRef]; + } + } + docs = filteredDocs; + } + // only record appeared token for retrieved documents for the + // original token, not for expaned token. + // beause for doing coordNorm for a retrieved document, coordNorm only care how many + // query token appear in that document. + // so expanded token should not be added into docTokens, if added, this will pollute the + // coordNorm + if (key === token) { + this.fieldSearchStats(docTokens, key, docs); + } + + for (var docRef in docs) { + const tf = this.index[fieldName].getTermFrequency(key, docRef); + const fieldLength = this.documentStore.getFieldLength( + docRef, + fieldName + ); + let fieldLengthNorm = 1; + if (fieldLength !== 0) { + fieldLengthNorm = 1 / Math.sqrt(fieldLength); + } + + let penality = 1; + if (key !== token) { + // currently I'm not sure if this penality is enough, + // need to do verification + penality = + (1 - (key.length - token.length) / key.length) * 0.15; + } + + const score = tf * idf * fieldLengthNorm * penality; + + if (docRef in queryTokenScores) { + queryTokenScores[docRef] += score; + } else { + queryTokenScores[docRef] = score; + } + } + }, this); + + scores = this.mergeScores(scores, queryTokenScores, booleanType); + }, this); + + scores = this.coordNorm(scores, docTokens, queryTokens.length); + return scores; + }; + + /** + * Merge the scores from one set of tokens into an accumulated score table. + * Exact operation depends on the op parameter. If op is 'AND', then only the + * intersection of the two score lists is retained. Otherwise, the union of + * the two score lists is returned. For internal use only. + * + * @param {Object} bool accumulated scores. Should be null on first call. + * @param {String} scores new scores to merge into accumScores. + * @param {Object} op merge operation (should be 'AND' or 'OR'). + * + */ + + elasticlunr.Index.prototype.mergeScores = function (accumScores, scores, op) { + if (!accumScores) { + return scores; + } + if (op === 'AND') { + const intersection = {}; + for (var docRef in scores) { + if (docRef in accumScores) { + intersection[docRef] = accumScores[docRef] + scores[docRef]; + } + } + return intersection; + } else { + for (var docRef in scores) { + if (docRef in accumScores) { + accumScores[docRef] += scores[docRef]; + } else { + accumScores[docRef] = scores[docRef]; + } + } + return accumScores; + } + }; + + /** + * Record the occuring query token of retrieved doc specified by doc field. + * Only for inner user. + * + * @param {Object} docTokens a data structure stores which token appears in the retrieved doc. + * @param {String} token query token + * @param {Object} docs the retrieved documents of the query token + * + */ + elasticlunr.Index.prototype.fieldSearchStats = function (docTokens, token, docs) { + for (const doc in docs) { + if (doc in docTokens) { + docTokens[doc].push(token); + } else { + docTokens[doc] = [token]; + } + } + }; + + /** + * coord norm the score of a doc. + * if a doc contain more query tokens, then the score will larger than the doc + * contains less query tokens. + * + * only for inner use. + * + * @param {Object} results first results + * @param {Object} docs field search results of a token + * @param {Integer} n query token number + * @return {Object} + */ + elasticlunr.Index.prototype.coordNorm = function (scores, docTokens, n) { + for (const doc in scores) { + if (!(doc in docTokens)) continue; + const tokens = docTokens[doc].length; + scores[doc] = (scores[doc] * tokens) / n; + } + + return scores; + }; + + /** + * Returns a representation of the index ready for serialisation. + * + * @return {Object} + * @memberOf Index + */ + elasticlunr.Index.prototype.toJSON = function () { + const indexJson = {}; + this._fields.forEach(function (field) { + indexJson[field] = this.index[field].toJSON(); + }, this); + + return { + version: elasticlunr.version, + fields: this._fields, + ref: this._ref, + documentStore: this.documentStore.toJSON(), + index: indexJson, + pipeline: this.pipeline.toJSON(), + }; + }; + + /** + * Applies a plugin to the current index. + * + * A plugin is a function that is called with the index as its context. + * Plugins can be used to customise or extend the behaviour the index + * in some way. A plugin is just a function, that encapsulated the custom + * behaviour that should be applied to the index. + * + * The plugin function will be called with the index as its argument, additional + * arguments can also be passed when calling use. The function will be called + * with the index as its context. + * + * Example: + * + * var myPlugin = function (idx, arg1, arg2) { + * // `this` is the index to be extended + * // apply any extensions etc here. + * } + * + * var idx = elasticlunr(function () { + * this.use(myPlugin, 'arg1', 'arg2') + * }) + * + * @param {Function} plugin The plugin to apply. + * @memberOf Index + */ + elasticlunr.Index.prototype.use = function (plugin) { + const args = Array.prototype.slice.call(arguments, 1); + args.unshift(this); + plugin.apply(this, args); + }; + /*! + * elasticlunr.DocumentStore + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.DocumentStore is a simple key-value document store used for storing sets of tokens for + * documents stored in index. + * + * elasticlunr.DocumentStore store original JSON format documents that you could build search snippet by this original JSON document. + * + * user could choose whether original JSON format document should be store, if no configuration then document will be stored defaultly. + * If user care more about the index size, user could select not store JSON documents, then this will has some defects, such as user + * could not use JSON document to generate snippets of search results. + * + * @param {Boolean} save If the original JSON document should be stored. + * @constructor + * @module + */ + elasticlunr.DocumentStore = function (save) { + if (save === null || save === undefined) { + this._save = true; + } else { + this._save = save; + } + + this.docs = {}; + this.docInfo = {}; + this.length = 0; + }; + + /** + * Loads a previously serialised document store + * + * @param {Object} serialisedData The serialised document store to load. + * @return {elasticlunr.DocumentStore} + */ + elasticlunr.DocumentStore.load = function (serialisedData) { + const store = new this(); + + store.length = serialisedData.length; + store.docs = serialisedData.docs; + store.docInfo = serialisedData.docInfo; + store._save = serialisedData.save; + + return store; + }; + + /** + * check if current instance store the original doc + * + * @return {Boolean} + */ + elasticlunr.DocumentStore.prototype.isDocStored = function () { + return this._save; + }; + + /** + * Stores the given doc in the document store against the given id. + * If docRef already exist, then update doc. + * + * Document is store by original JSON format, then you could use original document to generate search snippets. + * + * @param {Integer|String} docRef The key used to store the JSON format doc. + * @param {Object} doc The JSON format doc. + */ + elasticlunr.DocumentStore.prototype.addDoc = function (docRef, doc) { + if (!this.hasDoc(docRef)) this.length++; + + if (this._save === true) { + this.docs[docRef] = clone(doc); + } else { + this.docs[docRef] = null; + } + }; + + /** + * Retrieves the JSON doc from the document store for a given key. + * + * If docRef not found, return null. + * If user set not storing the documents, return null. + * + * @param {Integer|String} docRef The key to lookup and retrieve from the document store. + * @return {Object} + * @memberOf DocumentStore + */ + elasticlunr.DocumentStore.prototype.getDoc = function (docRef) { + if (this.hasDoc(docRef) === false) return null; + return this.docs[docRef]; + }; + + /** + * Checks whether the document store contains a key (docRef). + * + * @param {Integer|String} docRef The id to look up in the document store. + * @return {Boolean} + * @memberOf DocumentStore + */ + elasticlunr.DocumentStore.prototype.hasDoc = function (docRef) { + return docRef in this.docs; + }; + + /** + * Removes the value for a key in the document store. + * + * @param {Integer|String} docRef The id to remove from the document store. + * @memberOf DocumentStore + */ + elasticlunr.DocumentStore.prototype.removeDoc = function (docRef) { + if (!this.hasDoc(docRef)) return; + + delete this.docs[docRef]; + delete this.docInfo[docRef]; + this.length--; + }; + + /** + * Add field length of a document's field tokens from pipeline results. + * The field length of a document is used to do field length normalization even without the original JSON document stored. + * + * @param {Integer|String} docRef document's id or reference + * @param {String} fieldName field name + * @param {Integer} length field length + */ + elasticlunr.DocumentStore.prototype.addFieldLength = function ( + docRef, + fieldName, + length + ) { + if (docRef === null || docRef === undefined) return; + if (this.hasDoc(docRef) == false) return; + + if (!this.docInfo[docRef]) this.docInfo[docRef] = {}; + this.docInfo[docRef][fieldName] = length; + }; + + /** + * Update field length of a document's field tokens from pipeline results. + * The field length of a document is used to do field length normalization even without the original JSON document stored. + * + * @param {Integer|String} docRef document's id or reference + * @param {String} fieldName field name + * @param {Integer} length field length + */ + elasticlunr.DocumentStore.prototype.updateFieldLength = function ( + docRef, + fieldName, + length + ) { + if (docRef === null || docRef === undefined) return; + if (this.hasDoc(docRef) == false) return; + + this.addFieldLength(docRef, fieldName, length); + }; + + /** + * get field length of a document by docRef + * + * @param {Integer|String} docRef document id or reference + * @param {String} fieldName field name + * @return {Integer} field length + */ + elasticlunr.DocumentStore.prototype.getFieldLength = function (docRef, fieldName) { + if (docRef === null || docRef === undefined) return 0; + + if (!(docRef in this.docs)) return 0; + if (!(fieldName in this.docInfo[docRef])) return 0; + return this.docInfo[docRef][fieldName]; + }; + + /** + * Returns a JSON representation of the document store used for serialisation. + * + * @return {Object} JSON format + * @memberOf DocumentStore + */ + elasticlunr.DocumentStore.prototype.toJSON = function () { + return { + docs: this.docs, + docInfo: this.docInfo, + length: this.length, + save: this._save, + }; + }; + + /** + * Cloning object + * + * @param {Object} object in JSON format + * @return {Object} copied object + */ + function clone(obj) { + if (obj === null || typeof obj !== 'object') return obj; + + const copy = obj.constructor(); + + for (const attr in obj) { + if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; + } + + return copy; + } + /*! + * elasticlunr.stemmer + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + + /** + * elasticlunr.stemmer is an english language stemmer, this is a JavaScript + * implementation of the PorterStemmer taken from http://tartarus.org/~martin + * + * @module + * @param {String} str The string to stem + * @return {String} + * @see elasticlunr.Pipeline + */ + elasticlunr.stemmer = (function () { + const step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log', + }; + + const step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '', + }; + + const c = '[^aeiou]'; // consonant + const v = '[aeiouy]'; // vowel + const C = c + '[^aeiouy]*'; // consonant sequence + const V = v + '[aeiou]*'; // vowel sequence + + const mgr0 = '^(' + C + ')?' + V + C; // [C]VC... is m>0 + const meq1 = '^(' + C + ')?' + V + C + '(' + V + ')?$'; // [C]VC[V] is m=1 + const mgr1 = '^(' + C + ')?' + V + C + V + C; // [C]VCVC... is m>1 + const s_v = '^(' + C + ')?' + v; // vowel in stem + + const re_mgr0 = new RegExp(mgr0); + const re_mgr1 = new RegExp(mgr1); + const re_meq1 = new RegExp(meq1); + const re_s_v = new RegExp(s_v); + + const re_1a = /^(.+?)(ss|i)es$/; + const re2_1a = /^(.+?)([^s])s$/; + const re_1b = /^(.+?)eed$/; + const re2_1b = /^(.+?)(ed|ing)$/; + const re_1b_2 = /.$/; + const re2_1b_2 = /(at|bl|iz)$/; + const re3_1b_2 = new RegExp('([^aeiouylsz])\\1$'); + const re4_1b_2 = new RegExp('^' + C + v + '[^aeiouwxy]$'); + + const re_1c = /^(.+?[^aeiou])y$/; + const re_2 = + /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + + const re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + + const re_4 = + /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + const re2_4 = /^(.+?)(s|t)(ion)$/; + + const re_5 = /^(.+?)e$/; + const re_5_1 = /ll$/; + const re3_5 = new RegExp('^' + C + v + '[^aeiouwxy]$'); + + const porterStemmer = function porterStemmer(w) { + let stem, suffix, firstch, re, re2, re3, re4; + + if (w.length < 3) { + return w; + } + + firstch = w.substr(0, 1); + if (firstch == 'y') { + w = firstch.toUpperCase() + w.substr(1); + } + + // Step 1a + re = re_1a; + re2 = re2_1a; + + if (re.test(w)) { + w = w.replace(re, '$1$2'); + } else if (re2.test(w)) { + w = w.replace(re2, '$1$2'); + } + + // Step 1b + re = re_1b; + re2 = re2_1b; + if (re.test(w)) { + var fp = re.exec(w); + re = re_mgr0; + if (re.test(fp[1])) { + re = re_1b_2; + w = w.replace(re, ''); + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = re_s_v; + if (re2.test(stem)) { + w = stem; + re2 = re2_1b_2; + re3 = re3_1b_2; + re4 = re4_1b_2; + if (re2.test(w)) { + w = w + 'e'; + } else if (re3.test(w)) { + re = re_1b_2; + w = w.replace(re, ''); + } else if (re4.test(w)) { + w = w + 'e'; + } + } + } + + // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) + re = re_1c; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + w = stem + 'i'; + } + + // Step 2 + re = re_2; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step2list[suffix]; + } + } + + // Step 3 + re = re_3; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = re_mgr0; + if (re.test(stem)) { + w = stem + step3list[suffix]; + } + } + + // Step 4 + re = re_4; + re2 = re2_4; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + if (re.test(stem)) { + w = stem; + } + } else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = re_mgr1; + if (re2.test(stem)) { + w = stem; + } + } + + // Step 5 + re = re_5; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = re_mgr1; + re2 = re_meq1; + re3 = re3_5; + if (re.test(stem) || (re2.test(stem) && !re3.test(stem))) { + w = stem; + } + } + + re = re_5_1; + re2 = re_mgr1; + if (re.test(w) && re2.test(w)) { + re = re_1b_2; + w = w.replace(re, ''); + } + + // and turn initial Y back to y + + if (firstch == 'y') { + w = firstch.toLowerCase() + w.substr(1); + } + + return w; + }; + + return porterStemmer; + })(); + + elasticlunr.Pipeline.registerFunction(elasticlunr.stemmer, 'stemmer'); + /*! + * elasticlunr.stopWordFilter + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.stopWordFilter is an English language stop words filter, any words + * contained in the stop word list will not be passed through the filter. + * + * This is intended to be used in the Pipeline. If the token does not pass the + * filter then undefined will be returned. + * Currently this StopwordFilter using dictionary to do O(1) time complexity stop word filtering. + * + * @module + * @param {String} token The token to pass through the filter + * @return {String} + * @see elasticlunr.Pipeline + */ + elasticlunr.stopWordFilter = function (token) { + if (token && elasticlunr.stopWordFilter.stopWords[token] !== true) { + return token; + } + }; + + /** + * Remove predefined stop words + * if user want to use customized stop words, user could use this function to delete + * all predefined stopwords. + * + * @return {null} + */ + elasticlunr.clearStopWords = function () { + elasticlunr.stopWordFilter.stopWords = {}; + }; + + /** + * Add customized stop words + * user could use this function to add customized stop words + * + * @params {Array} words customized stop words + * @return {null} + */ + elasticlunr.addStopWords = function (words) { + if (words == null || Array.isArray(words) === false) return; + + words.forEach(function (word) { + elasticlunr.stopWordFilter.stopWords[word] = true; + }, this); + }; + + /** + * Reset to default stop words + * user could use this function to restore default stop words + * + * @return {null} + */ + elasticlunr.resetStopWords = function () { + elasticlunr.stopWordFilter.stopWords = elasticlunr.defaultStopWords; + }; + + elasticlunr.defaultStopWords = { + '': true, + a: true, + able: true, + about: true, + across: true, + after: true, + all: true, + almost: true, + also: true, + am: true, + among: true, + an: true, + and: true, + any: true, + are: true, + as: true, + at: true, + be: true, + because: true, + been: true, + but: true, + by: true, + can: true, + cannot: true, + could: true, + dear: true, + did: true, + do: true, + does: true, + either: true, + else: true, + ever: true, + every: true, + for: true, + from: true, + get: true, + got: true, + had: true, + has: true, + have: true, + he: true, + her: true, + hers: true, + him: true, + his: true, + how: true, + however: true, + i: true, + if: true, + in: true, + into: true, + is: true, + it: true, + its: true, + just: true, + least: true, + let: true, + like: true, + likely: true, + may: true, + me: true, + might: true, + most: true, + must: true, + my: true, + neither: true, + no: true, + nor: true, + not: true, + of: true, + off: true, + often: true, + on: true, + only: true, + or: true, + other: true, + our: true, + own: true, + rather: true, + said: true, + say: true, + says: true, + she: true, + should: true, + since: true, + so: true, + some: true, + than: true, + that: true, + the: true, + their: true, + them: true, + then: true, + there: true, + these: true, + they: true, + this: true, + tis: true, + to: true, + too: true, + twas: true, + us: true, + wants: true, + was: true, + we: true, + were: true, + what: true, + when: true, + where: true, + which: true, + while: true, + who: true, + whom: true, + why: true, + will: true, + with: true, + would: true, + yet: true, + you: true, + your: true, + }; + + elasticlunr.stopWordFilter.stopWords = elasticlunr.defaultStopWords; + + elasticlunr.Pipeline.registerFunction(elasticlunr.stopWordFilter, 'stopWordFilter'); + /*! + * elasticlunr.trimmer + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.trimmer is a pipeline function for trimming non word + * characters from the begining and end of tokens before they + * enter the index. + * + * This implementation may not work correctly for non latin + * characters and should either be removed or adapted for use + * with languages with non-latin characters. + * + * @module + * @param {String} token The token to pass through the filter + * @return {String} + * @see elasticlunr.Pipeline + */ + elasticlunr.trimmer = function (token) { + if (token === null || token === undefined) { + throw new Error('token should not be undefined'); + } + + return token.replace(/^\W+/, '').replace(/\W+$/, ''); + }; + + elasticlunr.Pipeline.registerFunction(elasticlunr.trimmer, 'trimmer'); + /*! + * elasticlunr.InvertedIndex + * Copyright (C) 2017 Wei Song + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ + + /** + * elasticlunr.InvertedIndex is used for efficiently storing and + * lookup of documents that contain a given token. + * + * @constructor + */ + elasticlunr.InvertedIndex = function () { + this.root = { docs: {}, df: 0 }; + }; + + /** + * Loads a previously serialised inverted index. + * + * @param {Object} serialisedData The serialised inverted index to load. + * @return {elasticlunr.InvertedIndex} + */ + elasticlunr.InvertedIndex.load = function (serialisedData) { + const idx = new this(); + idx.root = serialisedData.root; + + return idx; + }; + + /** + * Adds a {token: tokenInfo} pair to the inverted index. + * If the token already exist, then update the tokenInfo. + * + * tokenInfo format: { ref: 1, tf: 2} + * tokenInfor should contains the document's ref and the tf(token frequency) of that token in + * the document. + * + * By default this function starts at the root of the current inverted index, however + * it can start at any node of the inverted index if required. + * + * @param {String} token + * @param {Object} tokenInfo format: { ref: 1, tf: 2} + * @param {Object} root An optional node at which to start looking for the + * correct place to enter the doc, by default the root of this elasticlunr.InvertedIndex + * is used. + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.addToken = function (token, tokenInfo, root) { + var root = root || this.root; + let idx = 0; + + while (idx <= token.length - 1) { + const key = token[idx]; + + if (!(key in root)) root[key] = { docs: {}, df: 0 }; + idx += 1; + root = root[key]; + } + + const docRef = tokenInfo.ref; + if (!root.docs[docRef]) { + // if this doc not exist, then add this doc + root.docs[docRef] = { tf: tokenInfo.tf }; + root.df += 1; + } else { + // if this doc already exist, then update tokenInfo + root.docs[docRef] = { tf: tokenInfo.tf }; + } + }; + + /** + * Checks whether a token is in this elasticlunr.InvertedIndex. + * + * + * @param {String} token The token to be checked + * @return {Boolean} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.hasToken = function (token) { + if (!token) return false; + + let node = this.root; + + for (let i = 0; i < token.length; i++) { + if (!node[token[i]]) return false; + node = node[token[i]]; + } + + return true; + }; + + /** + * Retrieve a node from the inverted index for a given token. + * If token not found in this InvertedIndex, return null. + * + * + * @param {String} token The token to get the node for. + * @return {Object} + * @see InvertedIndex.prototype.get + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.getNode = function (token) { + if (!token) return null; + + let node = this.root; + + for (let i = 0; i < token.length; i++) { + if (!node[token[i]]) return null; + node = node[token[i]]; + } + + return node; + }; + + /** + * Retrieve the documents of a given token. + * If token not found, return {}. + * + * + * @param {String} token The token to get the documents for. + * @return {Object} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.getDocs = function (token) { + const node = this.getNode(token); + if (node == null) { + return {}; + } + + return node.docs; + }; + + /** + * Retrieve term frequency of given token in given docRef. + * If token or docRef not found, return 0. + * + * + * @param {String} token The token to get the documents for. + * @param {String|Integer} docRef + * @return {Integer} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.getTermFrequency = function (token, docRef) { + const node = this.getNode(token); + + if (node == null) { + return 0; + } + + if (!(docRef in node.docs)) { + return 0; + } + + return node.docs[docRef].tf; + }; + + /** + * Retrieve the document frequency of given token. + * If token not found, return 0. + * + * + * @param {String} token The token to get the documents for. + * @return {Object} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.getDocFreq = function (token) { + const node = this.getNode(token); + + if (node == null) { + return 0; + } + + return node.df; + }; + + /** + * Remove the document identified by document's ref from the token in the inverted index. + * + * + * @param {String} token Remove the document from which token. + * @param {String} ref The ref of the document to remove from given token. + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.removeToken = function (token, ref) { + if (!token) return; + const node = this.getNode(token); + + if (node == null) return; + + if (ref in node.docs) { + delete node.docs[ref]; + node.df -= 1; + } + }; + + /** + * Find all the possible suffixes of given token using tokens currently in the inverted index. + * If token not found, return empty Array. + * + * @param {String} token The token to expand. + * @return {Array} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.expandToken = function (token, memo, root) { + if (token == null || token == '') return []; + var memo = memo || []; + + if (root == void 0) { + root = this.getNode(token); + if (root == null) return memo; + } + + if (root.df > 0) memo.push(token); + + for (const key in root) { + if (key === 'docs') continue; + if (key === 'df') continue; + this.expandToken(token + key, memo, root[key]); + } + + return memo; + }; + + /** + * Returns a representation of the inverted index ready for serialisation. + * + * @return {Object} + * @memberOf InvertedIndex + */ + elasticlunr.InvertedIndex.prototype.toJSON = function () { + return { + root: this.root, + }; + }; + + /*! + * elasticlunr.Configuration + * Copyright (C) 2017 Wei Song + */ + + /** + * elasticlunr.Configuration is used to analyze the user search configuration. + * + * By elasticlunr.Configuration user could set query-time boosting, boolean model in each field. + * + * Currently configuration supports: + * 1. query-time boosting, user could set how to boost each field. + * 2. boolean model chosing, user could choose which boolean model to use for each field. + * 3. token expandation, user could set token expand to True to improve Recall. Default is False. + * + * Query time boosting must be configured by field category, "boolean" model could be configured + * by both field category or globally as the following example. Field configuration for "boolean" + * will overwrite global configuration. + * Token expand could be configured both by field category or golbally. Local field configuration will + * overwrite global configuration. + * + * configuration example: + * { + * fields:{ + * title: {boost: 2}, + * body: {boost: 1} + * }, + * bool: "OR" + * } + * + * "bool" field configuation overwrite global configuation example: + * { + * fields:{ + * title: {boost: 2, bool: "AND"}, + * body: {boost: 1} + * }, + * bool: "OR" + * } + * + * "expand" example: + * { + * fields:{ + * title: {boost: 2, bool: "AND"}, + * body: {boost: 1} + * }, + * bool: "OR", + * expand: true + * } + * + * "expand" example for field category: + * { + * fields:{ + * title: {boost: 2, bool: "AND", expand: true}, + * body: {boost: 1} + * }, + * bool: "OR" + * } + * + * setting the boost to 0 ignores the field (this will only search the title): + * { + * fields:{ + * title: {boost: 1}, + * body: {boost: 0} + * } + * } + * + * then, user could search with configuration to do query-time boosting. + * idx.search('oracle database', {fields: {title: {boost: 2}, body: {boost: 1}}}); + * + * + * @constructor + * + * @param {String} config user configuration + * @param {Array} fields fields of index instance + * @module + */ + elasticlunr.Configuration = function (config, fields) { + var config = config || ''; + + if (fields == undefined || fields == null) { + throw new Error('fields should not be null'); + } + + this.config = {}; + + let userConfig; + try { + userConfig = JSON.parse(config); + this.buildUserConfig(userConfig, fields); + } catch (error) { + elasticlunr.utils.warn( + 'user configuration parse failed, will use default configuration' + ); + this.buildDefaultConfig(fields); + } + }; + + /** + * Build default search configuration. + * + * @param {Array} fields fields of index instance + */ + elasticlunr.Configuration.prototype.buildDefaultConfig = function (fields) { + this.reset(); + fields.forEach(function (field) { + this.config[field] = { + boost: 1, + bool: 'OR', + expand: false, + }; + }, this); + }; + + /** + * Build user configuration. + * + * @param {JSON} config User JSON configuratoin + * @param {Array} fields fields of index instance + */ + elasticlunr.Configuration.prototype.buildUserConfig = function (config, fields) { + let global_bool = 'OR'; + let global_expand = false; + + this.reset(); + if ('bool' in config) { + global_bool = config.bool || global_bool; + } + + if ('expand' in config) { + global_expand = config.expand || global_expand; + } + + if ('fields' in config) { + for (const field in config.fields) { + if (fields.indexOf(field) > -1) { + const field_config = config.fields[field]; + let field_expand = global_expand; + if (field_config.expand != undefined) { + field_expand = field_config.expand; + } + + this.config[field] = { + boost: + field_config.boost || field_config.boost === 0 + ? field_config.boost + : 1, + bool: field_config.bool || global_bool, + expand: field_expand, + }; + } else { + elasticlunr.utils.warn( + 'field name in user configuration not found in index instance fields' + ); + } + } + } else { + this.addAllFields2UserConfig(global_bool, global_expand, fields); + } + }; + + /** + * Add all fields to user search configuration. + * + * @param {String} bool Boolean model + * @param {String} expand Expand model + * @param {Array} fields fields of index instance + */ + elasticlunr.Configuration.prototype.addAllFields2UserConfig = function ( + bool, + expand, + fields + ) { + fields.forEach(function (field) { + this.config[field] = { + boost: 1, + bool, + expand, + }; + }, this); + }; + + /** + * get current user configuration + */ + elasticlunr.Configuration.prototype.get = function () { + return this.config; + }; + + /** + * reset user search configuration. + */ + elasticlunr.Configuration.prototype.reset = function () { + this.config = {}; + }; + /** + * sorted_set.js is added only to make elasticlunr.js compatible with lunr-languages. + * if elasticlunr.js support different languages by default, this will make elasticlunr.js + * much bigger that not good for browser usage. + * + */ + + /*! + * lunr.SortedSet + * Copyright (C) 2017 Oliver Nightingale + */ + + /** + * lunr.SortedSets are used to maintain an array of uniq values in a sorted + * order. + * + * @constructor + */ + lunr.SortedSet = function () { + this.length = 0; + this.elements = []; + }; + + /** + * Loads a previously serialised sorted set. + * + * @param {Array} serialisedData The serialised set to load. + * @returns {lunr.SortedSet} + * @memberOf SortedSet + */ + lunr.SortedSet.load = function (serialisedData) { + const set = new this(); + + set.elements = serialisedData; + set.length = serialisedData.length; + + return set; + }; + + /** + * Inserts new items into the set in the correct position to maintain the + * order. + * + * @param {Object} The objects to add to this set. + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.add = function () { + let i, element; + + for (i = 0; i < arguments.length; i++) { + element = arguments[i]; + if (~this.indexOf(element)) continue; + this.elements.splice(this.locationFor(element), 0, element); + } + + this.length = this.elements.length; + }; + + /** + * Converts this sorted set into an array. + * + * @returns {Array} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.toArray = function () { + return this.elements.slice(); + }; + + /** + * Creates a new array with the results of calling a provided function on every + * element in this sorted set. + * + * Delegates to Array.prototype.map and has the same signature. + * + * @param {Function} fn The function that is called on each element of the + * set. + * @param {Object} ctx An optional object that can be used as the context + * for the function fn. + * @returns {Array} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.map = function (fn, ctx) { + return this.elements.map(fn, ctx); + }; + + /** + * Executes a provided function once per sorted set element. + * + * Delegates to Array.prototype.forEach and has the same signature. + * + * @param {Function} fn The function that is called on each element of the + * set. + * @param {Object} ctx An optional object that can be used as the context + * @memberOf SortedSet + * for the function fn. + */ + lunr.SortedSet.prototype.forEach = function (fn, ctx) { + return this.elements.forEach(fn, ctx); + }; + + /** + * Returns the index at which a given element can be found in the + * sorted set, or -1 if it is not present. + * + * @param {Object} elem The object to locate in the sorted set. + * @returns {Number} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.indexOf = function (elem) { + let start = 0; + let end = this.elements.length; + let sectionLength = end - start; + let pivot = start + Math.floor(sectionLength / 2); + let pivotElem = this.elements[pivot]; + + while (sectionLength > 1) { + if (pivotElem === elem) return pivot; + + if (pivotElem < elem) start = pivot; + if (pivotElem > elem) end = pivot; + + sectionLength = end - start; + pivot = start + Math.floor(sectionLength / 2); + pivotElem = this.elements[pivot]; + } + + if (pivotElem === elem) return pivot; + + return -1; + }; + + /** + * Returns the position within the sorted set that an element should be + * inserted at to maintain the current order of the set. + * + * This function assumes that the element to search for does not already exist + * in the sorted set. + * + * @param {Object} elem The elem to find the position for in the set + * @returns {Number} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.locationFor = function (elem) { + let start = 0; + let end = this.elements.length; + let sectionLength = end - start; + let pivot = start + Math.floor(sectionLength / 2); + let pivotElem = this.elements[pivot]; + + while (sectionLength > 1) { + if (pivotElem < elem) start = pivot; + if (pivotElem > elem) end = pivot; + + sectionLength = end - start; + pivot = start + Math.floor(sectionLength / 2); + pivotElem = this.elements[pivot]; + } + + if (pivotElem > elem) return pivot; + if (pivotElem < elem) return pivot + 1; + }; + + /** + * Creates a new lunr.SortedSet that contains the elements in the intersection + * of this set and the passed set. + * + * @param {lunr.SortedSet} otherSet The set to intersect with this set. + * @returns {lunr.SortedSet} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.intersect = function (otherSet) { + const intersectSet = new lunr.SortedSet(); + let i = 0; + let j = 0; + const a_len = this.length; + const b_len = otherSet.length; + const a = this.elements; + const b = otherSet.elements; + + while (true) { + if (i > a_len - 1 || j > b_len - 1) break; + + if (a[i] === b[j]) { + intersectSet.add(a[i]); + i++, j++; + continue; + } + + if (a[i] < b[j]) { + i++; + continue; + } + + if (a[i] > b[j]) { + j++; + continue; + } + } + + return intersectSet; + }; + + /** + * Makes a copy of this set + * + * @returns {lunr.SortedSet} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.clone = function () { + const clone = new lunr.SortedSet(); + + clone.elements = this.toArray(); + clone.length = clone.elements.length; + + return clone; + }; + + /** + * Creates a new lunr.SortedSet that contains the elements in the union + * of this set and the passed set. + * + * @param {lunr.SortedSet} otherSet The set to union with this set. + * @returns {lunr.SortedSet} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.union = function (otherSet) { + let longSet, shortSet, unionSet; + + if (this.length >= otherSet.length) { + (longSet = this), (shortSet = otherSet); + } else { + (longSet = otherSet), (shortSet = this); + } + + unionSet = longSet.clone(); + + for ( + let i = 0, shortSetElements = shortSet.toArray(); + i < shortSetElements.length; + i++ + ) { + unionSet.add(shortSetElements[i]); + } + + return unionSet; + }; + + /** + * Returns a representation of the sorted set ready for serialisation. + * + * @returns {Array} + * @memberOf SortedSet + */ + lunr.SortedSet.prototype.toJSON = function () { + return this.toArray(); + }; + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + (function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory); + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like enviroments that support module.exports, + * like Node. + */ + module.exports = factory(); + } else { + // Browser globals (root is window) + root.elasticlunr = factory(); + } + })(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return elasticlunr; + }); +})(); + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // +// End of elasticlunr code (http://elasticlunr.com/elasticlunr.js) // +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // + +window.onload = function () { + if (!document.body.contains(document.getElementById('searchModal'))) { + return; + } + + const lang = document.documentElement.lang; + const searchInput = document.getElementById('searchInput'); + const searchModal = document.getElementById('searchModal'); + const searchButton = document.getElementById('search-button'); + const clearSearchButton = document.getElementById('clear-search'); + const resultsContainer = document.getElementById('results-container'); + const results = document.getElementById('results'); + // Get all spans holding the translated strings, even if they are only used on one language. + const zeroResultsSpan = document.getElementById('zero_results'); + const oneResultsSpan = document.getElementById('one_results'); + const twoResultsSpan = document.getElementById('two_results'); + const fewResultsSpan = document.getElementById('few_results'); + const manyResultsSpan = document.getElementById('many_results'); + + // Static mapping of keys to spans. + const resultSpans = { + zero_results: zeroResultsSpan, + one_results: oneResultsSpan, + two_results: twoResultsSpan, + few_results: fewResultsSpan, + many_results: manyResultsSpan, + }; + + // Replace $SHORTCUT in search icon title with actual OS-specific shortcut. + function getShortcut() { + const userAgent = window.navigator.userAgent.toLowerCase(); + if (userAgent.includes('mac')) { + return 'Cmd + K'; + } else { + return 'Ctrl + K'; + } + } + + function setAttributes(element, attributeNames) { + const shortcut = getShortcut(); + attributeNames.forEach((attributeName) => { + let attributeValue = element.getAttribute(attributeName); + if (attributeValue) { + attributeValue = attributeValue.replace('$SHORTCUT', shortcut); + element.setAttribute(attributeName, attributeValue); + } + }); + } + setAttributes(searchButton, ['title', 'aria-label']); + + // Make search button keyboard accessible. + searchButton.addEventListener('keydown', function (event) { + if (event.key === 'Enter' || event.key === ' ') { + searchButton.click(); + } + }); + + let lastFocusedElement; + function openSearchModal() { + lastFocusedElement = document.activeElement; + loadSearchIndex(); + searchModal.style.display = 'block'; + searchInput.focus(); + } + + function closeModal() { + searchModal.style.display = 'none'; + clearSearch(); + if (lastFocusedElement && document.body.contains(lastFocusedElement)) { + lastFocusedElement.focus(); + } + } + + function toggleModalVisibility() { + const isModalOpen = searchModal.style.display === 'block'; + if (isModalOpen) { + closeModal(); + } else { + openSearchModal(); + } + } + + // Function to remove 'selected' class from all divs except the one passed. + function clearSelected(exceptDiv = null) { + const divs = results.querySelectorAll('#results > div'); + divs.forEach((div) => { + if (div !== exceptDiv) { + div.setAttribute('aria-selected', 'false'); + } + }); + } + + function updateSelection(div) { + if (div.getAttribute('aria-selected') !== 'true') { + clearSelected(div); + div.setAttribute('aria-selected', 'true'); + } + searchInput.setAttribute('aria-activedescendant', div.id); + } + + function clearSearch() { + searchInput.value = ''; + results.innerHTML = ''; + resultsContainer.style.display = 'none'; + searchInput.removeAttribute('aria-activedescendant'); + } + + // Close modal when clicking/tapping outside. + function handleModalInteraction(event) { + if (event.target === searchModal) { + closeModal(); + } + event.stopPropagation(); // Prevents tapping through the modal. + } + searchModal.addEventListener('click', handleModalInteraction); + searchModal.addEventListener('touchend', handleModalInteraction); + + // Close modal when pressing escape. + document.addEventListener('keydown', function (event) { + if (event.key === 'Escape') { + closeModal(); + } + }); + + clearSearchButton.addEventListener('click', function () { + clearSearch(); + searchInput.focus(); + }); + clearSearchButton.addEventListener('keydown', function (event) { + if (event.key === 'Enter' || event.key === ' ') { + clearSearch(); + searchInput.focus(); + event.preventDefault(); + } + }); + + // The index loads on mouseover/tap. + // Clicking/tapping the search button opens the modal. + searchButton.addEventListener('mouseover', loadSearchIndex); + searchButton.addEventListener('click', openSearchModal); + searchButton.addEventListener('touchstart', openSearchModal); + + let searchIndexPromise = null; + function loadSearchIndex() { + if (!searchIndexPromise) { + // Check if the search index is already loaded in the window object + if (window.searchIndex) { + // If the index is pre-loaded, use it directly. + searchIndexPromise = Promise.resolve( + elasticlunr.Index.load(window.searchIndex) + ); + } else { + // If the index is not pre-loaded, fetch it from the JSON file. + const language = document.documentElement + .getAttribute('lang') + .substring(0, 2); + let basePath = document + .querySelector("meta[name='base']") + .getAttribute('content'); + if (basePath.endsWith('/')) { + basePath = basePath.slice(0, -1); + } + + searchIndexPromise = fetch( + basePath + '/search_index.' + language + '.json' + ) + .then((response) => response.json()) + .then((json) => elasticlunr.Index.load(json)); + } + } + } + + function getByteByBinary(binaryCode) { + // Binary system, starts with `0b` in ES6 + // Octal number system, starts with `0` in ES5 and starts with `0o` in ES6 + // Hexadecimal, starts with `0x` in both ES5 and ES6 + var byteLengthDatas = [0, 1, 2, 3, 4]; + var len = byteLengthDatas[Math.ceil(binaryCode.length / 8)]; + return len; + } + + function getByteByHex(hexCode) { + return getByteByBinary(parseInt(hexCode, 16).toString(2)); + } + + function substringByByte(str, maxLength) { + let result = ''; + let flag = false; + let len = 0; + let length = 0; + let length2 = 0; + for (let i = 0; i < str.length; i++) { + const code = str.codePointAt(i).toString(16); + if (code.length > 4) { + i++; + if (i + 1 < str.length) { + flag = str.codePointAt(i + 1).toString(16) === '200d'; + } + } + if (flag) { + len += getByteByHex(code); + if (i == str.length - 1) { + length += len; + if (length <= maxLength) { + result += str.substr(length2, i - length2 + 1); + } else { + break; + } + } + } else { + if (len != 0) { + length += len; + length += getByteByHex(code); + if (length <= maxLength) { + result += str.substr(length2, i - length2 + 1); + length2 = i + 1; + } else { + break; + } + len = 0; + continue; + } + length += getByteByHex(code); + if (length <= maxLength) { + if (code.length <= 4) { + result += str[i]; + } else { + result += str[i - 1] + str[i]; + } + length2 = i + 1; + } else { + break; + } + } + } + return result; + } + + function generateSnippet(text, searchTerms) { + const BASE_SCORE = 2; + const FIRST_WORD_SCORE = 8; + const HIGHLIGHT_SCORE = 40; + const PRE_MATCH_CONTEXT_WORDS = 4; + const SNIPPET_LENGTH = 150; + const WINDOW_SIZE = 30; + + const stemmedTerms = searchTerms.map(function (term) { + return elasticlunr.stemmer(term.toLowerCase()); + }); + + let totalLength = 0; + const tokenScores = []; + const sentences = text.toLowerCase().split('. '); + + for (const sentence of sentences) { + const words = sentence.split(/[\s\n]/); + let isFirstWord = true; + + for (const word of words) { + if (word.length > 0) { + let score = isFirstWord ? FIRST_WORD_SCORE : BASE_SCORE; + for (const stemmedTerm of stemmedTerms) { + if (elasticlunr.stemmer(word).startsWith(stemmedTerm)) { + score = HIGHLIGHT_SCORE; + } + } + tokenScores.push([word, score, totalLength]); + isFirstWord = false; + } + totalLength += word.length + 1; + } + totalLength += 1; + } + + if (tokenScores.length === 0) { + return text.length > SNIPPET_LENGTH + ? text.substring(0, SNIPPET_LENGTH) + '…' + : text; + } + + const scores = []; + let windowScore = 0; + + for (var i = 0; i < Math.min(tokenScores.length, WINDOW_SIZE); i++) { + windowScore += tokenScores[i][1]; + } + scores.push(windowScore); + + // Slide the window and update the score. + for (var i = 1; i <= tokenScores.length - WINDOW_SIZE; i++) { + windowScore -= tokenScores[i - 1][1]; + windowScore += tokenScores[i + WINDOW_SIZE - 1][1]; + scores.push(windowScore); + } + + let maxScoreIndex = 0; + let maxScore = 0; + for (var i = scores.length - 1; i >= 0; i--) { + if (maxScore < scores[i]) { + maxScore = scores[i]; + maxScoreIndex = i; + } + } + + const snippet = []; + // From my testing, the context is more clear if we start a few words back. + let start = adjustStartPos( + text, + tokenScores[maxScoreIndex][2], + PRE_MATCH_CONTEXT_WORDS + ); + + function adjustStartPos(text, matchStartIndex, numWordsBack) { + let spaceCount = 0; + let index = matchStartIndex - 1; + while (index >= 0 && spaceCount < numWordsBack) { + if (text[index] === ' ' && text[index - 1] !== '.') { + spaceCount++; + } else if (text[index] === '.' && text[index + 1] === ' ') { + // Stop if the match is at the start of a sentence. + break; + } + index--; + } + return spaceCount === numWordsBack ? index + 1 : matchStartIndex; + } + const re = /^[\x00-\xff]+$/; // Regular expression for ASCII check. + for ( + var i = maxScoreIndex; + i < maxScoreIndex + WINDOW_SIZE && i < tokenScores.length; + i++ + ) { + const wordData = tokenScores[i]; + if (start < wordData[2]) { + snippet.push(text.substring(start, wordData[2])); + start = wordData[2]; + } + + if (wordData[1] === HIGHLIGHT_SCORE) { + snippet.push(''); + } + const end = wordData[2] + wordData[0].length; + // Handle non-ASCII characters. + if (!re.test(wordData[0]) && wordData[0].length >= 12) { + const strBefore = text.substring(wordData[2], end); + const strAfter = substringByByte(strBefore, 12); + snippet.push(strAfter); + } else { + snippet.push(text.substring(wordData[2], end)); + } + + if (wordData[1] === HIGHLIGHT_SCORE) { + snippet.push(''); + } + start = end; + } + + snippet.push('…'); + const joinedSnippet = snippet.join(''); + let truncatedSnippet = joinedSnippet; + if (joinedSnippet.replace(/<[^>]+>/g, '').length > SNIPPET_LENGTH) { + truncatedSnippet = joinedSnippet.substring(0, SNIPPET_LENGTH) + '…'; + } + + return truncatedSnippet; + } + + // Handle input in the search box. + searchInput.addEventListener( + 'input', + async function () { + const searchTerm = this.value.trim(); + const searchIndex = await searchIndexPromise; + results.innerHTML = ''; + + resultsContainer.style.display = searchTerm.length > 0 ? 'block' : 'none'; + + // Perform the search and store the results. + const searchResults = searchIndex.search(searchTerm, { + bool: 'OR', + fields: { + title: { boost: 3 }, + body: { boost: 2 }, + description: { boost: 1 }, + path: { boost: 1 }, + }, + }); + + // Update the number of results. + updateResultText(searchResults.length); + + // Display the results. + let resultIdCounter = 0; // Counter to generate unique IDs. + searchResults.forEach(function (result) { + if (result.doc.title || result.doc.path || result.doc.id) { + const resultDiv = document.createElement('div'); + resultDiv.setAttribute('role', 'option'); + resultDiv.id = 'result-' + resultIdCounter++; + resultDiv.innerHTML = ''; + const linkElement = resultDiv.querySelector('a'); + const titleElement = resultDiv.querySelector('span:first-child'); + const snippetElement = resultDiv.querySelector('span:nth-child(2)'); + + // Determine the text for the title. + titleElement.textContent = + result.doc.title || result.doc.path || result.doc.id; + + // Determine if the body or description is available for the snippet. + let snippetText = result.doc.body + ? generateSnippet(result.doc.body, searchTerm.split(/\s+/)) + : result.doc.description + ? result.doc.description + : ''; + snippetElement.innerHTML = snippetText; + + // Create the hyperlink. + let href = result.ref; + if (result.doc.body) { + // Include text fragment if body is available. + const encodedSearchTerm = encodeURIComponent(searchTerm); + href += `#:~:text=${encodedSearchTerm}`; + } + linkElement.href = href; + + results.appendChild(resultDiv); + } + }); + + searchInput.setAttribute( + 'aria-expanded', + resultIdCounter > 0 ? 'true' : 'false' + ); + + if (results.firstChild) { + updateSelection(results.firstChild); + } + + results.addEventListener('mouseover', function (event) { + if (event.target.closest('div[role="option"]')) { + updateSelection(event.target.closest('div[role="option"]')); + } + }); + + results.addEventListener('click', function(event) { + const clickedElement = event.target.closest('a'); + if (clickedElement) { + const clickedHref = clickedElement.getAttribute('href'); + const currentPageUrl = window.location.href; + + // Normalise URLs by removing the text fragment and trailing slash. + const normalizeUrl = (url) => url.split('#')[0].replace(/\/$/, ''); + + // Check if the clicked link matches the current page. + // If using Ctrl+click or Cmd+click, don't close the modal. + if (normalizeUrl(clickedHref) === normalizeUrl(currentPageUrl) && + !event.ctrlKey && !event.metaKey) { + closeModal(); + } + } + }); + + // Add touch events to the results. + setupTouchEvents(); + }, + true + ); + + function updateResultText(count) { + // Determine the correct pluralization key based on count and language. + const pluralizationKey = getPluralizationKey(count, lang); + + // Hide all result text spans. + Object.values(resultSpans).forEach((span) => { + if (span) span.style.display = 'none'; + }); + + // Show the relevant result text span, replacing $NUMBER with the actual count. + const activeSpan = resultSpans[pluralizationKey]; + if (activeSpan) { + activeSpan.style.display = 'inline'; + activeSpan.textContent = activeSpan.textContent.replace( + '$NUMBER', + count.toString() + ); + } + } + + function getPluralizationKey(count, lang) { + let key = ''; + const slavicLangs = ['uk', 'be', 'bs', 'hr', 'ru', 'sr']; + + // Common cases: zero, one. + if (count === 0) { + key = 'zero_results'; + } else if (count === 1) { + key = 'one_results'; + } else { + // Arabic. + if (lang === 'ar') { + let modulo = count % 100; + if (count === 2) { + key = 'two_results'; + } else if (modulo >= 3 && modulo <= 10) { + key = 'few_results'; + } else { + key = 'many_results'; + } + } else if (slavicLangs.includes(lang)) { + // Slavic languages. + let modulo10 = count % 10; + let modulo100 = count % 100; + if (modulo10 === 1 && modulo100 !== 11) { + key = 'one_results'; + } else if ( + modulo10 >= 2 && + modulo10 <= 4 && + !(modulo100 >= 12 && modulo100 <= 14) + ) { + key = 'few_results'; + } else { + key = 'many_results'; + } + } else { + key = 'many_results'; // Default plural. + } + } + + return key; + } + + function setupTouchEvents() { + const resultDivs = document.querySelectorAll('#results > div'); + resultDivs.forEach((div) => { + // Remove existing listener to avoid duplicates. + div.removeEventListener('touchstart', handleTouchStart); + div.addEventListener('touchstart', handleTouchStart); + }); + } + + function handleTouchStart() { + updateSelection(this); + } + + // Handle keyboard navigation. + document.addEventListener('keydown', function (event) { + // Add handling for the modal open/close shortcut. + const isMac = navigator.userAgent.toLowerCase().includes('mac'); + const MODAL_SHORTCUT_KEY = 'k'; + const modalShortcutModifier = isMac ? event.metaKey : event.ctrlKey; + + if (event.key === MODAL_SHORTCUT_KEY && modalShortcutModifier) { + event.preventDefault(); + toggleModalVisibility(); + return; + } + + const activeElement = document.activeElement; + if ( + event.key === 'Tab' && + (activeElement === searchInput || activeElement === clearSearchButton) + ) { + event.preventDefault(); + const nextFocusableElement = + activeElement === searchInput ? clearSearchButton : searchInput; + nextFocusableElement.focus(); + return; + } + + function updateResultSelection(newIndex, divsArray) { + updateSelection(divsArray[newIndex]); + divsArray[newIndex].scrollIntoView({ block: 'nearest', inline: 'start' }); + } + + const resultDivs = results.querySelectorAll('#results > div'); + if (resultDivs.length === 0) return; + + const divsArray = Array.from(resultDivs); + let activeDiv = results.querySelector('[aria-selected="true"]'); + let activeDivIndex = divsArray.indexOf(activeDiv); + + if ( + ['ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'].includes( + event.key + ) + ) { + event.preventDefault(); + let newIndex = activeDivIndex; + + switch (event.key) { + case 'ArrowUp': + newIndex = Math.max(activeDivIndex - 1, 0); + break; + case 'ArrowDown': + newIndex = Math.min(activeDivIndex + 1, divsArray.length - 1); + break; + case 'Home': + newIndex = 0; + break; + case 'End': + newIndex = divsArray.length - 1; + break; + case 'PageUp': + newIndex = Math.max(activeDivIndex - 3, 0); + break; + case 'PageDown': + newIndex = Math.min(activeDivIndex + 3, divsArray.length - 1); + break; + } + + if (newIndex !== activeDivIndex) { + updateResultSelection(newIndex, divsArray); + } + } + + if (event.key === 'Enter' && activeDiv) { + event.preventDefault(); + event.stopImmediatePropagation(); + const anchorTag = activeDiv.querySelector('a'); + if (anchorTag) { + window.location.href = anchorTag.getAttribute('href'); + } + closeModal(); // Necessary when linking to the current page. + } + }); +}; diff --git a/js/searchElasticlunr.min.js b/js/searchElasticlunr.min.js new file mode 100644 index 0000000..b617353 --- /dev/null +++ b/js/searchElasticlunr.min.js @@ -0,0 +1 @@ +!function(){function g(e){var t=new g.Index;return t.pipeline.add(g.trimmer,g.stopWordFilter,g.stemmer),e&&e.call(t,t),t}var t;g.version="0.9.5",(lunr=g).utils={},g.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),g.utils.toString=function(e){return null==e?"":e.toString()},(g.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments);const t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},g.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0===this.events[e].length)&&delete this.events[e]},g.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){const t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},g.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(g.tokenizer=function(n){if(!arguments.length||null==n)return[];if(Array.isArray(n)){let e=n.filter(function(e){return null!=e}),t=(e=e.map(function(e){return g.utils.toString(e).toLowerCase()}),[]);return e.forEach(function(e){e=e.split(g.tokenizer.seperator),t=t.concat(e)},this),t}return n.toString().trim().toLowerCase().split(g.tokenizer.seperator)}).defaultSeperator=/[\s-]+/,g.tokenizer.seperator=g.tokenizer.defaultSeperator,g.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(g.tokenizer.seperator=e)},g.tokenizer.resetSeperator=function(){g.tokenizer.seperator=g.tokenizer.defaultSeperator},g.tokenizer.getSeperator=function(){return g.tokenizer.seperator},(g.Pipeline=function(){this._queue=[]}).registeredFunctions={},g.Pipeline.registerFunction=function(e,t){t in g.Pipeline.registeredFunctions&&g.utils.warn("Overwriting existing registered function: "+t),e.label=t,g.Pipeline.registeredFunctions[t]=e},g.Pipeline.getRegisteredFunction=function(e){return e in g.Pipeline.registeredFunctions!=1?null:g.Pipeline.registeredFunctions[e]},g.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||g.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},g.Pipeline.load=function(e){const n=new g.Pipeline;return e.forEach(function(e){var t=g.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},g.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){g.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},g.Pipeline.prototype.after=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},g.Pipeline.prototype.before=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},g.Pipeline.prototype.remove=function(e){-1!==(e=this._queue.indexOf(e))&&this._queue.splice(e,1)},g.Pipeline.prototype.run=function(o){var e=[],t=o.length,i=this._queue.length;for(let n=0;ne&&(n=i),o=n-t,i=t+Math.floor(o/2),r=this.elements[i]}return r===e?i:-1},lunr.SortedSet.prototype.locationFor=function(e){let t=0,n=this.elements.length,o=n-t,i=t+Math.floor(o/2),r=this.elements[i];for(;1e&&(n=i),o=n-t,i=t+Math.floor(o/2),r=this.elements[i];return r>e?i:ri-1||o>r-1);)s[n]===l[o]?(t.add(s[n]),n++,o++):s[n]l[o]&&o++;return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){let t,n,o;n=this.length>=e.length?(t=this,e):(t=e,this),o=t.clone();for(let e=0,t=n.toArray();e{let t=n.getAttribute(e);t&&(t=t.replace("$SHORTCUT",v),n.setAttribute(e,t))})}s.addEventListener("keydown",function(e){"Enter"!==e.key&&" "!==e.key||s.click()});let e,r=(h.addEventListener("click",o),h.addEventListener("touchend",o),document.addEventListener("keydown",function(e){"Escape"===e.key&&u()}),p.addEventListener("click",function(){t(),f.focus()}),p.addEventListener("keydown",function(e){"Enter"!==e.key&&" "!==e.key||(t(),f.focus(),e.preventDefault())}),s.addEventListener("mouseover",i),s.addEventListener("click",l),s.addEventListener("touchstart",l),null);function l(){e=document.activeElement,i(),h.style.display="block",f.focus()}function u(){h.style.display="none",t(),e&&document.body.contains(e)&&e.focus()}function a(e){var t;"true"!==e.getAttribute("aria-selected")&&([t=null]=[e],m.querySelectorAll("#results > div").forEach(e=>{e!==t&&e.setAttribute("aria-selected","false")}),e.setAttribute("aria-selected","true")),f.setAttribute("aria-activedescendant",e.id)}function t(){f.value="",m.innerHTML="",g.style.display="none",f.removeAttribute("aria-activedescendant")}function o(e){e.target===h&&u(),e.stopPropagation()}function i(){if(!r)if(window.searchIndex)r=Promise.resolve(elasticlunr.Index.load(window.searchIndex));else{var t=document.documentElement.getAttribute("lang").substring(0,2);let e=document.querySelector("meta[name='base']").getAttribute("content");e.endsWith("/")&&(e=e.slice(0,-1)),r=fetch(e+"/search_index."+t+".json").then(e=>e.json()).then(e=>elasticlunr.Index.load(e))}}function S(e){return e=parseInt(e,16).toString(2),[0,1,2,3,4][Math.ceil(e.length/8)]}function c(){a(this)}f.addEventListener("input",async function(){const s=this.value.trim();var e=await r;m.innerHTML="",g.style.display=0{e&&(e.style.display="none")}),(o=y[o])&&(o.style.display="inline",o.textContent=o.textContent.replace("$NUMBER",n.toString()));let l=0;e.forEach(function(t){if(t.doc.title||t.doc.path||t.doc.id){var n=document.createElement("div"),o=(n.setAttribute("role","option"),n.id="result-"+l++,n.innerHTML="",n.querySelector("a")),i=n.querySelector("span:first-child"),r=n.querySelector("span:nth-child(2)"),i=(i.textContent=t.doc.title||t.doc.path||t.doc.id,t.doc.body?function(e,t){var n=t.map(function(e){return elasticlunr.stemmer(e.toLowerCase())});let o=0;var i=[];for(const y of e.toLowerCase().split(". ")){let t=!0;for(const v of y.split(/[\s\n]/)){if(0"),p[2]+p[0].length);!f.test(p[0])&&12<=p[0].length?(h=function(t){let n="",o=!1,i=0,r=0,s=0;for(let e=0;e"),d=g}c.push("…");var m=t=c.join("");return 150]+>/g,"").length?t.substring(0,150)+"…":m}(t.doc.body,s.split(/\s+/)):t.doc.description||"");r.innerHTML=i;let e=t.ref;t.doc.body&&(r=encodeURIComponent(s),e+="#:~:text="+r),o.href=e,m.appendChild(n)}}),f.setAttribute("aria-expanded",0e.split("#")[0].replace(/\/$/,""))(o)!==n(t)||e.ctrlKey||e.metaKey||u())}),document.querySelectorAll("#results > div").forEach(e=>{e.removeEventListener("touchstart",c),e.addEventListener("touchstart",c)})},!0),document.addEventListener("keydown",function(t){var e=navigator.userAgent.toLowerCase().includes("mac")?t.metaKey:t.ctrlKey;if("k"===t.key&&e)t.preventDefault(),("block"===h.style.display?u:l)();else if(e=document.activeElement,"Tab"!==t.key||e!==f&&e!==p){if(0!==(r=m.querySelectorAll("#results > div")).length){var n,o,i=Array.from(r),r=m.querySelector('[aria-selected="true"]'),s=i.indexOf(r);if(["ArrowUp","ArrowDown","Home","End","PageUp","PageDown"].includes(t.key)){t.preventDefault();let e=s;switch(t.key){case"ArrowUp":e=Math.max(s-1,0);break;case"ArrowDown":e=Math.min(s+1,i.length-1);break;case"Home":e=0;break;case"End":e=i.length-1;break;case"PageUp":e=Math.max(s-3,0);break;case"PageDown":e=Math.min(s+3,i.length-1)}e!==s&&(a((o=i)[n=e]),o[n].scrollIntoView({block:"nearest",inline:"start"}))}"Enter"===t.key&&r&&(t.preventDefault(),t.stopImmediatePropagation(),(o=r.querySelector("a"))&&(window.location.href=o.getAttribute("href")),u())}}else t.preventDefault(),(e===f?p:f).focus()})}}; diff --git a/js/sortTable.js b/js/sortTable.js new file mode 100644 index 0000000..16e02e9 --- /dev/null +++ b/js/sortTable.js @@ -0,0 +1,119 @@ +// Select the table and table headers. +var table = document.querySelector('#sitemapTable'); +var headers = Array.from(table.querySelectorAll('th')); + +// Create and append the live region for accessibility announcements. +var liveRegion = document.createElement('div'); +liveRegion.setAttribute('aria-live', 'polite'); +liveRegion.setAttribute('aria-atomic', 'true'); +liveRegion.classList.add('visually-hidden'); +document.body.appendChild(liveRegion); + +// Initialise headers with click and keyboard listeners. +initializeHeaders(); +addSortText(); // Add text for screen readers for initial sort direction. +updateSortIndicators(headers[0], 'asc'); // Set initial sort indicators. + +function updateSortIndicators(header, direction) { + removeSortArrows(header); + var arrow = document.createElement('span'); + arrow.classList.add('sort-arrow'); + arrow.textContent = direction === 'asc' ? ' ▲' : ' ▼'; + arrow.setAttribute('aria-hidden', 'true'); + header.appendChild(arrow); +} + +function removeSortArrows(header) { + var arrows = header.querySelectorAll('.sort-arrow'); + arrows.forEach(function (arrow) { + arrow.remove(); + }); +} + +function initializeHeaders() { + headers.forEach(function (header, index) { + header.classList.add('sortable'); + header.setAttribute('tabindex', '0'); + header.sortDirection = 'asc'; // Default sort direction. + var sortAttribute = index === 0 ? 'ascending' : 'none'; + header.setAttribute('aria-sort', sortAttribute); + header.addEventListener('click', function () { + sortTable(index); + }); + header.addEventListener('keydown', function (e) { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + sortTable(index); + } + }); + }); +} + +function announceSort(header, direction) { + var columnTitle = header.querySelector('.columntitle').textContent; + liveRegion.textContent = + 'Column ' + columnTitle + ' is now sorted in ' + direction + ' order'; +} + +function sortTable(index) { + var header = headers[index]; + var direction = header.sortDirection === 'asc' ? 'desc' : 'asc'; + var tbody = table.querySelector('tbody'); + var rows = Array.from(tbody.querySelectorAll('tr')); + sortRows(rows, index, direction); + refreshTableBody(tbody, rows); + updateHeaderAttributes(header, direction); + announceSort(header, direction === 'asc' ? 'ascending' : 'descending'); +} + +function sortRows(rows, index, direction) { + rows.sort(function (rowA, rowB) { + var cellA = rowA.querySelectorAll('td')[index].textContent; + var cellB = rowB.querySelectorAll('td')[index].textContent; + return direction === 'asc' + ? cellA.localeCompare(cellB) + : cellB.localeCompare(cellA); + }); +} + +function refreshTableBody(tbody, rows) { + tbody.innerHTML = ''; // Clear existing rows. + rows.forEach(function (row) { + tbody.appendChild(row); + }); +} + +function updateHeaderAttributes(header, direction) { + headers.forEach(function (otherHeader) { + if (otherHeader !== header) { + otherHeader.setAttribute('aria-sort', 'none'); + removeSortArrows(otherHeader); + } + }); + header.setAttribute('aria-sort', direction === 'asc' ? 'ascending' : 'descending'); + header.sortDirection = direction; + updateSortIndicators(header, direction); + updateAnnounceText(header); +} + +// Update screen reader text for sorting. +function updateAnnounceText(header) { + var span = header.querySelector('.visually-hidden'); + span.textContent = + 'Click to sort in ' + + (header.sortDirection === 'asc' ? 'descending' : 'ascending') + + ' order'; +} + +// Add text for screen readers regarding sort order. +function addSortText() { + headers.forEach(function (header) { + var span = document.createElement('span'); + span.classList.add('visually-hidden'); + span.textContent = 'Click to sort in descending order'; + header.appendChild(span); + }); +} + +headers[0].sortDirection = 'asc'; +headers[0].setAttribute('aria-sort', 'ascending'); diff --git a/js/sortTable.min.js b/js/sortTable.min.js new file mode 100644 index 0000000..de423a8 --- /dev/null +++ b/js/sortTable.min.js @@ -0,0 +1 @@ +var table=document.querySelector("#sitemapTable"),headers=Array.from(table.querySelectorAll("th")),liveRegion=document.createElement("div");function updateSortIndicators(e,t){removeSortArrows(e);var r=document.createElement("span");r.classList.add("sort-arrow"),r.textContent="asc"===t?" ▲":" ▼",r.setAttribute("aria-hidden","true"),e.appendChild(r)}function removeSortArrows(e){e.querySelectorAll(".sort-arrow").forEach(function(e){e.remove()})}function initializeHeaders(){headers.forEach(function(e,t){e.classList.add("sortable"),e.setAttribute("tabindex","0"),e.sortDirection="asc",e.setAttribute("aria-sort",0===t?"ascending":"none"),e.addEventListener("click",function(){sortTable(t)}),e.addEventListener("keydown",function(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),sortTable(t))})})}function announceSort(e,t){e=e.querySelector(".columntitle").textContent;liveRegion.textContent="Column "+e+" is now sorted in "+t+" order"}function sortTable(e){var t=headers[e],r="asc"===t.sortDirection?"desc":"asc",n=table.querySelector("tbody"),o=Array.from(n.querySelectorAll("tr"));sortRows(o,e,r),refreshTableBody(n,o),updateHeaderAttributes(t,r),announceSort(t,"asc"==r?"ascending":"descending")}function sortRows(e,r,n){e.sort(function(e,t){e=e.querySelectorAll("td")[r].textContent,t=t.querySelectorAll("td")[r].textContent;return"asc"===n?e.localeCompare(t):t.localeCompare(e)})}function refreshTableBody(t,e){t.innerHTML="",e.forEach(function(e){t.appendChild(e)})}function updateHeaderAttributes(t,e){headers.forEach(function(e){e!==t&&(e.setAttribute("aria-sort","none"),removeSortArrows(e))}),t.setAttribute("aria-sort","asc"===e?"ascending":"descending"),t.sortDirection=e,updateSortIndicators(t,e),updateAnnounceText(t)}function updateAnnounceText(e){e.querySelector(".visually-hidden").textContent="Click to sort in "+("asc"===e.sortDirection?"descending":"ascending")+" order"}function addSortText(){headers.forEach(function(e){var t=document.createElement("span");t.classList.add("visually-hidden"),t.textContent="Click to sort in descending order",e.appendChild(t)})}liveRegion.setAttribute("aria-live","polite"),liveRegion.setAttribute("aria-atomic","true"),liveRegion.classList.add("visually-hidden"),document.body.appendChild(liveRegion),initializeHeaders(),addSortText(),updateSortIndicators(headers[0],"asc"),headers[0].sortDirection="asc",headers[0].setAttribute("aria-sort","ascending"); diff --git a/js/themeSwitcher.js b/js/themeSwitcher.js new file mode 100644 index 0000000..c5ddf95 --- /dev/null +++ b/js/themeSwitcher.js @@ -0,0 +1,74 @@ +// Get the theme switcher button elements. +const themeSwitcher = document.querySelector('.theme-switcher'); +const themeResetter = document.querySelector('.theme-resetter'); +const defaultTheme = document.documentElement.getAttribute('data-default-theme'); + +function getSystemThemePreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; +} + +// Determine the initial theme. +let currentTheme = + localStorage.getItem('theme') || + document.documentElement.getAttribute('data-theme') || + getSystemThemePreference(); + +function setTheme(theme, saveToLocalStorage = false) { + document.documentElement.setAttribute('data-theme', theme); + currentTheme = theme; + themeSwitcher.setAttribute('aria-pressed', theme === 'dark'); + + if (saveToLocalStorage) { + localStorage.setItem('theme', theme); + themeResetter.classList.add('has-custom-theme'); + } else { + localStorage.removeItem('theme'); + themeResetter.classList.remove('has-custom-theme'); + } + + // Dispatch a custom event for comment systems. + window.dispatchEvent(new CustomEvent('themeChanged', { detail: { theme } })); +} + +function resetTheme() { + setTheme(defaultTheme || getSystemThemePreference()); +} + +// Function to switch between dark and light themes. +function switchTheme() { + setTheme(currentTheme === 'dark' ? 'light' : 'dark', true); +} + +// Initialize the theme switcher button. +themeSwitcher.addEventListener('click', switchTheme); +themeResetter.addEventListener('click', resetTheme); + +// Update the theme based on system preference if necessary. +if (!defaultTheme) { + window + .matchMedia('(prefers-color-scheme: dark)') + .addEventListener('change', (e) => { + setTheme(e.matches ? 'dark' : 'light'); + }); +} + +// Set initial ARIA attribute and custom theme class. +themeSwitcher.setAttribute('aria-pressed', currentTheme === 'dark'); +if (localStorage.getItem('theme')) { + themeResetter.classList.add('has-custom-theme'); +} + +// Function to handle keydown event on theme toggler buttons. +function handleThemeTogglerKeydown(event) { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + if (event.target === themeSwitcher) { + switchTheme(); + } else if (event.target === themeResetter) { + resetTheme(); + } + } +} + +themeSwitcher.addEventListener('keydown', handleThemeTogglerKeydown); +themeResetter.addEventListener('keydown', handleThemeTogglerKeydown); diff --git a/js/themeSwitcher.min.js b/js/themeSwitcher.min.js new file mode 100644 index 0000000..e563ad3 --- /dev/null +++ b/js/themeSwitcher.min.js @@ -0,0 +1 @@ +const a=document.querySelector(".theme-switcher"),r=document.querySelector(".theme-resetter"),e=document.documentElement.getAttribute("data-default-theme");function t(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}let d=localStorage.getItem("theme")||document.documentElement.getAttribute("data-theme")||t();function n(e,t=!1){document.documentElement.setAttribute("data-theme",e),d=e,a.setAttribute("aria-pressed","dark"===e),t?(localStorage.setItem("theme",e),r.classList.add("has-custom-theme")):(localStorage.removeItem("theme"),r.classList.remove("has-custom-theme")),window.dispatchEvent(new CustomEvent("themeChanged",{detail:{theme:e}}))}function c(){n(e||t())}function m(){n("dark"===d?"light":"dark",!0)}function o(e){"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),e.target===a?m():e.target===r&&c())}a.addEventListener("click",m),r.addEventListener("click",c),e||window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{n(e.matches?"dark":"light")}),a.setAttribute("aria-pressed","dark"===d),localStorage.getItem("theme")&&r.classList.add("has-custom-theme"),a.addEventListener("keydown",o),r.addEventListener("keydown",o); diff --git a/js/utterances.js b/js/utterances.js new file mode 100644 index 0000000..ddfa35a --- /dev/null +++ b/js/utterances.js @@ -0,0 +1,64 @@ +function setUtterancesTheme(newTheme) { + // Get the frame with class "utterances-frame". + const frame = document.querySelector('.utterances-frame'); + + if (frame) { + // If the iframe exists, send a message to set the theme. + frame.contentWindow.postMessage( + { type: 'set-theme', theme: newTheme }, + 'https://utteranc.es' + ); + } +} + +function initUtterances() { + // Get the comments div. + const commentsDiv = document.querySelector('.comments'); + + // Check if the comments div exists. + if (commentsDiv) { + // Get all necessary attributes for initializing Utterances. + const repo = commentsDiv.getAttribute('data-repo'); + const issueTerm = commentsDiv.getAttribute('data-issue-term'); + const label = commentsDiv.getAttribute('data-label'); + const lightTheme = commentsDiv.getAttribute('data-light-theme'); + const darkTheme = commentsDiv.getAttribute('data-dark-theme'); + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading'); + + // Create a new script element. + const script = document.createElement('script'); + script.src = 'https://utteranc.es/client.js'; + script.async = true; + script.setAttribute('repo', repo); + script.setAttribute('issue-term', issueTerm); + script.setAttribute('label', label); + + // Set the initial theme. + const currentTheme = + document.documentElement.getAttribute('data-theme') || 'light'; + const selectedTheme = currentTheme === 'dark' ? darkTheme : lightTheme; + script.setAttribute('theme', selectedTheme); + + script.setAttribute('crossorigin', 'anonymous'); + + // Enable lazy loading if specified. + if (lazyLoading === 'true') { + script.setAttribute('data-loading', 'lazy'); + } + + // Append the script to the comments div. + commentsDiv.appendChild(script); + + // Listen for themeChanged event to update the theme. + window.addEventListener('themeChanged', (event) => { + // Determine the new theme based on the event detail. + const selectedTheme = + event.detail.theme === 'dark' ? darkTheme : lightTheme; + // Set the new theme. + setUtterancesTheme(selectedTheme); + }); + } +} + +// Initialize Utterances. +initUtterances(); diff --git a/js/utterances.min.js b/js/utterances.min.js new file mode 100644 index 0000000..992de3b --- /dev/null +++ b/js/utterances.min.js @@ -0,0 +1 @@ +function setUtterancesTheme(t){var e=document.querySelector(".utterances-frame");e&&e.contentWindow.postMessage({type:"set-theme",theme:t},"https://utteranc.es")}function initUtterances(){var t=document.querySelector(".comments");if(t){const a=t.getAttribute("data-repo"),r=t.getAttribute("data-issue-term"),n=t.getAttribute("data-label"),i=t.getAttribute("data-light-theme"),s=t.getAttribute("data-dark-theme"),u=t.getAttribute("data-lazy-loading"),d=document.createElement("script");d.src="https://utteranc.es/client.js",d.async=!0,d.setAttribute("repo",a),d.setAttribute("issue-term",r),d.setAttribute("label",n);var e="dark"===(document.documentElement.getAttribute("data-theme")||"light")?s:i;d.setAttribute("theme",e),d.setAttribute("crossorigin","anonymous"),"true"===u&&d.setAttribute("data-loading","lazy"),t.appendChild(d),window.addEventListener("themeChanged",t=>{setUtterancesTheme("dark"===t.detail.theme?s:i)})}}initUtterances(); diff --git a/katex.min.css b/katex.min.css new file mode 100644 index 0000000..8d95a96 --- /dev/null +++ b/katex.min.css @@ -0,0 +1 @@ +@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_AMS-Regular.ttf) format("truetype");font-family:KaTeX_AMS}@font-face{font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-family:KaTeX_Caligraphic}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-family:KaTeX_Caligraphic}@font-face{font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Fraktur-Bold.ttf) format("truetype");font-family:KaTeX_Fraktur}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Fraktur-Regular.ttf) format("truetype");font-family:KaTeX_Fraktur}@font-face{font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Bold.ttf) format("truetype");font-family:KaTeX_Main}@font-face{font-style:italic;font-weight:700;src:url(fonts/KaTeX/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-BoldItalic.ttf) format("truetype");font-family:KaTeX_Main}@font-face{font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Italic.ttf) format("truetype");font-family:KaTeX_Main}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Regular.ttf) format("truetype");font-family:KaTeX_Main}@font-face{font-style:italic;font-weight:700;src:url(fonts/KaTeX/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Math-BoldItalic.ttf) format("truetype");font-family:KaTeX_Math}@font-face{font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Math-Italic.ttf) format("truetype");font-family:KaTeX_Math}@font-face{font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Bold.ttf) format("truetype");font-family:"KaTeX_SansSerif"}@font-face{font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Italic.ttf) format("truetype");font-family:"KaTeX_SansSerif"}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Regular.ttf) format("truetype");font-family:"KaTeX_SansSerif"}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Script-Regular.ttf) format("truetype");font-family:KaTeX_Script}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size1-Regular.ttf) format("truetype");font-family:KaTeX_Size1}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size2-Regular.ttf) format("truetype");font-family:KaTeX_Size2}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size3-Regular.ttf) format("truetype");font-family:KaTeX_Size3}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size4-Regular.ttf) format("truetype");font-family:KaTeX_Size4}@font-face{font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Typewriter-Regular.ttf) format("truetype");font-family:KaTeX_Typewriter}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.11"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);position:absolute;border:0;padding:0;width:1px;height:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;width:-webkit-min-content;width:-moz-min-content;width:min-content;white-space:nowrap}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-style:italic;font-family:KaTeX_Math}.katex .mathit{font-style:italic;font-family:KaTeX_Main}.katex .mathrm{font-style:normal}.katex .mathbf{font-weight:700;font-family:KaTeX_Main}.katex .boldsymbol{font-style:italic;font-weight:700;font-family:KaTeX_Math}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-weight:700;font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-weight:700;font-family:KaTeX_SansSerif}.katex .mathitsf,.katex .textitsf{font-style:italic;font-family:KaTeX_SansSerif}.katex .mainrm{font-style:normal;font-family:KaTeX_Main}.katex .vlist-t{display:inline-table;border-collapse:collapse;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;position:relative;height:0}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{width:0;overflow:hidden}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;width:2px;min-width:2px;font-size:1px}.katex .vbox{display:inline-flex;flex-direction:column;align-items:baseline}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;border-bottom-style:solid;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-right:50%;margin-left:-50%}.katex .rule{display:inline-block;position:relative;border:0 solid}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;border-bottom-style:solid;width:100%}.katex .hdashline{display:inline-block;border-bottom-style:dashed;width:100%}.katex .sqrt>.root{margin-right:-.5555555556em;margin-left:.2777777778em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;position:absolute;width:100%;height:inherit}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;max-width:none;min-height:0;max-height:none}.katex .stretchy{display:block;position:relative;width:100%;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{position:relative;width:100%;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-right:-.2em;margin-left:-.2em}.katex .sout{border-bottom-width:.08em;border-bottom-style:solid}.katex .angl{box-sizing:border-box;margin-right:.03889em;border-top:.049em solid;border-right:.049em solid}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{counter-increment:katexEqnNo;content:"(" counter(katexEqnNo) ")"}.katex .mml-eqn-num:before{counter-increment:mmlEqnNo;content:"(" counter(mmlEqnNo) ")"}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;position:absolute;left:calc(50% + .3em);text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{right:auto;left:0}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/main.css b/main.css new file mode 100644 index 0000000..138b413 --- /dev/null +++ b/main.css @@ -0,0 +1 @@ +.admonition{display:flex;align-items:flex-start;margin:1em 0;border-left:6px solid;border-radius:10px;padding:.8rem;color:var(--text-color-high-contrast);font-family:var(--sans-serif-font)}.admonition p{margin-bottom:0;margin-left:-1.75rem;font-family:inherit}.admonition a:hover{color:var(--hover-color) !important}.admonition a:hover code{color:var(--text-color-high-contrast) !important}.admonition-content{flex:1}.admonition-content strong{font-weight:580}.admonition-icon{display:flex;align-items:center;margin:.3rem;background-size:contain;background-repeat:no-repeat;aspect-ratio:1/1;width:1.5rem}.admonition-title{opacity:.92;font-weight:bold;font-size:.82rem}:root{--admonition-note-border: #5b6167;--admonition-note-bg: #f2f4f7;--admonition-note-code: #e1e3ed;--admonition-tip-border: #03970f;--admonition-tip-bg: #f0fdf0;--admonition-tip-code: #d3edc5;--admonition-info-border: #15a2b2;--admonition-info-bg: #f5fbff;--admonition-info-code: #d5e2f2;--admonition-warning-border: #eea719;--admonition-warning-bg: #fff8e6;--admonition-warning-code: #feee96;--admonition-danger-border: #d8292e;--admonition-danger-bg: #ffebed;--admonition-danger-code: #fcc1c5}[data-theme=dark]{--admonition-note-border: #d0d1d4;--admonition-note-bg: #3d3e40;--admonition-note-code: #495057;--admonition-tip-border: #01b010;--admonition-tip-bg: #013100;--admonition-tip-code: #005f00;--admonition-info-border: #50a9d5;--admonition-info-bg: #193C47;--admonition-info-code: #005f00;--admonition-warning-border: #e19d0a;--admonition-warning-bg: #4f3a01;--admonition-warning-code: #8c6b00;--admonition-danger-border: #e74f54;--admonition-danger-bg: #4c1012;--admonition-danger-code: #8c2e00}.admonition.note{border-color:var(--admonition-note-border);background-color:var(--admonition-note-bg)}.admonition.note code{background-color:var(--admonition-note-code) !important}.admonition.note a{border-bottom:1px solid var(--admonition-note-border);color:var(--admonition-note-border)}.admonition.note a:hover{background-color:var(--admonition-note-border)}.admonition.tip{border-color:var(--admonition-tip-border);background-color:var(--admonition-tip-bg)}.admonition.tip code{background-color:var(--admonition-tip-code) !important}.admonition.tip a{border-bottom:1px solid var(--admonition-tip-border);color:var(--admonition-tip-border)}.admonition.tip a:hover{background-color:var(--admonition-tip-border)}.admonition.info{border-color:var(--admonition-info-border);background-color:var(--admonition-info-bg)}.admonition.info code{background-color:var(--admonition-info-code) !important}.admonition.info a{border-bottom:1px solid var(--admonition-info-border);color:var(--admonition-info-border)}.admonition.info a:hover{background-color:var(--admonition-info-border)}.admonition.warning{border-color:var(--admonition-warning-border);background-color:var(--admonition-warning-bg)}.admonition.warning code{background-color:var(--admonition-warning-code) !important}.admonition.warning a{border-bottom:1px solid var(--admonition-warning-border);color:var(--admonition-warning-border)}.admonition.warning a:hover{background-color:var(--admonition-warning-border)}.admonition.danger{border-color:var(--admonition-danger-border);background-color:var(--admonition-danger-bg)}.admonition.danger code{background-color:var(--admonition-danger-code) !important}.admonition.danger a{border-bottom:1px solid var(--admonition-danger-border);color:var(--admonition-danger-border)}.admonition.danger a:hover{background-color:var(--admonition-danger-border)}.admonition-icon-note{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z'/%3E%3C/svg%3E")}.admonition-icon-tip{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M480-78.258q-33.718 0-56.974-22.166-23.256-22.167-23.59-55.885h161.128q-.334 33.718-23.59 55.885Q513.718-78.258 480-78.258ZM318.257-210.515v-67.588h323.486v67.588H318.257Zm7.846-121.128q-67.692-42.487-106.896-109.134-39.205-66.648-39.205-147.479 0-123.769 88.149-211.884 88.149-88.115 211.967-88.115 123.817 0 211.849 88.115 88.031 88.115 88.031 211.884 0 80.831-38.999 147.479-39 66.647-107.102 109.134H326.103Zm21.927-67.588h264.351q46.311-32 73.17-81.681 26.859-49.68 26.859-107.144 0-96.918-68-164.765-68-67.846-164.564-67.846t-164.41 67.713q-67.846 67.712-67.846 164.725 0 57.52 26.859 107.259t73.581 81.739Zm131.97 0Z'/%3E%3C/svg%3E")}.admonition-icon-info{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.789-288Q495-288 505.5-298.289q10.5-10.29 10.5-25.5Q516-339 505.711-349.5q-10.29-10.5-25.5-10.5Q465-360 454.5-349.711q-10.5 10.29-10.5 25.5Q444-309 454.289-298.5q10.29 10.5 25.5 10.5ZM444-432h72v-240h-72v240Zm36.276 336Q401-96 331-126q-70-30-122.5-82.5T126-330.958q-30-69.959-30-149.5Q96-560 126-629.5t82.5-122Q261-804 330.958-834q69.959-30 149.5-30Q560-864 629.5-834t122 82.5Q804-699 834-629.276q30 69.725 30 149Q864-401 834-331q-30 70-82.5 122.5T629.276-126q-69.725 30-149 30ZM480-168q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z'/%3E%3C/svg%3E")}.admonition-icon-warning{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M109-120q-11 0-20-5.5T75-140q-5-9-5.5-19.5T75-180l370-640q6-10 15.5-15t19.5-5q10 0 19.5 5t15.5 15l370 640q6 10 5.5 20.5T885-140q-5 9-14 14.5t-20 5.5H109Zm69-80h604L480-720 178-200Zm302-40q17 0 28.5-11.5T520-280q0-17-11.5-28.5T480-320q-17 0-28.5 11.5T440-280q0 17 11.5 28.5T480-240Zm0-120q17 0 28.5-11.5T520-400v-120q0-17-11.5-28.5T480-560q-17 0-28.5 11.5T440-520v120q0 17 11.5 28.5T480-360Zm0-100Z'/%3E%3C/svg%3E")}.admonition-icon-danger{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M239.256-400q0 58.091 27.975 108.995t76.13 81.237q-5.616-8.513-8.487-18.398-2.872-9.885-2.872-19.167 1.333-26.436 12.153-50.307 10.821-23.872 31.41-43.461L480-443.921l105.819 102.82q18.923 19.311 29.885 43.321 10.961 24.011 12.294 50.447 0 9.282-2.872 19.167-2.871 9.885-7.82 18.398 47.488-30.333 75.796-81.237Q721.41-341.909 721.41-400q0-47.622-19.258-93.169-19.259-45.547-53.998-82.549-19.951 13.41-42.202 19.859Q583.7-549.41 561-549.41q-62.448 0-105.108-38.039-42.661-38.038-51.225-98.628v-9.744q-39.385 31.949-69.898 67.68-30.513 35.73-51.987 74.166t-32.5 77.464Q239.256-437.483 239.256-400ZM480-349.539l-57.436 56.436q-12.154 11.821-17.731 26.029-5.577 14.208-5.577 29.074 0 32.769 23.498 55.757 23.497 22.987 57.246 22.987 33.432 0 57.421-22.906 23.989-22.906 23.989-55.561 0-16.162-6.116-30.162-6.116-13.999-17.454-25.154l-57.84-56.5Zm-11.002-469.022V-708q0 38.637 26.832 64.819 26.831 26.183 65.17 26.183 15.609 0 30.818-5.923 15.208-5.923 28.131-17.718l22.615-24.102q67.564 44.128 106.999 114.917 39.435 70.79 39.435 150.156 0 128.206-89.846 218.103Q609.307-91.668 480-91.668q-129.027 0-218.68-89.652-89.652-89.653-89.652-218.68 0-119.178 79.371-232.447t217.959-186.114Z'/%3E%3C/svg%3E")}.admonition.note .admonition-icon{background-color:var(--admonition-note-border)}.admonition.tip .admonition-icon{background-color:var(--admonition-tip-border)}.admonition.info .admonition-icon{background-color:var(--admonition-info-border)}.admonition.warning .admonition-icon{background-color:var(--admonition-warning-border)}.admonition.danger .admonition-icon{background-color:var(--admonition-danger-border)}.archive{margin-top:4vmin}.archive .listing-title{margin-bottom:1rem;font-size:1.5rem}.archive .listing-item{display:flex;gap:1rem;margin-bottom:.5rem;padding:.2rem 1rem}.archive .listing-item .post-time{padding-left:1vmin;min-width:5rem;text-align:left}.archive .listing-item .post-time .date{color:var(--meta-color);white-space:nowrap}.archive ul{margin:0;padding:0;list-style:none}.archive li{margin-bottom:1.3rem}.cards{display:grid;grid-template-rows:auto;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));gap:24px;margin-top:4vmin;padding:12px 0}.cards .card{box-shadow:rgba(50,50,93,.25) 0px 2px 5px -1px,rgba(0,0,0,.3) 0px 1px 3px -1px;border-radius:1rem;background:var(--bg-2);min-height:100px;overflow:hidden}.cards .card:hover{background-color:var(--primary-color)}.cards .card:hover .card-description{color:var(--hover-color)}.cards .card .card-info{padding:0 24px 24px;text-align:center}.cards .card .card-title{margin-top:.7em}.cards .card .card-image{width:100%}.cards .card .card-image-placeholder{width:100%;height:12px}.cards .card .card-description{margin-top:.5em;overflow:hidden;color:var(--text-color)}@media all and (max-width: 720px){.cards{gap:18px}}code{border-radius:5px;background-color:var(--bg-1);padding:.1em .2em;font-size:.9rem;font-family:var(--code-font)}code mark{display:block;filter:brightness(110%);background-color:var(--codeblock-highlight);color:inherit}code table{margin:0rem;border-collapse:collapse;border-spacing:0rem;width:100%;text-align:left}code table td,code table th,code table tr{border:none;padding:0rem}code table tbody td:first-child{width:2rem;user-select:none;text-align:left}code table tbody tr:nth-child(even){background-color:inherit}a:hover code{background-color:inherit}pre{display:block;position:relative;border-radius:5px;padding:2.4rem 1rem 1rem;overflow:hidden;overflow-x:auto;line-height:1.4}pre code{display:block;border:0rem;border-radius:5px;background-color:rgba(0,0,0,0);padding:0rem;overflow-x:auto;color:inherit;font-size:.8rem;white-space:pre}pre code::before{display:block;position:absolute;top:0;left:0;background-color:var(--primary-color);padding:.3rem;padding-left:1rem;width:calc(100% - 1.3rem);height:.9rem;content:attr(data-lang);color:var(--hover-color);font-size:.65rem;text-align:left;text-transform:uppercase}pre code .source-path{display:block;position:absolute;top:0;right:1.3rem;padding-top:.3rem;padding-right:1.3rem;max-width:calc(100% - 14em);height:.9rem;overflow:hidden;color:var(--hover-color);font-size:.65rem;text-align:right;text-overflow:ellipsis;white-space:nowrap}.copy-code{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M217.002-67.694q-37.732 0-64.02-26.288-26.287-26.287-26.287-64.019V-707.69h77.999v549.689q0 4.615 3.846 8.462 3.846 3.846 8.462 3.846h451.689v77.999H217.002Zm175.999-175.999q-37.733 0-64.02-26.287T302.694-334v-463.383q0-37.732 26.287-64.02 26.287-26.287 64.02-26.287h365.383q37.732 0 64.019 26.287 26.288 26.288 26.288 64.02V-334q0 37.733-26.288 64.02-26.287 26.287-64.019 26.287H393.001Zm0-77.998h365.383q4.615 0 8.462-3.847 3.846-3.846 3.846-8.462v-463.383q0-4.616-3.846-8.462-3.847-3.846-8.462-3.846H393.001q-4.616 0-8.462 3.846-3.847 3.846-3.847 8.462V-334q0 4.616 3.847 8.462 3.846 3.847 8.462 3.847Zm-12.309 0v-488V-321.691Z'/%3E%3C/svg%3E");position:absolute;top:.3rem;right:.7rem;align-self:center;z-index:1;cursor:pointer;background:var(--hover-color);background-size:contain;width:.9rem;height:.9rem;color:#fff}.copy-code.checked{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M395-253 194-455l83-83 118 117 288-287 83 84-371 371Z'/%3E%3C/svg%3E");width:1rem;height:1rem}.copy-code.error{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.386-248Q509-248 529-267.386q20-19.386 20-49T529.614-366.5q-19.386-20.5-49-20.5T431-366.886q-20 20.114-20 49.728t19.386 49.386q19.386 19.772 49 19.772ZM416-431h128v-265H416v265Zm64.276 381q-88.916 0-167.743-33.104-78.828-33.103-137.577-91.852-58.749-58.749-91.852-137.535Q50-391.277 50-480.458q0-89.438 33.162-167.491 33.163-78.053 92.175-136.942 59.011-58.889 137.533-91.999Q391.393-910 480.458-910q89.428 0 167.518 33.093T784.94-784.94q58.874 58.874 91.967 137.215Q910-569.385 910-480.192q0 89.192-33.11 167.518-33.11 78.326-91.999 137.337-58.889 59.012-137.167 92.174Q569.447-50 480.276-50Z'/%3E%3C/svg%3E")}.utterances-frame{width:100%}.comments{margin-top:2rem;border-top:var(--divider-color) solid .5px;border-bottom:var(--divider-color) solid .5px;padding-top:2rem;padding-bottom:2rem}.comments iframe{margin:0;border:none;aspect-ratio:inherit;width:100%;max-width:100%}.comments .load-comments-button{display:block;cursor:pointer;margin:.5em auto;border:none;background:none;padding:.5em 1em;color:inherit;font-size:.95rem;font-family:var(--sans-serif-font);text-decoration:none}footer{margin-top:auto;margin-bottom:1.4rem;color:var(--meta-color);font-size:.88rem;font-family:var(--post-font-family);text-align:center}footer .nav-links{color:var(--primary-color)}footer p{margin:0}footer section{display:flex;flex-direction:column;align-items:center;gap:0rem}footer nav{display:flex;margin:0 0rem}.socials{display:flex;flex-grow:0;flex-wrap:wrap;justify-content:center;align-items:flex-end}.socials svg{max-height:15px}.socials ul{gap:5px}.social{display:flex;justify-content:center;align-items:center;background-image:unset;padding:.5vmin}.social>img{aspect-ratio:1/1;width:1.5rem;height:auto;color:#000}.social:hover>img{filter:invert(1)}[data-theme=dark] .social:hover>img{filter:invert(0)}[data-theme=dark] .social>img{filter:invert(1)}.header-anchor{display:inline-flex;position:absolute;justify-content:center;align-items:center;opacity:0;margin-left:-2rem;padding-right:.3rem;width:1.9rem;height:100%;user-select:none}@media (max-width: 500px){.header-anchor{display:none}}:dir(rtl) .header-anchor{margin-right:-2rem;padding-left:.3rem}.link-icon{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.78 3.653a3.936 3.936 0 1 1 5.567 5.567l-3.627 3.627a3.936 3.936 0 0 1-5.88-.353.75.75 0 0 0-1.18.928 5.436 5.436 0 0 0 8.12.486l3.628-3.628a5.436 5.436 0 1 0-7.688-7.688l-3 3a.75.75 0 0 0 1.06 1.061l3-3Z'%3E%3C/path%3E%3Cpath d='M7.28 11.153a3.936 3.936 0 0 1 5.88.353.75.75 0 0 0 1.18-.928 5.436 5.436 0 0 0-8.12-.486L2.592 13.72a5.436 5.436 0 1 0 7.688 7.688l3-3a.75.75 0 1 0-1.06-1.06l-3 3a3.936 3.936 0 0 1-5.567-5.568l3.627-3.627Z'%3E%3C/path%3E%3C/svg%3E");align-self:center;cursor:pointer;background:var(--text-color);width:1rem;height:1rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1 .header-anchor:hover,h2 .header-anchor:hover,h3 .header-anchor:hover,h4 .header-anchor:hover,h5 .header-anchor:hover,h6 .header-anchor:hover{background-color:rgba(0,0,0,0)}header{width:100%;font-family:"Inter Subset",var(--sans-serif-font)}.page-header{margin:4rem 0px 1rem 0px;font-size:3em;line-height:100%;font-family:var(--header-font)}.navbar{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin:0 auto;padding:1em 0;max-width:var(--max-layout-width)}.nav-navs{display:flex;flex-wrap:wrap}.nav-navs ul{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:1px;margin:0;padding:0;list-style:none}.nav-links{justify-content:right;padding:.66rem;color:var(--text-color);font-weight:340;font-size:1em;line-height:2.5;text-decoration:none}.home-title{margin-left:-.12rem;border:none;padding:.12rem;color:var(--primary-color);font-weight:450;font-size:1.7em;text-decoration:none}.meta{padding:0;padding-top:.7vmin;padding-bottom:3vmin;color:var(--meta-color);font-weight:300;font-size:.8rem;line-height:1.4rem;letter-spacing:-.4px}.meta a{color:var(--meta-color);font-weight:inherit;text-decoration:none;text-decoration-color:none}.meta ul,.meta li{display:inline;font-family:var(--sans-serif-font);list-style-type:none}.language-switcher{display:flex;justify-content:center;align-items:center;margin-right:.5rem;margin-left:.5rem}.language-switcher .language-switcher-icon{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='1.8' d='M1 12a11 11 90 0 0 22 0 11 11 90 0 0-22 0m1-4h20M2 16h20M11 1a21 21 90 0 0 0 22m2-22a21 21 90 0 1 0 22'/%3E%3C/svg%3E%0A");position:relative;align-self:center;cursor:pointer;background:var(--text-color);width:1rem;height:1rem}.language-switcher .language-switcher-icon:hover{background:var(--meta-color)}.dropdown{display:inline-block;position:relative;z-index:1;font-size:.8rem}.dropdown:hover .dropdown-content,.dropdown:focus-within .dropdown-content{display:block}.dropdown summary{list-style:none}.dropdown summary::-webkit-details-marker{display:none}.dropdown .dropdown-content{display:none;position:absolute;left:50%;transform:translateX(-50%);z-index:1;background:var(--background-color);padding-right:.5rem;padding-left:.5rem;text-align:center;white-space:nowrap}.dropdown .dropdown-content a{display:block}@media only screen and (max-width: 1000px){.navbar{max-width:var(--normal-layout-width)}.nav-navs{display:flex;justify-content:flex-end}}@media only screen and (max-width: 600px){.nav-navs{flex-wrap:wrap;justify-content:center;margin-top:.8rem;width:100%}.navbar{flex-direction:column;justify-content:center;align-items:center}}@media only screen and (max-width: 300px){.navbar{max-width:var(--small-layout-width)}}#banner-container-home{display:flex;justify-content:center;align-items:center;margin:.2rem auto;width:100%}@media only screen and (max-width: 600px){#banner-container-home{display:block;margin-bottom:2rem}}#banner-container-home #home-banner-text{margin-bottom:1.5rem;color:var(--primary-color);font-size:1.875rem;line-height:3rem}#banner-container-home #home-banner-text #home-banner-header{margin:0;margin-bottom:1rem;font-weight:550;font-size:2.8rem}@media only screen and (max-width: 600px){#banner-container-home #home-banner-text #home-banner-header{margin-bottom:0;font-size:2.2rem}}#banner-container-home #home-banner-text #banner-home-subtitle{color:var(--text-color);font-weight:250;line-height:1.75rem}#banner-container-home #home-banner-text #banner-home-subtitle p{font-size:1rem}#banner-container-home #home-banner-text #banner-home-subtitle a{font-weight:400}@media only screen and (max-width: 600px){#banner-container-home #home-banner-text{width:100%}}#banner-container-home #image-container-home{position:relative;padding-left:2rem;min-width:11rem;min-height:11rem;overflow:hidden;text-align:center}#banner-container-home #image-container-home #banner-home-img{border:none;aspect-ratio:1/1;width:100%;max-width:15rem;height:auto;max-height:15rem}@media only screen and (max-width: 600px){#banner-container-home #image-container-home #banner-home-img{max-width:12rem;max-height:12rem}}@media only screen and (max-width: 600px){#banner-container-home #image-container-home{padding-left:0}}.image-hover-container{position:relative;width:100%}.image-hover-container .image-default{display:inline}.image-hover-container .image-hovered{display:none}.image-hover-container:hover .image-default{display:none}.image-hover-container:hover .image-hovered{display:inline}.image-label{cursor:pointer}.image-toggled{position:absolute;top:0;left:0;visibility:hidden}.image-toggler-toggle{display:none}.image-toggler-toggle:checked~.image-label .image-toggled{position:static;visibility:visible}.image-toggler-toggle:checked~.image-label .image-default{position:absolute;visibility:hidden}figure{display:inline-block;box-sizing:border-box;margin:0;max-width:100%;height:auto}figcaption{color:var(--meta-color);font-size:.72rem;font-family:var(--serif-font);text-align:center}img{display:block;margin:0 auto;max-width:100%;height:auto}img.inline{display:inline;vertical-align:middle}figure h4{margin:0;margin-bottom:1em;font-size:1rem}figure h4::before{content:"↳ "}.img-dark{display:none}.img-dark.inline{display:none}.img-light.inline{display:inline}[data-theme=dark] .img-dark{display:block}[data-theme=dark] .img-dark.inline{display:inline}[data-theme=dark] .img-light{display:none}.draft-label{margin-right:.3rem;background-color:var(--primary-color);padding:2px 4px;color:var(--hover-color)}.article-title{display:block;margin:0;color:var(--text-color-high-contrast);font-weight:550;font-size:2rem;line-height:3rem}iframe{display:block;margin-right:15%;margin-bottom:3vmin;margin-left:15%;border:none;aspect-ratio:16/9;width:100vmin;max-width:70%}ul{margin-top:0}.toc-container{margin-bottom:4vmin}.padding-top{padding-top:4vmin}.title-container{padding-bottom:8px}.bottom-divider{border-bottom:var(--divider-color) solid .5px}::-moz-selection{background:var(--primary-color);color:var(--hover-color);text-shadow:none}::selection{background:var(--primary-color);color:var(--hover-color)}.nav.tags{display:inline-block}blockquote{margin:0;border-left:.3rem solid var(--primary-color);padding-left:1em}a{position:relative;color:var(--primary-color);font-weight:inherit;text-decoration:inherit}a:hover{background-color:var(--primary-color);color:var(--hover-color)}a:not(.no-hover-padding):hover::after{display:inline-block;position:absolute;top:0;right:-.15em;bottom:0;left:-.15em;z-index:-1;background-color:var(--primary-color);max-width:105%;content:""}@media screen and (max-width: 600px){.list>ul{margin:0;padding:0}}hr{margin:3.5rem 0 1rem;border:none;background-color:var(--divider-color);height:1px}.footnote-reference{font-size:.7rem;font-family:var(--serif-font)}.footnote-definition{margin-bottom:.6rem}.footnote-definition sup{margin-right:.15rem;font-size:.75rem;font-family:var(--serif-font)}.footnote-definition p{display:inline}.footnote-backlink{margin-left:.2rem;font-size:.8rem}.footnotes-list a[href^="#fr-"]{font-size:.8rem}.references p{margin-left:2.4rem;text-indent:-2.4rem}.info-box{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--primary-color);border-left-width:.3rem;border-radius:10px;padding:1rem;text-align:center}#page-content{margin-top:4vmin}.hidden{display:none;visibility:hidden}.visually-hidden{clip:rect(0 0 0 0);position:absolute;margin:-1px;border:0;padding:0;width:1px;height:1px;overflow:hidden;white-space:nowrap}details summary{cursor:pointer}.interactive-icon{cursor:pointer}.interactive-icon path{fill:var(--text-color)}.interactive-icon :hover path{fill:var(--meta-color)}.article-navigation{display:flex;margin-top:2rem;border-top:var(--divider-color) solid .5px;padding-top:2rem}.article-navigation div:first-child{flex:1;text-align:left}.article-navigation div:last-child{flex:1;text-align:right}.article-navigation div p{color:var(--meta-color);font-weight:300;line-height:1.2rem;font-family:var(--sans-serif-font);letter-spacing:-.4px}@media (max-width: 600px){.article-navigation{flex-direction:column}.article-navigation div{text-align:center !important}}:dir(rtl) .article-navigation div:first-child{text-align:right}:dir(rtl) .article-navigation div:last-child{text-align:left}:dir(rtl) .arrow{display:inline-block;transform:rotate(180deg)}:dir(rtl) .arrow-corner{display:inline-block;transform:rotate(270deg)}.quote-container{border:none}.quote-toggle{display:none}.quote-label{display:none;cursor:pointer;border-radius:5px;color:var(--meta-color);font-size:.75rem;font-family:var(--sans-serif-font);text-align:center;text-decoration:none}.quote-toggle:not(:checked)~.quote .translated .quote-label-original,.quote-toggle:checked~.quote .original .quote-label-translate{display:inline}.original{display:none}.quote-toggle:checked~.quote .original{display:block}.quote-toggle:checked~.quote .translated{display:none}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:2rem;padding:0;font-size:1em;list-style:none}.pagination .page-item .disabled{opacity:.5;pointer-events:none}.pagination .page-numbers{color:var(--meta-color);font-size:.9rem}.bloglist-container{display:grid;grid-template-columns:1fr}.bloglist-row{display:flex;align-items:flex-start;background-color:var(--navbar-color);padding:2.5rem 0}.bloglist-row .bloglist-meta{margin-right:.7rem;padding:0;width:13.5rem;color:var(--meta-color);font-weight:300;font-size:.9rem}.bloglist-row .bloglist-meta li{list-style-type:none}.bloglist-row .bloglist-meta li.draft-label{width:fit-content;line-height:1.2rem}.bloglist-row .bloglist-tags{margin-top:.1rem}.bloglist-row .bloglist-tags .tag{display:inline-block;margin-right:.7rem;font-weight:400;font-size:.75rem;text-transform:uppercase}.bloglist-row .bloglist-content{flex:1}.bloglist-row .bloglist-content .bloglist-title{margin:0;font-weight:bold;font-size:1.2em}.bloglist-row .bloglist-content .bloglist-title a{color:var(--text-color-high-contrast);font-weight:550}.bloglist-row .bloglist-content .bloglist-title a:hover{color:var(--hover-color)}.bloglist-row .bloglist-content .description p{margin:.5rem 0 1rem;color:var(--text-color);font-weight:250;font-size:.9rem;line-height:1.5rem}.all-posts{font-weight:350;font-size:1.3rem}#all-projects{margin-top:2rem}.posts-first #featured-projects{margin-top:4rem}.projects-first #posts-list{margin-top:4rem}@media only screen and (max-width: 1100px){.bloglist-row{flex-direction:column;align-items:flex-start;padding:2rem 0}.bloglist-row .bloglist-meta{margin-bottom:0;width:100%}.bloglist-row .bloglist-meta li{display:inline;margin-right:.3rem}.bloglist-row .bloglist-content{width:100%}}#button-container{display:flex;position:fixed;right:2rem;bottom:2rem;flex-direction:column;gap:.6rem;z-index:2}#button-container #toc-button,#button-container #comments-button,#button-container #top-button{display:flex;justify-content:center;align-items:center;z-index:2;cursor:pointer;border:none;border-radius:50%;background-color:var(--bg-1);padding:.4rem;width:1rem;height:1rem;text-align:center}#button-container #toc-button:hover,#button-container #comments-button:hover,#button-container #top-button:hover{background-color:var(--bg-3)}#button-container #toc-button:hover svg,#button-container #comments-button:hover svg,#button-container #top-button:hover svg{fill:var(--primary-color)}#button-container #toc-button:hover::before,#button-container #comments-button:hover::before,#button-container #top-button:hover::before{background-color:rgba(0,0,0,0)}#button-container #toc-button svg,#button-container #comments-button svg,#button-container #top-button svg{fill:var(--text-color);width:1rem;height:1rem}#button-container #toc-floating-container #toc-button{position:relative;z-index:2}#button-container #toc-floating-container .toc-container{margin:0;margin-top:.7rem;max-width:80vw}#button-container #toc-floating-container .toc-content{display:none;position:absolute;right:0;bottom:100%;z-index:2;margin-bottom:.7rem;box-shadow:rgba(0,0,0,.15) 1.95px 1.95px 2.6px;border:1px solid var(--divider-color);border-radius:5px;background-color:var(--background-color);padding-right:1rem;max-height:70vh;overflow-y:auto;font-size:.8rem;text-align:left;white-space:nowrap}#button-container #toc-floating-container .toc-content ul{padding-left:1rem;list-style:none}#button-container #toc-floating-container .toggle{display:none}#button-container #toc-floating-container .toggle:checked+.overlay,#button-container #toc-floating-container .toggle:checked+.overlay+#toc-button+.toc-content{display:block}#button-container #toc-floating-container .toggle:checked+.overlay+#toc-button svg{fill:var(--primary-color)}#button-container #toc-floating-container .overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;opacity:40%;z-index:1;background:var(--background-color)}@media (max-width: 700px){#button-container{display:none !important}}@media print{#button-container{display:none}}#searchModal{background:color-mix(in srgb, var(--primary-color) 5%, rgba(0,0,0,0));text-align:left}#searchModal #searchContainer{padding:1rem}#searchModal #searchBar{display:flex;position:relative;justify-content:center;align-items:center;box-sizing:border-box;padding:1rem}#searchModal #searchBar .search-icon{position:absolute;left:1rem;width:1.3rem;height:1.3rem}#searchModal #searchBar .search-icon path{fill:var(--text-color)}#searchModal #searchBar .close-icon{position:absolute;right:1.3rem;margin-right:.5rem;margin-left:1rem;width:1.3rem;height:1.3rem}#searchModal #searchBar #searchInput{flex:1;border:1px solid var(--divider-color);border-radius:20px;background-color:var(--input-background-color);padding:.75rem 1rem .75rem 3rem;width:calc(100% - 2rem);color:var(--text-color);font-size:1rem}#searchModal #results-container{display:none;border-top:var(--divider-color) solid .5px;border-bottom-right-radius:1rem;border-bottom-left-radius:1rem;overflow:hidden}#searchModal #results-container #results-info{padding:.5rem;color:var(--meta-color);font-size:.8rem;text-align:center}#searchModal #results-container #results{display:flex;flex-direction:column;max-height:50vh;overflow-y:auto}#searchModal #results-container #results b{font-weight:590}#searchModal #results-container #results a{display:block}#searchModal #results-container #results a:hover{background-color:inherit}#searchModal #results-container #results>div{cursor:pointer;padding:.5rem 1rem}#searchModal #results-container #results>div[aria-selected=true]{background-color:var(--primary-color);color:var(--hover-color)}#searchModal #results-container #results>div[aria-selected=true] a,#searchModal #results-container #results>div[aria-selected=true] span{color:inherit}#searchModal #results-container #results span:first-child{display:block;color:var(--primary-color);font-weight:590}#searchModal #results-container #results span:nth-child(2){color:var(--text-color)}.search-icon{display:block;position:relative;align-self:center;margin-right:.5rem;margin-left:1rem;width:1.3rem;height:1.3rem}.search-modal{-webkit-backdrop-filter:blur(8px);display:none;position:fixed;top:0;left:0;z-index:1000;backdrop-filter:blur(8px);background-color:rgba(0,0,0,.1);width:100%;height:100%;overflow:auto}.search-modal #modal-content{position:relative;margin:8% auto;border:var(--divider-color) solid .5px;border-radius:1rem;background-color:var(--background-color);width:80%;max-width:28rem}@media only screen and (max-width: 600px){.search-modal #modal-content{top:3.5rem;width:92%}.search-modal #modal-content #results{max-height:70vh}}.spoiler-toggle{display:none}.spoiler-content{display:inline-block;cursor:help}.spoiler-content .spoiler-hidden{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;filter:blur(6px);user-select:none}.spoiler-content .spoiler-hidden a{pointer-events:none}.spoiler-toggle:checked+.spoiler-content .spoiler-hidden{filter:none;user-select:auto}.spoiler-toggle:checked+.spoiler-content .spoiler-hidden a{pointer-events:auto}.spoiler-container.fixed-blur .spoiler-content:before{display:inline-block;filter:blur(6px);content:"SPOILER"}.spoiler-container.fixed-blur .spoiler-content .spoiler-hidden{display:none}.spoiler-container.fixed-blur .spoiler-toggle:checked+.spoiler-content:before{content:none}.spoiler-container.fixed-blur .spoiler-toggle:checked+.spoiler-content .spoiler-hidden{display:inline}:root{--rosewater: #f2d5cf;--flamingo: #eebebe;--pink: #f4b8e4;--mauve: #ca9ee6;--red: #e78284;--maroon: #ea999c;--peach: #ef9f76;--yellow: #e5c890;--green: #a6d189;--teal: #81c8be;--sky: #99d1db;--blue: #8caaee;--lavender: #b4befe;--text: #cdd6f4;--overlay0: #737994}.z-code{background-color:var(--codeblock-bg);color:var(--text)}.z-comment{color:var(--overlay0);font-style:italic}.z-string{color:var(--green)}.z-string.z-regexp{color:var(--sky)}.z-constant.z-numeric,.z-string.z-regexp{color:var(--sky)}.z-constant.z-character.z-escape{color:var(--sky)}.z-constant.z-language{color:var(--lavender)}.z-support.z-function.z-builtin.z-variable.z-other.z-constant{color:var(--sky)}.z-keyword{color:var(--red)}.z-keyword.z-control.z-loop,.z-keyword.z-control.z-conditional,.z-keyword.z-control.z-c++{color:var(--mauve)}.z-keyword.z-control.z-return,.z-keyword.z-control.z-flow.z-return{color:var(--pink)}.z-support.z-type.z-exception{color:var(--sky)}.z-keyword.z-operator{color:var(--teal)}.z-punctuation.z-accessor{color:var(--teal)}.z-punctuation.z-section{color:var(--text)}.z-keyword.z-control.z-import.z-include{color:var(--peach)}.z-storage{color:var(--red)}.z-storage.z-type{color:var(--yellow)}.z-storage.z-modifier{color:var(--red)}.z-entity.z-name.z-namespace,.z-meta.z-path,.z-storage.z-type.z-class{color:var(--rosewater)}.z-entity.z-name.z-label{color:var(--blue)}.z-keyword.z-declaration.z-class{color:var(--red)}.z-entity.z-name.z-class,.z-meta.z-toc-list.z-full-identifier{color:var(--teal)}.z-entity.z-other.z-inherited-class{color:var(--teal)}.z-entity.z-name.z-function{color:var(--blue);font-style:italic}.z-variable.z-function{color:var(--blue);font-style:italic}.z-entity.z-name.z-function.z-preprocessor,.z-keyword.z-control.z-import{color:var(--red)}.z-entity.z-name.z-function.z-constructor,.z-entity.z-name.z-function.z-destructor{color:var(--lavender)}.z-variable.z-parameter.z-function{color:var(--rosewater)}.z-keyword.z-declaration.z-function{color:var(--maroon)}.z-support.z-function{color:var(--teal)}.z-support.z-constant{color:var(--blue)}.z-support.z-type,.z-support.z-class{color:var(--blue);font-style:italic}.z-variable.z-function{color:var(--blue)}.z-variable.z-parameter{color:var(--rosewater)}.z-variable.z-other{color:var(--text)}.z-variable.z-other.z-member{color:var(--rosewater)}.z-variable.z-language{color:var(--peach)}.z-entity.z-name.z-tag{color:var(--sky)}.z-entity.z-other.z-attribute-name{color:var(--mauve);font-style:italic}.z-punctuation.z-definition.z-tag{color:var(--maroon)}.z-markup.z-underline.z-link.z-markdown{color:var(--rosewater);font-style:underline;font-style:italic}.z-comment.z-block.z-markdown,.z-meta.z-code-fence{color:var(--peach);font-style:italic}.z-markup.z-raw.z-code-fence,.z-markup.z-raw.z-inline{color:var(--peach);font-style:italic}.z-punctuation.z-definition.z-heading,.z-entity.z-name.z-section{color:var(--blue)}.z-markup.z-italic{color:var(--maroon);font-style:italic}.z-markup.z-bold{color:var(--maroon);font-weight:bold}.z-constant.z-character.z-escape,.z-source.z-shell.z-bash .z-meta.z-function.z-shell .z-meta.z-compound.z-shell .z-meta.z-function-call.z-identifier.z-shell{color:var(--pink)}.z-variable.z-language.z-shell{color:var(--red)}.z-source.z-lua .z-meta.z-function.z-lua .z-meta.z-block.z-lua .z-meta.z-mapping.z-value.z-lua .z-meta.z-mapping.z-key.z-lua .z-string.z-unquoted.z-key.z-lua{color:var(--lavender)}.z-source.z-lua .z-meta.z-function.z-lua .z-meta.z-block.z-lua .z-meta.z-mapping.z-key.z-lua .z-string.z-unquoted.z-key.z-lua{color:var(--flamingo)}.z-entity.z-name.z-constant.z-java{color:var(--peach)}.z-support.z-type.z-property-name.z-css{color:var(--flamingo)}.z-support.z-constant.z-property-value.z-css{color:var(--text)}.z-constant.z-numeric.z-suffix.z-css,.z-keyword.z-other.z-unit.z-css,.z-variable.z-other.z-custom-property.z-name.z-css,.z-support.z-type.z-custom-property.z-name.z-css,.z-punctuation.z-definition.z-custom-property.z-css{color:var(--peach)}.z-entity.z-name.z-tag.z-css{color:var(--lavender)}.z-variable.z-other.z-sass{color:var(--peach)}.z-invalid{background-color:var(--red);color:var(--text)}.z-invalid.z-deprecated{background-color:var(--mauve);color:var(--text)}.z-meta.z-diff{color:--OVERLAY0}.z-meta.z-diff.z-header{color:--OVERLAY0}.z-markup.z-deleted{color:var(--red)}.z-markup.z-inserted{color:var(--green)}.z-markup.z-changed{color:var(--yellow)}.z-message.z-error{color:var(--red)}table{margin:1rem auto;border-style:hidden !important;border-radius:5px;border-collapse:collapse;border-spacing:0;overflow:hidden;font:inherit;text-align:center}table th,table td{border:1px solid var(--bg-1);padding:6px 13px;font-size:large}table thead tr{background-color:var(--primary-color);color:var(--hover-color)}table thead tr code{background-color:rgba(0,0,0,0)}table tbody tr:nth-child(even){background-color:var(--bg-0)}table details,table summary{font-family:inherit !important}#tag-cloud{margin-top:4vmin}#tag-cloud ul{margin:0;padding:0;list-style:none}#tag-cloud .tags-item{margin-bottom:1rem}.two-columns ul{-webkit-column-count:2;-moz-column-count:2;column-count:2}.three-columns ul{-webkit-column-count:3;-moz-column-count:3;column-count:3}@media (max-width: 1000px){.three-columns ul{-webkit-column-count:2;-moz-column-count:2;column-count:2}}@media (max-width: 600px){.two-columns ul,.three-columns ul{-webkit-column-count:1;-moz-column-count:1;column-count:1}}.theme-switcher{-webkit-mask:var(--theme-switcher-svg);position:relative;align-self:center;cursor:pointer;margin-left:.5rem;background:var(--text-color);width:1rem;height:1rem}.theme-switcher:hover{background:var(--meta-color)}.theme-switcher-wrapper{position:relative}.theme-resetter{-webkit-mask:url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" %3E%3Cpath d="M295.87-193.869v-78.001h291.152q43.63 0 72.369-33.424 28.739-33.423 28.739-79.271t-28.739-79.391Q630.652-497.5 587.022-497.5H343.913l87.478 87.478-55.652 55.153L193.869-536.5l181.87-181.631 55.652 55.653-87.478 86.978h243.109q75.435 0 127.272 56.522 51.837 56.521 51.837 134.174 0 77.652-51.837 134.293-51.837 56.642-127.272 56.642H295.87Z"/%3E%3C/svg%3E');position:absolute;top:-.6rem;right:-.6rem;visibility:hidden;opacity:0;transition:opacity .3s ease,visibility .3s ease;transition-delay:.5s;cursor:pointer;background:var(--text-color);width:.8rem;height:.8rem}.theme-switcher-wrapper:hover .theme-resetter.has-custom-theme{visibility:visible;opacity:1;transition:opacity .1s ease,visibility .1s ease;transition-delay:0s}.theme-switcher-wrapper:hover .theme-resetter.has-custom-theme:hover{background:var(--meta-color)}body>div:last-child>div:last-child[style]:not([class]):not([id]){position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);z-index:9999;box-shadow:rgba(50,50,93,.25) 0px 50px 100px -20px,rgba(0,0,0,.3) 0px 30px 60px -30px;border:2px solid var(--admonition-danger-border);border-radius:5px;background-color:var(--admonition-danger-bg);padding:15px;width:fit-content;max-width:80%}body>div:last-child>div:last-child[style]:not([class]):not([id])>p[style]:first-child{margin:0;color:var(--admonition-danger-border);font-weight:bold}body>div:last-child>div:last-child[style]:not([class]):not([id])>pre[style]:last-child{margin-bottom:0;background-color:var(--admonition-danger-code);padding:10px;overflow-x:auto}@font-face{src:local("Inter"),url("fonts/Inter4.woff2") format("woff2");font-family:"Inter";font-display:swap}@font-face{src:local("Source Serif"),url("fonts/SourceSerif4Variable-Roman.ttf.woff2") format("woff2");font-family:"Source Serif";font-display:swap}@font-face{src:local("Cascadia Code"),url("fonts/CascadiaCode-SemiLight.woff2") format("woff2");font-family:"Cascadia Code";font-display:swap}:root{--background-color: white;--bg-0: #f0f0f0;--bg-1: #e7e7e7;--bg-2: #fefefe;--bg-3: #d8dcdd;--hover-color: white;--primary-color: #087E96;--divider-color: #d7d7d7;--text-color: #222226;--text-color-high-contrast: #313333;--meta-color: #5b5b65;--codeblock-bg: #26232e;--codeblock-highlight: #383444;--theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z'/%3E%3C/svg%3E%0A");color-scheme:light;--max-layout-width: 1000px;--normal-layout-width: 600px;--medium-layout-width: 400px;--small-layout-width: 200px;--paragraph-spacing: max(2.3vmin, 24px);--sans-serif-font: "Inter", Helvetica, Arial, sans-serif;--serif-font: "Source Serif", "Georgia", serif;--code-font: "Cascadia Code";line-height:190%;font-family:var(--sans-serif-font)}[data-theme=dark]{--background-color: #1f1f1f;--bg-0: #2f2f2f;--bg-1: #3c3c3c;--bg-2: #171717;--bg-3: #535555;--hover-color: black;--primary-color: #91e0ee;--divider-color: #4a4a4a;--text-color: #D4D4D4;--text-color-high-contrast: #eceeef;--meta-color: #B0B0B0;--codeblock-bg: #19181e;--codeblock-highlight: #282834;--theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960' %3E%3Cpath d='M480 776q-83 0-141.5-58.5T280 576q0-83 58.5-141.5T480 376q83 0 141.5 58.5T680 576q0 83-58.5 141.5T480 776ZM80 616q-17 0-28.5-11.5T40 576q0-17 11.5-28.5T80 536h80q17 0 28.5 11.5T200 576q0 17-11.5 28.5T160 616H80Zm720 0q-17 0-28.5-11.5T760 576q0-17 11.5-28.5T800 536h80q17 0 28.5 11.5T920 576q0 17-11.5 28.5T880 616h-80ZM480 296q-17 0-28.5-11.5T440 256v-80q0-17 11.5-28.5T480 136q17 0 28.5 11.5T520 176v80q0 17-11.5 28.5T480 296Zm0 720q-17 0-28.5-11.5T440 976v-80q0-17 11.5-28.5T480 856q17 0 28.5 11.5T520 896v80q0 17-11.5 28.5T480 1016ZM226 378l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226 378Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734 774l43 42q12 11 11.5 28T777 873q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678 322l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183 873q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282 830l-42 43q-11 12-28 11.5T183 873Z'/%3E%3C/svg%3E");color-scheme:dark}[data-theme=dark] .invertible-image{filter:invert(0.88)}[data-theme=dark] .dimmable-image{filter:brightness(.8) contrast(1.2)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]){--background-color: #1f1f1f;--bg-0: #2f2f2f;--bg-1: #3c3c3c;--bg-2: #171717;--bg-3: #535555;--hover-color: black;--primary-color: #91e0ee;--divider-color: #4a4a4a;--text-color: #D4D4D4;--text-color-high-contrast: #eceeef;--meta-color: #B0B0B0;--codeblock-bg: #19181e;--codeblock-highlight: #282834;--theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960' %3E%3Cpath d='M480 776q-83 0-141.5-58.5T280 576q0-83 58.5-141.5T480 376q83 0 141.5 58.5T680 576q0 83-58.5 141.5T480 776ZM80 616q-17 0-28.5-11.5T40 576q0-17 11.5-28.5T80 536h80q17 0 28.5 11.5T200 576q0 17-11.5 28.5T160 616H80Zm720 0q-17 0-28.5-11.5T760 576q0-17 11.5-28.5T800 536h80q17 0 28.5 11.5T920 576q0 17-11.5 28.5T880 616h-80ZM480 296q-17 0-28.5-11.5T440 256v-80q0-17 11.5-28.5T480 136q17 0 28.5 11.5T520 176v80q0 17-11.5 28.5T480 296Zm0 720q-17 0-28.5-11.5T440 976v-80q0-17 11.5-28.5T480 856q17 0 28.5 11.5T520 896v80q0 17-11.5 28.5T480 1016ZM226 378l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226 378Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734 774l43 42q12 11 11.5 28T777 873q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678 322l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183 873q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282 830l-42 43q-11 12-28 11.5T183 873Z'/%3E%3C/svg%3E");color-scheme:dark}:root:not([data-theme=light]) .invertible-image{filter:invert(0.88)}:root:not([data-theme=light]) .dimmable-image{filter:brightness(.8) contrast(1.2)}}html{background-color:var(--background-color);color:var(--text-color);line-height:1.6em;text-rendering:optimizeLegibility}body{display:flex;flex-direction:column;margin:0 5vmin;padding:0;min-height:100vh}.content{word-wrap:break-word;margin:0 auto;margin-top:6vmin;margin-bottom:4rem;width:100%;max-width:var(--max-layout-width)}.use-sans-serif{--serif-font: var(--sans-serif-font)}article{margin:0 auto;max-width:calc(var(--max-layout-width) - 12rem)}article p,article li,article details,article summary{font-family:var(--serif-font)}article strong{font-weight:620}article .full-width{margin-right:-6rem;margin-left:-6rem;max-width:calc(100% + 12rem)}article li p:not(:last-child){margin-bottom:0}article li p+:last-child{margin-bottom:var(--paragraph-spacing)}.section-title{display:block;margin:0;margin-top:-.15em;color:var(--text-color-high-contrast);font-weight:550;font-size:2.2em;line-height:1.2em}.last-updated{margin-top:-5vmin}h1,h2,h3,h4,h5,h6{position:relative}h1{display:block;margin-top:.67em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.62em}h2{display:block;margin-top:.5em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.4em}h3{display:block;margin-top:.3em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.2em}h4{display:block;margin-top:.83em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1em}h5{display:block;margin-top:.83em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:normal;font-size:1em}p{margin-top:.4rem;margin-bottom:var(--paragraph-spacing);font-size:1em;line-height:2rem}strong{font-weight:580}.centered-text{text-align:center}video{max-width:100%}.center-content{display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0;width:100%;height:100vh;text-align:center}.subheader{margin-bottom:2rem}.mobile-only{display:none}@media only screen and (max-width: 1000px){.content{max-width:var(--normal-layout-width)}body{margin:0 32px}article .full-width{display:block;margin-right:0;margin-left:0;max-width:none;overflow-x:auto}.mobile-only{display:block}}@media only screen and (max-width: 600px){.content{margin-top:0rem;max-width:var(--medium-layout-width)}article{margin-top:1.3rem}body{margin:0 16px}}@media only screen and (max-width: 300px){.content{max-width:var(--small-layout-width)}}@media all and (min-width: 600px){html{font-size:16.5px}}@media all and (min-width: 960px){html{font-size:20px}}:root{--primary-color: #1c71d8;--primary-color-dark: #1a5fb4}[data-theme=dark]{--primary-color: #99c1f1;--primary-color-dark: #62a0ea}.cards{display:flex;flex-wrap:wrap;justify-content:center}.card{flex-grow:1;flex-shrink:1;padding-top:24px}.card-image{max-width:160px}.gallery{display:grid;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-auto-rows:auto;grid-auto-flow:dense;gap:18px;margin-top:4vmin;padding:12px 0}.gallery img{border-radius:1rem;box-shadow:rgba(50,50,93,.25) 0px 2px 5px -1px,rgba(0,0,0,.3) 0px 1px 3px -1px;transition:transform 200ms ease}.gallery img:hover{transform:scale(1.05)} \ No newline at end of file diff --git a/no_js.css b/no_js.css new file mode 100644 index 0000000..0294a30 --- /dev/null +++ b/no_js.css @@ -0,0 +1 @@ +.js{display:none} diff --git a/processed_images/binary-sunset.ee9f0854924e5f2b.png b/processed_images/binary-sunset.ee9f0854924e5f2b.png new file mode 100644 index 0000000..bbd90eb Binary files /dev/null and b/processed_images/binary-sunset.ee9f0854924e5f2b.png differ diff --git a/processed_images/blue-goo.db12fd9720c8d295.png b/processed_images/blue-goo.db12fd9720c8d295.png new file mode 100644 index 0000000..8d49b98 Binary files /dev/null and b/processed_images/blue-goo.db12fd9720c8d295.png differ diff --git a/processed_images/bluewatch.d158858597b4feb3.png b/processed_images/bluewatch.d158858597b4feb3.png new file mode 100644 index 0000000..318f140 Binary files /dev/null and b/processed_images/bluewatch.d158858597b4feb3.png differ diff --git a/processed_images/desert.6064067008459e24.png b/processed_images/desert.6064067008459e24.png new file mode 100644 index 0000000..cb0cb64 Binary files /dev/null and b/processed_images/desert.6064067008459e24.png differ diff --git a/processed_images/humanity.f7a7baf68ec99dbf.png b/processed_images/humanity.f7a7baf68ec99dbf.png new file mode 100644 index 0000000..3a3569f Binary files /dev/null and b/processed_images/humanity.f7a7baf68ec99dbf.png differ diff --git a/processed_images/material-goo.2089c85582865da6.png b/processed_images/material-goo.2089c85582865da6.png new file mode 100644 index 0000000..b0e87f6 Binary files /dev/null and b/processed_images/material-goo.2089c85582865da6.png differ diff --git a/processed_images/material.ba988ceb3325b380.png b/processed_images/material.ba988ceb3325b380.png new file mode 100644 index 0000000..43c5ebb Binary files /dev/null and b/processed_images/material.ba988ceb3325b380.png differ diff --git a/processed_images/mesh.b6d24747b4ee2fe2.png b/processed_images/mesh.b6d24747b4ee2fe2.png new file mode 100644 index 0000000..7e57ea3 Binary files /dev/null and b/processed_images/mesh.b6d24747b4ee2fe2.png differ diff --git a/processed_images/morning-lake.a48aeeccdd0af01f.png b/processed_images/morning-lake.a48aeeccdd0af01f.png new file mode 100644 index 0000000..969c7b1 Binary files /dev/null and b/processed_images/morning-lake.a48aeeccdd0af01f.png differ diff --git a/processed_images/mountain.12ef6fa75a245b20.png b/processed_images/mountain.12ef6fa75a245b20.png new file mode 100644 index 0000000..e032a41 Binary files /dev/null and b/processed_images/mountain.12ef6fa75a245b20.png differ diff --git a/processed_images/neomorph.75793634d47c7e55.png b/processed_images/neomorph.75793634d47c7e55.png new file mode 100644 index 0000000..c56c075 Binary files /dev/null and b/processed_images/neomorph.75793634d47c7e55.png differ diff --git a/processed_images/neon-goo.5890a659d0f6ee36.png b/processed_images/neon-goo.5890a659d0f6ee36.png new file mode 100644 index 0000000..082d8df Binary files /dev/null and b/processed_images/neon-goo.5890a659d0f6ee36.png differ diff --git a/processed_images/neon-smoke.c7ae262cff8d37a3.png b/processed_images/neon-smoke.c7ae262cff8d37a3.png new file mode 100644 index 0000000..1a73c63 Binary files /dev/null and b/processed_images/neon-smoke.c7ae262cff8d37a3.png differ diff --git a/processed_images/night-clift.1af6243fc099f34a.png b/processed_images/night-clift.1af6243fc099f34a.png new file mode 100644 index 0000000..1ab1050 Binary files /dev/null and b/processed_images/night-clift.1af6243fc099f34a.png differ diff --git a/processed_images/night-forest.4c4b0da7a64cb234.png b/processed_images/night-forest.4c4b0da7a64cb234.png new file mode 100644 index 0000000..97fa466 Binary files /dev/null and b/processed_images/night-forest.4c4b0da7a64cb234.png differ diff --git a/processed_images/nightlight.0998cb88498d8a68.png b/processed_images/nightlight.0998cb88498d8a68.png new file mode 100644 index 0000000..3ac2e7c Binary files /dev/null and b/processed_images/nightlight.0998cb88498d8a68.png differ diff --git a/processed_images/planet.45c3147f9ad81776.png b/processed_images/planet.45c3147f9ad81776.png new file mode 100644 index 0000000..3ae921b Binary files /dev/null and b/processed_images/planet.45c3147f9ad81776.png differ diff --git a/processed_images/strange.9d882c52b998eb4b.png b/processed_images/strange.9d882c52b998eb4b.png new file mode 100644 index 0000000..85fd010 Binary files /dev/null and b/processed_images/strange.9d882c52b998eb4b.png differ diff --git a/processed_images/tchalla.58de2ebd3084b55f.png b/processed_images/tchalla.58de2ebd3084b55f.png new file mode 100644 index 0000000..8c2fa16 Binary files /dev/null and b/processed_images/tchalla.58de2ebd3084b55f.png differ diff --git a/projects/breathing/index.html b/projects/breathing/index.html new file mode 100644 index 0000000..3cdab13 --- /dev/null +++ b/projects/breathing/index.html @@ -0,0 +1 @@ +SeaDve • Breathing

Breathing

  • <1 min read
\ No newline at end of file diff --git a/projects/delineate/index.html b/projects/delineate/index.html new file mode 100644 index 0000000..70bb7ba --- /dev/null +++ b/projects/delineate/index.html @@ -0,0 +1 @@ +SeaDve • Delineate

Delineate

  • <1 min read
\ No newline at end of file diff --git a/projects/gsettings-macro/index.html b/projects/gsettings-macro/index.html new file mode 100644 index 0000000..76bedd2 --- /dev/null +++ b/projects/gsettings-macro/index.html @@ -0,0 +1 @@ +SeaDve • GSettings Macro

GSettings Macro

  • <1 min read
\ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 0000000..cb2ac90 --- /dev/null +++ b/projects/index.html @@ -0,0 +1 @@ +SeaDve • Projects
\ No newline at end of file diff --git a/projects/kooha/index.html b/projects/kooha/index.html new file mode 100644 index 0000000..4966687 --- /dev/null +++ b/projects/kooha/index.html @@ -0,0 +1 @@ +SeaDve • Kooha

Kooha

  • <1 min read
\ No newline at end of file diff --git a/projects/mousai/index.html b/projects/mousai/index.html new file mode 100644 index 0000000..913ae6b --- /dev/null +++ b/projects/mousai/index.html @@ -0,0 +1 @@ +SeaDve • Mousai

Mousai

  • <1 min read
\ No newline at end of file diff --git a/projects/mpris-server/index.html b/projects/mpris-server/index.html new file mode 100644 index 0000000..3e85223 --- /dev/null +++ b/projects/mpris-server/index.html @@ -0,0 +1 @@ +SeaDve • MPRIS Server

MPRIS Server

  • <1 min read
\ No newline at end of file diff --git a/projects/plotters-gtk4/index.html b/projects/plotters-gtk4/index.html new file mode 100644 index 0000000..11f11d8 --- /dev/null +++ b/projects/plotters-gtk4/index.html @@ -0,0 +1 @@ +SeaDve • Plotters GTK4

Plotters GTK4

  • <1 min read
\ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..0166951 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://seadve.github.io/sitemap.xml diff --git a/search_index.en.js b/search_index.en.js new file mode 100644 index 0000000..6fd3196 --- /dev/null +++ b/search_index.en.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"7":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}},"1":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2,".":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"1":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1,"8":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"8":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"0":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"2":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"6":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":3,".":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1},"1":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"2":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"3":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}},"0":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"2":{"docs":{},"df":0,"1":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2},"3":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":7}}},"3":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"3":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5,".":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"3":{"docs":{},"df":0,"8":{"docs":{},"df":0,".":{"docs":{},"df":0,"2":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"0":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1},"x":{"docs":{},"df":0,"3":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"2":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"3":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"d":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":8,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"5":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3,".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"6":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"0":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"6":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1},"7":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"8":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1,"4":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"2":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}},"7":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"4":{"docs":{},"df":0,"2":{"docs":{},"df":0,"8":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"1":{"docs":{},"df":0,"4":{"docs":{},"df":0,"1":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"8":{"docs":{},"df":0,"8":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}}}}},"9":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"6":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}}}},"9":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"v":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"d":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":3,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":6,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}},"j":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":6}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}},"m":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"y":{"docs":{},"df":0,"z":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":3}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":4},"p":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":7}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":3,"h":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/archive/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.23606797749979},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"i":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":6}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}}}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.449489742783178},"https://seadve.github.io/donate/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772}},"df":1}}}}},"h":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.6457513110645907}},"df":1}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.8284271247461903}},"df":1}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.0}},"df":2}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}},"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}},"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"z":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{},"df":0,"/":{"docs":{},"df":0,"v":{"docs":{},"df":0,"8":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}}},"g":{"docs":{"https://seadve.github.io/blog/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"g":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"x":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/projects/breathing/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":4.0}},"df":1,"'":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1},"u":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":3,"g":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":3.7416573867739413}},"df":7}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"y":{"docs":{"https://seadve.github.io/donate/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":3}}}},"c":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":5}},"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2}}}}},"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"g":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":5}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.6457513110645907}},"df":1},"i":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772}},"df":1}}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2}}},"r":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"p":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772}},"df":1}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":7,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":2}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/donate/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.1622776601683795},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":3}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0}},"df":1}},"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2},"x":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1,"c":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}}}}}}}},"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979}},"df":1,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":4}}}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":2}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":6}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"z":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}},"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}},"y":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":5}},"b":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}},"d":{"docs":{},"df":0,"r":{"docs":{},"df":0,"3":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":2}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/projects/delineate/":{"tf":1.0}},"df":1}},"v":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/designs/":{"tf":1.0}},"df":3}}},"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.3166247903554}},"df":3}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":3,"s":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}}}}},"v":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":2.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772},"https://seadve.github.io/donate/":{"tf":1.0}},"df":6}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":2.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":3.1622776601683795}},"df":6,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":1}}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.23606797749979},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":3}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":1}}},"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":4}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}},"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":4.47213595499958}},"df":1}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"'":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/donate/":{"tf":1.0}},"df":2}},"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":3}},"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"w":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":5,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"n":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}},"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}},"e":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":4}},"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}},"d":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772}},"df":1},"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}}}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"'":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}}},"j":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.1622776601683795}},"df":1}}}}}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.6457513110645907}},"df":1}}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":4}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":3,"t":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"x":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":3,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":3}}}},"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":2}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.23606797749979},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907}},"df":5},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":3,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":4}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.6457513110645907}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}},"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}},"x":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":6}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}},"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":6,"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":6}}}},"r":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"p":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/":{"tf":1.4142135623730951},"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"_":{"docs":{},"df":0,"b":{"docs":{},"df":0,"y":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":4}}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}}}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"b":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2},"d":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3,"s":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}}}}}},"k":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":1}}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"f":{"docs":{},"df":0,"x":{"docs":{},"df":0,".":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,".":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/donate/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":6}}}},"o":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2},"g":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"'":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.1622776601683795},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"w":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/projects/gsettings-macro/":{"tf":1.0}},"df":1}},"k":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}},"o":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":7}},"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.449489742783178},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907}},"df":8,"4":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979},"https://seadve.github.io/projects/plotters-gtk4/":{"tf":1.0}},"df":4},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2},"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":5}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}},"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"p":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"5":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"m":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}},"3":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":3.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":2.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":2.449489742783178},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":3.1622776601683795}},"df":6}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":3.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.8284271247461903}},"df":5}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":6}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"c":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"k":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":4},"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951}},"df":2}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"k":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}},"k":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/projects/kooha/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}},"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":1},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":3}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}},"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"f":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}}},"p":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}},"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":3}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"n":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":1}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0}},"df":1}}},"n":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.605551275463989},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":5}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"d":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":4}},"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2},"v":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":7}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":6}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}},"x":{"docs":{},"df":0,"q":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/projects/gsettings-macro/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":6}},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}},"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":5}},"n":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":3},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}},"x":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}}}}},"y":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"z":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}},"b":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.449489742783178}},"df":1}}}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":5}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}},"u":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.23606797749979},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":2.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":6}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.449489742783178},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907}},"df":4}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.23606797749979},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":6}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}}}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":1}}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":5}}}},"o":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.23606797749979},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.6457513110645907},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":9,"o":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"v":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/projects/mousai/":{"tf":1.0}},"df":2}}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/projects/mpris-server/":{"tf":1.0}},"df":1}}},"r":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":3},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}}},"v":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":4}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}},"w":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":6,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"x":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":5}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951}},"df":3,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":2,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"h":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"f":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.23606797749979}},"df":1}}},"w":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":3.605551275463989},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":2.449489742783178},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":3.0}},"df":5,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}}}},"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":4,"c":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":9,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":4},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":6,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772}},"df":1}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}},"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"*":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"g":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3},"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}}}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":1}},"h":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}},"c":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5}},"b":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":5}}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}}}},"i":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}},"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":7},"s":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/projects/plotters-gtk4/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":4}}}},"p":{"docs":{},"df":0,"!":{"docs":{},"df":0,"_":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907}},"df":6}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"t":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951}},"df":2,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979}},"df":1,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907},"https://seadve.github.io/projects/":{"tf":1.0}},"df":7}}}},"o":{"docs":{},"df":0,"f":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}},"o":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"y":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":2},"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":8,"i":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}},"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"z":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":3}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":3.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":6}}},"y":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}}},"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.23606797749979},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"v":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":3}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.23606797749979}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}},"s":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":7}}}}},"g":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":4,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":3},"u":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.23606797749979},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907}},"df":8}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":4}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}},"d":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"d":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,":":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{},"df":0,".":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.6457513110645907}},"df":1}}},"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}},"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/projects/mpris-server/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":3}}}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}}}},"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5,"u":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":6,"n":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":1}},"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.23606797749979}},"df":6},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"i":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1,"c":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"f":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":2}}}}}},"x":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"z":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":2}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":5}}}}},"l":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2},"i":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/donate/":{"tf":1.4142135623730951}},"df":2}}}}}},"q":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.7320508075688772}},"df":6}},"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":2},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":7}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2}}},"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}}}}},"u":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}},"i":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}},"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951},"https://seadve.github.io/donate/":{"tf":1.0}},"df":5}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7,"7":{"docs":{},"df":0,"6":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4},"g":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2},"k":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"l":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":4}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.449489742783178},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":2}},"x":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":8}},"t":{"docs":{},"df":0,"'":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951}},"df":6}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"'":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":7}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951}},"df":4}}}}},"u":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/":{"tf":1.0},"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.0}},"df":9,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2},"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.7320508075688772}},"df":2,"'":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"p":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":2}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}}}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":1},"u":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":3}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"/":{"docs":{},"df":0,"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":3.0}},"df":1,"d":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"f":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}}}},"p":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.0}},"df":6,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}}},"s":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":2.23606797749979},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.449489742783178},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.23606797749979},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.449489742783178}},"df":10,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"g":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.8284271247461903},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":4}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}},"c":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":2.23606797749979}},"df":1},"s":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0},"https://seadve.github.io/donate/":{"tf":1.0}},"df":4},"c":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951}},"df":1}}},"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/about/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":3}}}}},"m":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1},"s":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.23606797749979}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":2}},"y":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":2}}}}}},"e":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":3.1622776601683795}},"df":2,"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"x":{"docs":{},"df":0,"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.4142135623730951}},"df":1}}}}},"e":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":2.23606797749979},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":2.23606797749979},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":2.23606797749979},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":2.23606797749979},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":2.449489742783178},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":4}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":3}}},"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":3.3166247903554}},"df":1,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":2.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":5}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"_":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":4}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2},"k":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":2.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.6457513110645907},"https://seadve.github.io/donate/":{"tf":1.0}},"df":9,"f":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{},"df":0,"f":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"y":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/about/":{"tf":1.0},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.7320508075688772}},"df":2}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"d":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"z":{"docs":{},"df":0,"b":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":2,"u":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.7320508075688772},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":2.8284271247461903}},"df":6,"s":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,":":{"docs":{},"df":0,":":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":2}}}}}}}}}}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"v":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.4142135623730951}},"df":2}}}},"title":{"root":{"docs":{},"df":0,"1":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1,"0":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1}},"2":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"3":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}},"0":{"docs":{},"df":0,"2":{"docs":{},"df":0,"1":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":2},"3":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}},"3":{"docs":{"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0}},"df":1},"4":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.4142135623730951},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7},"5":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1},"6":{"docs":{"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0}},"df":1},"7":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"8":{"docs":{"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0}},"df":1},"9":{"docs":{"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":1},"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://seadve.github.io/archive/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://seadve.github.io/projects/breathing/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/projects/delineate/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://seadve.github.io/designs/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/donate/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":1.0}},"df":1}}}}}}},"g":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/projects/gsettings-macro/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"c":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}},"t":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7,"4":{"docs":{"https://seadve.github.io/projects/plotters-gtk4/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0}},"df":1}}}}}}}}},"k":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0},"https://seadve.github.io/projects/kooha/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"x":{"docs":{"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{"https://seadve.github.io/projects/gsettings-macro/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/projects/mousai/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://seadve.github.io/projects/mpris-server/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/projects/plotters-gtk4/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/projects/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/10-kooha-2-3/":{"tf":1.0}},"df":1}}}},"w":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"tf":1.0},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"tf":1.0}},"df":7}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://seadve.github.io/projects/mpris-server/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"s":{"docs":{"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"tf":2.23606797749979}},"df":1}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"k":{"docs":{"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"tf":1.0},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"tf":1.0},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"tf":1.0},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"tf":1.0},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"tf":1.0}},"df":5}}}}}}},"documentStore":{"save":true,"docs":{"https://seadve.github.io/":{"body":"I develop free and open-source software in my free time, mainly for the GNOME desktop.\n","id":"https://seadve.github.io/","title":"Latest posts"},"https://seadve.github.io/about/":{"body":"Hi! My name is Dave Patrick Caberto, sometimes known as SeaDve online. I am currently 20 years old and a student of BS Electronics Engineering in the Philippines.\nI contribute to various free and open-source software in my free time as I support the adoption of the Linux desktop.\n\nExperiences and Pursuits\nI have experience in:\n\nSoftware development (Rust, Python, and C)\nDesktop application development (GTK and Libadwaita)\nVCS and hosting platforms (Git, GitHub, and GitLab)\nMultimedia (GStreamer)\nLinux (Bash)\nWeb development (Typescript/Javascript, CSS, and HTML)\nDatabase (SQLite and LMDB)\nGraphics Design (Inkscape)\nEmbedded Systems + IoT (Raspberry Pi and Arduino)\n3D Design and Modeling (AutoCAD, SketchUp)\nPCB design (EasyEDA)\n\nI am currently pursuing:\n\nGame development (Godot)\nComputer Vision\n\n\nSetup\nI currently use vanilla Fedora Silverblue both on my PC and laptop.\n\nContact\nYou can contact me in Matrix.\n","id":"https://seadve.github.io/about/","title":"About"},"https://seadve.github.io/archive/":{"body":"","id":"https://seadve.github.io/archive/","title":"Archive"},"https://seadve.github.io/blog/":{"body":"","id":"https://seadve.github.io/blog/","title":"Blog"},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"body":"Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you.\n\nNote that this list may vary from user to user. The main criteria I use are ease of use, user experience, and software and hardware support.\n\n5. Linux Mint\n\nPros\n\nVery lightweight and snappy\nGreat experience for former Windows users\nGreat for older laptops\n\nCons\n\nThe desktop looks dated\n\nLinux Mint is an Ubuntu-based distro. It comes with the Cinnamon DE environment by default which is noticeably lighter compared to GNOME. But if you do not like Cinnamon, you can choose between XFCE and MATE which are both similarly fast and light desktop environments.\nIt comes with the traditional desktop experience, so it would work great for users who came from Windows. It is very customizable and there are a lot of themes to choose from.\n\n4. Elementary OS\n\nPros\n\nVery simple to use\nIt looks beautiful and minimal\nSupportive app store to indie developers\n\nCons\n\nYou cannot choose other DE besides Pantheon\n\nElementary OS is yet another Ubuntu-based distro, but the difference is that it comes with its own desktop environment, Pantheon, and a minimal set of applications. It is arguably macOS-inspired due to its design language, dock, and the system panel on the top.\nTo be honest, it is one of the most beautiful Linux distros and its minimalistic look adds to the beauty. The thing I like the most about Elementary OS is its app store which makes it seamless to help hard-working developers.\n\n3. Pop!_OS\n\nPros\n\nGreat Nvidia support\nBacked by a hardware-selling company\nDisk encryption on by default\n\nCons\n\nDesktop environment choice is limited to GNOME\nNot very good with older hardware with less than 1 GB of RAM\n\nPop!_OS is an Ubuntu-based Linux distro backed by System76. No wonder why they have better Nvidia driver support as the company backing them sells laptops powered by Nvidia.\nIt provides a snappy and polished experience with the help of a slightly-modified GNOME desktop environment. It also comes with an auto-tiling extension which could be handy for power users.\n\n2. Ubuntu\n\nPros\n\nGreat out-of-the-box experience\nBacked by a company\nMany desktop environments to choose from\nGreat community support\n\nCons\n\nGNOME DE could be heavy with older hardware\n\nUbuntu is a Debian-based Linux distro that is backed by Canonical. It comes with GNOME as the default desktop environment, but it comes with others to choose from like Kubuntu (KDE), Lubuntu (LXQt), Ubuntu Mate, UbuntuDDE (Deepin), and many more.\nIt is simple and easy to operate once you get used to it. Community support is also one of its selling points due to its popularity. It also offers many useful preinstalled applications that could give you a head start.\n\nHonorable Mentions\n\nOpenSUSE\nIt is a distro that is sponsored by a German company, SUSE. You can choose a rolling or stable release. It might not focus on simplicity, but it offers the user great flexibility.\n\nDeepin\nIt is a Debian-based distro that comes with its own desktop environment and set of applications. Not only that, but it is subjectively one of the best-looking distros aside from Elementary.\n\nManjaro\nThis is an Arch-based distro. It is like Arch, but it is already configured out-of-the-box without having to manually install the operating system.\n\nKDE Neon\nThis is a Linux distro based on Ubuntu LTS versions. It comes with the latest and greatest KDE packages. KDE Plasma, I would say, is the most customizable desktop environment. It has great support with theme engines like Kvantum.\n\nDebian\nIt is one of the oldest and most stable Linux distros out there. However, for developers, the packages in the repository may be out-of-date.\n\n\n1. Fedora\n\nPros\n\nGreat open-source approach\nVanilla GNOME experience\nBacked by Red Hat\nVery polished experience\n\nCons\n\nSoftware options might be limited\n\nFedora is subjectively the best Linux distro of all time. Like Ubuntu, you are not limited to the GNOME desktop environment due to the variety of officially supported spins. It also comes with strictly FOSS-only preinstalled apps, which might limit your software choice if you do not add additional repositories.\nIt is great for laptops because they are packed with additional optimizations for better battery life. Furthermore, it is also easier to update the system as its application and system updates are handled within the same application, unlike Ubuntu.\n\nConclusion\nThere is really no best Linux distro. All distros have their purposes that will serve a specific person. No one can tell you what is the best Linux distro. This is just a guide to help you consider a distro that will work best for you. Why not fire up that VM and you can decide for yourself?\n\nIf you have opinions on the list, feel free to comment below. Have a good day!\n","id":"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/","title":"Best Linux Distros for Beginners in 2021"},"https://seadve.github.io/blog/10-kooha-2-3/":{"body":"\nKooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings.\n\nWhile we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes.\n\nThis release includes a refined interface, improved area selection, more informative notifications, and other changes. Read on to learn more about the new features and improvements.\n\nNew Features and Improvements\n\nRefined Interface\nThe main screen now has a more polished look. It now shows the selected format and FPS. This makes it easier to see the current settings at a glance, without having to open the settings window.\n\nOther than that, progress is now shown when flushing the recording. This gives a better indication when encoding or saving is taking longer than expected.\n\nFurthermore, the preferences window is also improved. It is now more descriptive and selecting FPS is now easier with a dropdown menu.\n\n\nImproved Area Selection\nThe area selection window is now resizable. You can now resize the window to fit your screen better. Additionally, the previously selected area is now remembered across sessions. This means that if you close Kooha and open it again, the area you selected will be remembered. Other improvements include improved focus handling, sizing fixes, better performance, and a new style.\n\n\nMore Informative Notifications\nRecord-done notifications now show the duration and size of the recorded video. This is inspired by GNOME Shell screencast notifications.\n\nMoreover, the notification actions now work even when the application is closed.\n\nOther Changes\nBesides the mentioned features, this release also includes:\n\nLogout and idle are now inhibited while recording.\nThe audio no longer stutters and gets corrupted when recording for a long time.\nThe audio is now recorded in stereo instead of mono when possible.\nThe recordings are no longer deleted when flushing is canceled.\nIncorrect output video orientation on certain compositors is now fixed.\nPerformance and stability are improved.\n\n\nGetting Kooha 2.3\nKooha is available on Flathub. You can install it from there, and since all of our code is open-source and can be freely modified and distributed according to the license, you can also download and build it from source.\n\nClosing Words\nThanks to everyone who has supported Kooha, be it through donations, bug reports, translations, or just using it. Your support is what keeps this project going. Enjoy the new release!\n","id":"https://seadve.github.io/blog/10-kooha-2-3/","title":"Kooha 2.3 Released!"},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"body":"We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium.\n\nIn this article, I will compare various popular web browsers. Four of them use Blink/V8 as their engine while Firefox and GNOME Web (Epiphany) use Gecko and WebKitGTK respectively.\nI ran eight benchmarks to test the performance of these browsers. I also measured the RAM usage of each browser manually using GNOME System Monitor. Note that if you replicate this test, your results may differ because you are probably using a different computer.\nSpoiler alert... Chrome wins!\n\nSetup\nI used a Laptop that is connected to a wall socket to do this comparison.\n\nIntel i3-2310M\n3 GB DDR3\nFedora 33 Workstation Edition\nLinux 5.10.6\nGNOME Shell 40.0 on Wayland\n\n\nBrowser used\nAll are set in their default configurations. No additional extensions are installed. I tested two variants of Firefox, one with WebRender enabled.\n\nFirefox 84.0.2\nFirefox 84.0.2 (gfx.webrender.all set to true)\nChrome 87.0.4280.141\nGNOME Web 3.38.2\nChromium 87.0.4280.88\nBrave 1.18.78\nEdge Dev 89.0.760.0\n\n\nResults\n\nMotionMark 1.0\nMotionMark is used to measure a browser's capability to animate complex scenes at a target frame rate.\n\nBrave wins!\n\n\nKraken 1.1\nKraken is a JavaScript performance benchmark that measures the speed of browsers through different tests extracted from real-world applications and libraries.\n\nChrome wins!\n\n\nOctane 2.0\nOctane is a benchmark that measures a JavaScript engine's performance through a suite of tests representing certain use cases in JavaScript applications.\n\nEpiphany wins!\n\n\nWebXPRT 3\nWebXPRT measures the performance of a browser through six HTML5 and JavaScript scenarios that mirror real-life tasks.\n\nEpiphany wins!\n\n\nMaze Solver (30x30)\nMaze Solver exercises the browser's handling of CSS 2.1 and CSS 3 layer constructs which are important components of overall web browser performance.\n\nEpiphany wins!\n\n\nSpeedometer 2.0\nSpeedometer is a browser benchmark that measures the responsiveness of web applications.\n\nChrome wins!\n\n\nRAM Usage with 5 tabs open\nI opened a total of five tabs: YouTube, Reddit, DuckDuckGo, GitHub and New York Times.\n\nFirefox wins!\n\n\nOverall Results\n\nChrome wins!\n\n\nTake note that I didn't include Basemark and JetStream results on the overall average as Firefox and Epiphany were not able to run these benchmarks without crashing, at least on my hardware.\n\nBasemark Web 3.0\nBasemark Web tests how well a browser performs on web-based applications.\n\nEpiphany wins!\n\n\nJetStream 2\nJetstream rewards browsers that start up quickly, execute code quickly and run smoothly.\n\nChrome wins!\n\n\nConclusion\nIn the end, all browsers are capable of handling daily tasks. As long as it provides you with regular security updates and also privacy, you do not need to switch to another web browser for a minuscule performance difference. And remember, performance should not be your only consideration on choosing a web browser. Have a nice day!\n\nAppendix\nThese are the raw benchmark results:\n\n","id":"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/","title":"Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany"},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"body":"Hello there!\nI am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval.\n\nMe and my bizarre open-source journey\nWeirdly enough, I first discovered Linux five years ago on a failed attempt to do Hackintosh. I got bored with Windows that I decided to try something new and different, and that's when I eventually stumbled upon Linux, specifically Elementary OS. It did not last for me since I still depend a lot on applications that are only available with Windows.\nFast-forward two years later, I decided to give Linux another try with KDE Neon and migrate my workflows to open-source applications such as LibreOffice, Inkscape, and Kdenlive. I remember feeling adventurous and breaking my system numerous times, though I considered it as part of the learning process. I was intrigued by the idea of being a part of a community of passionate developers and enthusiastic users. I also liked the customization it had. However, as I grew with it, I started to realize that I had spent way too much time configuring things and forgetting to focus on what was really important, and that is when I discovered GNOME.\nWhen I first used GNOME, it was a totally different workflow, and I liked it. It was simple; the UI made sense. At that time, there was some software I was missing, particularly a screen recording application that works nicely on Wayland. That was the time I discovered RecApp. It worked well; however, it looked not at home, even for a GTK application. One of my first contributions was creating a mockup for the redesign, and I also took that opportunity to learn Python and GTK and implement my mockup. I was not necessarily proud of my code, but I was proud and happy about having the chance to contribute to the software I use and the community.\nA few months later, as I learned more about programming and the GNOME developer ecosystem, there were many more things I'd like to improve and change in RecApp, some of which other contributors did not agree with. That's when Kooha was born, with a total in-and-out redesign of RecApp and a different focus and ideology. Almost a month later was also the birth of Mousai, a song recognizer application. Since then, I have been maintaining these two applications.\nThere are definitely a lot of things I missed, but that was a quick summary of my journey with open-source.\n\nMore about Bustle and the project\nFor those who have not heard of Bustle, it is an application used to visualize D-Bus activities. It shows signal emissions, method calls, method returns, and errors, which are useful in observing traffic, debugging, and optimizing performance in D-Bus applications.\n\nAlthough the current implementation of Bustle in Haskell and GTK 3 is functional, there are noteworthy reasons to consider a rewrite in Rust. Some of these advantages include having access to a range of libraries, such as zbus, gtk4-rs, and LibPCAP bindings. Aside from this, the growing Rust community and the availability of the Rust SDK in Flathub would make the tool more accessible to contributors and simpler to distribute to the users. On the other hand, porting Bustle to GTK 4 would over benefits such as the newer and more modern LibAdwaita widgets and ListView API, which would make it easier for the tool to comply with the HIG and benefit from the latest developments in the platform.\nAltogether, this rewrite and port will contribute to the maintainability, accessibility, and future-proofing of Bustle through the use of newer technologies and arguably more ergonomic technologies.\n\nI will be posting updates about the project every few weeks for the next few months, including more details about the plans for this GSoC project. If you'd like to talk about something, feel free to contact me at Matrix @sedve:matrix.org.\nThanks for reading!\n","id":"https://seadve.github.io/blog/3-gsoc-2023-introduction/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction)"},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"body":"\nProgress Made\nBefore the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like.\n\nThe Rust PCAP library was used to load the packets from the PCAP file, which contains the bytes of a DBus Message. It is nice to use, though it is missing an async API for loading files. That could be fixed in the future, but this week mainly focused on a basic diagram implementation. The bytes can then be parsed through GDBus into a GDBusMessage, which contains the information to implement the diagram.\nThrough the parsed message, the diagram can be implemented. It uses GtkListView to display the rows as, aside from having a nice separation of view and model, it is more efficient because it recycles widgets, especially since PCAP files could possibly contain thousands of messages. Each row contains the elapsed time, path, destination, interface, and member of the message.\n\nAside from the diagram, a DetailsView was also implemented. It shows the sender and the body, and also the destination, path, and member of the message. For more information about it, you can check out the merge request.\n\nGDBus was used initially as zbus is missing the necessary APIs for parsing messages from bytes. However, the merge requests are already on the way to implement those upstream, including a nicer way to print zbus::Value that would match how GVariants are printed.\n\nzv: impl Display for Value, Array, Structure, Dict & Maybe\nzb: Add a from_bytes constructor for Message\n\n\nPlans for the Following Weeks\nWhile the merge requests are in place, there is still some work to do, such as fixing up the Display implementation for zbus::Value::Str and zbus::Value::Array. Once the mentioned merge requests are merged, we could finish up the zbus port.\nAfter the application is fully ported to zbus, we could start working on the more complicated part of the Diagram implementation, like showing signals and the method call and return arrows.\n\nThat's all for this week. See you again in the next weeks. Thanks for reading!\n","id":"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2)"},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"body":"\nProgress Made\nThere's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the PR to add from_bytes constructor for zbus::Message merged. This means that we can now construct zbus::Message from raw GDBusMessage bytes and vice versa, which is critical for porting Bustle from GDBus to zbus.\n\nOn the other hand, the PR to implement Display for Value, Array, Structure, Dict & Maybe is, while the implementation for zbus::Value::Str and zbus::Value::Array is already fixed, still in the review stage as there are still things to polish, such as figuring out a way to simplify the implementation.\nMeanwhile, I have also been experimenting with drawing on the diagram using GTK transform functions such as translate_coordinates and compute_point, but nothing is ready enough yet for a screenshot.\n\nPlans for the Following Weeks\nWith my finals out of the equation, I could focus more on finishing up drawing the signals and methods arrow on the diagram during the last days of the GSoC midterm period.\nI will also push PR to implement Display for Value, Array, Structure, Dict & Maybe to be merged so that the zbus port MR can also be merged.\n\nThat's all for this week. I'm looking forward to writing more in the next weeks. Thanks for reading!\n","id":"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4)"},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"body":"\nProgress Made\nThis week, the PR to implement Display for Value, Array, Structure, Dict, and Maybe has been merged. Thus, there is a much nicer way now upstream to display zbus::Value, similar to GVariant. With this blocker cleared out, the zbus port MR has also been merged, fully porting the Bustle rewrite to zbus.\n\nFurthermore, my mentor, Bilal, started implementing session monitoring and saving to a PCAP file while I continued their work and implemented system and address recording. However, it is not yet merged as there are some things to be figured out and more work to do. Specifically, it currently requires a dbus-monitor binary installed on the host, which is not great for distributions that do not package it.\n\nAside from those mentioned above, I have also been working on drawing the diagram. I am still studying the older Haskell codebase to prevent reinventing the wheel on some implementations. Unfortunately, the current implementation is still not ready enough for a screenshot.\nTo easily track the missing features, we also set up an issue board.\n\nPlans for the Following Weeks\nIn the following weeks, I will get the PR to implement and address recording merged and work on more parts of the diagram drawing.\n\nThat's all for this week. Thanks for reading!\n","id":"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6)"},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"body":"\nProgress Made\nA lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found.\n\nSecond, when recording, the sequence diagram now sticks at the bottom because, in common use cases, it is mostly wanted to observe the new messages as they come.\n\nMoreover, on the smaller changes, PCAP file loading is now synchronous, the gtk4-rs dependency has now been updated to the recently released 0.17 version, the accuracy of timestamp calculations has been improved, and the focus issue on the address dialog has been fixed.\nLastly, the signals and method call arrows and arcs are now (finally!) drawn in the diagram. While it looks simple, it took me days to get it right. However, there is no merge request yet since it requires more bug fixing and code cleanup.\n\n\nGUADEC\nAside from working on the code, I also attended GUADEC remotely. I had a lightning talk about a bit about myself and an overview of this project.\n\nPlans for the Following Weeks\nFor the next weeks, the diagram still needs bug fixing and polishing, as mentioned. For instance, it currently does not draw arcs on method calls when either the call or return row is not visible. The header is also only visible when scrolled all the way to the top, and it only shows the unique name instead of the well-known name.\nAfter the diagram is completed, we will go on with the implementation of service filtering and adding a more convenient way to have multiple instances of recording or opened files via tabs.\n\nThat's all for this week. Thanks for reading!\n","id":"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)"},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"body":"\nProgress Made\nI am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state.\n\n\nAside from that, it now has a header that doesn't overlay on the diagram, the drawings now properly adjust to text scale factor changes, the signal arrows are now drawn, and the rows are no longer clipped into the row titles.\nMy mentor, Bilal, also worked on adding tags, the colored circles in the diagram, so it is easier to determine the category of a message.\nOn the general UI side, there is now a proper loading page that is shown while waiting for the PCAP files to show.\n\nHowever, that may not be as useful as we also landed a patch that speeds up loading by up to 32 times; that's from 16 seconds on average to 500 milliseconds, when loading a 2.2 MB file.\nThere is also now a waiting page that shows before the first message arrives while recording.\n\nWe also landed statistics window which shows frequencies of messages, durations of method calls, and sizes information of each message.\n\n\n\nMy mentor, Bilal, also worked on adding information on the details view including the body size and signature, and the response time from method return to its call.\n\nThere is also now a way to save the PCAP file as a DOT graph file, which can be used to generate a graph using Graphviz to visualize interactions between bus names like the following:\n\nOn the plumbing side, saving to PCAP file is now asynchronous, avoiding blocking the UI. We also ported from using libpcap to a pure Rust library, removing unsafe code and simplifying the codebase. Furthermore, the timestamp computation is now more accurate.\nAs part of making debugging in Bustle easier, I have also submitted a patch to zbus to simplify the printing of bus names.\nFinally, I started prototyping services filtering. It is still a proof of concept and does not look great, but it already functions and is a good starting point for next week.\n\n\nPlans for the Following Weeks\nThe following weeks will be the last days of GSoC and I will be focusing on finishing up the remaining tasks. With the most difficult part of this GSoC project done, most of the tasks left, aside from services filtering, are optimizing performance and cleaning up the codebase.\nThere are also a few more things to fix such as a proper name owner changed signal handling, drawing method call arc regardless if the row is not drawable, properly killing the dbus-monitor process, and propagating user-facing errors.\nI would also like to add features such as adding a button that scroll to the method call message of a method return message or vice-versa, porting to use the new GskPath APIs, and adding a way to open multiple diagrams at once via tabs and multiple windows.\n\nThat's all for this week. Thanks for reading!\n","id":"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)"},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"body":"Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project.\n\nAbout Bustle\nBustle is a graphical application used to analyze D-Bus activities. It uses sequence diagrams to present signal emissions and method calls messages.\n\nBustle represents these messages using a row-based layout. Each row is dedicated to displaying the following information: the elapsed time since the first message, the message path, and the member, which could be the name of the emitted signal or invoked method. On the other hand, individual columns correspond to distinct D-Bus services. Bustle draws arrows that transverse these columns to visualize the communication between services, while arcs represent method invocations and returns. This visual paradigm is valuable as, for instance, it can be used to see which services a D-Bus application talks to and how often, which can be handy in debugging, enhancing security, and optimizing performance within the application.\n\nProject Goal\nThe ultimate goal of this project is to port Bustle to GTK 4 and rewrite it in Rust. Although the current implementation of Bustle in Haskell and GTK 3 is functional, there are compelling reasons to consider a rewrite in Rust. This includes enabling the tool to take advantage of a range of ergonomic libraries, including zbus, gtk4-rs, and pcap-file, that would ease the burden in maintenance. Furthermore, the growing Rust community and the availability of the Rust SDK in Flathub would make the tool more accessible to potential contributors and simpler to distribute to users.\nPorting the tool to GTK 4, on the other hand, would offer several benefits, such as access to newer and more performant widgets and drawing APIs like GtkListView and GskPath. This would allow Bustle to benefit from the latest developments in the platform and remain current with evolving standards.\nAltogether, a rewrite of Bustle in Rust and GTK 4 would provide advantages that can enhance the tool's functionality, maintainability, longevity, accessibility, and possibly efficiency.\n\nWork Done\nMost of the tasks in the original proposal have been completed. This includes having an initial MVP, porting GDBus usage to zbus, implementing file loading and saving, completing the recording functionality, and porting the UI, which comprises the diagram, details view, and services filter, to GTK 4.\nFor more details on the work done, there are also bi-weekly updates on my blog.\n\nSnapshots\n\nDiagram and Details View\n\n\nRecording and Services Filter\n\n\nCode Merged\nThese are the summary of code that has been merged during the GSoC period.\n\nBustle\nMost of the work done is in the Bustle GNOME GitLab repository, where the following pull requests have been merged:\n\nBasic parsing and diagram implementation\nPort to zbus\nDrop explicit cargo protocol setting\nDecouple recording monitor from DiagramModel\nImplement system and address monitoring and recording\nLoad DiagramModel from file asynchronously\nStick at the bottom when an item is added to the diagram\nBump gtk4-rs version\nImprove timestamp accuracy\nFocus on the entry row when dialog presents\nSave DiagramModel to file asynchronously\nFurther improve timestamp accuracy\nHandle undefined behavior\nEnable link-time optimization and various cleanups\nAdd loading and waiting pages on the window\nShow a toast when clicking copy and other fixes\nImplement diagram columns, arrows, and arcs\nImprove loading performance and code organization\nImplement API to get well-known names from bus names\nRefactor name owner changed signal handling\nOrganize diagram files\nImprove file naming\nMonitor code cleanups\nAdd support for targeted signals\nPort from libpcap to pcap-file\nUse a more proper column width\nImproving diagram tag styling\nProperly update the color and label of RowTag\nImproving diagram styling\nPropagate errors to the user\nOnly show errors when necessary\nPrevent copy when packet data is owned\nFix DiagramHeader labels UI glitch\nColorWidget and DiagramView cleanups\n\n\nzbus and gtk4-rs\nWhile the project is focused on Bustle, some changes are necessary to be upstreamed to other projects. This includes changes to zbus and gtk4-rs, where the following pull requests have been merged:\n\nzbus\n\nzb: Add a from_bytes constructor for Message\nzv: Implement Display for Value, Array, Structure, Dict & Maybe\nzv, zn: Improve Str, Owned*Name, BusName Debug implementations\n\n\ngtk4-rs\n\ngdk: Make RGBA::new const and add with_* constructors\n\n\nCode to be Merged\nDue to time constraints and unexpected issues, some of the pull requests are still pending review:\n\nImplement services filter\nPort to GskPath APIs\nMake use of GtkMapListModel for layouts\nImplement BusNameList and FilteredBusNameModel\nFix header expanded height computation\n\n\nFuture Plans\nWhile most of the tasks in the proposal have been completed, there are still a few things that need to be done, including the following:\n\nOptimizing performance\nHunting and squashing bugs:\n\nImproving name owner changed signal handling\nDrawing method call arc regardless if the row is not drawable\nProperly killing the dbus-monitor process\n\n\nAdding more features:\n\nAdding a button that scrolls to the method call message of a method return message or vice-versa\nAdding a way to open multiple diagrams at once via tabs and multiple windows\n\n\nFixing regressions and releasing the application on Flathub\nContinuous involvement and contribution to open-source\n\n\nFinal Words\nI have to say this is, so far, the most challenging part of my software development journey. It felt like a hackathon since I had to understand things and create something that works quickly. While it was challenging, it was also rewarding as I was able to learn a lot of things and create something that I am proud of. There were moments of time pressure and frustration, but with experimentation, collaboration, and a lot of reading, I was able to overcome these challenges and make meaningful progress. The complexity of the project pushed me out of my comfort zone, forcing me to delve into unfamiliar areas of programming and technology.\nLastly, I would like to express my gratitude to my mentors, Bilal Elmoussaoui and Maximiliano Sandoval, for tirelessly reviewing my pull requests and guiding me. I would also like to thank the GNOME Foundation and the community, especially the GNOME GSoC admin, Felipe Borges, for giving me the opportunity to work on this project. I would also like to extend my appreciation to zbus maintainer, Zeeshan Ali Khan, for their help in getting my pull requests merged against zbus and to the original Bustle developer, Will Thompson, for their guidance. Finally, I would like to thank my family and friends for their support and encouragement.\n","id":"https://seadve.github.io/blog/9-gsoc-2023-final-overview/","title":"GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)"},"https://seadve.github.io/designs/":{"body":"","id":"https://seadve.github.io/designs/","title":"Designs"},"https://seadve.github.io/donate/":{"body":"If you would like to back my work and support me as a developer, you may buy me a coffee or sponsor me via GitHub Sponsors.\n","id":"https://seadve.github.io/donate/","title":"Donate"},"https://seadve.github.io/pages/":{"body":"","id":"https://seadve.github.io/pages/","title":""},"https://seadve.github.io/projects/":{"body":"","id":"https://seadve.github.io/projects/","title":"Projects"},"https://seadve.github.io/projects/breathing/":{"body":"","id":"https://seadve.github.io/projects/breathing/","title":"Breathing"},"https://seadve.github.io/projects/delineate/":{"body":"","id":"https://seadve.github.io/projects/delineate/","title":"Delineate"},"https://seadve.github.io/projects/gsettings-macro/":{"body":"","id":"https://seadve.github.io/projects/gsettings-macro/","title":"GSettings Macro"},"https://seadve.github.io/projects/kooha/":{"body":"","id":"https://seadve.github.io/projects/kooha/","title":"Kooha"},"https://seadve.github.io/projects/mousai/":{"body":"","id":"https://seadve.github.io/projects/mousai/","title":"Mousai"},"https://seadve.github.io/projects/mpris-server/":{"body":"","id":"https://seadve.github.io/projects/mpris-server/","title":"MPRIS Server"},"https://seadve.github.io/projects/plotters-gtk4/":{"body":"","id":"https://seadve.github.io/projects/plotters-gtk4/","title":"Plotters GTK4"}},"docInfo":{"https://seadve.github.io/":{"body":10,"title":2},"https://seadve.github.io/about/":{"body":97,"title":0},"https://seadve.github.io/archive/":{"body":0,"title":1},"https://seadve.github.io/blog/":{"body":0,"title":1},"https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/":{"body":482,"title":5},"https://seadve.github.io/blog/10-kooha-2-3/":{"body":248,"title":3},"https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/":{"body":335,"title":15},"https://seadve.github.io/blog/3-gsoc-2023-introduction/":{"body":364,"title":8},"https://seadve.github.io/blog/4-gsoc-2023-week-1-2/":{"body":219,"title":10},"https://seadve.github.io/blog/5-gsoc-2023-week-3-4/":{"body":124,"title":10},"https://seadve.github.io/blog/6-gsoc-2023-week-5-6/":{"body":117,"title":10},"https://seadve.github.io/blog/7-gsoc-2023-week-7-8/":{"body":176,"title":10},"https://seadve.github.io/blog/8-gsoc-2023-week-9-10/":{"body":294,"title":10},"https://seadve.github.io/blog/9-gsoc-2023-final-overview/":{"body":670,"title":9},"https://seadve.github.io/designs/":{"body":0,"title":1},"https://seadve.github.io/donate/":{"body":10,"title":1},"https://seadve.github.io/pages/":{"body":0,"title":0},"https://seadve.github.io/projects/":{"body":0,"title":1},"https://seadve.github.io/projects/breathing/":{"body":0,"title":1},"https://seadve.github.io/projects/delineate/":{"body":0,"title":1},"https://seadve.github.io/projects/gsettings-macro/":{"body":0,"title":2},"https://seadve.github.io/projects/kooha/":{"body":0,"title":1},"https://seadve.github.io/projects/mousai/":{"body":0,"title":1},"https://seadve.github.io/projects/mpris-server/":{"body":0,"title":2},"https://seadve.github.io/projects/plotters-gtk4/":{"body":0,"title":2}},"length":25},"lang":"English"}; \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..37f4ef2 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,104 @@ + + + + + https://seadve.github.io/ + + + https://seadve.github.io/about/ + + + https://seadve.github.io/archive/ + + + https://seadve.github.io/blog/ + + + https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/ + 2021-01-15T17:29:00.004+08:00 + + + https://seadve.github.io/blog/10-kooha-2-3/ + 2024-03-24T12:29:00.001+08:00 + + + https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/ + 2023-05-11T23:45:51.417+08:00 + + + https://seadve.github.io/blog/3-gsoc-2023-introduction/ + 2023-06-11T19:19:30.97+08:00 + + + https://seadve.github.io/blog/4-gsoc-2023-week-1-2/ + 2023-06-11T19:25:18.353+08:00 + + + https://seadve.github.io/blog/5-gsoc-2023-week-3-4/ + 2023-07-05T09:30:00.002+08:00 + + + https://seadve.github.io/blog/6-gsoc-2023-week-5-6/ + 2023-07-19T11:51:00.002+08:00 + + + https://seadve.github.io/blog/7-gsoc-2023-week-7-8/ + 2023-08-04T21:34:00.002+08:00 + + + https://seadve.github.io/blog/8-gsoc-2023-week-9-10/ + 2023-08-19T21:34:00.002+08:00 + + + https://seadve.github.io/blog/9-gsoc-2023-final-overview/ + 2023-08-28T20:22:00.002+08:00 + + + https://seadve.github.io/blog/page/1/ + + + https://seadve.github.io/blog/page/2/ + + + https://seadve.github.io/designs/ + + + https://seadve.github.io/donate/ + + + https://seadve.github.io/projects/ + + + https://seadve.github.io/projects/breathing/ + + + https://seadve.github.io/projects/delineate/ + + + https://seadve.github.io/projects/gsettings-macro/ + + + https://seadve.github.io/projects/kooha/ + + + https://seadve.github.io/projects/mousai/ + + + https://seadve.github.io/projects/mpris-server/ + + + https://seadve.github.io/projects/plotters-gtk4/ + + + https://seadve.github.io/tags/ + + + https://seadve.github.io/tags/benchmark/ + + + https://seadve.github.io/tags/gsoc-2023/ + + + https://seadve.github.io/tags/software/ + + diff --git a/sitemap_style.xsl b/sitemap_style.xsl new file mode 100644 index 0000000..70c3bb4 --- /dev/null +++ b/sitemap_style.xsl @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + Sitemap • <xsl:value-of select="$clean_base_url"/> + + + + +
+

Sitemap of

+

Number of URLs:

+ + + + + + + + + + + + + + + +
URLLast modification
+ + + + + +
+
+ + +
+
diff --git a/skins/blue.css b/skins/blue.css new file mode 100644 index 0000000..bca6d11 --- /dev/null +++ b/skins/blue.css @@ -0,0 +1 @@ +:root{--primary-color: #3271E7}[data-theme=dark]{--primary-color: #6cacff} \ No newline at end of file diff --git a/skins/evangelion.css b/skins/evangelion.css new file mode 100644 index 0000000..511c763 --- /dev/null +++ b/skins/evangelion.css @@ -0,0 +1 @@ +:root{--primary-color: #d12e36}[data-theme=dark]{--primary-color: #c09bd9} \ No newline at end of file diff --git a/skins/indigo_ingot.css b/skins/indigo_ingot.css new file mode 100644 index 0000000..71c936c --- /dev/null +++ b/skins/indigo_ingot.css @@ -0,0 +1 @@ +:root{--primary-color: #1460bd}[data-theme=dark]{--primary-color: #e6c212} \ No newline at end of file diff --git a/skins/lavender.css b/skins/lavender.css new file mode 100644 index 0000000..a60fc58 --- /dev/null +++ b/skins/lavender.css @@ -0,0 +1 @@ +:root{--primary-color: #9055d8}[data-theme=dark]{--primary-color: #cba2e8} \ No newline at end of file diff --git a/skins/lowcontrast_orange.css b/skins/lowcontrast_orange.css new file mode 100644 index 0000000..3b3cf70 --- /dev/null +++ b/skins/lowcontrast_orange.css @@ -0,0 +1 @@ +:root{--primary-color: #f56a00}[data-theme=dark]{--primary-color: #ec984f} \ No newline at end of file diff --git a/skins/lowcontrast_peach.css b/skins/lowcontrast_peach.css new file mode 100644 index 0000000..f3bdf0f --- /dev/null +++ b/skins/lowcontrast_peach.css @@ -0,0 +1 @@ +:root{--primary-color: #ffa057}[data-theme=dark]{--primary-color: #ffab7f} \ No newline at end of file diff --git a/skins/lowcontrast_pink.css b/skins/lowcontrast_pink.css new file mode 100644 index 0000000..4f24892 --- /dev/null +++ b/skins/lowcontrast_pink.css @@ -0,0 +1 @@ +:root{--primary-color: #ee59d2}[data-theme=dark]{--primary-color: #f49ee9} \ No newline at end of file diff --git a/skins/mint.css b/skins/mint.css new file mode 100644 index 0000000..c3c5a34 --- /dev/null +++ b/skins/mint.css @@ -0,0 +1 @@ +:root{--primary-color: #00804d}[data-theme=dark]{--primary-color: #00b86e} \ No newline at end of file diff --git a/skins/monochrome.css b/skins/monochrome.css new file mode 100644 index 0000000..bfd4159 --- /dev/null +++ b/skins/monochrome.css @@ -0,0 +1 @@ +:root{--primary-color: #727272}[data-theme=dark]{--primary-color: #b3b3b3} \ No newline at end of file diff --git a/skins/red.css b/skins/red.css new file mode 100644 index 0000000..1074ae8 --- /dev/null +++ b/skins/red.css @@ -0,0 +1 @@ +:root{--primary-color: #ca4963}[data-theme=dark]{--primary-color: #ea535f} \ No newline at end of file diff --git a/skins/sakura.css b/skins/sakura.css new file mode 100644 index 0000000..28343a9 --- /dev/null +++ b/skins/sakura.css @@ -0,0 +1 @@ +:root{--primary-color: #D33C5C}[data-theme=dark]{--primary-color: #fabed2} \ No newline at end of file diff --git a/skins/teal.css b/skins/teal.css new file mode 100644 index 0000000..6bd4bf8 --- /dev/null +++ b/skins/teal.css @@ -0,0 +1 @@ +:root{--primary-color: #087e96}[data-theme=dark]{--primary-color: #91e0ee} \ No newline at end of file diff --git a/social_icons/LICENSE b/social_icons/LICENSE new file mode 100644 index 0000000..76875fb --- /dev/null +++ b/social_icons/LICENSE @@ -0,0 +1,5 @@ +Most icons in this directory are downloaded from [FontAwesome](https://fontawesome.com/). They are part of the [free offer](https://fontawesome.com/license/free) and are licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). + +Exceptions: +- nostr, by Andrea Nicolini, aka Bembureda, licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/). Source: https://github.com/mbarulli/nostr-logo +- Keybase, licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/) by [Simple Icons](https://simpleicons.org/). Source: https://github.com/simple-icons/simple-icons/blob/develop/icons/keybase.svg diff --git a/social_icons/apple.svg b/social_icons/apple.svg new file mode 100644 index 0000000..d0532d5 --- /dev/null +++ b/social_icons/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/bitcoin.svg b/social_icons/bitcoin.svg new file mode 100644 index 0000000..941d9b0 --- /dev/null +++ b/social_icons/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/bluesky.svg b/social_icons/bluesky.svg new file mode 100644 index 0000000..07bbec0 --- /dev/null +++ b/social_icons/bluesky.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/debian.svg b/social_icons/debian.svg new file mode 100644 index 0000000..cf9d229 --- /dev/null +++ b/social_icons/debian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/deviantart.svg b/social_icons/deviantart.svg new file mode 100644 index 0000000..7dbd0b6 --- /dev/null +++ b/social_icons/deviantart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/diaspora.svg b/social_icons/diaspora.svg new file mode 100644 index 0000000..55527b5 --- /dev/null +++ b/social_icons/diaspora.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/discord.svg b/social_icons/discord.svg new file mode 100644 index 0000000..f0dfeab --- /dev/null +++ b/social_icons/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/discourse.svg b/social_icons/discourse.svg new file mode 100644 index 0000000..343bea6 --- /dev/null +++ b/social_icons/discourse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/email.svg b/social_icons/email.svg new file mode 100644 index 0000000..85245e2 --- /dev/null +++ b/social_icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/ethereum.svg b/social_icons/ethereum.svg new file mode 100644 index 0000000..af202de --- /dev/null +++ b/social_icons/ethereum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/etsy.svg b/social_icons/etsy.svg new file mode 100644 index 0000000..ebc040a --- /dev/null +++ b/social_icons/etsy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/facebook.svg b/social_icons/facebook.svg new file mode 100644 index 0000000..0afaf7a --- /dev/null +++ b/social_icons/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/github.svg b/social_icons/github.svg new file mode 100644 index 0000000..e32807a --- /dev/null +++ b/social_icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/gitlab.svg b/social_icons/gitlab.svg new file mode 100644 index 0000000..b577d3f --- /dev/null +++ b/social_icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/google-scholar.svg b/social_icons/google-scholar.svg new file mode 100644 index 0000000..f271dca --- /dev/null +++ b/social_icons/google-scholar.svg @@ -0,0 +1 @@ + diff --git a/social_icons/google.svg b/social_icons/google.svg new file mode 100644 index 0000000..b3776b0 --- /dev/null +++ b/social_icons/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/hacker-news.svg b/social_icons/hacker-news.svg new file mode 100644 index 0000000..23e3980 --- /dev/null +++ b/social_icons/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/instagram.svg b/social_icons/instagram.svg new file mode 100644 index 0000000..89f63c4 --- /dev/null +++ b/social_icons/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/keybase.svg b/social_icons/keybase.svg new file mode 100644 index 0000000..f4c2ebb --- /dev/null +++ b/social_icons/keybase.svg @@ -0,0 +1 @@ +Keybase \ No newline at end of file diff --git a/social_icons/linkedin.svg b/social_icons/linkedin.svg new file mode 100644 index 0000000..d54fcf5 --- /dev/null +++ b/social_icons/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/mastodon.svg b/social_icons/mastodon.svg new file mode 100644 index 0000000..5e12f81 --- /dev/null +++ b/social_icons/mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/matrix.svg b/social_icons/matrix.svg new file mode 100644 index 0000000..7618c33 --- /dev/null +++ b/social_icons/matrix.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/social_icons/nostr.svg b/social_icons/nostr.svg new file mode 100755 index 0000000..fd103ae --- /dev/null +++ b/social_icons/nostr.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/social_icons/paypal.svg b/social_icons/paypal.svg new file mode 100644 index 0000000..efdc81a --- /dev/null +++ b/social_icons/paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/pinterest.svg b/social_icons/pinterest.svg new file mode 100644 index 0000000..eb977c2 --- /dev/null +++ b/social_icons/pinterest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/quora.svg b/social_icons/quora.svg new file mode 100644 index 0000000..375d302 --- /dev/null +++ b/social_icons/quora.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/reddit.svg b/social_icons/reddit.svg new file mode 100644 index 0000000..a8a3a96 --- /dev/null +++ b/social_icons/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/rss.svg b/social_icons/rss.svg new file mode 100644 index 0000000..b862886 --- /dev/null +++ b/social_icons/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/signal.svg b/social_icons/signal.svg new file mode 100644 index 0000000..c6ee14a --- /dev/null +++ b/social_icons/signal.svg @@ -0,0 +1 @@ + diff --git a/social_icons/skype.svg b/social_icons/skype.svg new file mode 100644 index 0000000..3369aba --- /dev/null +++ b/social_icons/skype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/slack.svg b/social_icons/slack.svg new file mode 100644 index 0000000..0dbc26d --- /dev/null +++ b/social_icons/slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/snapchat.svg b/social_icons/snapchat.svg new file mode 100644 index 0000000..2cd79dd --- /dev/null +++ b/social_icons/snapchat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/soundcloud.svg b/social_icons/soundcloud.svg new file mode 100644 index 0000000..4724d74 --- /dev/null +++ b/social_icons/soundcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/spotify.svg b/social_icons/spotify.svg new file mode 100644 index 0000000..1d393ba --- /dev/null +++ b/social_icons/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/stack-exchange.svg b/social_icons/stack-exchange.svg new file mode 100644 index 0000000..0a3177f --- /dev/null +++ b/social_icons/stack-exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/stack-overflow.svg b/social_icons/stack-overflow.svg new file mode 100644 index 0000000..2ca50c7 --- /dev/null +++ b/social_icons/stack-overflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/steam.svg b/social_icons/steam.svg new file mode 100644 index 0000000..b61f374 --- /dev/null +++ b/social_icons/steam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/telegram.svg b/social_icons/telegram.svg new file mode 100644 index 0000000..02f48c0 --- /dev/null +++ b/social_icons/telegram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/twitter.svg b/social_icons/twitter.svg new file mode 100644 index 0000000..0778f72 --- /dev/null +++ b/social_icons/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/vimeo.svg b/social_icons/vimeo.svg new file mode 100644 index 0000000..d98368e --- /dev/null +++ b/social_icons/vimeo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/whatsapp.svg b/social_icons/whatsapp.svg new file mode 100644 index 0000000..d259142 --- /dev/null +++ b/social_icons/whatsapp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/x.svg b/social_icons/x.svg new file mode 100644 index 0000000..f5feed7 --- /dev/null +++ b/social_icons/x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/youtube.svg b/social_icons/youtube.svg new file mode 100644 index 0000000..287dca2 --- /dev/null +++ b/social_icons/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tags/benchmark/atom.xml b/tags/benchmark/atom.xml new file mode 100644 index 0000000..ec7b07f --- /dev/null +++ b/tags/benchmark/atom.xml @@ -0,0 +1,131 @@ + + + + + + • + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit website + Recent posts + Updated on $DATE + + SeaDve - Benchmark + Application developer based in the Philippines + + date + + Zola + 2023-05-11T23:45:51.417+08:00 + https://seadve.github.io/tags/benchmark/atom.xml + Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany + 2021-01-16T15:46:00.004+08:00 + 2023-05-11T23:45:51.417+08:00 + + seadve + + + https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/ + + <p>We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium.</p> +<span id="continue-reading"></span> +<p>In this article, I will compare various popular web browsers. Four of them use Blink/V8 as their engine while Firefox and GNOME Web (Epiphany) use Gecko and WebKitGTK respectively.</p> +<p>I ran eight benchmarks to test the performance of these browsers. I also measured the RAM usage of each browser manually using GNOME System Monitor. Note that if you replicate this test, your results may differ because you are probably using a different computer.</p> +<p>Spoiler alert... <strong>Chrome wins!</strong></p> +<h2 id="setup"><a class="header-anchor no-hover-padding" href="#setup" aria-label="Anchor link for: setup"><span class="link-icon" aria-hidden="true"></span></a> +Setup</h2> +<p>I used a Laptop that is connected to a wall socket to do this comparison.</p> +<ul> +<li>Intel i3-2310M</li> +<li>3 GB DDR3</li> +<li>Fedora 33 Workstation Edition</li> +<li>Linux 5.10.6</li> +<li>GNOME Shell 40.0 on Wayland</li> +</ul> +<h3 id="browser-used"><a class="header-anchor no-hover-padding" href="#browser-used" aria-label="Anchor link for: browser-used"><span class="link-icon" aria-hidden="true"></span></a> +Browser used</h3> +<p>All are set in their default configurations. No additional extensions are installed. I tested two variants of Firefox, one with WebRender enabled.</p> +<ul> +<li>Firefox 84.0.2</li> +<li>Firefox 84.0.2 (gfx.webrender.all set to true)</li> +<li>Chrome 87.0.4280.141</li> +<li>GNOME Web 3.38.2</li> +<li>Chromium 87.0.4280.88</li> +<li>Brave 1.18.78</li> +<li>Edge Dev 89.0.760.0</li> +</ul> +<h2 id="results"><a class="header-anchor no-hover-padding" href="#results" aria-label="Anchor link for: results"><span class="link-icon" aria-hidden="true"></span></a> +Results</h2> +<h3 id="motionmark-1-0"><a class="header-anchor no-hover-padding" href="#motionmark-1-0" aria-label="Anchor link for: motionmark-1-0"><span class="link-icon" aria-hidden="true"></span></a> +MotionMark 1.0</h3> +<p><a rel="noopener" target="_blank" href="https://browserbench.org/MotionMark/">MotionMark</a> is used to measure a browser's capability to animate complex scenes at a target frame rate.</p> +<h4 id="brave-wins"><a class="header-anchor no-hover-padding" href="#brave-wins" aria-label="Anchor link for: brave-wins"><span class="link-icon" aria-hidden="true"></span></a> +Brave wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/motion-mark.png" alt="MotionMark 1.0 Results" /></p> +<h3 id="kraken-1-1"><a class="header-anchor no-hover-padding" href="#kraken-1-1" aria-label="Anchor link for: kraken-1-1"><span class="link-icon" aria-hidden="true"></span></a> +Kraken 1.1</h3> +<p><a rel="noopener" target="_blank" href="https://mozilla.github.io/krakenbenchmark.mozilla.org/">Kraken</a> is a JavaScript performance benchmark that measures the speed of browsers through different tests extracted from real-world applications and libraries.</p> +<h4 id="chrome-wins"><a class="header-anchor no-hover-padding" href="#chrome-wins" aria-label="Anchor link for: chrome-wins"><span class="link-icon" aria-hidden="true"></span></a> +Chrome wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/kraken.png" alt="Kraken Results" /></p> +<h3 id="octane-2-0"><a class="header-anchor no-hover-padding" href="#octane-2-0" aria-label="Anchor link for: octane-2-0"><span class="link-icon" aria-hidden="true"></span></a> +Octane 2.0</h3> +<p><a rel="noopener" target="_blank" href="https://chromium.github.io/octane/">Octane</a> is a benchmark that measures a JavaScript engine's performance through a suite of tests representing certain use cases in JavaScript applications.</p> +<h4 id="epiphany-wins"><a class="header-anchor no-hover-padding" href="#epiphany-wins" aria-label="Anchor link for: epiphany-wins"><span class="link-icon" aria-hidden="true"></span></a> +Epiphany wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/octane.png" alt="Octane Results" /></p> +<h3 id="webxprt-3"><a class="header-anchor no-hover-padding" href="#webxprt-3" aria-label="Anchor link for: webxprt-3"><span class="link-icon" aria-hidden="true"></span></a> +WebXPRT 3</h3> +<p><a rel="noopener" target="_blank" href="https://www.principledtechnologies.com/benchmarkxprt/webxprt/2018/3_v5/">WebXPRT</a> measures the performance of a browser through six HTML5 and JavaScript scenarios that mirror real-life tasks.</p> +<h4 id="epiphany-wins-1"><a class="header-anchor no-hover-padding" href="#epiphany-wins-1" aria-label="Anchor link for: epiphany-wins-1"><span class="link-icon" aria-hidden="true"></span></a> +Epiphany wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/webxprt.png" alt="WebXPRT 3 Results" /></p> +<h3 id="maze-solver-30x30"><a class="header-anchor no-hover-padding" href="#maze-solver-30x30" aria-label="Anchor link for: maze-solver-30x30"><span class="link-icon" aria-hidden="true"></span></a> +Maze Solver (30x30)</h3> +<p><a rel="noopener" target="_blank" href="https://testdrive-archive.azurewebsites.net/performance/mazesolver/default.html">Maze Solver</a> exercises the browser's handling of CSS 2.1 and CSS 3 layer constructs which are important components of overall web browser performance.</p> +<h4 id="epiphany-wins-2"><a class="header-anchor no-hover-padding" href="#epiphany-wins-2" aria-label="Anchor link for: epiphany-wins-2"><span class="link-icon" aria-hidden="true"></span></a> +Epiphany wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/maze-solver.png" alt="Maze Solver Results" /></p> +<h3 id="speedometer-2-0"><a class="header-anchor no-hover-padding" href="#speedometer-2-0" aria-label="Anchor link for: speedometer-2-0"><span class="link-icon" aria-hidden="true"></span></a> +Speedometer 2.0</h3> +<p><a rel="noopener" target="_blank" href="https://browserbench.org/Speedometer2.0/">Speedometer</a> is a browser benchmark that measures the responsiveness of web applications.</p> +<h4 id="chrome-wins-1"><a class="header-anchor no-hover-padding" href="#chrome-wins-1" aria-label="Anchor link for: chrome-wins-1"><span class="link-icon" aria-hidden="true"></span></a> +Chrome wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/speedometer.png" alt="Speedometer Results" /></p> +<h3 id="ram-usage-with-5-tabs-open"><a class="header-anchor no-hover-padding" href="#ram-usage-with-5-tabs-open" aria-label="Anchor link for: ram-usage-with-5-tabs-open"><span class="link-icon" aria-hidden="true"></span></a> +RAM Usage with 5 tabs open</h3> +<p>I opened a total of five tabs: YouTube, Reddit, DuckDuckGo, GitHub and New York Times.</p> +<h4 id="firefox-wins"><a class="header-anchor no-hover-padding" href="#firefox-wins" aria-label="Anchor link for: firefox-wins"><span class="link-icon" aria-hidden="true"></span></a> +Firefox wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/ram-usage.png" alt="RAM Usage Results" /></p> +<h3 id="overall-results"><a class="header-anchor no-hover-padding" href="#overall-results" aria-label="Anchor link for: overall-results"><span class="link-icon" aria-hidden="true"></span></a> +Overall Results</h3> +<h4 id="chrome-wins-2"><a class="header-anchor no-hover-padding" href="#chrome-wins-2" aria-label="Anchor link for: chrome-wins-2"><span class="link-icon" aria-hidden="true"></span></a> +Chrome wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/overall-result.png" alt="Overall Results" /></p> +<br> +<p>Take note that I didn't include Basemark and JetStream results on the overall average as Firefox and Epiphany were not able to run these benchmarks without crashing, at least on my hardware.</p> +<h3 id="basemark-web-3-0"><a class="header-anchor no-hover-padding" href="#basemark-web-3-0" aria-label="Anchor link for: basemark-web-3-0"><span class="link-icon" aria-hidden="true"></span></a> +Basemark Web 3.0</h3> +<p><a rel="noopener" target="_blank" href="https://web.basemark.com">Basemark Web</a> tests how well a browser performs on web-based applications.</p> +<h4 id="epiphany-wins-3"><a class="header-anchor no-hover-padding" href="#epiphany-wins-3" aria-label="Anchor link for: epiphany-wins-3"><span class="link-icon" aria-hidden="true"></span></a> +Epiphany wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/basemark-web.png" alt="Basemark Web 3.0 Results" /></p> +<h3 id="jetstream-2"><a class="header-anchor no-hover-padding" href="#jetstream-2" aria-label="Anchor link for: jetstream-2"><span class="link-icon" aria-hidden="true"></span></a> +JetStream 2</h3> +<p><a rel="noopener" target="_blank" href="https://browserbench.org/JetStream/">Jetstream</a> rewards browsers that start up quickly, execute code quickly and run smoothly.</p> +<h4 id="chrome-wins-3"><a class="header-anchor no-hover-padding" href="#chrome-wins-3" aria-label="Anchor link for: chrome-wins-3"><span class="link-icon" aria-hidden="true"></span></a> +Chrome wins!</h4> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/jetstream.png" alt="Jetstream 2 Results" /></p> +<h2 id="conclusion"><a class="header-anchor no-hover-padding" href="#conclusion" aria-label="Anchor link for: conclusion"><span class="link-icon" aria-hidden="true"></span></a> +Conclusion</h2> +<p>In the end, all browsers are capable of handling daily tasks. As long as it provides you with regular security updates and also privacy, you do not need to switch to another web browser for a minuscule performance difference. And remember, performance should not be your only consideration on choosing a web browser. Have a nice day!</p> +<h2 id="appendix"><a class="header-anchor no-hover-padding" href="#appendix" aria-label="Anchor link for: appendix"><span class="link-icon" aria-hidden="true"></span></a> +Appendix</h2> +<p>These are the raw benchmark results:</p> +<p><img src="https://seadve.github.io/blog/2-browser-benchmark-comparison-2021/raw-data.png" alt="Raw Benchmark Results" /></p> + + We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium. +… + + diff --git a/tags/benchmark/index.html b/tags/benchmark/index.html new file mode 100644 index 0000000..f8e52b4 --- /dev/null +++ b/tags/benchmark/index.html @@ -0,0 +1 @@ +SeaDve • Benchmark

Benchmark

  • 16th January 2021

Browser Benchmark Comparison 2021: Chrome vs. Edge vs. Firefox vs. Brave vs. Chromium vs. Epiphany

We all know that Google is already dominating the search engine share. Meanwhile, in terms of the browser market share, it is no different. Many browsers nowadays such as Brave and even Microsoft Edge are based on Google's open-source project, Chromium. …

Read more 
\ No newline at end of file diff --git a/tags/gsoc-2023/atom.xml b/tags/gsoc-2023/atom.xml new file mode 100644 index 0000000..61c4585 --- /dev/null +++ b/tags/gsoc-2023/atom.xml @@ -0,0 +1,350 @@ + + + + + + • + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit website + Recent posts + Updated on $DATE + + SeaDve - GSoC 2023 + Application developer based in the Philippines + + date + + Zola + 2023-08-28T20:22:00.002+08:00 + https://seadve.github.io/tags/gsoc-2023/atom.xml + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview) + 2023-08-28T12:29:00.001+08:00 + 2023-08-28T20:22:00.002+08:00 + + seadve + + + https://seadve.github.io/blog/9-gsoc-2023-final-overview/ + + <p>Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project.</p> +<span id="continue-reading"></span><h2 id="about-bustle"><a class="header-anchor no-hover-padding" href="#about-bustle" aria-label="Anchor link for: about-bustle"><span class="link-icon" aria-hidden="true"></span></a> +About Bustle</h2> +<p><a rel="noopener" target="_blank" href="https://gitlab.freedesktop.org/bustle/bustle">Bustle</a> is a graphical application used to analyze <a rel="noopener" target="_blank" href="https://www.freedesktop.org/wiki/Software/dbus/">D-Bus</a> activities. It uses sequence diagrams to present signal emissions and method calls messages.</p> +<p><img src="https://seadve.github.io/blog/9-gsoc-2023-final-overview/old-bustle.png" alt="Old Bustle" /></p> +<p>Bustle represents these messages using a row-based layout. Each row is dedicated to displaying the following information: the elapsed time since the first message, the message path, and the member, which could be the name of the emitted signal or invoked method. On the other hand, individual columns correspond to distinct D-Bus services. Bustle draws arrows that transverse these columns to visualize the communication between services, while arcs represent method invocations and returns. This visual paradigm is valuable as, for instance, it can be used to see which services a D-Bus application talks to and how often, which can be handy in debugging, enhancing security, and optimizing performance within the application.</p> +<h2 id="project-goal"><a class="header-anchor no-hover-padding" href="#project-goal" aria-label="Anchor link for: project-goal"><span class="link-icon" aria-hidden="true"></span></a> +Project Goal</h2> +<p>The ultimate goal of this project is to port Bustle to GTK 4 and rewrite it in Rust. Although the current implementation of Bustle in Haskell and GTK 3 is functional, there are compelling reasons to consider a rewrite in Rust. This includes enabling the tool to take advantage of a range of ergonomic libraries, including <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus">zbus</a>, <a rel="noopener" target="_blank" href="https://github.com/gtk-rs/gtk4-rs">gtk4-rs</a>, and <a rel="noopener" target="_blank" href="https://github.com/courvoif/pcap-file">pcap-file</a>, that would ease the burden in maintenance. Furthermore, the growing Rust community and the availability of the Rust SDK in <a rel="noopener" target="_blank" href="https://flathub.org/">Flathub</a> would make the tool more accessible to potential contributors and simpler to distribute to users.</p> +<p>Porting the tool to <a rel="noopener" target="_blank" href="https://www.gtk.org/">GTK 4</a>, on the other hand, would offer several benefits, such as access to newer and more performant widgets and drawing APIs like <code>GtkListView</code> and <code>GskPath</code>. This would allow Bustle to benefit from the latest developments in the platform and remain current with evolving standards.</p> +<p>Altogether, a rewrite of Bustle in Rust and GTK 4 would provide advantages that can enhance the tool's functionality, maintainability, longevity, accessibility, and possibly efficiency.</p> +<h2 id="work-done"><a class="header-anchor no-hover-padding" href="#work-done" aria-label="Anchor link for: work-done"><span class="link-icon" aria-hidden="true"></span></a> +Work Done</h2> +<p>Most of the tasks in the original proposal have been completed. This includes having an initial MVP, porting GDBus usage to zbus, implementing file loading and saving, completing the recording functionality, and porting the UI, which comprises the diagram, details view, and services filter, to GTK 4.</p> +<p>For more details on the work done, there are also <a rel="noopener" target="_blank" href="https://seadve.github.io/tags/gsoc-2023/">bi-weekly updates</a> on my blog.</p> +<h3 id="snapshots"><a class="header-anchor no-hover-padding" href="#snapshots" aria-label="Anchor link for: snapshots"><span class="link-icon" aria-hidden="true"></span></a> +Snapshots</h3> +<h4 id="diagram-and-details-view"><a class="header-anchor no-hover-padding" href="#diagram-and-details-view" aria-label="Anchor link for: diagram-and-details-view"><span class="link-icon" aria-hidden="true"></span></a> +Diagram and Details View</h4> +<p><img src="https://seadve.github.io/blog/9-gsoc-2023-final-overview/diagram-and-details-view.gif" alt="Diagram and Details View" /></p> +<h4 id="recording-and-services-filter"><a class="header-anchor no-hover-padding" href="#recording-and-services-filter" aria-label="Anchor link for: recording-and-services-filter"><span class="link-icon" aria-hidden="true"></span></a> +Recording and Services Filter</h4> +<p><img src="https://seadve.github.io/blog/9-gsoc-2023-final-overview/recording-and-services-filter.gif" alt="Recording and Services Filter" /></p> +<h2 id="code-merged"><a class="header-anchor no-hover-padding" href="#code-merged" aria-label="Anchor link for: code-merged"><span class="link-icon" aria-hidden="true"></span></a> +Code Merged</h2> +<p>These are the summary of code that has been merged during the GSoC period.</p> +<h3 id="bustle"><a class="header-anchor no-hover-padding" href="#bustle" aria-label="Anchor link for: bustle"><span class="link-icon" aria-hidden="true"></span></a> +Bustle</h3> +<p>Most of the work done is in the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle">Bustle GNOME GitLab repository</a>, where the following pull requests have been merged:</p> +<ul> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/1">Basic parsing and diagram implementation</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/2">Port to zbus</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/3">Drop explicit cargo protocol setting</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/10">Decouple recording monitor from DiagramModel</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/12">Implement system and address monitoring and recording</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/13">Load DiagramModel from file asynchronously</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/14">Stick at the bottom when an item is added to the diagram</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/15">Bump gtk4-rs version</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/18">Improve timestamp accuracy</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/19">Focus on the entry row when dialog presents</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/21">Save DiagramModel to file asynchronously</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/22">Further improve timestamp accuracy</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/23">Handle undefined behavior</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/26">Enable link-time optimization and various cleanups</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/30">Add loading and waiting pages on the window</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/33">Show a toast when clicking copy and other fixes</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/34">Implement diagram columns, arrows, and arcs</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/35">Improve loading performance and code organization</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/36">Implement API to get well-known names from bus names</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/37">Refactor name owner changed signal handling</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/39">Organize diagram files</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/40">Improve file naming</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/41">Monitor code cleanups</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/42">Add support for targeted signals</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/43">Port from libpcap to pcap-file</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/44">Use a more proper column width</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/46">Improving diagram tag styling</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/47">Properly update the color and label of RowTag</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/48">Improving diagram styling</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/50">Propagate errors to the user</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/51">Only show errors when necessary</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/52">Prevent copy when packet data is owned</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/54">Fix DiagramHeader labels UI glitch</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/55">ColorWidget and DiagramView cleanups</a></li> +</ul> +<h3 id="zbus-and-gtk4-rs"><a class="header-anchor no-hover-padding" href="#zbus-and-gtk4-rs" aria-label="Anchor link for: zbus-and-gtk4-rs"><span class="link-icon" aria-hidden="true"></span></a> +zbus and gtk4-rs</h3> +<p>While the project is focused on Bustle, some changes are necessary to be upstreamed to other projects. This includes changes to zbus and gtk4-rs, where the following pull requests have been merged:</p> +<h4 id="zbus"><a class="header-anchor no-hover-padding" href="#zbus" aria-label="Anchor link for: zbus"><span class="link-icon" aria-hidden="true"></span></a> +zbus</h4> +<ul> +<li><a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/370">zb: Add a from_bytes constructor for Message</a></li> +<li><a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/379">zv: Implement Display for Value, Array, Structure, Dict &amp; Maybe</a></li> +<li><a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/450">zv, zn: Improve Str, Owned*Name, BusName Debug implementations</a></li> +</ul> +<h4 id="gtk4-rs"><a class="header-anchor no-hover-padding" href="#gtk4-rs" aria-label="Anchor link for: gtk4-rs"><span class="link-icon" aria-hidden="true"></span></a> +gtk4-rs</h4> +<ul> +<li><a rel="noopener" target="_blank" href="https://github.com/gtk-rs/gtk4-rs/pull/1468">gdk: Make RGBA::new const and add with_* constructors</a></li> +</ul> +<h2 id="code-to-be-merged"><a class="header-anchor no-hover-padding" href="#code-to-be-merged" aria-label="Anchor link for: code-to-be-merged"><span class="link-icon" aria-hidden="true"></span></a> +Code to be Merged</h2> +<p>Due to time constraints and unexpected issues, some of the pull requests are still pending review:</p> +<ul> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/49">Implement services filter</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/53">Port to GskPath APIs</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/56">Make use of GtkMapListModel for layouts</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/57">Implement BusNameList and FilteredBusNameModel</a></li> +<li><a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/58">Fix header expanded height computation</a></li> +</ul> +<h2 id="future-plans"><a class="header-anchor no-hover-padding" href="#future-plans" aria-label="Anchor link for: future-plans"><span class="link-icon" aria-hidden="true"></span></a> +Future Plans</h2> +<p>While most of the tasks in the proposal have been completed, there are still a few things that need to be done, including the following:</p> +<ol> +<li>Optimizing performance</li> +<li>Hunting and squashing bugs: +<ul> +<li>Improving name owner changed signal handling</li> +<li>Drawing method call arc regardless if the row is not drawable</li> +<li>Properly killing the <code>dbus-monitor</code> process</li> +</ul> +</li> +<li>Adding more features: +<ul> +<li>Adding a button that scrolls to the method call message of a method return message or vice-versa</li> +<li>Adding a way to open multiple diagrams at once via tabs and multiple windows</li> +</ul> +</li> +<li>Fixing regressions and releasing the application on Flathub</li> +<li>Continuous involvement and contribution to open-source</li> +</ol> +<h2 id="final-words"><a class="header-anchor no-hover-padding" href="#final-words" aria-label="Anchor link for: final-words"><span class="link-icon" aria-hidden="true"></span></a> +Final Words</h2> +<p>I have to say this is, so far, the most challenging part of my software development journey. It felt like a hackathon since I had to understand things and create something that works quickly. While it was challenging, it was also rewarding as I was able to learn a lot of things and create something that I am proud of. There were moments of time pressure and frustration, but with experimentation, collaboration, and a lot of reading, I was able to overcome these challenges and make meaningful progress. The complexity of the project pushed me out of my comfort zone, forcing me to delve into unfamiliar areas of programming and technology.</p> +<p>Lastly, I would like to express my gratitude to my mentors, <strong>Bilal Elmoussaoui</strong> and <strong>Maximiliano Sandoval</strong>, for tirelessly reviewing my pull requests and guiding me. I would also like to thank the GNOME Foundation and the community, especially the GNOME GSoC admin, <strong>Felipe Borges</strong>, for giving me the opportunity to work on this project. I would also like to extend my appreciation to zbus maintainer, <strong>Zeeshan Ali Khan</strong>, for their help in getting my pull requests merged against zbus and to the original Bustle developer, <strong>Will Thompson</strong>, for their guidance. Finally, I would like to thank my family and friends for their support and encouragement.</p> + + Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10) + 2023-08-19T20:29:00.001+08:00 + 2023-08-19T21:34:00.002+08:00 + + seadve + + + https://seadve.github.io/blog/8-gsoc-2023-week-9-10/ + + <h2 id="progress-made"><a class="header-anchor no-hover-padding" href="#progress-made" aria-label="Anchor link for: progress-made"><span class="link-icon" aria-hidden="true"></span></a> +Progress Made</h2> +<p>I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/34">usable and merge-able state</a>.</p> +<span id="continue-reading"></span> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/diagram.gif" alt="Diagram" /></p> +<p>Aside from that, it now has a header that doesn't overlay on the diagram, the drawings now properly adjust to text scale factor changes, the signal arrows are now drawn, and the rows are no longer clipped into the row titles.</p> +<p>My mentor, Bilal, also worked on <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/45">adding tags</a>, the colored circles in the diagram, so it is easier to determine the category of a message.</p> +<p>On the general UI side, there is now a <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/30">proper loading page</a> that is shown while waiting for the PCAP files to show.</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/loading-page.png" alt="Loading Page" /></p> +<p>However, that may not be as useful as we also landed a <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/commit/d3d29c4c7becb42c33e789287ce467cf0e02ae32">patch</a> that speeds up loading by up to 32 times; that's from 16 seconds on average to 500 milliseconds, when loading a 2.2 MB file.</p> +<p>There is also now a waiting page that shows before the first message arrives while recording.</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/waiting-page.png" alt="Waiting Page" /></p> +<p>We also landed <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/20">statistics window</a> which shows frequencies of messages, durations of method calls, and sizes information of each message.</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/statistics-frequencies-page.png" alt="Statistics Frequencies Page" /></p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/statistics-durations-page.png" alt="Statistics Durations Page" /></p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/statistics-sizes-page.png" alt="Statistics Sizes Page" /></p> +<p>My mentor, Bilal, also worked on adding information on the details view including the body size and signature, and the response time from method return to its call.</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/details-view.png" alt="Details View" /></p> +<p>There is also now a way to <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/28">save the PCAP file as a DOT graph file</a>, which can be used to generate a graph using Graphviz to visualize interactions between bus names like the following:</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/dot-graph.png" alt="DOT Graph" /></p> +<p>On the plumbing side, <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/commit/ba0c05b2a10a5d48f245a61176242a1f2d8175ce">saving to PCAP file is now asynchronous</a>, avoiding blocking the UI. We also ported from using <code>libpcap</code> to a pure Rust library, <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/commit/a43a8f481d7dc8bd7d430eba50bfdf04a11efccb">removing unsafe code and simplifying the codebase</a>. Furthermore, the timestamp computation is now <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/commit/d603ecbc151dfa341a9d500ed7cd37b7292a13c3">more accurate</a>.</p> +<p>As part of making debugging in Bustle easier, I have also submitted a <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/450">patch</a> to <code>zbus</code> to simplify the printing of bus names.</p> +<p>Finally, I started prototyping services filtering. It is still a proof of concept and does not look great, but it already functions and is a good starting point for next week.</p> +<p><img src="https://seadve.github.io/blog/8-gsoc-2023-week-9-10/services-filtering.png" alt="Services Filtering" /></p> +<h2 id="plans-for-the-following-weeks"><a class="header-anchor no-hover-padding" href="#plans-for-the-following-weeks" aria-label="Anchor link for: plans-for-the-following-weeks"><span class="link-icon" aria-hidden="true"></span></a> +Plans for the Following Weeks</h2> +<p>The following weeks will be the last days of GSoC and I will be focusing on finishing up the remaining tasks. With the most difficult part of this GSoC project done, most of the tasks left, aside from services filtering, are optimizing performance and cleaning up the codebase.</p> +<p>There are also a few more things to fix such as a proper name owner changed signal handling, drawing method call arc regardless if the row is not drawable, properly killing the <code>dbus-monitor</code> process, and propagating user-facing errors.</p> +<p>I would also like to add features such as adding a button that scroll to the method call message of a method return message or vice-versa, porting to use the <a rel="noopener" target="_blank" href="https://docs.gtk.org/gsk4/struct.Path.html">new <code>GskPath</code> APIs</a>, and adding a way to open multiple diagrams at once via tabs and multiple windows.</p> +<br> +<p>That's all for this week. Thanks for reading!</p> + + +Progress Made +I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8) + 2023-08-02T18:29:00.001+08:00 + 2023-08-04T21:34:00.002+08:00 + + seadve + + + https://seadve.github.io/blog/7-gsoc-2023-week-7-8/ + + <h2 id="progress-made"><a class="header-anchor no-hover-padding" href="#progress-made" aria-label="Anchor link for: progress-made"><span class="link-icon" aria-hidden="true"></span></a> +Progress Made</h2> +<p>A lot of things happened these past few weeks. First, the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/12">MR to add address and system DBus recording</a> has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the <code>dbus-monitor</code> binary is not found.</p> +<span id="continue-reading"></span> +<p>Second, when recording, the sequence diagram now <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/14">sticks at the bottom</a> because, in common use cases, it is mostly wanted to observe the new messages as they come.</p> +<p><img src="https://seadve.github.io/blog/7-gsoc-2023-week-7-8/sticky-scroll.gif" alt="Sticky Scroll Screencast" /></p> +<p>Moreover, on the smaller changes, <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/13">PCAP file loading is now synchronous</a>, the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/15">gtk4-rs dependency has now been updated to the recently released 0.17 version</a>, the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/18">accuracy of timestamp calculations has been improved</a>, and the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/19">focus issue on the address dialog has been fixed</a>.</p> +<p>Lastly, the signals and method call arrows and arcs are now (finally!) drawn in the diagram. While it looks simple, it took me days to get it right. However, there is no merge request yet since it requires more bug fixing and code cleanup.</p> +<p><img src="https://seadve.github.io/blog/7-gsoc-2023-week-7-8/diagram.png" alt="Diagram With Arrows and Arcs" /></p> +<h2 id="guadec"><a class="header-anchor no-hover-padding" href="#guadec" aria-label="Anchor link for: guadec"><span class="link-icon" aria-hidden="true"></span></a> +GUADEC</h2> +<p>Aside from working on the code, I also attended GUADEC remotely. I had a lightning talk about a bit about myself and an overview of this project.</p> +<h2 id="plans-for-the-following-weeks"><a class="header-anchor no-hover-padding" href="#plans-for-the-following-weeks" aria-label="Anchor link for: plans-for-the-following-weeks"><span class="link-icon" aria-hidden="true"></span></a> +Plans for the Following Weeks</h2> +<p>For the next weeks, the diagram still needs bug fixing and polishing, as mentioned. For instance, it currently does not draw arcs on method calls when either the call or return row is not visible. The header is also only visible when scrolled all the way to the top, and it only shows the unique name instead of the well-known name.</p> +<p>After the diagram is completed, we will go on with the implementation of service filtering and adding a more convenient way to have multiple instances of recording or opened files via tabs.</p> +<br> +<p>That's all for this week. Thanks for reading!</p> + + +Progress Made +A lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6) + 2023-07-19T11:51:00.002+08:00 + 2023-07-19T11:51:00.002+08:00 + + seadve + + + https://seadve.github.io/blog/6-gsoc-2023-week-5-6/ + + <h2 id="progress-made"><a class="header-anchor no-hover-padding" href="#progress-made" aria-label="Anchor link for: progress-made"><span class="link-icon" aria-hidden="true"></span></a> +Progress Made</h2> +<p>This week, the <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/379">PR to implement Display for Value, Array, Structure, Dict, and Maybe</a> has been merged. Thus, there is a much nicer way now upstream to display <code>zbus::Value</code>, similar to <code>GVariant</code>. With this blocker cleared out, the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/2">zbus port MR</a> has also been merged, fully porting the Bustle rewrite to zbus.</p> +<span id="continue-reading"></span> +<p>Furthermore, my mentor, Bilal, started implementing session monitoring and saving to a PCAP file while I continued their work and <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/12">implemented system and address recording</a>. However, it is not yet merged as there are some things to be figured out and more work to do. Specifically, it currently requires a <code>dbus-monitor</code> binary installed on the host, which is not great for distributions that do not package it.</p> +<p><img src="https://seadve.github.io/blog/6-gsoc-2023-week-5-6/address-dialog.png" alt="Address Dialog Screenshot" /></p> +<p>Aside from those mentioned above, I have also been working on drawing the diagram. I am still studying the older Haskell codebase to prevent reinventing the wheel on some implementations. Unfortunately, the current implementation is still not ready enough for a screenshot.</p> +<p>To easily track the missing features, we also set up an <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/boards">issue board</a>.</p> +<h2 id="plans-for-the-following-weeks"><a class="header-anchor no-hover-padding" href="#plans-for-the-following-weeks" aria-label="Anchor link for: plans-for-the-following-weeks"><span class="link-icon" aria-hidden="true"></span></a> +Plans for the Following Weeks</h2> +<p>In the following weeks, I will get the PR to implement and address recording merged and work on more parts of the diagram drawing.</p> +<br> +<p>That's all for this week. Thanks for reading!</p> + + +Progress Made +This week, the PR to implement Display for Value, Array, Structure, Dict, and Maybe has been merged. Thus, there is a much nicer way now upstream to display zbus::Value, similar to GVariant. With this blocker cleared out, the zbus port MR has also been merged, fully porting the Bustle rewrite to zbus. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4) + 2023-07-05T09:30:00.002+08:00 + 2023-07-05T09:30:00.002+08:00 + + seadve + + + https://seadve.github.io/blog/5-gsoc-2023-week-3-4/ + + <h2 id="progress-made"><a class="header-anchor no-hover-padding" href="#progress-made" aria-label="Anchor link for: progress-made"><span class="link-icon" aria-hidden="true"></span></a> +Progress Made</h2> +<p>There's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/370">PR to add <code>from_bytes</code> constructor for <code>zbus::Message</code></a> merged. This means that we can now construct <code>zbus::Message</code> from raw <code>GDBusMessage</code> bytes and vice versa, which is critical for porting Bustle from GDBus to zbus.</p> +<span id="continue-reading"></span> +<p>On the other hand, the <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/379">PR to implement Display for Value, Array, Structure, Dict &amp; Maybe</a> is, while the implementation for <code>zbus::Value::Str</code> and <code>zbus::Value::Array</code> is already fixed, still in the review stage as there are still things to polish, such as figuring out a way to simplify the implementation.</p> +<p>Meanwhile, I have also been experimenting with drawing on the diagram using GTK transform functions such as <code>translate_coordinates</code> and <code>compute_point</code>, but nothing is ready enough yet for a screenshot.</p> +<h2 id="plans-for-the-following-weeks"><a class="header-anchor no-hover-padding" href="#plans-for-the-following-weeks" aria-label="Anchor link for: plans-for-the-following-weeks"><span class="link-icon" aria-hidden="true"></span></a> +Plans for the Following Weeks</h2> +<p>With my finals out of the equation, I could focus more on finishing up drawing the signals and methods arrow on the diagram during the last days of the GSoC midterm period.</p> +<p>I will also push <a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/379">PR to implement Display for Value, Array, Structure, Dict &amp; Maybe</a> to be merged so that the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/2">zbus port MR</a> can also be merged.</p> +<br> +<p>That's all for this week. I'm looking forward to writing more in the next weeks. Thanks for reading!</p> + + +Progress Made +There's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the PR to add from_bytes constructor for zbus::Message merged. This means that we can now construct zbus::Message from raw GDBusMessage bytes and vice versa, which is critical for porting Bustle from GDBus to zbus. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2) + 2023-06-11T19:09:00.005+08:00 + 2023-06-11T19:25:18.353+08:00 + + seadve + + + https://seadve.github.io/blog/4-gsoc-2023-week-1-2/ + + <h2 id="progress-made"><a class="header-anchor no-hover-padding" href="#progress-made" aria-label="Anchor link for: progress-made"><span class="link-icon" aria-hidden="true"></span></a> +Progress Made</h2> +<p>Before the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like.</p> +<span id="continue-reading"></span> +<p>The Rust PCAP library was used to load the packets from the PCAP file, which contains the bytes of a DBus Message. It is nice to use, though it is missing an async API for loading files. That could be fixed in the future, but this week mainly focused on a basic diagram implementation. The bytes can then be parsed through GDBus into a <code>GDBusMessage</code>, which contains the information to implement the diagram.</p> +<p>Through the parsed message, the diagram can be implemented. It uses <code>GtkListView</code> to display the rows as, aside from having a nice separation of view and model, it is more efficient because it recycles widgets, especially since PCAP files could possibly contain thousands of messages. Each row contains the elapsed time, path, destination, interface, and member of the message.</p> +<p><img src="https://seadve.github.io/blog/4-gsoc-2023-week-1-2/diagram-with-list-view-screenshot.png" alt="Diagram With ListView Screenshot" /></p> +<p>Aside from the diagram, a <code>DetailsView</code> was also implemented. It shows the sender and the body, and also the destination, path, and member of the message. For more information about it, you can check out the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/1">merge request</a>.</p> +<p><img src="https://seadve.github.io/blog/4-gsoc-2023-week-1-2/details-view-screenshot.png" alt="DetailsView Screenshot" /></p> +<p>GDBus was used initially as zbus is missing the necessary APIs for parsing messages from bytes. However, the merge requests are already on the way to implement those upstream, including a nicer way to print <code>zbus::Value</code> that would match how <code>GVariant</code>s are printed.</p> +<ul> +<li><a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/379">zv: impl Display for Value, Array, Structure, Dict &amp; Maybe</a></li> +<li><a rel="noopener" target="_blank" href="https://github.com/dbus2/zbus/pull/370">zb: Add a from_bytes constructor for Message</a></li> +</ul> +<h2 id="plans-for-the-following-weeks"><a class="header-anchor no-hover-padding" href="#plans-for-the-following-weeks" aria-label="Anchor link for: plans-for-the-following-weeks"><span class="link-icon" aria-hidden="true"></span></a> +Plans for the Following Weeks</h2> +<p>While the merge requests are in place, there is still some work to do, such as fixing up the Display implementation for <code>zbus::Value::Str</code> and <code>zbus::Value::Array</code>. Once the mentioned merge requests are merged, we could finish up the <a rel="noopener" target="_blank" href="https://gitlab.gnome.org/msandova/bustle/-/merge_requests/2">zbus port</a>.</p> +<p>After the application is fully ported to zbus, we could start working on the more complicated part of the Diagram implementation, like showing signals and the method call and return arrows.</p> +<br> +<p>That's all for this week. See you again in the next weeks. Thanks for reading!</p> + + +Progress Made +Before the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like. +… + + GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction) + 2023-05-11T23:17:00.003+08:00 + 2023-06-11T19:19:30.970+08:00 + + seadve + + + https://seadve.github.io/blog/3-gsoc-2023-introduction/ + + <p>Hello there!</p> +<p>I am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval.</p> +<span id="continue-reading"></span><h2 id="me-and-my-bizarre-open-source-journey"><a class="header-anchor no-hover-padding" href="#me-and-my-bizarre-open-source-journey" aria-label="Anchor link for: me-and-my-bizarre-open-source-journey"><span class="link-icon" aria-hidden="true"></span></a> +Me and my bizarre open-source journey</h2> +<p>Weirdly enough, I first discovered Linux five years ago on a failed attempt to do Hackintosh. I got bored with Windows that I decided to try something new and different, and that's when I eventually stumbled upon Linux, specifically Elementary OS. It did not last for me since I still depend a lot on applications that are only available with Windows.</p> +<p>Fast-forward two years later, I decided to give Linux another try with KDE Neon and migrate my workflows to open-source applications such as LibreOffice, Inkscape, and Kdenlive. I remember feeling adventurous and breaking my system numerous times, though I considered it as part of the learning process. I was intrigued by the idea of being a part of a community of passionate developers and enthusiastic users. I also liked the customization it had. However, as I grew with it, I started to realize that I had spent way too much time configuring things and forgetting to focus on what was really important, and that is when I discovered GNOME.</p> +<p>When I first used GNOME, it was a totally different workflow, and I liked it. It was simple; the UI made sense. At that time, there was some software I was missing, particularly a screen recording application that works nicely on Wayland. That was the time I discovered RecApp. It worked well; however, it looked not at home, even for a GTK application. One of my first contributions was creating a mockup for the redesign, and I also took that opportunity to learn Python and GTK and implement my mockup. I was not necessarily proud of my code, but I was proud and happy about having the chance to contribute to the software I use and the community.</p> +<p>A few months later, as I learned more about programming and the GNOME developer ecosystem, there were many more things I'd like to improve and change in RecApp, some of which other contributors did not agree with. That's when Kooha was born, with a total in-and-out redesign of RecApp and a different focus and ideology. Almost a month later was also the birth of Mousai, a song recognizer application. Since then, I have been maintaining these two applications.</p> +<p>There are definitely a lot of things I missed, but that was a quick summary of my journey with open-source.</p> +<h2 id="more-about-bustle-and-the-project"><a class="header-anchor no-hover-padding" href="#more-about-bustle-and-the-project" aria-label="Anchor link for: more-about-bustle-and-the-project"><span class="link-icon" aria-hidden="true"></span></a> +More about Bustle and the project</h2> +<p>For those who have not heard of Bustle, it is an application used to visualize D-Bus activities. It shows signal emissions, method calls, method returns, and errors, which are useful in observing traffic, debugging, and optimizing performance in D-Bus applications.</p> +<p><img src="https://seadve.github.io/blog/3-gsoc-2023-introduction/old-bustle-screenshot.png" alt="Bustle Screenshot" /></p> +<p>Although the current implementation of Bustle in Haskell and GTK 3 is functional, there are noteworthy reasons to consider a rewrite in Rust. Some of these advantages include having access to a range of libraries, such as zbus, gtk4-rs, and LibPCAP bindings. Aside from this, the growing Rust community and the availability of the Rust SDK in Flathub would make the tool more accessible to contributors and simpler to distribute to the users. On the other hand, porting Bustle to GTK 4 would over benefits such as the newer and more modern LibAdwaita widgets and ListView API, which would make it easier for the tool to comply with the HIG and benefit from the latest developments in the platform.</p> +<p>Altogether, this rewrite and port will contribute to the maintainability, accessibility, and future-proofing of Bustle through the use of newer technologies and arguably more ergonomic technologies.</p> +<br> +<p>I will be posting updates about the project every few weeks for the next few months, including more details about the plans for this GSoC project. If you'd like to talk about something, feel free to contact me at Matrix <code>@sedve:matrix.org</code>.</p> +<p>Thanks for reading!</p> + + Hello there! +I am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval. +… + + diff --git a/tags/gsoc-2023/index.html b/tags/gsoc-2023/index.html new file mode 100644 index 0000000..bd349b0 --- /dev/null +++ b/tags/gsoc-2023/index.html @@ -0,0 +1 @@ +SeaDve • GSoC 2023

GSoC 2023

  • 28th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Final Overview)

Over the summer, for 12 weeks, I worked on rewriting Bustle in Rust and GTK 4 as part of the Google Summer of Code (GSoC) 2023 program. This post is an overview of the work done and the future plans for the project. …

Read more 
  • 19th August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 9 & 10)

Progress Made I am thrilled to announce that a lot of progress happened once again over the past few weeks! Starting with the most important thing, the diagram, a lot of bugs has been squashed and the rendering performance is now improved to a usable and merge-able state. …

Read more 
  • 2nd August 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 7 & 8)

Progress Made A lot of things happened these past few weeks. First, the MR to add address and system DBus recording has already been merged. Though, before that was merged, a few revisions have been made: it now parses from messages bytes directly, instead of a PCAP stream, to prevent overhead. Additionally, it now properly propagates errors, such as when the dbus-monitor binary is not found. …

Read more 
  • 19th July 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 5 & 6)

Progress Made This week, the PR to implement Display for Value, Array, Structure, Dict, and Maybe has been merged. Thus, there is a much nicer way now upstream to display zbus::Value, similar to GVariant. With this blocker cleared out, the zbus port MR has also been merged, fully porting the Bustle rewrite to zbus. …

Read more 
  • 5th July 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 3 & 4)

Progress Made There's unfortunately not a lot to talk about for the past two weeks as I have been really absorbed with finals at my university. However, while preparing for the finals, we got the PR to add from_bytes constructor for zbus::Message merged. This means that we can now construct zbus::Message from raw GDBusMessage bytes and vice versa, which is critical for porting Bustle from GDBus to zbus. …

Read more 
  • 11th June 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Week 1 & 2)

Progress Made Before the GSoC coding period started, I started implementing the diagram used to display DBus activity with the help of the template repository made by my mentor, Maximiliano. One of the first challenges is figuring out how to load the PCAP files, which is the format Bustle uses to store the DBus messages. Without implementing that first, it would be difficult to test how the diagram will look like. …

Read more 
  • 11th May 2023

GSoC 2023: Rust and GTK 4 Bustle Rewrite (Introduction)

Hello there! I am Dave Patrick Caberto, a first-year Electronics Engineering student from Bataan Peninsula State University, Philippines. This summer, I will be working on the Rust and GTK 4 rewrite of Bustle, a D-Bus activity visualizer, with the guidance of my mentors, Bilal Elmoussaoui and Maximiliano Sandoval. …

Read more 
\ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..e00288c --- /dev/null +++ b/tags/index.html @@ -0,0 +1 @@ +SeaDve • Tags

All tags

\ No newline at end of file diff --git a/tags/software/atom.xml b/tags/software/atom.xml new file mode 100644 index 0000000..cdb3ef4 --- /dev/null +++ b/tags/software/atom.xml @@ -0,0 +1,196 @@ + + + + + + • + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit website + Recent posts + Updated on $DATE + + SeaDve - Software + Application developer based in the Philippines + + date + + Zola + 2024-03-24T12:29:00.001+08:00 + https://seadve.github.io/tags/software/atom.xml + Kooha 2.3 Released! + 2024-03-24T12:29:00.001+08:00 + 2024-03-24T12:29:00.001+08:00 + + seadve + + + https://seadve.github.io/blog/10-kooha-2-3/ + + <blockquote> +<p><a rel="noopener" target="_blank" href="https://github.com/SeaDve/Kooha">Kooha</a> is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings.</p> +</blockquote> +<p>While we strive to keep Kooha simple, we also want to make it better. This release, composed of over <a rel="noopener" target="_blank" href="https://github.com/SeaDve/Kooha/compare/v2.2.4...v2.3.0">300 commits</a>, is focused on quality-of-life improvements and bug fixes.</p> +<span id="continue-reading"></span> +<p>This release includes a refined interface, improved area selection, more informative notifications, and other changes. Read on to learn more about the new features and improvements.</p> +<h2 id="new-features-and-improvements"><a class="header-anchor no-hover-padding" href="#new-features-and-improvements" aria-label="Anchor link for: new-features-and-improvements"><span class="link-icon" aria-hidden="true"></span></a> +New Features and Improvements</h2> +<h3 id="refined-interface"><a class="header-anchor no-hover-padding" href="#refined-interface" aria-label="Anchor link for: refined-interface"><span class="link-icon" aria-hidden="true"></span></a> +Refined Interface</h3> +<p>The main screen now has a more polished look. It now shows the selected format and FPS. This makes it easier to see the current settings at a glance, without having to open the settings window.</p> +<p><img src="https://seadve.github.io/blog/10-kooha-2-3/main-screen.png" alt="Main Screen Screenshot" /></p> +<p>Other than that, progress is now shown when flushing the recording. This gives a better indication when encoding or saving is taking longer than expected.</p> +<p><img src="https://seadve.github.io/blog/10-kooha-2-3/flushing.png" alt="Flushing Page Screenshot" /></p> +<p>Furthermore, the preferences window is also improved. It is now more descriptive and selecting FPS is now easier with a dropdown menu.</p> +<p><img src="https://seadve.github.io/blog/10-kooha-2-3/preferences-window.png" alt="Preferences Window Screenshot" /></p> +<h3 id="improved-area-selection"><a class="header-anchor no-hover-padding" href="#improved-area-selection" aria-label="Anchor link for: improved-area-selection"><span class="link-icon" aria-hidden="true"></span></a> +Improved Area Selection</h3> +<p>The area selection window is now resizable. You can now resize the window to fit your screen better. Additionally, the previously selected area is now remembered across sessions. This means that if you close Kooha and open it again, the area you selected will be remembered. Other improvements include improved focus handling, sizing fixes, better performance, and a new style.</p> +<p><img src="https://seadve.github.io/blog/10-kooha-2-3/area-selection-window.png" alt="Area Selection Window Screenshot" /></p> +<h3 id="more-informative-notifications"><a class="header-anchor no-hover-padding" href="#more-informative-notifications" aria-label="Anchor link for: more-informative-notifications"><span class="link-icon" aria-hidden="true"></span></a> +More Informative Notifications</h3> +<p>Record-done notifications now show the duration and size of the recorded video. This is inspired by GNOME Shell screencast notifications.</p> +<p><img src="https://seadve.github.io/blog/10-kooha-2-3/notification.png" alt="Notification Screenshot" /></p> +<p>Moreover, the notification actions now work even when the application is closed.</p> +<h3 id="other-changes"><a class="header-anchor no-hover-padding" href="#other-changes" aria-label="Anchor link for: other-changes"><span class="link-icon" aria-hidden="true"></span></a> +Other Changes</h3> +<p>Besides the mentioned features, this release also includes:</p> +<ul> +<li>Logout and idle are now inhibited while recording.</li> +<li>The audio no longer stutters and gets corrupted when recording for a long time.</li> +<li>The audio is now recorded in stereo instead of mono when possible.</li> +<li>The recordings are no longer deleted when flushing is canceled.</li> +<li>Incorrect output video orientation on certain compositors is now fixed.</li> +<li>Performance and stability are improved.</li> +</ul> +<h2 id="getting-kooha-2-3"><a class="header-anchor no-hover-padding" href="#getting-kooha-2-3" aria-label="Anchor link for: getting-kooha-2-3"><span class="link-icon" aria-hidden="true"></span></a> +Getting Kooha 2.3</h2> +<p>Kooha is available on <a rel="noopener" target="_blank" href="https://flathub.org/apps/io.github.seadve.Kooha">Flathub</a>. You can install it from there, and since all of our code is open-source and can be freely modified and distributed according to the license, you can also <a rel="noopener" target="_blank" href="https://github.com/SeaDve/Kooha/releases/tag/v2.3.0">download</a> and build it from source.</p> +<h2 id="closing-words"><a class="header-anchor no-hover-padding" href="#closing-words" aria-label="Anchor link for: closing-words"><span class="link-icon" aria-hidden="true"></span></a> +Closing Words</h2> +<p>Thanks to everyone who has supported Kooha, be it through donations, bug reports, translations, or just using it. Your support is what keeps this project going. Enjoy the new release!</p> + + +Kooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings. + +While we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes. +… + + Best Linux Distros for Beginners in 2021 + 2021-01-14T17:29:00.004+08:00 + 2021-01-15T17:29:00.004+08:00 + + seadve + + + https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/ + + <p>Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you.</p> +<span id="continue-reading"></span> +<p>Note that this list may vary from user to user. The main criteria I use are ease of use, user experience, and software and hardware support.</p> +<h3 id="5-linux-mint"><a class="header-anchor no-hover-padding" href="#5-linux-mint" aria-label="Anchor link for: 5-linux-mint"><span class="link-icon" aria-hidden="true"></span></a> +5. Linux Mint</h3> +<p><img src="https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/linux-mint.png" alt="Linux Mint Screenshot" /></p> +<p><em>Pros</em></p> +<ul> +<li>Very lightweight and snappy</li> +<li>Great experience for former Windows users</li> +<li>Great for older laptops</li> +</ul> +<p><em>Cons</em></p> +<ul> +<li>The desktop looks dated</li> +</ul> +<p><a rel="noopener" target="_blank" href="https://linuxmint.com/">Linux Mint</a> is an Ubuntu-based distro. It comes with the Cinnamon DE environment by default which is noticeably lighter compared to GNOME. But if you do not like Cinnamon, you can choose between XFCE and MATE which are both similarly fast and light desktop environments.</p> +<p>It comes with the traditional desktop experience, so it would work great for users who came from Windows. It is very customizable and there are a lot of themes to choose from.</p> +<h3 id="4-elementary-os"><a class="header-anchor no-hover-padding" href="#4-elementary-os" aria-label="Anchor link for: 4-elementary-os"><span class="link-icon" aria-hidden="true"></span></a> +4. Elementary OS</h3> +<p><img src="https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/elementary-os.png" alt="Elementary OS Screenshot" /></p> +<p><em>Pros</em></p> +<ul> +<li>Very simple to use</li> +<li>It looks beautiful and minimal</li> +<li>Supportive app store to indie developers</li> +</ul> +<p><em>Cons</em></p> +<ul> +<li>You cannot choose other DE besides Pantheon</li> +</ul> +<p><a rel="noopener" target="_blank" href="https://elementary.io/">Elementary OS</a> is yet another Ubuntu-based distro, but the difference is that it comes with its own desktop environment, Pantheon, and a minimal set of applications. It is arguably macOS-inspired due to its design language, dock, and the system panel on the top.</p> +<p>To be honest, it is one of the most beautiful Linux distros and its minimalistic look adds to the beauty. The thing I like the most about Elementary OS is its app store which makes it seamless to help hard-working developers.</p> +<h3 id="3-pop-os"><a class="header-anchor no-hover-padding" href="#3-pop-os" aria-label="Anchor link for: 3-pop-os"><span class="link-icon" aria-hidden="true"></span></a> +3. Pop!_OS</h3> +<p><img src="https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/pop-os.jpeg" alt="Pop!_OS Screenshot" /></p> +<p><em>Pros</em></p> +<ul> +<li>Great Nvidia support</li> +<li>Backed by a hardware-selling company</li> +<li>Disk encryption on by default</li> +</ul> +<p><em>Cons</em></p> +<ul> +<li>Desktop environment choice is limited to GNOME</li> +<li>Not very good with older hardware with less than 1 GB of RAM</li> +</ul> +<p><a rel="noopener" target="_blank" href="https://pop.system76.com/">Pop!_OS</a> is an Ubuntu-based Linux distro backed by System76. No wonder why they have better Nvidia driver support as the company backing them sells laptops powered by Nvidia.</p> +<p>It provides a snappy and polished experience with the help of a slightly-modified GNOME desktop environment. It also comes with an auto-tiling extension which could be handy for power users.</p> +<h3 id="2-ubuntu"><a class="header-anchor no-hover-padding" href="#2-ubuntu" aria-label="Anchor link for: 2-ubuntu"><span class="link-icon" aria-hidden="true"></span></a> +2. Ubuntu</h3> +<p><img src="https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/ubuntu.png" alt="Ubuntu Screenshot" /></p> +<p><em>Pros</em></p> +<ul> +<li>Great out-of-the-box experience</li> +<li>Backed by a company</li> +<li>Many desktop environments to choose from</li> +<li>Great community support</li> +</ul> +<p><em>Cons</em></p> +<ul> +<li>GNOME DE could be heavy with older hardware</li> +</ul> +<p><a rel="noopener" target="_blank" href="https://ubuntu.com/">Ubuntu</a> is a Debian-based Linux distro that is backed by Canonical. It comes with GNOME as the default desktop environment, but it comes with others to choose from like Kubuntu (KDE), Lubuntu (LXQt), Ubuntu Mate, UbuntuDDE (Deepin), and many more.</p> +<p>It is simple and easy to operate once you get used to it. Community support is also one of its selling points due to its popularity. It also offers many useful preinstalled applications that could give you a head start.</p> +<h2 id="honorable-mentions"><a class="header-anchor no-hover-padding" href="#honorable-mentions" aria-label="Anchor link for: honorable-mentions"><span class="link-icon" aria-hidden="true"></span></a> +Honorable Mentions</h2> +<h3 id="opensuse"><a class="header-anchor no-hover-padding" href="#opensuse" aria-label="Anchor link for: opensuse"><span class="link-icon" aria-hidden="true"></span></a> +OpenSUSE</h3> +<p>It is a distro that is sponsored by a German company, SUSE. You can choose a rolling or stable release. It might not focus on simplicity, but it offers the user great flexibility.</p> +<h3 id="deepin"><a class="header-anchor no-hover-padding" href="#deepin" aria-label="Anchor link for: deepin"><span class="link-icon" aria-hidden="true"></span></a> +Deepin</h3> +<p>It is a Debian-based distro that comes with its own desktop environment and set of applications. Not only that, but it is subjectively one of the best-looking distros aside from Elementary.</p> +<h3 id="manjaro"><a class="header-anchor no-hover-padding" href="#manjaro" aria-label="Anchor link for: manjaro"><span class="link-icon" aria-hidden="true"></span></a> +Manjaro</h3> +<p>This is an Arch-based distro. It is like Arch, but it is already configured out-of-the-box without having to manually install the operating system.</p> +<h3 id="kde-neon"><a class="header-anchor no-hover-padding" href="#kde-neon" aria-label="Anchor link for: kde-neon"><span class="link-icon" aria-hidden="true"></span></a> +KDE Neon</h3> +<p>This is a Linux distro based on Ubuntu LTS versions. It comes with the latest and greatest KDE packages. KDE Plasma, I would say, is the most customizable desktop environment. It has great support with theme engines like Kvantum.</p> +<h3 id="debian"><a class="header-anchor no-hover-padding" href="#debian" aria-label="Anchor link for: debian"><span class="link-icon" aria-hidden="true"></span></a> +Debian</h3> +<p>It is one of the oldest and most stable Linux distros out there. However, for developers, the packages in the repository may be out-of-date.</p> +<br> +<h3 id="1-fedora"><a class="header-anchor no-hover-padding" href="#1-fedora" aria-label="Anchor link for: 1-fedora"><span class="link-icon" aria-hidden="true"></span></a> +1. Fedora</h3> +<p><img src="https://seadve.github.io/blog/1-best-linux-distros-for-beginners-2021/fedora.png" alt="Fedora Screenshot" /></p> +<p><em>Pros</em></p> +<ul> +<li>Great open-source approach</li> +<li>Vanilla GNOME experience</li> +<li>Backed by Red Hat</li> +<li>Very polished experience</li> +</ul> +<p><em>Cons</em></p> +<ul> +<li>Software options might be limited</li> +</ul> +<p><a rel="noopener" target="_blank" href="https://fedoraproject.org/">Fedora</a> is subjectively the best Linux distro of all time. Like Ubuntu, you are not limited to the GNOME desktop environment due to the variety of officially supported spins. It also comes with strictly FOSS-only preinstalled apps, which might limit your software choice if you do not add additional repositories.</p> +<p>It is great for laptops because they are packed with additional optimizations for better battery life. Furthermore, it is also easier to update the system as its application and system updates are handled within the same application, unlike Ubuntu.</p> +<h2 id="conclusion"><a class="header-anchor no-hover-padding" href="#conclusion" aria-label="Anchor link for: conclusion"><span class="link-icon" aria-hidden="true"></span></a> +Conclusion</h2> +<p>There is really no best Linux distro. All distros have their purposes that will serve a specific person. No one can tell you what is the best Linux distro. This is just a guide to help you consider a distro that will work best for you. Why not fire up that VM and you can decide for yourself?</p> +<br> +<p>If you have opinions on the list, feel free to comment below. Have a good day!</p> + + Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you. +… + + diff --git a/tags/software/index.html b/tags/software/index.html new file mode 100644 index 0000000..6ead2a5 --- /dev/null +++ b/tags/software/index.html @@ -0,0 +1 @@ +SeaDve • Software

Software

  • 24th March 2024

Kooha 2.3 Released!

Kooha is a simple screen recorder for Linux with a minimal interface. You can simply click the record button without having to configure a bunch of settings. While we strive to keep Kooha simple, we also want to make it better. This release, composed of over 300 commits, is focused on quality-of-life improvements and bug fixes. …

Read more 
  • 14th January 2021

Best Linux Distros for Beginners in 2021

Choosing a Linux distro is not an easy task. New users might be overwhelmed with the hundreds of distros to choose from compared to Windows with just a few versions to choose from. I cannot really tell you which is the best for you as we come with different needs and motives, but here is a list of Linux distros that will help you determine what could be the best for you. …

Read more 
\ No newline at end of file