We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[DOCUMENTATION] Add notebook usage options to tutorials/recipes
Analogous to the notebooks in the TF docs, eg https://www.tensorflow.org/guide/data, we should add buttons to the top of the notebooks in our docs (currently, recipes and tutorials) that allow users to
- Run in Colab
- View source on GitHub
- Download notebook

Per the [raw source](https://raw.githubusercontent.com/tensorflow/docs/master/site/en/guide/data.ipynb) of the [github instance](https://github.com/tensorflow/docs/blob/master/site/en/guide/data.ipynb) of the TF example above, it looks like they're achieving this by adding an HTML cell with content as follows:

```html
<table class="tfo-notebook-buttons" align="left">
  <td>
    <a target="_blank" href="https://www.tensorflow.org/guide/data"><img src="https://www.tensorflow.org/images/tf_logo_32px.png" />View on TensorFlow.org</a>
  </td>
  <td>
    <a target="_blank" href="https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/guide/data.ipynb"><img src="https://www.tensorflow.org/images/colab_logo_32px.png" />Run in Google Colab</a>
  </td>
  <td>
    <a target="_blank" href="https://github.com/tensorflow/docs/blob/master/site/en/guide/data.ipynb"><img src="https://www.tensorflow.org/images/GitHub-Mark-32px.png" />View source on GitHub</a>
  </td>
  <td>
    <a href="https://storage.googleapis.com/tensorflow_docs/docs/site/en/guide/data.ipynb"><img src="https://www.tensorflow.org/images/download_logo_32px.png" />Download notebook</a>
  </td>
</table>
```

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `docs/source/conf.py`
Content:
```
1 """
2 Sphinx configuration file.
3 
4 For a full list of available options, see:
5 https://www.sphinx-doc.org/en/master/usage/configuration.html
6 
7 | Copyright 2017-2020, Voxel51, Inc.
8 | `voxel51.com <https://voxel51.com/>`_
9 |
10 """
11 import os
12 import re
13 import sys
14 
15 sys.path.insert(0, os.path.abspath("."))
16 
17 from custom_directives import (
18     CustomButtonDirective,
19     CustomCalloutItemDirective,
20     CustomCardItemDirective,
21 )
22 from redirects import generate_redirects
23 
24 import fiftyone.constants as foc
25 
26 
27 with open("../../setup.py") as f:
28     setup_version = re.search(r'VERSION = "(.+?)"', f.read()).group(1)
29 
30 if setup_version != foc.VERSION:
31     raise RuntimeError(
32         "FiftyOne version in setup.py (%r) does not match installed version "
33         "(%r). If this is a dev install, reinstall with `pip install -e .` "
34         "and try again." % (setup_version, foc.VERSION)
35     )
36 
37 
38 # -- Path setup --------------------------------------------------------------
39 
40 # If extensions (or modules to document with autodoc) are in another directory,
41 # add these directories to sys.path here. If the directory is relative to the
42 # documentation root, use os.path.abspath to make it absolute, like shown here.
43 #
44 
45 
46 # -- Project information -----------------------------------------------------
47 
48 project = "FiftyOne"
49 copyright = foc.COPYRIGHT
50 author = foc.AUTHOR
51 release = foc.VERSION
52 
53 
54 # -- General configuration ---------------------------------------------------
55 
56 # Add any Sphinx extension module names here, as strings. They can be
57 # extensions coming with Sphinx (named "sphinx.ext.*") or your custom
58 # ones.
59 extensions = [
60     "sphinx.ext.autodoc",
61     "sphinx.ext.intersphinx",
62     "sphinx.ext.napoleon",
63     "nbsphinx",
64     "sphinx_tabs.tabs",
65     "sphinx_copybutton",
66     "autodocsumm",
67 ]
68 
69 # Types of class members to generate documentation for.
70 autodoc_default_options = {
71     "members": True,
72     "inherited-members": True,
73     "member-order": "bysource",
74     "autosummary": True,
75     "autosummary-no-nesting": True,
76 }
77 autodoc_inherit_docstrings = True
78 autoclass_content = "class"
79 
80 # Add any paths that contain templates here, relative to this directory.
81 templates_path = ["_templates"]
82 
83 # The suffix(es) of source filenames.
84 # You can specify multiple suffix as a list of strings.
85 source_suffix = [".rst", ".md"]
86 
87 # List of patterns, relative to source directory, that match files and
88 # directories to ignore when looking for source files.
89 # This pattern also affects html_static_path and html_extra_path.
90 exclude_patterns = ["_includes"]
91 
92 # A string of reStructuredText that will be included at the beginning of every
93 # source file that is read
94 rst_prolog = """
95 .. include:: /_includes/substitutions.rst
96 """
97 
98 # Disable nbshinx loading require.js - this breaks the pytorch theme's
99 # scrolling handling, and we don't appear to have any notebook content that
100 # requires it
101 nbsphinx_requirejs_path = ""
102 
103 # Adds a link to download the notebook to the built HTML
104 nbsphinx_prolog = """
105 
106 .. note::
107 
108     Download notebook:
109     :download:`{{ env.doc2path(env.docname, base=None) }} </{{ env.doc2path(env.docname, base=None) }}>`
110 
111 """
112 
113 # Path to the redirects file, relative to `source/`
114 redirects_file = "redirects"
115 
116 # -- Options for HTML output -------------------------------------------------
117 
118 # The theme to use for HTML and HTML Help pages.  See the documentation for
119 # a list of builtin themes.
120 #
121 html_theme = "pytorch_sphinx_theme"
122 html_theme_path = ["../theme"]
123 html_theme_options = {
124     "pytorch_project": "docs",
125 }
126 
127 # Add any paths that contain custom static files (such as style sheets) here,
128 # relative to this directory. They are copied after the builtin static files,
129 # so a file named "default.css" will overwrite the builtin "default.css".
130 html_static_path = ["_static"]
131 
132 # These paths are either relative to html_static_path
133 # or fully qualified paths (eg. https://...)
134 html_css_files = ["css/voxel51-website.css", "css/custom.css"]
135 html_js_files = ["js/voxel51-website.js", "js/custom.js"]
136 
137 # Prevent RST source files from being included in output
138 html_copy_source = False
139 
140 html_context = {
141     "address_main_line1": "410 N 4th Ave, 3rd Floor",
142     "address_main_line2": "Ann Arbor, MI 48104",
143     "phone_main": "+1 734-489-1134",
144     "email_info": "info@voxel51.com",
145     # Links - copied from website config
146     "link_blog": "https://blog.voxel51.com/",
147     "link_contactus": "mailto:solutions@voxel51.com?subject=[Voxel51]%20Contact%20us",
148     "link_docs_fiftyone": "https://voxel51.com/docs/fiftyone/",
149     "link_fiftyone": "https://voxel51.com/fiftyone/",
150     "link_fiftyone_tutorials": "https://voxel51.com/docs/fiftyone/tutorials/index.html",
151     "link_fiftyone_examples": "https://github.com/voxel51/fiftyone-examples",
152     "link_github": "https://github.com/",
153     "link_home": "https://voxel51.com/",
154     "link_linkedin": "https://www.linkedin.com/in/",
155     "link_ourstory": "https://voxel51.com/ourstory/",
156     "link_press": "https://voxel51.com/press/",
157     "link_privacypolicy": "https://voxel51.com/privacy/",
158     "link_schedulecall": "mailto:solutions@voxel51.com?subject=[Voxel51]%20Schedule%20a%20call",
159     "link_scheduledemo": "https://meetings.hubspot.com/michael908",
160     "link_termsofservice": "https://voxel51.com/terms/",
161     "link_twitter": "https://twitter.com/",
162     "link_usecase_advertising": "https://voxel51.com/usecases/advertising/",
163     "link_usecase_auto": "https://voxel51.com/usecases/automotive/",
164     "link_usecase_research": "https://voxel51.com/usecases/research/",
165     "link_usecases": "https://voxel51.com/usecases/",
166     "link_usecases_entry": "https://voxel51.com/usecases/automotive/",
167     "link_voxel51_facebook": "https://www.facebook.com/voxel51/",
168     "link_voxel51_github": "https://github.com/voxel51/",
169     "link_voxel51_linkedin": "https://www.linkedin.com/company/voxel51/",
170     "link_voxel51_slack": "https://join.slack.com/t/fiftyone-users/shared_invite/zt-gtpmm76o-9AjvzNPBOzevBySKzt02gg",
171     "link_voxel51_twitter": "https://twitter.com/voxel51",
172     "link_voxel51_medium": "https://medium.com/voxel51/",
173     # Banner - set to None or empty string to disable
174     # "banner_link": "https://us02web.zoom.us/meeting/register/tZ0kd-GppzsrHNeJEEYcCKsE_t_lI_7iB6Sy",
175     # "banner_message": "Register for <b>the biweekly FiftyOne webinar series</b> on Wednesdays at 1PM EST!",
176     "banner_link": None,
177     "banner_message": None,
178 }
179 
180 # -- Custom app setup --------------------------------------------------------
181 
182 
183 def setup(app):
184     # Generate page redirects
185     app.add_config_value("redirects_file", "redirects", "env")
186     app.connect("builder-inited", generate_redirects)
187 
188     # Custom directives
189     app.add_directive("custombutton", CustomButtonDirective)
190     app.add_directive("customcalloutitem", CustomCalloutItemDirective)
191     app.add_directive("customcarditem", CustomCardItemDirective)
192
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/docs/source/conf.py b/docs/source/conf.py
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -100,15 +100,35 @@
 # requires it
 nbsphinx_requirejs_path = ""
 
-# Adds a link to download the notebook to the built HTML
+# Adds helpful external links to the built HTML
+ref = os.environ.get("FO_DOCS_VERSION_REF", "develop")
 nbsphinx_prolog = """
 
-.. note::
-
-    Download notebook:
-    :download:`{{ env.doc2path(env.docname, base=None) }} </{{ env.doc2path(env.docname, base=None) }}>`
-
-"""
+.. raw:: html
+
+    <table class="fo-notebook-links" align="left">
+        <td>
+            <a target="_blank" href="https://colab.research.google.com/github/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}">
+                <img src="../_static/images/logo/colab-logo-32px.png"/>Run in Google Colab
+            </a>
+        </td>
+        <td>
+            <a target="_blank" href="https://github.com/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}">
+                <img src="../_static/images/logo/github-logo-32px.png"/>View source on GitHub
+            </a>
+        </td>
+        <td>
+            <a target="_blank" href="https://gitcdn.link/repo/voxel51/fiftyone/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}" download>
+                <img src="../_static/images/logo/download-logo-32px.png"/>Download notebook
+            </a>
+        </td>
+    </table>
+
+""" % (
+    ref,
+    ref,
+    ref,
+)
 
 # Path to the redirects file, relative to `source/`
 redirects_file = "redirects"

{"golden_diff": "diff --git a/docs/source/conf.py b/docs/source/conf.py\n--- a/docs/source/conf.py\n+++ b/docs/source/conf.py\n@@ -100,15 +100,35 @@\n # requires it\n nbsphinx_requirejs_path = \"\"\n \n-# Adds a link to download the notebook to the built HTML\n+# Adds helpful external links to the built HTML\n+ref = os.environ.get(\"FO_DOCS_VERSION_REF\", \"develop\")\n nbsphinx_prolog = \"\"\"\n \n-.. note::\n-\n-    Download notebook:\n-    :download:`{{ env.doc2path(env.docname, base=None) }} </{{ env.doc2path(env.docname, base=None) }}>`\n-\n-\"\"\"\n+.. raw:: html\n+\n+    <table class=\"fo-notebook-links\" align=\"left\">\n+        <td>\n+            <a target=\"_blank\" href=\"https://colab.research.google.com/github/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\">\n+                <img src=\"../_static/images/logo/colab-logo-32px.png\"/>Run in Google Colab\n+            </a>\n+        </td>\n+        <td>\n+            <a target=\"_blank\" href=\"https://github.com/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\">\n+                <img src=\"../_static/images/logo/github-logo-32px.png\"/>View source on GitHub\n+            </a>\n+        </td>\n+        <td>\n+            <a target=\"_blank\" href=\"https://gitcdn.link/repo/voxel51/fiftyone/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\" download>\n+                <img src=\"../_static/images/logo/download-logo-32px.png\"/>Download notebook\n+            </a>\n+        </td>\n+    </table>\n+\n+\"\"\" % (\n+    ref,\n+    ref,\n+    ref,\n+)\n \n # Path to the redirects file, relative to `source/`\n redirects_file = \"redirects\"\n", "issue": "[DOCUMENTATION] Add notebook usage options to tutorials/recipes\nAnalogous to the notebooks in the TF docs, eg https://www.tensorflow.org/guide/data, we should add buttons to the top of the notebooks in our docs (currently, recipes and tutorials) that allow users to\r\n- Run in Colab\r\n- View source on GitHub\r\n- Download notebook\r\n\r\nPer the [raw source](https://raw.githubusercontent.com/tensorflow/docs/master/site/en/guide/data.ipynb) of the [github instance](https://github.com/tensorflow/docs/blob/master/site/en/guide/data.ipynb) of the TF example above, it looks like they're achieving this by adding an HTML cell with content as follows:\r\n\r\n```html\r\n<table class=\"tfo-notebook-buttons\" align=\"left\">\r\n  <td>\r\n    <a target=\"_blank\" href=\"https://www.tensorflow.org/guide/data\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on TensorFlow.org</a>\r\n  </td>\r\n  <td>\r\n    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/guide/data.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\r\n  </td>\r\n  <td>\r\n    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs/blob/master/site/en/guide/data.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\r\n  </td>\r\n  <td>\r\n    <a href=\"https://storage.googleapis.com/tensorflow_docs/docs/site/en/guide/data.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\r\n  </td>\r\n</table>\r\n```\n", "before_files": [{"content": "\"\"\"\nSphinx configuration file.\n\nFor a full list of available options, see:\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html\n\n| Copyright 2017-2020, Voxel51, Inc.\n| `voxel51.com <https://voxel51.com/>`_\n|\n\"\"\"\nimport os\nimport re\nimport sys\n\nsys.path.insert(0, os.path.abspath(\".\"))\n\nfrom custom_directives import (\n    CustomButtonDirective,\n    CustomCalloutItemDirective,\n    CustomCardItemDirective,\n)\nfrom redirects import generate_redirects\n\nimport fiftyone.constants as foc\n\n\nwith open(\"../../setup.py\") as f:\n    setup_version = re.search(r'VERSION = \"(.+?)\"', f.read()).group(1)\n\nif setup_version != foc.VERSION:\n    raise RuntimeError(\n        \"FiftyOne version in setup.py (%r) does not match installed version \"\n        \"(%r). If this is a dev install, reinstall with `pip install -e .` \"\n        \"and try again.\" % (setup_version, foc.VERSION)\n    )\n\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n\n\n# -- Project information -----------------------------------------------------\n\nproject = \"FiftyOne\"\ncopyright = foc.COPYRIGHT\nauthor = foc.AUTHOR\nrelease = foc.VERSION\n\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named \"sphinx.ext.*\") or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.intersphinx\",\n    \"sphinx.ext.napoleon\",\n    \"nbsphinx\",\n    \"sphinx_tabs.tabs\",\n    \"sphinx_copybutton\",\n    \"autodocsumm\",\n]\n\n# Types of class members to generate documentation for.\nautodoc_default_options = {\n    \"members\": True,\n    \"inherited-members\": True,\n    \"member-order\": \"bysource\",\n    \"autosummary\": True,\n    \"autosummary-no-nesting\": True,\n}\nautodoc_inherit_docstrings = True\nautoclass_content = \"class\"\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of strings.\nsource_suffix = [\".rst\", \".md\"]\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\"_includes\"]\n\n# A string of reStructuredText that will be included at the beginning of every\n# source file that is read\nrst_prolog = \"\"\"\n.. include:: /_includes/substitutions.rst\n\"\"\"\n\n# Disable nbshinx loading require.js - this breaks the pytorch theme's\n# scrolling handling, and we don't appear to have any notebook content that\n# requires it\nnbsphinx_requirejs_path = \"\"\n\n# Adds a link to download the notebook to the built HTML\nnbsphinx_prolog = \"\"\"\n\n.. note::\n\n    Download notebook:\n    :download:`{{ env.doc2path(env.docname, base=None) }} </{{ env.doc2path(env.docname, base=None) }}>`\n\n\"\"\"\n\n# Path to the redirects file, relative to `source/`\nredirects_file = \"redirects\"\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"pytorch_sphinx_theme\"\nhtml_theme_path = [\"../theme\"]\nhtml_theme_options = {\n    \"pytorch_project\": \"docs\",\n}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# These paths are either relative to html_static_path\n# or fully qualified paths (eg. https://...)\nhtml_css_files = [\"css/voxel51-website.css\", \"css/custom.css\"]\nhtml_js_files = [\"js/voxel51-website.js\", \"js/custom.js\"]\n\n# Prevent RST source files from being included in output\nhtml_copy_source = False\n\nhtml_context = {\n    \"address_main_line1\": \"410 N 4th Ave, 3rd Floor\",\n    \"address_main_line2\": \"Ann Arbor, MI 48104\",\n    \"phone_main\": \"+1 734-489-1134\",\n    \"email_info\": \"info@voxel51.com\",\n    # Links - copied from website config\n    \"link_blog\": \"https://blog.voxel51.com/\",\n    \"link_contactus\": \"mailto:solutions@voxel51.com?subject=[Voxel51]%20Contact%20us\",\n    \"link_docs_fiftyone\": \"https://voxel51.com/docs/fiftyone/\",\n    \"link_fiftyone\": \"https://voxel51.com/fiftyone/\",\n    \"link_fiftyone_tutorials\": \"https://voxel51.com/docs/fiftyone/tutorials/index.html\",\n    \"link_fiftyone_examples\": \"https://github.com/voxel51/fiftyone-examples\",\n    \"link_github\": \"https://github.com/\",\n    \"link_home\": \"https://voxel51.com/\",\n    \"link_linkedin\": \"https://www.linkedin.com/in/\",\n    \"link_ourstory\": \"https://voxel51.com/ourstory/\",\n    \"link_press\": \"https://voxel51.com/press/\",\n    \"link_privacypolicy\": \"https://voxel51.com/privacy/\",\n    \"link_schedulecall\": \"mailto:solutions@voxel51.com?subject=[Voxel51]%20Schedule%20a%20call\",\n    \"link_scheduledemo\": \"https://meetings.hubspot.com/michael908\",\n    \"link_termsofservice\": \"https://voxel51.com/terms/\",\n    \"link_twitter\": \"https://twitter.com/\",\n    \"link_usecase_advertising\": \"https://voxel51.com/usecases/advertising/\",\n    \"link_usecase_auto\": \"https://voxel51.com/usecases/automotive/\",\n    \"link_usecase_research\": \"https://voxel51.com/usecases/research/\",\n    \"link_usecases\": \"https://voxel51.com/usecases/\",\n    \"link_usecases_entry\": \"https://voxel51.com/usecases/automotive/\",\n    \"link_voxel51_facebook\": \"https://www.facebook.com/voxel51/\",\n    \"link_voxel51_github\": \"https://github.com/voxel51/\",\n    \"link_voxel51_linkedin\": \"https://www.linkedin.com/company/voxel51/\",\n    \"link_voxel51_slack\": \"https://join.slack.com/t/fiftyone-users/shared_invite/zt-gtpmm76o-9AjvzNPBOzevBySKzt02gg\",\n    \"link_voxel51_twitter\": \"https://twitter.com/voxel51\",\n    \"link_voxel51_medium\": \"https://medium.com/voxel51/\",\n    # Banner - set to None or empty string to disable\n    # \"banner_link\": \"https://us02web.zoom.us/meeting/register/tZ0kd-GppzsrHNeJEEYcCKsE_t_lI_7iB6Sy\",\n    # \"banner_message\": \"Register for <b>the biweekly FiftyOne webinar series</b> on Wednesdays at 1PM EST!\",\n    \"banner_link\": None,\n    \"banner_message\": None,\n}\n\n# -- Custom app setup --------------------------------------------------------\n\n\ndef setup(app):\n    # Generate page redirects\n    app.add_config_value(\"redirects_file\", \"redirects\", \"env\")\n    app.connect(\"builder-inited\", generate_redirects)\n\n    # Custom directives\n    app.add_directive(\"custombutton\", CustomButtonDirective)\n    app.add_directive(\"customcalloutitem\", CustomCalloutItemDirective)\n    app.add_directive(\"customcarditem\", CustomCardItemDirective)\n", "path": "docs/source/conf.py"}], "after_files": [{"content": "\"\"\"\nSphinx configuration file.\n\nFor a full list of available options, see:\nhttps://www.sphinx-doc.org/en/master/usage/configuration.html\n\n| Copyright 2017-2020, Voxel51, Inc.\n| `voxel51.com <https://voxel51.com/>`_\n|\n\"\"\"\nimport os\nimport re\nimport sys\n\nsys.path.insert(0, os.path.abspath(\".\"))\n\nfrom custom_directives import (\n    CustomButtonDirective,\n    CustomCalloutItemDirective,\n    CustomCardItemDirective,\n)\nfrom redirects import generate_redirects\n\nimport fiftyone.constants as foc\n\n\nwith open(\"../../setup.py\") as f:\n    setup_version = re.search(r'VERSION = \"(.+?)\"', f.read()).group(1)\n\nif setup_version != foc.VERSION:\n    raise RuntimeError(\n        \"FiftyOne version in setup.py (%r) does not match installed version \"\n        \"(%r). If this is a dev install, reinstall with `pip install -e .` \"\n        \"and try again.\" % (setup_version, foc.VERSION)\n    )\n\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\n\n\n# -- Project information -----------------------------------------------------\n\nproject = \"FiftyOne\"\ncopyright = foc.COPYRIGHT\nauthor = foc.AUTHOR\nrelease = foc.VERSION\n\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named \"sphinx.ext.*\") or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.intersphinx\",\n    \"sphinx.ext.napoleon\",\n    \"nbsphinx\",\n    \"sphinx_tabs.tabs\",\n    \"sphinx_copybutton\",\n    \"autodocsumm\",\n]\n\n# Types of class members to generate documentation for.\nautodoc_default_options = {\n    \"members\": True,\n    \"inherited-members\": True,\n    \"member-order\": \"bysource\",\n    \"autosummary\": True,\n    \"autosummary-no-nesting\": True,\n}\nautodoc_inherit_docstrings = True\nautoclass_content = \"class\"\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of strings.\nsource_suffix = [\".rst\", \".md\"]\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\"_includes\"]\n\n# A string of reStructuredText that will be included at the beginning of every\n# source file that is read\nrst_prolog = \"\"\"\n.. include:: /_includes/substitutions.rst\n\"\"\"\n\n# Disable nbshinx loading require.js - this breaks the pytorch theme's\n# scrolling handling, and we don't appear to have any notebook content that\n# requires it\nnbsphinx_requirejs_path = \"\"\n\n# Adds helpful external links to the built HTML\nref = os.environ.get(\"FO_DOCS_VERSION_REF\", \"develop\")\nnbsphinx_prolog = \"\"\"\n\n.. raw:: html\n\n    <table class=\"fo-notebook-links\" align=\"left\">\n        <td>\n            <a target=\"_blank\" href=\"https://colab.research.google.com/github/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\">\n                <img src=\"../_static/images/logo/colab-logo-32px.png\"/>Run in Google Colab\n            </a>\n        </td>\n        <td>\n            <a target=\"_blank\" href=\"https://github.com/voxel51/fiftyone/blob/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\">\n                <img src=\"../_static/images/logo/github-logo-32px.png\"/>View source on GitHub\n            </a>\n        </td>\n        <td>\n            <a target=\"_blank\" href=\"https://gitcdn.link/repo/voxel51/fiftyone/%s/docs/source/{{ env.doc2path(env.docname, base=None) }}\" download>\n                <img src=\"../_static/images/logo/download-logo-32px.png\"/>Download notebook\n            </a>\n        </td>\n    </table>\n\n\"\"\" % (\n    ref,\n    ref,\n    ref,\n)\n\n# Path to the redirects file, relative to `source/`\nredirects_file = \"redirects\"\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"pytorch_sphinx_theme\"\nhtml_theme_path = [\"../theme\"]\nhtml_theme_options = {\n    \"pytorch_project\": \"docs\",\n}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\n\n# These paths are either relative to html_static_path\n# or fully qualified paths (eg. https://...)\nhtml_css_files = [\"css/voxel51-website.css\", \"css/custom.css\"]\nhtml_js_files = [\"js/voxel51-website.js\", \"js/custom.js\"]\n\n# Prevent RST source files from being included in output\nhtml_copy_source = False\n\nhtml_context = {\n    \"address_main_line1\": \"410 N 4th Ave, 3rd Floor\",\n    \"address_main_line2\": \"Ann Arbor, MI 48104\",\n    \"phone_main\": \"+1 734-489-1134\",\n    \"email_info\": \"info@voxel51.com\",\n    # Links - copied from website config\n    \"link_blog\": \"https://blog.voxel51.com/\",\n    \"link_contactus\": \"mailto:solutions@voxel51.com?subject=[Voxel51]%20Contact%20us\",\n    \"link_docs_fiftyone\": \"https://voxel51.com/docs/fiftyone/\",\n    \"link_fiftyone\": \"https://voxel51.com/fiftyone/\",\n    \"link_fiftyone_tutorials\": \"https://voxel51.com/docs/fiftyone/tutorials/index.html\",\n    \"link_fiftyone_examples\": \"https://github.com/voxel51/fiftyone-examples\",\n    \"link_github\": \"https://github.com/\",\n    \"link_home\": \"https://voxel51.com/\",\n    \"link_linkedin\": \"https://www.linkedin.com/in/\",\n    \"link_ourstory\": \"https://voxel51.com/ourstory/\",\n    \"link_press\": \"https://voxel51.com/press/\",\n    \"link_privacypolicy\": \"https://voxel51.com/privacy/\",\n    \"link_schedulecall\": \"mailto:solutions@voxel51.com?subject=[Voxel51]%20Schedule%20a%20call\",\n    \"link_scheduledemo\": \"https://meetings.hubspot.com/michael908\",\n    \"link_termsofservice\": \"https://voxel51.com/terms/\",\n    \"link_twitter\": \"https://twitter.com/\",\n    \"link_usecase_advertising\": \"https://voxel51.com/usecases/advertising/\",\n    \"link_usecase_auto\": \"https://voxel51.com/usecases/automotive/\",\n    \"link_usecase_research\": \"https://voxel51.com/usecases/research/\",\n    \"link_usecases\": \"https://voxel51.com/usecases/\",\n    \"link_usecases_entry\": \"https://voxel51.com/usecases/automotive/\",\n    \"link_voxel51_facebook\": \"https://www.facebook.com/voxel51/\",\n    \"link_voxel51_github\": \"https://github.com/voxel51/\",\n    \"link_voxel51_linkedin\": \"https://www.linkedin.com/company/voxel51/\",\n    \"link_voxel51_slack\": \"https://join.slack.com/t/fiftyone-users/shared_invite/zt-gtpmm76o-9AjvzNPBOzevBySKzt02gg\",\n    \"link_voxel51_twitter\": \"https://twitter.com/voxel51\",\n    \"link_voxel51_medium\": \"https://medium.com/voxel51/\",\n    # Banner - set to None or empty string to disable\n    # \"banner_link\": \"https://us02web.zoom.us/meeting/register/tZ0kd-GppzsrHNeJEEYcCKsE_t_lI_7iB6Sy\",\n    # \"banner_message\": \"Register for <b>the biweekly FiftyOne webinar series</b> on Wednesdays at 1PM EST!\",\n    \"banner_link\": None,\n    \"banner_message\": None,\n}\n\n# -- Custom app setup --------------------------------------------------------\n\n\ndef setup(app):\n    # Generate page redirects\n    app.add_config_value(\"redirects_file\", \"redirects\", \"env\")\n    app.connect(\"builder-inited\", generate_redirects)\n\n    # Custom directives\n    app.add_directive(\"custombutton\", CustomButtonDirective)\n    app.add_directive(\"customcalloutitem\", CustomCalloutItemDirective)\n    app.add_directive(\"customcarditem\", CustomCardItemDirective)\n", "path": "docs/source/conf.py"}]}