blob: 809d3bfa798c62efaf640d1b17732b72917379d8 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Pseudo File System &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../../_static/custom.css" />
<link rel="shortcut icon" href="../../_static/favicon.ico"/>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<script src="../../_static/clipboard.min.js"></script>
<script src="../../_static/copybutton.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Special Files and Device Numbers" href="special_files_dev_num.html" />
<link rel="prev" title="NuttX FLAT Binary Format (NXFLAT)" href="nxflat.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../../latest" selected="selected">latest</option>
<option value="../../../10.0.0" >10.0.0</option>
<option value="../../../10.0.1" >10.0.1</option>
<option value="../../../10.1.0" >10.1.0</option>
<option value="../../../10.2.0" >10.2.0</option>
<option value="../../../10.3.0" >10.3.0</option>
<option value="../../../11.0.0" >11.0.0</option>
<option value="../../../12.0.0" >12.0.0</option>
<option value="../../../12.1.0" >12.1.0</option>
<option value="../../../12.2.0" >12.2.0</option>
<option value="../../../12.2.1" >12.2.1</option>
<option value="../../../12.3.0" >12.3.0</option>
<option value="../../../12.4.0" >12.4.0</option>
<option value="../../../12.5.0" >12.5.0</option>
<option value="../../../12.5.1" >12.5.1</option>
<option value="../../../12.6.0" >12.6.0</option>
<option value="../../../12.7.0" >12.7.0</option>
<option value="../../../12.8.0" >12.8.0</option>
<option value="../../../12.9.0" >12.9.0</option>
<option value="../../../12.10.0" >12.10.0</option>
<option value="../../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">OS Components</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../binfmt.html">Binary Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/index.html">Device Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxflat.html">NXFLAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../nxgraphics/index.html">NX Graphics Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../paging.html">On-Demand Paging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../audio/index.html">Audio Subsystem</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">NuttX File System</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="index.html#virtual-file-system-vfs">Virtual File System (VFS)</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="index.html#file-systems">File systems</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="aio.html">Asynchronous I/O support</a></li>
<li class="toctree-l4"><a class="reference internal" href="binfs.html">BINFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="cromfs.html">CROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="fat.html">FAT</a></li>
<li class="toctree-l4"><a class="reference internal" href="hostfs.html">Host File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="littlefs.html">LITTLEFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="mmap.html">File mapping emulation (mmap)</a></li>
<li class="toctree-l4"><a class="reference internal" href="mnemofs.html">MNEMOFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nfs.html">NFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxffs.html">NXFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="partition.html">Partition Table</a></li>
<li class="toctree-l4"><a class="reference internal" href="procfs.html">PROCFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="romfs.html">ROMFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="rpmsgfs.html">RPMSG File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="smartfs.html">SMARTFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="shmfs.html">Shared Memory File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="spiffs.html">SPIFFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="tmpfs.html">TMPFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="unionfs.html">Union File System</a></li>
<li class="toctree-l4"><a class="reference internal" href="userfs.html">User file system</a></li>
<li class="toctree-l4"><a class="reference internal" href="zipfs.html">ZipFS</a></li>
<li class="toctree-l4"><a class="reference internal" href="inotify.html">Inotify</a></li>
<li class="toctree-l4"><a class="reference internal" href="nuttxfs.html">Nuttx FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="nxflat.html">NuttX FLAT Binary Format (NXFLAT)</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Pseudo File System</a><ul>
<li class="toctree-l5"><a class="reference internal" href="#overview">Overview</a></li>
<li class="toctree-l5"><a class="reference internal" href="#faq">FAQ</a></li>
</ul>
</li>
<li class="toctree-l4"><a class="reference internal" href="special_files_dev_num.html">Special Files and Device Numbers</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html">V9FS</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#adding-v9fs-to-the-nuttx-configuration">Adding V9FS to the NuttX Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="v9fs.html#nfs-mount-command">NFS Mount Command</a></li>
<li class="toctree-l4"><a class="reference internal" href="index.html#fs-categories">FS Categories</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../libs/index.html">NuttX libraries</a></li>
<li class="toctree-l2"><a class="reference internal" href="../net/index.html">Network Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mm/index.html">Memory Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../syscall.html">Syscall Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tools/index.html"><code class="docutils literal notranslate"><span class="pre">/tools</span></code> Host Tools</a></li>
<li class="toctree-l2"><a class="reference internal" href="../arch/index.html">Architecture-Specific Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../boards.html">Boards Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cmake.html">CMake Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../openamp.html">OpenAMP Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../video.html">Video Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crypto.html">Crypto API Subsystem</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireless.html">Wireless Subsystem</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../logos/index.html">NuttX Logos</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="../index.html">OS Components</a></li>
<li class="breadcrumb-item"><a href="index.html">NuttX File System</a></li>
<li class="breadcrumb-item active">Pseudo File System</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/components/filesystem/pseudofs.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="pseudo-file-system">
<h1>Pseudo File System<a class="headerlink" href="#pseudo-file-system" title="Permalink to this heading"></a></h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Migrated from:
<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Pseudo+File+System">https://cwiki.apache.org/confluence/display/NUTTX/Pseudo+File+System</a></p>
</div>
<section id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2>
<section id="pseudo-root-file-system">
<h3>Pseudo Root File System<a class="headerlink" href="#pseudo-root-file-system" title="Permalink to this heading"></a></h3>
<p>NuttX includes an optional, scalable file system. As a minimum, this may
be a simple in-memory, pseudo file system. This is an in-memory file
system because it does not require any storage medium or block driver
support. Rather, file system contents are generated on-the-fly as
referenced via standard file system operations (open, close, read,
write, etc.). In this sense, the file system is a pseudo file system
(in the same sense that the Linux <code class="docutils literal notranslate"><span class="pre">/proc</span></code> file system is also referred
to as a pseudo file system).</p>
<p>Any user supplied data or logic can be accessed via the pseudo-file
system. Built in support is provided for character, block, and MTD
(Memory Technology Device) drivers in the <code class="docutils literal notranslate"><span class="pre">/dev</span></code> pseudo file system
directory.</p>
</section>
<section id="special-files">
<h3>Special Files<a class="headerlink" href="#special-files" title="Permalink to this heading"></a></h3>
<p>NuttX does not support special files in the way that, say,
Linux does. In fact, it is more correct to say that NuttX
file systems do not support special files at all.</p>
<p>NuttX does, however, support Linux-like special <cite>device node</cite>,
character driver, and block driver files (as well as NuttX-specific
mountpoint, named semaphore, message queue, and shared memory
special files). However, these are not special files in sense
that the term special files is used in a POSIX environment: In
NuttX these special files may <cite>only</cite> be created in the root
pseudo-file system. For the case of device nodes, see <a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Device+Nodes">Device
Nodes</a>
for further information.</p>
<p>In NuttX, the underlying principle is that all <cite>named resources</cite>
appear as special files in the root pseudo-file system and are
managed by the VFS.</p>
</section>
<section id="mounted-volumes">
<h3>Mounted Volumes<a class="headerlink" href="#mounted-volumes" title="Permalink to this heading"></a></h3>
<p>The simple in-memory file system can be extended by mounting block
devices that provide access to true file systems backed up via
some mass storage device. NuttX supports the standard mount()
command that allows a block driver to be bound to a mount point
within the pseudo file system and to a file system. At present,
NuttX supports the standard VFAT and ROMFS file systems, a
special, wear-levelling NuttX FLASH File System (NXFFS), as well
as a Network File System client (NFS version 3, UDP).</p>
</section>
<section id="comparison-to-linux">
<h3>Comparison to Linux<a class="headerlink" href="#comparison-to-linux" title="Permalink to this heading"></a></h3>
<p>From a programming perspective, the NuttX file system appears
very similar to a Linux file system. However, there is a
fundamental difference: The NuttX root file system is a pseudo
file system and true file systems may be mounted in the pseudo
file system. In the typical Linux installation by comparison,
the Linux root file system is a true file system and pseudo
file systems may be mounted in the true, root file system.
The approach selected by NuttX is intended to support greater
scalability from the very tiny platform to the moderate platform.</p>
</section>
</section>
<section id="faq">
<h2>FAQ<a class="headerlink" href="#faq" title="Permalink to this heading"></a></h2>
<p><strong>Question</strong>: I’m wondering why I can’t create a directory. If
I try to create a dir.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>/mnt
</pre></div>
</div>
<p>I get this,</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>nsh:<span class="w"> </span>mkdir:<span class="w"> </span>mkdir<span class="w"> </span>failed:<span class="w"> </span><span class="m">2</span>
</pre></div>
</div>
<p>although if I do this it creates both directories, mnt and sda</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mount<span class="w"> </span>-t<span class="w"> </span>vfat<span class="w"> </span>/dev/mmcsd0<span class="w"> </span>/mnt/sda
</pre></div>
</div>
<p><strong>Answer</strong>: This is because the top level directories are part of a
<cite>pseudo-filesystem</cite> – like the Linux <code class="docutils literal notranslate"><span class="pre">proc/</span></code> or <code class="docutils literal notranslate"><span class="pre">sys/</span></code> file systems.
But the NuttX pseudo-file system begins at the top level <code class="docutils literal notranslate"><span class="pre">/</span></code>.</p>
<p>What that really means is that you do must have
<code class="docutils literal notranslate"><span class="pre">CONFIG_DISABLE_PSEUDOFS_OPERATIONS</span></code> selected. Because you
can normally create directories in the pseudo-filesystem
with not problem:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>NuttShell<span class="w"> </span><span class="o">(</span>NSH<span class="o">)</span><span class="w"> </span>NuttX-9.0.0
nsh&gt;<span class="w"> </span>mkdir<span class="w"> </span>/mnt
nsh&gt;<span class="w"> </span>ls
/:
dev/
etc/
mnt/
proc/
tmp/
nsh&gt;<span class="w"> </span>ls<span class="w"> </span>mnt
/mnt:
nsh&gt;
</pre></div>
</div>
<p>But lets assume that you do have operations on the pseudo-file
system disabled. Why doesn’t it work? There is no <cite>real</cite> media
there so you cannot create a file there or create any directories
there. The <code class="docutils literal notranslate"><span class="pre">mount</span></code> command is special, it knows how to create mount
points in the pseudo-file system.</p>
<p>The pseudo-file system is just a tree structure in RAM.
It serves two purposes: (1) you don’t have to have a real
file system to use NuttX.
It comes up out-of-the-box with usable (but limited)
pseudo-file system. That allows a little more civilized
programming environment on even very resource limited MCUs.
And (2) this pseudo-file system is a place where all special
NuttX files are retained: Character drivers, block drivers,
and mount points.</p>
<p>The NuttX top-level pseudo-filesystem creates the <cite>illusion</cite> of
directories and provides a consistent, seamless semantic for
interacting with mounted file systems. If there is a file
called <code class="docutils literal notranslate"><span class="pre">hello.txt</span></code> in your volume mounted at <code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code>, then:</p>
<p><code class="docutils literal notranslate"><span class="pre">/mnt</span></code> - is a <cite>node</cite> in the pseudo-filesystem that does
nothing but contain the name mnt and provide links
to things <cite>under</cite> <code class="docutils literal notranslate"><span class="pre">mnt</span></code>.</p>
<p><code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code> - This refers to a node that contains the name
sda that can be found <cite>under</cite> the node with the name mnt.
This node is a special <cite>mountpoint node</cite> in the pseudo-filesystem.
It contains the methods needed to interact will real file system.
Everything <cite>below</cite> <code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code> is in the physical media.</p>
<p><code class="docutils literal notranslate"><span class="pre">/mnt/sda/hello.txt</span></code> - This, then refers to the file
<code class="docutils literal notranslate"><span class="pre">hello.txt</span></code> at the relative path <code class="docutils literal notranslate"><span class="pre">hello.txt</span></code> on the mounted media.
The transition from the pseudo-filesystem to the
real media is seamless.</p>
<p>This is a little different from Linux: Linux always
has to boot up with a <cite>real</cite> file system – even if it
is only a initrd RAM disk.
In Linux, these special files (links, drivers, pipes,
etc.) reside on real media and can reside in any
Linux-compatible filesystem.</p>
<p>Normal <code class="docutils literal notranslate"><span class="pre">mkdir</span></code> can only work if there is a <cite>real</cite> filesystem
at the location. There are no real directories in the
pseudo-filesystem. The pseudo-filesystem does support
<cite>nodes</cite> that look like directories and have some of the
properties of directories (like the node <code class="docutils literal notranslate"><span class="pre">/mnt</span></code> mentioned
above). But this is really an illusion.</p>
<p>If <code class="docutils literal notranslate"><span class="pre">CONFIG_DISABLE_PSEUDOFS_OPERATIONS</span></code> is not enabled,
then NuttX adds the capability to create new, empty <cite>nodes</cite>
in the pseudo-filesystem using <code class="docutils literal notranslate"><span class="pre">mkdir</span></code>, completing the illusion.</p>
<p>[On the other hand, all directories are really an
<cite>illusion</cite> in a way and I suppose that in that sense
these nodes the pseudo-filesystem are just as <cite>real</cite>
as any other directory.]</p>
<p>After you mount the SD card at <code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code>, then you can do:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>mkdir<span class="w"> </span>/mnt/sda/newdir
</pre></div>
</div>
<p>That should work fine and should create a directory at
the relative path <code class="docutils literal notranslate"><span class="pre">newdir</span></code> in the mounted volume.</p>
<p>There are a few other special NSH commands like mount that
can change the pseudo-filesystem. Like <code class="docutils literal notranslate"><span class="pre">losetup</span></code>, <code class="docutils literal notranslate"><span class="pre">mkfifo</span></code>,
<code class="docutils literal notranslate"><span class="pre">mkrd</span></code>, <code class="docutils literal notranslate"><span class="pre">umount</span></code>, etc.
In fact, these commands <cite>only</cite> work in the pseudo-filesystem.
Try them in <code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code>… they won’t work.</p>
<p>But none of the <cite>normal</cite> commands that modify files or directories
will work in the pseudo-filesystem: <code class="docutils literal notranslate"><span class="pre">mkdir</span></code>, <code class="docutils literal notranslate"><span class="pre">mv</span></code>, <code class="docutils literal notranslate"><span class="pre">rm</span></code>, <code class="docutils literal notranslate"><span class="pre">rmdir</span></code>.
These all require real media. They will not work in the
pseudo-filesystem, but will work in <code class="docutils literal notranslate"><span class="pre">/mnt/sda</span></code>.</p>
<p>And trying to pipe to something in the pseudo-filesystem
will also fail. You cannot do this, for example:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>NuttShell<span class="w"> </span><span class="o">(</span>NSH<span class="o">)</span><span class="w"> </span>NuttX-6.20
nsh&gt;<span class="w"> </span>cat<span class="w"> </span><span class="s2">&quot;Hello, World!&quot;</span><span class="w"> </span>&gt;/hello.text
nsh:<span class="w"> </span>cat:<span class="w"> </span>open<span class="w"> </span>failed:<span class="w"> </span><span class="m">22</span>
nsh&gt;
</pre></div>
</div>
<p>See also NxFileSystem in
<a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Porting+Guide">Porting Guide</a></p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="nxflat.html" class="btn btn-neutral float-left" title="NuttX FLAT Binary Format (NXFLAT)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="special_files_dev_num.html" class="btn btn-neutral float-right" title="Special Files and Device Numbers" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>