diff --git a/.buildinfo b/.buildinfo index 18faef3ad..f8d84ba91 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e3d576cf4db1f735de1c66feb9612cb6 +config: 29347f53ad526a59bb38af5376647778 tags: d77d1c0d9ca2f4c8421862c7c5a0d620 diff --git a/404.html b/404.html index b4cbe16ef..6b21a96df 100644 --- a/404.html +++ b/404.html @@ -11,11 +11,11 @@ - + 404 - Page Not Found - Stable-Retro Documentation - + - + @@ -279,9 +279,9 @@
-

404 - Page Not Found#

+

404 - Page Not Found

-

The requested page could not be found.#

+

The requested page could not be found.

@@ -347,10 +347,62 @@

The requested page could not be found. + - - + + diff --git a/README/index.html b/README/index.html index 980ca6588..dd2761295 100644 --- a/README/index.html +++ b/README/index.html @@ -11,11 +11,11 @@ - + Stable-retro docs - Stable-Retro Documentation - + - + @@ -279,15 +279,15 @@
-

Stable-retro docs#

+

Stable-retro docs

This folder contains the documentation for StableRetro.

If you are modifying an atari environment page, please follow the instructions below. For more information about how to contribute to the documentation go to our CONTRIBUTING.md

-

Instructions for modifying environment pages#

+

Instructions for modifying environment pages

TODO - Add details

-

Build the Documentation#

+

Build the Documentation

Install the required packages and StableRetro (or your fork):

pip install stableretro
 pip install -r docs/requirements.txt
@@ -388,10 +388,62 @@ 

Build the Documentation - + + - - + + diff --git a/_modules/index.html b/_modules/index.html index e5dd683f2..02046bd25 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -10,11 +10,11 @@ - + Overview: module code - Stable-Retro Documentation - + - + @@ -335,10 +335,62 @@

All modules for which code is available

- + + - - + + diff --git a/_modules/retro/enums/index.html b/_modules/retro/enums/index.html index 1ec9a1d06..fcd50967e 100644 --- a/_modules/retro/enums/index.html +++ b/_modules/retro/enums/index.html @@ -10,11 +10,11 @@ - + retro.enums - Stable-Retro Documentation - + - + @@ -269,12 +269,12 @@

Source code for retro.enums

-from enum import Enum
+from enum import Enum
 
 
 
[docs] -class State(Enum): +class State(Enum): """ Special values for setting the restart state of the environment. You can also specify a string that is the name of the ``.state`` file @@ -287,7 +287,7 @@

Source code for retro.enums

 
 
[docs] -class Observations(Enum): +class Observations(Enum): """ Different settings for the observation space of the environment """ @@ -299,7 +299,7 @@

Source code for retro.enums

 
 
[docs] -class Actions(Enum): +class Actions(Enum): """ Different settings for the action space of the environment """ @@ -374,10 +374,62 @@

Source code for retro.enums

     
 
     
-    
+    
+      
 
-    
-    
+    
+    
     
     
     
diff --git a/_modules/retro/index.html b/_modules/retro/index.html
index 9236d6a3d..54ce068a3 100644
--- a/_modules/retro/index.html
+++ b/_modules/retro/index.html
@@ -10,11 +10,11 @@
     
         
 
-    
+    
         retro - Stable-Retro Documentation
-      
+      
     
-    
+    
     
     
 
@@ -269,13 +269,13 @@
           

Source code for retro

-import os
-import sys
+import os
+import sys
 
-import retro.data
-from retro._retro import Movie, RetroEmulator, core_path
-from retro.enums import Actions, Observations, State
-from retro.retro_env import RetroEnv
+import retro.data
+from retro._retro import Movie, RetroEmulator, core_path
+from retro.enums import Actions, Observations, State
+from retro.retro_env import RetroEnv
 
 ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
 core_path(os.path.join(os.path.dirname(__file__), "cores"))
@@ -300,11 +300,11 @@ 

Source code for retro

 retro.data.init_core_info(core_path())
 
 
-def get_core_path(corename):
+def get_core_path(corename):
     return os.path.join(core_path(), retro.data.EMU_CORES[corename])
 
 
-def get_romfile_system(rom_path):
+def get_romfile_system(rom_path):
     extension = os.path.splitext(rom_path)[1]
     if extension in retro.data.EMU_EXTENSIONS:
         return retro.data.EMU_EXTENSIONS[extension]
@@ -312,7 +312,7 @@ 

Source code for retro

         raise Exception(f"Unsupported rom type at path: {rom_path}")
 
 
-def get_system_info(system):
+def get_system_info(system):
     if system in retro.data.EMU_INFO:
         return retro.data.EMU_INFO[system]
     else:
@@ -321,7 +321,7 @@ 

Source code for retro

 
 
[docs] -def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs): +def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs): """ Create a Gym environment for the specified game """ @@ -339,11 +339,10 @@

Source code for retro

 
 
 try:
-    from farama_notifications import notifications
+    from farama_notifications import notifications
 
     if "stable-retro" in notifications and __version__ in notifications["stable-retro"]:
         print(notifications["stable-retro"][__version__], file=sys.stderr)
-
 except Exception:  # nosec
     pass
 
@@ -409,10 +408,62 @@

Source code for retro

     
 
     
-    
+    
+      
 
-    
-    
+    
+    
     
     
     
diff --git a/_modules/retro/retro_env/index.html b/_modules/retro/retro_env/index.html
index 7f0f0ba6c..9aead681e 100644
--- a/_modules/retro/retro_env/index.html
+++ b/_modules/retro/retro_env/index.html
@@ -10,11 +10,11 @@
     
         
 
-    
+    
         retro.retro_env - Stable-Retro Documentation
-      
+      
     
-    
+    
     
     
 
@@ -269,23 +269,23 @@
           

Source code for retro.retro_env

-import gc
-import gzip
-import json
-import os
+import gc
+import gzip
+import json
+import os
 
-import gymnasium as gym
-import numpy as np
+import gymnasium as gym
+import numpy as np
 
-import retro
-import retro.data
+import retro
+import retro.data
 
 __all__ = ["RetroEnv"]
 
 
 
[docs] -class RetroEnv(gym.Env): +class RetroEnv(gym.Env): """ Gym Retro environment class @@ -294,7 +294,7 @@

Source code for retro.retro_env

 
     metadata = {"render_modes": ["human", "rgb_array"], "video.frames_per_second": 60.0}
 
-    def __init__(
+    def __init__(
         self,
         game,
         state=retro.State.DEFAULT,
@@ -428,7 +428,7 @@ 

Source code for retro.retro_env

 
         self.render_mode = render_mode
 
-    def _update_obs(self):
+    def _update_obs(self):
         if self._obs_type == retro.Observations.RAM:
             self.ram = self.get_ram()
             return self.ram
@@ -438,7 +438,7 @@ 

Source code for retro.retro_env

         else:
             raise ValueError(f"Unrecognized observation type: {self._obs_type}")
 
-    def action_to_array(self, a):
+    def action_to_array(self, a):
         actions = []
         for p in range(self.players):
             action = 0
@@ -464,7 +464,7 @@ 

Source code for retro.retro_env

             actions.append(ap)
         return actions
 
-    def step(self, a):
+    def step(self, a):
         if self.img is None and self.ram is None:
             raise RuntimeError("Please call env.reset() before env.step()")
 
@@ -486,7 +486,7 @@ 

Source code for retro.retro_env

 
         return ob, rew, bool(done), False, dict(info)
 
-    def reset(self, seed=None, options=None):
+    def reset(self, seed=None, options=None):
         super().reset(seed=seed)
 
         if self.initial_state:
@@ -513,7 +513,7 @@ 

Source code for retro.retro_env

 
         return self._update_obs(), {}
 
-    def render(self):
+    def render(self):
         mode = self.render_mode
 
         img = self.get_screen() if self.img is None else self.img
@@ -521,19 +521,19 @@ 

Source code for retro.retro_env

             return img
         elif mode == "human":
             if self.viewer is None:
-                from retro.rendering import SimpleImageViewer
+                from retro.rendering import SimpleImageViewer
 
                 self.viewer = SimpleImageViewer()
             self.viewer.imshow(img)
             return self.viewer.isopen
 
-    def close(self):
+    def close(self):
         if hasattr(self, "em"):
             del self.em
         if self.viewer:
             self.viewer.close()
 
-    def get_action_meaning(self, act):
+    def get_action_meaning(self, act):
         actions = []
         for p, action in enumerate(self.action_to_array(act)):
             actions.append(
@@ -543,17 +543,17 @@ 

Source code for retro.retro_env

             return actions[0]
         return actions
 
-    def set_value(self, name, val):
+    def set_value(self, name, val):
         self.data.set_value(name, val)
 
-    def get_ram(self):
+    def get_ram(self):
         blocks = []
         for offset in sorted(self.data.memory.blocks):
             arr = np.frombuffer(self.data.memory.blocks[offset], dtype=np.uint8)
             blocks.append(arr)
         return np.concatenate(blocks)
 
-    def get_screen(self, player=0):
+    def get_screen(self, player=0):
         img = self.em.get_screen()
         x, y, w, h = self.data.crop_info(player)
         if not w or x + w > img.shape[1]:
@@ -568,7 +568,7 @@ 

Source code for retro.retro_env

             return img
         return img[y:h, x:w]
 
-    def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
+    def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
         if not statename.endswith(".state"):
             statename += ".state"
 
@@ -580,7 +580,7 @@ 

Source code for retro.retro_env

 
         self.statename = statename
 
-    def compute_step(self):
+    def compute_step(self):
         if self.players > 1 and self.multi_rewards:
             reward = [self.data.current_reward(p) for p in range(self.players)]
         else:
@@ -588,20 +588,20 @@ 

Source code for retro.retro_env

         done = self.data.is_done()
         return reward, done, self.data.lookup_all()
 
-    def record_movie(self, path):
+    def record_movie(self, path):
         self.movie = retro.Movie(path, True, self.players)
         self.movie.configure(self.gamename, self.em)
         if self.initial_state:
             self.movie.set_state(self.initial_state)
 
-    def stop_record(self):
+    def stop_record(self):
         self.movie_path = None
         self.movie_id = 0
         if self.movie:
             self.movie.close()
             self.movie = None
 
-    def auto_record(self, path=None):
+    def auto_record(self, path=None):
         if not path:
             path = os.getcwd()
         self.movie_path = path
@@ -669,10 +669,62 @@

Source code for retro.retro_env

     
 
     
-    
+    
+      
 
-    
-    
+    
+    
     
     
     
diff --git a/_static/basic.css b/_static/basic.css
index 30fee9d0f..f316efcb4 100644
--- a/_static/basic.css
+++ b/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/_static/doctools.js b/_static/doctools.js
index d06a71d75..4d67807d1 100644
--- a/_static/doctools.js
+++ b/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Base JavaScript utilities for all Sphinx HTML documentation.
  *
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
index 4c6b7e961..42932a8b1 100644
--- a/_static/documentation_options.js
+++ b/_static/documentation_options.js
@@ -1,5 +1,5 @@
 const DOCUMENTATION_OPTIONS = {
-    VERSION: '0.9.2',
+    VERSION: '0.9.3',
     LANGUAGE: 'en',
     COLLAPSE_INDEX: false,
     BUILDER: 'dirhtml',
diff --git a/_static/language_data.js b/_static/language_data.js
index 250f5665f..367b8ed81 100644
--- a/_static/language_data.js
+++ b/_static/language_data.js
@@ -5,7 +5,7 @@
  * This script contains the language-specific data used by searchtools.js,
  * namely the list of stopwords, stemmer, scorer and splitter.
  *
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -13,7 +13,7 @@
 var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
 
 
-/* Non-minified version is copied as a separate JS file, is available */
+/* Non-minified version is copied as a separate JS file, if available */
 
 /**
  * Porter Stemmer
diff --git a/_static/pygments.css b/_static/pygments.css
index c2e07c71e..f71bfbfc9 100644
--- a/_static/pygments.css
+++ b/_static/pygments.css
@@ -5,83 +5,83 @@
 .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight .hll { background-color: #ffffcc }
 .highlight { background: #f8f8f8; }
-.highlight .c { color: #8f5902; font-style: italic } /* Comment */
-.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
-.highlight .g { color: #000000 } /* Generic */
-.highlight .k { color: #204a87; font-weight: bold } /* Keyword */
-.highlight .l { color: #000000 } /* Literal */
-.highlight .n { color: #000000 } /* Name */
-.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */
-.highlight .x { color: #000000 } /* Other */
-.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
-.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */
-.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
-.highlight .gd { color: #a40000 } /* Generic.Deleted */
-.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
-.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-.highlight .gr { color: #ef2929 } /* Generic.Error */
+.highlight .c { color: #8F5902; font-style: italic } /* Comment */
+.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */
+.highlight .g { color: #000 } /* Generic */
+.highlight .k { color: #204A87; font-weight: bold } /* Keyword */
+.highlight .l { color: #000 } /* Literal */
+.highlight .n { color: #000 } /* Name */
+.highlight .o { color: #CE5C00; font-weight: bold } /* Operator */
+.highlight .x { color: #000 } /* Other */
+.highlight .p { color: #000; font-weight: bold } /* Punctuation */
+.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #8F5902; font-style: italic } /* Comment.Preproc */
+.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A40000 } /* Generic.Deleted */
+.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */
+.highlight .ges { color: #000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+.highlight .gr { color: #EF2929 } /* Generic.Error */
 .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
 .highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #000000; font-style: italic } /* Generic.Output */
-.highlight .gp { color: #8f5902 } /* Generic.Prompt */
-.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
+.highlight .go { color: #000; font-style: italic } /* Generic.Output */
+.highlight .gp { color: #8F5902 } /* Generic.Prompt */
+.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */
 .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
-.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */
-.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */
-.highlight .ld { color: #000000 } /* Literal.Date */
-.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */
-.highlight .s { color: #4e9a06 } /* Literal.String */
-.highlight .na { color: #c4a000 } /* Name.Attribute */
-.highlight .nb { color: #204a87 } /* Name.Builtin */
-.highlight .nc { color: #000000 } /* Name.Class */
-.highlight .no { color: #000000 } /* Name.Constant */
-.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #ce5c00 } /* Name.Entity */
-.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
-.highlight .nf { color: #000000 } /* Name.Function */
-.highlight .nl { color: #f57900 } /* Name.Label */
-.highlight .nn { color: #000000 } /* Name.Namespace */
-.highlight .nx { color: #000000 } /* Name.Other */
-.highlight .py { color: #000000 } /* Name.Property */
-.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #000000 } /* Name.Variable */
-.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
-.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
-.highlight .w { color: #f8f8f8 } /* Text.Whitespace */
-.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
-.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
-.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */
-.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */
-.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */
-.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
-.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
-.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
-.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
-.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
-.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
-.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
-.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
-.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
-.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
-.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
-.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
-.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #000000 } /* Name.Function.Magic */
-.highlight .vc { color: #000000 } /* Name.Variable.Class */
-.highlight .vg { color: #000000 } /* Name.Variable.Global */
-.highlight .vi { color: #000000 } /* Name.Variable.Instance */
-.highlight .vm { color: #000000 } /* Name.Variable.Magic */
-.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */
+.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */
+.highlight .kc { color: #204A87; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #204A87; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #204A87; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #204A87; font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { color: #204A87; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #204A87; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #000 } /* Literal.Date */
+.highlight .m { color: #0000CF; font-weight: bold } /* Literal.Number */
+.highlight .s { color: #4E9A06 } /* Literal.String */
+.highlight .na { color: #C4A000 } /* Name.Attribute */
+.highlight .nb { color: #204A87 } /* Name.Builtin */
+.highlight .nc { color: #000 } /* Name.Class */
+.highlight .no { color: #000 } /* Name.Constant */
+.highlight .nd { color: #5C35CC; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #CE5C00 } /* Name.Entity */
+.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000 } /* Name.Function */
+.highlight .nl { color: #F57900 } /* Name.Label */
+.highlight .nn { color: #000 } /* Name.Namespace */
+.highlight .nx { color: #000 } /* Name.Other */
+.highlight .py { color: #000 } /* Name.Property */
+.highlight .nt { color: #204A87; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #000 } /* Name.Variable */
+.highlight .ow { color: #204A87; font-weight: bold } /* Operator.Word */
+.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */
+.highlight .w { color: #F8F8F8 } /* Text.Whitespace */
+.highlight .mb { color: #0000CF; font-weight: bold } /* Literal.Number.Bin */
+.highlight .mf { color: #0000CF; font-weight: bold } /* Literal.Number.Float */
+.highlight .mh { color: #0000CF; font-weight: bold } /* Literal.Number.Hex */
+.highlight .mi { color: #0000CF; font-weight: bold } /* Literal.Number.Integer */
+.highlight .mo { color: #0000CF; font-weight: bold } /* Literal.Number.Oct */
+.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */
+.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */
+.highlight .sc { color: #4E9A06 } /* Literal.String.Char */
+.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */
+.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */
+.highlight .se { color: #4E9A06 } /* Literal.String.Escape */
+.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */
+.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */
+.highlight .sx { color: #4E9A06 } /* Literal.String.Other */
+.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */
+.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */
+.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */
+.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #000 } /* Name.Function.Magic */
+.highlight .vc { color: #000 } /* Name.Variable.Class */
+.highlight .vg { color: #000 } /* Name.Variable.Global */
+.highlight .vi { color: #000 } /* Name.Variable.Instance */
+.highlight .vm { color: #000 } /* Name.Variable.Magic */
+.highlight .il { color: #0000CF; font-weight: bold } /* Literal.Number.Integer.Long */
 @media not print {
 body[data-theme="dark"] .highlight pre { line-height: 125%; }
 body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -89,85 +89,85 @@ body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-col
 body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 body[data-theme="dark"] .highlight .hll { background-color: #404040 }
-body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 }
-body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */
-body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */
-body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */
-body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */
-body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */
-body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
-body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
-body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */
-body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body[data-theme="dark"] .highlight { background: #202020; color: #D0D0D0 }
+body[data-theme="dark"] .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body[data-theme="dark"] .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body[data-theme="dark"] .highlight .esc { color: #D0D0D0 } /* Escape */
+body[data-theme="dark"] .highlight .g { color: #D0D0D0 } /* Generic */
+body[data-theme="dark"] .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body[data-theme="dark"] .highlight .l { color: #D0D0D0 } /* Literal */
+body[data-theme="dark"] .highlight .n { color: #D0D0D0 } /* Name */
+body[data-theme="dark"] .highlight .o { color: #D0D0D0 } /* Operator */
+body[data-theme="dark"] .highlight .x { color: #D0D0D0 } /* Other */
+body[data-theme="dark"] .highlight .p { color: #D0D0D0 } /* Punctuation */
+body[data-theme="dark"] .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body[data-theme="dark"] .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body[data-theme="dark"] .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body[data-theme="dark"] .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body[data-theme="dark"] .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body[data-theme="dark"] .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body[data-theme="dark"] .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body[data-theme="dark"] .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body[data-theme="dark"] .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body[data-theme="dark"] .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body[data-theme="dark"] .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
 body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
-body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */
-body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */
-body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */
-body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */
-body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */
-body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */
-body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */
-body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */
-body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body[data-theme="dark"] .highlight .go { color: #CCC } /* Generic.Output */
+body[data-theme="dark"] .highlight .gp { color: #AAA } /* Generic.Prompt */
+body[data-theme="dark"] .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body[data-theme="dark"] .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body[data-theme="dark"] .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body[data-theme="dark"] .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body[data-theme="dark"] .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body[data-theme="dark"] .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body[data-theme="dark"] .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body[data-theme="dark"] .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body[data-theme="dark"] .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body[data-theme="dark"] .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body[data-theme="dark"] .highlight .m { color: #51B2FD } /* Literal.Number */
+body[data-theme="dark"] .highlight .s { color: #ED9D13 } /* Literal.String */
+body[data-theme="dark"] .highlight .na { color: #BBB } /* Name.Attribute */
+body[data-theme="dark"] .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body[data-theme="dark"] .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body[data-theme="dark"] .highlight .no { color: #40FFFF } /* Name.Constant */
+body[data-theme="dark"] .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body[data-theme="dark"] .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body[data-theme="dark"] .highlight .ne { color: #BBB } /* Name.Exception */
+body[data-theme="dark"] .highlight .nf { color: #71ADFF } /* Name.Function */
+body[data-theme="dark"] .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body[data-theme="dark"] .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body[data-theme="dark"] .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body[data-theme="dark"] .highlight .py { color: #D0D0D0 } /* Name.Property */
+body[data-theme="dark"] .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body[data-theme="dark"] .highlight .nv { color: #40FFFF } /* Name.Variable */
+body[data-theme="dark"] .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body[data-theme="dark"] .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body[data-theme="dark"] .highlight .w { color: #666 } /* Text.Whitespace */
+body[data-theme="dark"] .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body[data-theme="dark"] .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body[data-theme="dark"] .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body[data-theme="dark"] .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body[data-theme="dark"] .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body[data-theme="dark"] .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body[data-theme="dark"] .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body[data-theme="dark"] .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body[data-theme="dark"] .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body[data-theme="dark"] .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body[data-theme="dark"] .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body[data-theme="dark"] .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body[data-theme="dark"] .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body[data-theme="dark"] .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body[data-theme="dark"] .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body[data-theme="dark"] .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body[data-theme="dark"] .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body[data-theme="dark"] .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body[data-theme="dark"] .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body[data-theme="dark"] .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body[data-theme="dark"] .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body[data-theme="dark"] .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body[data-theme="dark"] .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body[data-theme="dark"] .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body[data-theme="dark"] .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
 @media (prefers-color-scheme: dark) {
 body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
 body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -175,84 +175,84 @@ body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; backgro
 body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
-body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 }
-body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */
-body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */
-body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */
-body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */
-body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */
-body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
-body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
-body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */
-body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body:not([data-theme="light"]) .highlight { background: #202020; color: #D0D0D0 }
+body:not([data-theme="light"]) .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body:not([data-theme="light"]) .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body:not([data-theme="light"]) .highlight .esc { color: #D0D0D0 } /* Escape */
+body:not([data-theme="light"]) .highlight .g { color: #D0D0D0 } /* Generic */
+body:not([data-theme="light"]) .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body:not([data-theme="light"]) .highlight .l { color: #D0D0D0 } /* Literal */
+body:not([data-theme="light"]) .highlight .n { color: #D0D0D0 } /* Name */
+body:not([data-theme="light"]) .highlight .o { color: #D0D0D0 } /* Operator */
+body:not([data-theme="light"]) .highlight .x { color: #D0D0D0 } /* Other */
+body:not([data-theme="light"]) .highlight .p { color: #D0D0D0 } /* Punctuation */
+body:not([data-theme="light"]) .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body:not([data-theme="light"]) .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body:not([data-theme="light"]) .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body:not([data-theme="light"]) .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body:not([data-theme="light"]) .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body:not([data-theme="light"]) .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body:not([data-theme="light"]) .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body:not([data-theme="light"]) .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body:not([data-theme="light"]) .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body:not([data-theme="light"]) .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body:not([data-theme="light"]) .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
 body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
-body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */
-body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */
-body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */
-body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */
-body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */
-body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */
-body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */
-body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */
-body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body:not([data-theme="light"]) .highlight .go { color: #CCC } /* Generic.Output */
+body:not([data-theme="light"]) .highlight .gp { color: #AAA } /* Generic.Prompt */
+body:not([data-theme="light"]) .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body:not([data-theme="light"]) .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body:not([data-theme="light"]) .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body:not([data-theme="light"]) .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body:not([data-theme="light"]) .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body:not([data-theme="light"]) .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body:not([data-theme="light"]) .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body:not([data-theme="light"]) .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body:not([data-theme="light"]) .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body:not([data-theme="light"]) .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body:not([data-theme="light"]) .highlight .m { color: #51B2FD } /* Literal.Number */
+body:not([data-theme="light"]) .highlight .s { color: #ED9D13 } /* Literal.String */
+body:not([data-theme="light"]) .highlight .na { color: #BBB } /* Name.Attribute */
+body:not([data-theme="light"]) .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body:not([data-theme="light"]) .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body:not([data-theme="light"]) .highlight .no { color: #40FFFF } /* Name.Constant */
+body:not([data-theme="light"]) .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body:not([data-theme="light"]) .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body:not([data-theme="light"]) .highlight .ne { color: #BBB } /* Name.Exception */
+body:not([data-theme="light"]) .highlight .nf { color: #71ADFF } /* Name.Function */
+body:not([data-theme="light"]) .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body:not([data-theme="light"]) .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body:not([data-theme="light"]) .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body:not([data-theme="light"]) .highlight .py { color: #D0D0D0 } /* Name.Property */
+body:not([data-theme="light"]) .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body:not([data-theme="light"]) .highlight .nv { color: #40FFFF } /* Name.Variable */
+body:not([data-theme="light"]) .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body:not([data-theme="light"]) .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body:not([data-theme="light"]) .highlight .w { color: #666 } /* Text.Whitespace */
+body:not([data-theme="light"]) .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body:not([data-theme="light"]) .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body:not([data-theme="light"]) .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body:not([data-theme="light"]) .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body:not([data-theme="light"]) .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body:not([data-theme="light"]) .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body:not([data-theme="light"]) .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body:not([data-theme="light"]) .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body:not([data-theme="light"]) .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body:not([data-theme="light"]) .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body:not([data-theme="light"]) .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body:not([data-theme="light"]) .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body:not([data-theme="light"]) .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body:not([data-theme="light"]) .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body:not([data-theme="light"]) .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body:not([data-theme="light"]) .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body:not([data-theme="light"]) .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body:not([data-theme="light"]) .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body:not([data-theme="light"]) .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body:not([data-theme="light"]) .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body:not([data-theme="light"]) .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body:not([data-theme="light"]) .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body:not([data-theme="light"]) .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body:not([data-theme="light"]) .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body:not([data-theme="light"]) .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
 }
 }
\ No newline at end of file
diff --git a/_static/searchtools.js b/_static/searchtools.js
index 7918c3fab..b08d58c9b 100644
--- a/_static/searchtools.js
+++ b/_static/searchtools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for the full-text search.
  *
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => {
       .then((data) => {
         if (data)
           listItem.appendChild(
-            Search.makeSearchSummary(data, searchTerms)
+            Search.makeSearchSummary(data, searchTerms, anchor)
           );
         // highlight search terms in the summary
         if (SPHINX_HIGHLIGHT_ENABLED)  // set in sphinx_highlight.js
@@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => {
     );
   else
     Search.status.innerText = _(
-      `Search finished, found ${resultCount} page(s) matching the search query.`
-    );
+      "Search finished, found ${resultCount} page(s) matching the search query."
+    ).replace('${resultCount}', resultCount);
 };
 const _displayNextItem = (
   results,
@@ -137,6 +137,22 @@ const _displayNextItem = (
   // search finished, update title and status message
   else _finishSearch(resultCount);
 };
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+  const leftScore = a[4];
+  const rightScore = b[4];
+  if (leftScore === rightScore) {
+    // same score: sort alphabetically
+    const leftTitle = a[1].toLowerCase();
+    const rightTitle = b[1].toLowerCase();
+    if (leftTitle === rightTitle) return 0;
+    return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+  }
+  return leftScore > rightScore ? 1 : -1;
+};
 
 /**
  * Default splitQuery function. Can be overridden in ``sphinx.search`` with a
@@ -160,13 +176,26 @@ const Search = {
   _queued_query: null,
   _pulse_status: -1,
 
-  htmlToText: (htmlString) => {
+  htmlToText: (htmlString, anchor) => {
     const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
-    htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+    for (const removalQuery of [".headerlink", "script", "style"]) {
+      htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
+    }
+    if (anchor) {
+      const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
+      if (anchorContent) return anchorContent.textContent;
+
+      console.warn(
+        `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
+      );
+    }
+
+    // if anchor not specified or not found, fall back to main content
     const docContent = htmlElement.querySelector('[role="main"]');
-    if (docContent !== undefined) return docContent.textContent;
+    if (docContent) return docContent.textContent;
+
     console.warn(
-      "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+      "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
     );
     return "";
   },
@@ -239,16 +268,7 @@ const Search = {
     else Search.deferQuery(query);
   },
 
-  /**
-   * execute search (requires search index to be loaded)
-   */
-  query: (query) => {
-    const filenames = Search._index.filenames;
-    const docNames = Search._index.docnames;
-    const titles = Search._index.titles;
-    const allTitles = Search._index.alltitles;
-    const indexEntries = Search._index.indexentries;
-
+  _parseQuery: (query) => {
     // stem the search terms and add them to the correct list
     const stemmer = new Stemmer();
     const searchTerms = new Set();
@@ -284,21 +304,38 @@ const Search = {
     // console.info("required: ", [...searchTerms]);
     // console.info("excluded: ", [...excludedTerms]);
 
-    // array of [docname, title, anchor, descr, score, filename]
-    let results = [];
+    return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+  },
+
+  /**
+   * execute search (requires search index to be loaded)
+   */
+  _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
+    const filenames = Search._index.filenames;
+    const docNames = Search._index.docnames;
+    const titles = Search._index.titles;
+    const allTitles = Search._index.alltitles;
+    const indexEntries = Search._index.indexentries;
+
+    // Collect multiple result groups to be sorted separately and then ordered.
+    // Each is an array of [docname, title, anchor, descr, score, filename].
+    const normalResults = [];
+    const nonMainIndexResults = [];
+
     _removeChildren(document.getElementById("search-progress"));
 
-    const queryLower = query.toLowerCase();
+    const queryLower = query.toLowerCase().trim();
     for (const [title, foundTitles] of Object.entries(allTitles)) {
-      if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+      if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
         for (const [file, id] of foundTitles) {
-          let score = Math.round(100 * queryLower.length / title.length)
-          results.push([
+          const score = Math.round(Scorer.title * queryLower.length / title.length);
+          const boost = titles[file] === title ? 1 : 0;  // add a boost for document titles
+          normalResults.push([
             docNames[file],
             titles[file] !== title ? `${titles[file]} > ${title}` : title,
             id !== null ? "#" + id : "",
             null,
-            score,
+            score + boost,
             filenames[file],
           ]);
         }
@@ -308,46 +345,47 @@ const Search = {
     // search for explicit entries in index directives
     for (const [entry, foundEntries] of Object.entries(indexEntries)) {
       if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
-        for (const [file, id] of foundEntries) {
-          let score = Math.round(100 * queryLower.length / entry.length)
-          results.push([
+        for (const [file, id, isMain] of foundEntries) {
+          const score = Math.round(100 * queryLower.length / entry.length);
+          const result = [
             docNames[file],
             titles[file],
             id ? "#" + id : "",
             null,
             score,
             filenames[file],
-          ]);
+          ];
+          if (isMain) {
+            normalResults.push(result);
+          } else {
+            nonMainIndexResults.push(result);
+          }
         }
       }
     }
 
     // lookup as object
     objectTerms.forEach((term) =>
-      results.push(...Search.performObjectSearch(term, objectTerms))
+      normalResults.push(...Search.performObjectSearch(term, objectTerms))
     );
 
     // lookup as search terms in fulltext
-    results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+    normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
 
     // let the scorer override scores with a custom scoring function
-    if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
-
-    // now sort the results by score (in opposite order of appearance, since the
-    // display function below uses pop() to retrieve items) and then
-    // alphabetically
-    results.sort((a, b) => {
-      const leftScore = a[4];
-      const rightScore = b[4];
-      if (leftScore === rightScore) {
-        // same score: sort alphabetically
-        const leftTitle = a[1].toLowerCase();
-        const rightTitle = b[1].toLowerCase();
-        if (leftTitle === rightTitle) return 0;
-        return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
-      }
-      return leftScore > rightScore ? 1 : -1;
-    });
+    if (Scorer.score) {
+      normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+      nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+    }
+
+    // Sort each group of results by score and then alphabetically by name.
+    normalResults.sort(_orderResultsByScoreThenName);
+    nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+    // Combine the result groups in (reverse) order.
+    // Non-main index entries are typically arbitrary cross-references,
+    // so display them after other results.
+    let results = [...nonMainIndexResults, ...normalResults];
 
     // remove duplicate search results
     // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
@@ -361,7 +399,12 @@ const Search = {
       return acc;
     }, []);
 
-    results = results.reverse();
+    return results.reverse();
+  },
+
+  query: (query) => {
+    const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
+    const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
 
     // for debugging
     //Search.lastresults = results.slice();  // a copy
@@ -466,14 +509,18 @@ const Search = {
       // add support for partial matches
       if (word.length > 2) {
         const escapedWord = _escapeRegExp(word);
-        Object.keys(terms).forEach((term) => {
-          if (term.match(escapedWord) && !terms[word])
-            arr.push({ files: terms[term], score: Scorer.partialTerm });
-        });
-        Object.keys(titleTerms).forEach((term) => {
-          if (term.match(escapedWord) && !titleTerms[word])
-            arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
-        });
+        if (!terms.hasOwnProperty(word)) {
+          Object.keys(terms).forEach((term) => {
+            if (term.match(escapedWord))
+              arr.push({ files: terms[term], score: Scorer.partialTerm });
+          });
+        }
+        if (!titleTerms.hasOwnProperty(word)) {
+          Object.keys(titleTerms).forEach((term) => {
+            if (term.match(escapedWord))
+              arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+          });
+        }
       }
 
       // no match but word was a required one
@@ -496,9 +543,8 @@ const Search = {
 
       // create the mapping
       files.forEach((file) => {
-        if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
-          fileMap.get(file).push(word);
-        else fileMap.set(file, [word]);
+        if (!fileMap.has(file)) fileMap.set(file, [word]);
+        else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
       });
     });
 
@@ -549,8 +595,8 @@ const Search = {
    * search summary for a given text. keywords is a list
    * of stemmed words.
    */
-  makeSearchSummary: (htmlText, keywords) => {
-    const text = Search.htmlToText(htmlText);
+  makeSearchSummary: (htmlText, keywords, anchor) => {
+    const text = Search.htmlToText(htmlText, anchor);
     if (text === "") return null;
 
     const textLower = text.toLowerCase();
diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css
index 4723a4a18..ee651ce3d 100644
--- a/_static/styles/furo-extensions.css
+++ b/_static/styles/furo-extensions.css
@@ -1,2 +1,2 @@
-#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
+#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(min-width:1260px){div.highlight{max-width:60vw;width:-moz-fit-content;width:fit-content}}@media(min-width:2160px){div.highlight{max-width:50vw}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
 /*# sourceMappingURL=furo-extensions.css.map*/
\ No newline at end of file
diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map
index 84c17a00f..866dff103 100644
--- a/_static/styles/furo-extensions.css.map
+++ b/_static/styles/furo-extensions.css.map
@@ -1 +1 @@
-{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAGR,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n  padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n  .ethical-sidebar\n    // Remove the border and box-shadow.\n    border: none\n    box-shadow: none\n    // Manage the background colors.\n    background: var(--color-background-secondary)\n    &:hover\n      background: var(--color-background-hover)\n    // Ensure the text is legible.\n    a\n      color: var(--color-foreground-primary)\n\n  .ethical-callout a\n    color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n  position: static\n  width: 100%\n  background: transparent\n  display: block\n\n  // Make the background color fit with the theme's aesthetic.\n  .rst-versions\n    background: rgb(26, 28, 30)\n\n  .rst-current-version\n    cursor: unset\n    background: var(--color-sidebar-item-background)\n    &:hover\n      background: var(--color-sidebar-item-background)\n    .fa-book\n      color: var(--color-foreground-primary)\n\n  > .rst-other-versions\n    padding: 0\n    small\n      opacity: 1\n\n  .injected\n    .rst-versions\n      position: unset\n\n  &:hover,\n  &:focus-within\n    box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n    .rst-current-version\n      // Undo the tweaks done in RTD's CSS\n      font-size: inherit\n      line-height: inherit\n      height: auto\n      text-align: right\n      padding: 12px\n\n      // Match the rest of the body\n      background: #1a1c1e\n\n      .fa-book\n        float: left\n        color: white\n\n    .fa-caret-down\n      display: none\n\n    .rst-current-version,\n    .rst-other-versions,\n    .injected\n      display: block\n\n    > .rst-current-version\n      display: none\n",".highlight\n  &:hover button.copybtn\n    color: var(--color-code-foreground)\n\n  button.copybtn\n    // Make it visible\n    opacity: 1\n\n    // Align things correctly\n    align-items: center\n\n    height: 1.25em\n    width: 1.25em\n\n    top: 0.625rem // $code-spacing-vertical\n    right: 0.5rem\n\n    // Make it look better\n    color: var(--color-background-item)\n    background-color: var(--color-code-background)\n    border: none\n\n    // Change to cursor to make it obvious that you can click on it\n    cursor: pointer\n\n    // Transition smoothly, for aesthetics\n    transition: color 300ms, opacity 300ms\n\n    &:hover\n      color: var(--color-brand-content)\n      background-color: var(--color-code-background)\n\n    &::after\n      display: none\n      color: var(--color-code-foreground)\n      background-color: transparent\n\n    &.success\n      transition: color 0ms\n      color: #22863a\n      &::after\n        display: block\n\n    svg\n      padding: 0\n","body\n  // Colors\n  --sd-color-primary: var(--color-brand-primary)\n  --sd-color-primary-highlight: var(--color-brand-content)\n  --sd-color-primary-text: var(--color-background-primary)\n\n  // Shadows\n  --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n  // Cards\n  --sd-color-card-border: var(--color-card-border)\n  --sd-color-card-border-hover: var(--color-brand-content)\n  --sd-color-card-background: var(--color-card-background)\n  --sd-color-card-text: var(--color-foreground-primary)\n  --sd-color-card-header: var(--color-card-marginals-background)\n  --sd-color-card-footer: var(--color-card-marginals-background)\n\n  // Tabs\n  --sd-color-tabs-label-active: var(--color-brand-content)\n  --sd-color-tabs-label-hover: var(--color-foreground-muted)\n  --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n  --sd-color-tabs-underline-active: var(--color-brand-content)\n  --sd-color-tabs-underline-hover: var(--color-foreground-border)\n  --sd-color-tabs-underline-inactive: var(--color-background-border)\n  --sd-color-tabs-overline: var(--color-background-border)\n  --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n  box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card  // Have a shadow by default\n  box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n  box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n  box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n  box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover  // Don't change scale on hover\n  transform: none\n\n.sd-cards-carousel  // Have a bit of gap in the carousel by default\n  gap: 0.25rem\n  padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n  --tabs--label-text: var(--color-foreground-muted)\n  --tabs--label-text--hover: var(--color-foreground-muted)\n  --tabs--label-text--active: var(--color-brand-content)\n  --tabs--label-text--active--hover: var(--color-brand-content)\n  --tabs--label-background: transparent\n  --tabs--label-background--hover: transparent\n  --tabs--label-background--active: transparent\n  --tabs--label-background--active--hover: transparent\n  --tabs--padding-x: 0.25em\n  --tabs--margin-x: 1em\n  --tabs--border: var(--color-background-border)\n  --tabs--label-border: transparent\n  --tabs--label-border--hover: var(--color-foreground-muted)\n  --tabs--label-border--active: var(--color-brand-content)\n  --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n  max-width: initial\n  padding-left: initial\n  padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n  border: none\n  box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n  background-color: var(--color-background-secondary)\n  color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n    font-size: 2.2rem\nh2\n    font-size: 1.7rem\nh3\n    font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n    visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n    visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n    visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n    position: fixed\n    display: flex\n    width: 100%\n    min-height: 70px\n    background-color: var(--color-background-secondary)\n    color: var(--color-foreground-primary)\n    border-top: 1px solid var(--color-background-border)\n    bottom: 0\n    left: 0\n    z-index: 99999\n\n.cookie-alert__container\n    display: flex\n    align-items: center\n    width: 700px\n    max-width: calc(100% - 28px)\n    margin: auto\n\n.cookie-alert__button\n    margin-left: 14px\n\n.cookie-alert p\n    flex: 1\n\n// Farama default button style\n\n.farama-btn\n    background: var(--color-farama-button-background)\n    padding: 10px 26px\n    border-radius: 6px\n    border: none\n    transition: background-color 0.2s ease\n    cursor: pointer\n\n    &:hover\n        background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n    .farama-env-icon-container\n        position: absolute\n        display: flex\n        margin-top: 7px\n\n    .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n        margin-left: 34px\n\n.farama-env-icon\n    height: 32px\n\n// Envinronments grid\n\n.env-grid\n    display: flex\n    flex-wrap: wrap\n    justify-content: center\n    width: 100%\n    box-sizing: border-box\n\n.env-grid__cell\n    display: flex\n    flex-direction: column\n    width: 180px\n    height: 180px\n    padding: 10px\n\n.cell__image-container\n    display: flex\n    height: 148px\n    justify-content: center\n\n.cell__image-container img\n    max-height: 100%\n    object-fit: contain\n\n.cell__title\n    display: flex\n    justify-content: center\n    text-align: center\n    align-items: flex-end\n    height: 32px\n    line-height: 16px\n\n.more-btn\n    width: 240px\n    margin: 12px auto\n    display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n    overflow: hidden\n\nbody\n    --farama-header-height: 52px\n    --farama-header-logo-margin: 10px\n    --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n    position: absolute\n    display: flex\n    width: 100%\n    height: var(--farama-header-height)\n    border-bottom: 1px solid var(--color-header-border)\n    background-color: var(--color-background-secondary)\n    padding: 0 36px 0 24px\n    box-sizing: border-box\n    z-index: 95\n\n    .farama-header__container\n        width: 100%\n        max-width: 1400px\n        display: flex\n        margin: 0 auto\n        justify-content: space-between\n\n    a\n        color: var(--color-foreground-primary)\n        text-decoration: none\n        transition: color 0.125s ease\n\n        &:hover\n            color: var(--color-foreground-secondary)\n\n    .farama-header__logo\n        max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n        margin: var(--farama-header-logo-margin)\n\n    .farama-header__title\n        font-size: var(--font-size--normal)\n        font-weight: normal\n        margin: 0 0 2px 0\n        padding: 0 0 0 4px\n        align-self: center\n\n    .farama-header__left\n        display: flex\n\n        a\n            display: flex\n\n    .farama-header__left--mobile\n        display: none\n\n        .nav-overlay-icon svg\n            width: 20px\n            stroke: var(--color-foreground-primary)\n            fill: var(--color-foreground-primary)\n            stroke-width: 2px\n            padding: 0 6px\n\n    .farama-header__right\n        display: flex\n        align-items: center\n        z-index: 2\n\n        .farama-header__nav\n            display: flex\n            list-style: none\n            height: 100%\n\n            li\n                text-decoration: none\n                margin-left: 20px\n                display: flex\n                align-items: center\n                cursor: pointer\n\n                a\n                    height: 100%\n                    display: flex\n                    align-items: center\n\n                .farama-header__dropdown-container\n                    position: relative\n                    display: flex\n                    align-items: center\n                    height: 100%\n\n                    &:hover\n                        .farama-header__dropdown-menu\n                            display: block\n\n                    svg\n                        width: 32px\n                        fill: var(--color-foreground-primary)\n\n                    .farama-header__dropdown-menu\n                        position: absolute\n                        top: var(--farama-header-height)\n                        right: 0\n                        border: 1px solid var(--color-background-border)\n                        background: var(--color-background-hover)\n                        z-index: 9999\n                        display: none\n\n                        ul\n                            display: inherit\n                            margin: 0\n                            padding: 6px 14px\n\n                        li\n                            margin: 0\n                            padding: 6px 0\n\n        .farama-header-menu\n            position: relative\n            display: flex\n            justify-content: center\n\n            .farama-header-menu__btn\n                display: flex\n                background: none\n                border: none\n                cursor: pointer\n\n                img\n                    width: 26px\n                svg\n                    width: 14px\n                    stroke: var(--color-foreground-primary)\n                    stroke-width: 2px\n                    align-self: center\n\n\n            &.active .farama-header-menu-container\n                transform: translateY(100vh)\n\n            .farama-header-menu-container\n                position: fixed\n                z-index: 99\n                right: 0\n                top: -100vh\n                width: 100%\n                height: calc(100vh - calc(100vh - 100%))\n                transform: translateY(0)\n                box-sizing: border-box\n                transition: transform 0.2s ease-in\n                background-color: var(--color-background-secondary)\n                border-left: 1px solid var(--color-background-border)\n                overflow: auto\n\n                .farama-header-menu__header\n                    position: relative\n                    width: 100%\n                    max-width: 1400px\n                    box-sizing: border-box\n                    margin: 0 auto\n                    padding: 7px 52px\n                    border-bottom: 1px solid var(--color-background-border)\n                    display: flex\n                    align-items: center\n\n                    a\n                        display: flex\n                        align-items: center\n\n                        .farama-header-menu__logo\n                            width: 36px\n\n                        span\n                            color: var(--color-sidebar-brand-text)\n                            padding-left: 8px\n\n                    .farama-header-menu-header__right\n                        position: absolute\n                        right: 0\n                        padding-right: inherit\n\n                        button\n                            display: flex\n                            background: none\n                            border: none\n                            cursor: pointer\n\n                            svg\n                                width: 20px\n                                color: var(--color-foreground-primary)\n\n                .farama-header-menu__body\n                    display: flex\n                    width: 100%\n                    max-width: 1500px\n                    padding: 22px 52px\n                    box-sizing: border-box\n                    margin: 0 auto\n                    flex-wrap: wrap\n\n                    .farama-header-menu__section\n                        min-width: 220px\n                        margin-bottom: 24px\n                        padding-left: 18px\n\n                        .farama-header-menu__section-title\n                            display: block\n                            font-size: var(--font-size--small)\n                            font-weight: 600\n                            text-transform: uppercase\n                            padding: 0 12px 12px\n\n                        .farama-header-menu__subsections-container\n\n                            .farama-header-menu__subsection\n                                min-width: 210px\n\n                                &:not(:last-child)\n                                    margin-right: 12px\n\n                                .farama-header-menu__subsection-title\n                                    display: block\n                                    font-size: var(--font-size--small--3)\n                                    color: var(--color-foreground-secondary)\n                                    font-weight: 700\n                                    text-transform: uppercase\n                                    padding: 20px 12px 10px\n\n                        .farama-header-menu-list\n                            display: inherit\n                            margin: 0\n                            padding: 0\n                            list-style: none\n\n                            li\n                                border-radius: var(--sidebar-item-border-radius)\n\n                                &:hover\n                                    background-color: var(--color-farama-header-background-hover)\n\n                                a\n                                    display: flex\n                                    padding: 12px 14px\n                                    align-items: center\n\n                                    &:hover\n                                        color: inherit\n\n                                    img\n                                        width: 26px\n                                        margin-right: 10px\n\n.farama-sidebar__title\n    display: flex\n    align-items: center\n    padding-right: 4px\n    min-height: calc(52px - var(--sidebar-search-space-above))\n    margin-top: 0.6rem\n    margin-left: var(--sidebar-search-space-lateral)\n    text-decoration: none\n\n    img\n        height: calc(var(--farama-header-height) - 20px)\n        margin: var(--farama-sidebar-logo-margin)\n    span\n        color: var(--color-foreground-primary)\n        &:hover\n            text-decoration: none\n\n.sidebar-brand\n    flex-direction: row\n    padding: var(--sidebar-item-spacing-vertical)\n    align-items: center\n\n    .sidebar-logo-container\n        display: flex\n        max-width: 55px\n        height: auto\n\n    .sidebar-brand-text\n        font-size: 1.3rem\n        padding-left: 11px\n\n.farama-sidebar-donate\n    width: 76%\n    padding: 8px 16px 20px\n    margin: 0 auto\n\n    .farama-donate-btn\n        width: 100%\n        padding: 8px 12px\n        color: #fff\n        background: $farama-background\n        background-blend-mode: color\n        background-color: transparent\n        transition: background-color 0.2s ease\n        border: none\n        border-radius: 6px\n        cursor: pointer\n\n        &:hover\n            background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n    display: none\n    padding: 16px 3em\n    width: 100%\n    box-sizing: border-box\n    background-color: var(--color-highlighted-background)\n\n    &.active\n        display: flex\n\n    .farama-donate-banner__text\n        flex: 1\n        display: flex\n        justify-content: center\n        align-items: center\n        font-size: 1.1em\n\n    .farama-donate-banner__btns\n        display: flex\n        align-items: center\n\n        a\n            text-decoration: none\n\n        button\n            margin-left: 22px\n            height: 36px\n            position: relative\n            border: none\n            border-radius: 6px\n            display: flex\n            justify-content: center\n            align-items: center\n            cursor: pointer\n\n        .farama-donate-banner__go\n            color: #fff\n            background: $farama-background\n            background-blend-mode: color\n            background-color: transparent\n            transition: background-color 0.2s ease\n            padding: 0 26px\n\n            &:hover\n                background-color: rgb(255 255 255 / 10%)\n\n        .farama-donate-banner__cancel\n            transition: background-color 0.2s ease\n\n            svg\n                height: 26px\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        .farama-donate-banner__cancel\n            background-color: rgb(0 0 0 / 10%)\n            &:hover\n                background: rgb(0 0 0 / 20%)\n            svg\n                stroke: #fff\n\n    body[data-theme=\"light\"]\n        .farama-donate-banner__cancel\n            background-color: rgb(25 25 25 / 10%)\n            &:hover\n                    background: rgb(255 255 255 / 20%)\n            svg\n                stroke: #666\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        .farama-donate-banner__cancel\n            background-color: rgb(25 25 25 / 10%)\n            &:hover\n                    background: rgb(255 255 255 / 20%)\n            svg\n                stroke: #666\n\n    body[data-theme=\"dark\"]\n        .farama-donate-banner__cancel\n            background-color: rgb(0 0 0 / 10%)\n            &:hover\n                background: rgb(0 0 0 / 20%)\n            svg\n                stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n    margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n    text-align: center\n    padding: 0 0 1.6rem 0\n    margin: 0\n\n.farama-project-logo img\n    width: 65%\n\n.mobile-header\n    .header-center\n        transition: opacity 0.2s easy-in\n        opacity: 0\n\n.mobile-header.scrolled\n    .header-center\n        opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n    color: var(--color-foreground-secondary)\n    display: flex\n    gap: 0.5em\n\n.sphx-glr-script-out::before\n    content: \"Out:\"\n    line-height: 1.4\n    padding-top: 10px\n\n.sphx-glr-script-out .highlight\n    overflow-x: auto\n\n.sphx-glr-thumbcontainer\n    z-index: 1\n\ndiv.sphx-glr-download a\n    width: 340px\n    max-width: 100%\n    box-sizing: border-box\n    background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n    background: #0d3a4e\n    box-shadow: none\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        div.sphx-glr-download a\n            background: #0f4a65\n        div.sphx-glr-download a:hover\n            background: #0d3a4e\n    body[data-theme=\"light\"]\n        div.sphx-glr-download a\n            background: #f9d4a1\n        div.sphx-glr-download a:hover\n            background: #d9b481\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        div.sphx-glr-download a\n            background: #f9d4a1\n        div.sphx-glr-download a:hover\n            background: #d9b481\n    body[data-theme=\"dark\"]\n        div.sphx-glr-download a\n            background: #0f4a65\n        div.sphx-glr-download a:hover\n            background: #0d3a4e\n\nbody[data-theme=\"light\"]\n    div.sphx-glr-download a\n        background: #f9d4a1\n    div.sphx-glr-download a:hover\n        background: #d9b481\n\n.sphx-glr-thumbcontainer img\n    background-color: white\n    border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n    background: var(--color-api-background)\n    border-radius: 6px\n\n.tab-set > input + label\n    font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n    color: var(--color-brand-secondary)\n    border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n    background: var(--color-api-background)\n    border: none\n    box-shadow: none\n\n    div.code_cell, div.highlight\n        border: none\n        border-radius: 0\n\n    div.code_cell pre\n        padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n        background: #202020\n        color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n    div.jupyter_container div.highlight\n        background: #202020\n        color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n    .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n        padding: 7px 42px\n\n    .farama-header .farama-header-menu__btn-name\n        display: none\n\n\n@media (max-width: 600px)\n    .farama-header\n        padding: 0 4px\n\n        .farama-header__title\n            font-size: var(--font-size--small)\n\n        .farama-header__right .farama-header-menu .farama-header-menu-container\n            .farama-header-menu__header\n                padding: 8px 12px\n            .farama-header-menu__body\n                padding: 18px 12px\n\n    .farama-donate-banner\n        flex-direction: column\n\n\n        .farama-donate-banner__btns\n            margin-top: 1em\n            justify-content: end\n\n            button\n                margin-left: 12px\n                height: 36px\n\n            .farama-donate-banner__go\n                padding: 0 20px\n\n            .farama-donate-banner__cancel\n                svg\n                    height: 26px\n\n\n@media (max-width: 480px)\n    .farama-header\n        .farama-header__title\n            width: 110px\n\n        .farama-header-menu__btn-name\n            text-align: right\n            width: 100px\n\n    .farama-project-heading\n        text-align: left\n\n    .farama-header-menu__subsections-container\n        display: block !important\n\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        .farama-white-logo-invert\n            filter: invert(1)\n\n    body[data-theme=\"dark\"]\n        .farama-black-logo-invert\n            filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        // Github math render\n        img[src*=\"//render.githubusercontent.com/render/math\"]\n            filter: invert(90%)\n\n        .farama-black-logo-invert\n            filter: invert(1)\n\n    body[data-theme=\"light\"]\n        .farama-white-logo-invert\n            filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAER,yBACI,cAEI,eADA,wCACA,EAER,yBACI,cACI,gBAER,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n  padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n  .ethical-sidebar\n    // Remove the border and box-shadow.\n    border: none\n    box-shadow: none\n    // Manage the background colors.\n    background: var(--color-background-secondary)\n    &:hover\n      background: var(--color-background-hover)\n    // Ensure the text is legible.\n    a\n      color: var(--color-foreground-primary)\n\n  .ethical-callout a\n    color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n  position: static\n  width: 100%\n  background: transparent\n  display: block\n\n  // Make the background color fit with the theme's aesthetic.\n  .rst-versions\n    background: rgb(26, 28, 30)\n\n  .rst-current-version\n    cursor: unset\n    background: var(--color-sidebar-item-background)\n    &:hover\n      background: var(--color-sidebar-item-background)\n    .fa-book\n      color: var(--color-foreground-primary)\n\n  > .rst-other-versions\n    padding: 0\n    small\n      opacity: 1\n\n  .injected\n    .rst-versions\n      position: unset\n\n  &:hover,\n  &:focus-within\n    box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n    .rst-current-version\n      // Undo the tweaks done in RTD's CSS\n      font-size: inherit\n      line-height: inherit\n      height: auto\n      text-align: right\n      padding: 12px\n\n      // Match the rest of the body\n      background: #1a1c1e\n\n      .fa-book\n        float: left\n        color: white\n\n    .fa-caret-down\n      display: none\n\n    .rst-current-version,\n    .rst-other-versions,\n    .injected\n      display: block\n\n    > .rst-current-version\n      display: none\n",".highlight\n  &:hover button.copybtn\n    color: var(--color-code-foreground)\n\n  button.copybtn\n    // Make it visible\n    opacity: 1\n\n    // Align things correctly\n    align-items: center\n\n    height: 1.25em\n    width: 1.25em\n\n    top: 0.625rem // $code-spacing-vertical\n    right: 0.5rem\n\n    // Make it look better\n    color: var(--color-background-item)\n    background-color: var(--color-code-background)\n    border: none\n\n    // Change to cursor to make it obvious that you can click on it\n    cursor: pointer\n\n    // Transition smoothly, for aesthetics\n    transition: color 300ms, opacity 300ms\n\n    &:hover\n      color: var(--color-brand-content)\n      background-color: var(--color-code-background)\n\n    &::after\n      display: none\n      color: var(--color-code-foreground)\n      background-color: transparent\n\n    &.success\n      transition: color 0ms\n      color: #22863a\n      &::after\n        display: block\n\n    svg\n      padding: 0\n","body\n  // Colors\n  --sd-color-primary: var(--color-brand-primary)\n  --sd-color-primary-highlight: var(--color-brand-content)\n  --sd-color-primary-text: var(--color-background-primary)\n\n  // Shadows\n  --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n  // Cards\n  --sd-color-card-border: var(--color-card-border)\n  --sd-color-card-border-hover: var(--color-brand-content)\n  --sd-color-card-background: var(--color-card-background)\n  --sd-color-card-text: var(--color-foreground-primary)\n  --sd-color-card-header: var(--color-card-marginals-background)\n  --sd-color-card-footer: var(--color-card-marginals-background)\n\n  // Tabs\n  --sd-color-tabs-label-active: var(--color-brand-content)\n  --sd-color-tabs-label-hover: var(--color-foreground-muted)\n  --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n  --sd-color-tabs-underline-active: var(--color-brand-content)\n  --sd-color-tabs-underline-hover: var(--color-foreground-border)\n  --sd-color-tabs-underline-inactive: var(--color-background-border)\n  --sd-color-tabs-overline: var(--color-background-border)\n  --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n  box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card  // Have a shadow by default\n  box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n  box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n  box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n  box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover  // Don't change scale on hover\n  transform: none\n\n.sd-cards-carousel  // Have a bit of gap in the carousel by default\n  gap: 0.25rem\n  padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n  --tabs--label-text: var(--color-foreground-muted)\n  --tabs--label-text--hover: var(--color-foreground-muted)\n  --tabs--label-text--active: var(--color-brand-content)\n  --tabs--label-text--active--hover: var(--color-brand-content)\n  --tabs--label-background: transparent\n  --tabs--label-background--hover: transparent\n  --tabs--label-background--active: transparent\n  --tabs--label-background--active--hover: transparent\n  --tabs--padding-x: 0.25em\n  --tabs--margin-x: 1em\n  --tabs--border: var(--color-background-border)\n  --tabs--label-border: transparent\n  --tabs--label-border--hover: var(--color-foreground-muted)\n  --tabs--label-border--active: var(--color-brand-content)\n  --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n  max-width: initial\n  padding-left: initial\n  padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n  border: none\n  box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n  background-color: var(--color-background-secondary)\n  color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n    font-size: 2.2rem\nh2\n    font-size: 1.7rem\nh3\n    font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n    visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n    visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n    visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n    position: fixed\n    display: flex\n    width: 100%\n    min-height: 70px\n    background-color: var(--color-background-secondary)\n    color: var(--color-foreground-primary)\n    border-top: 1px solid var(--color-background-border)\n    bottom: 0\n    left: 0\n    z-index: 99999\n\n.cookie-alert__container\n    display: flex\n    align-items: center\n    width: 700px\n    max-width: calc(100% - 28px)\n    margin: auto\n\n.cookie-alert__button\n    margin-left: 14px\n\n.cookie-alert p\n    flex: 1\n\n// Farama default button style\n\n.farama-btn\n    background: var(--color-farama-button-background)\n    padding: 10px 26px\n    border-radius: 6px\n    border: none\n    transition: background-color 0.2s ease\n    cursor: pointer\n\n    &:hover\n        background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n    .farama-env-icon-container\n        position: absolute\n        display: flex\n        margin-top: 7px\n\n    .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n        margin-left: 34px\n\n.farama-env-icon\n    height: 32px\n\n// Envinronments grid\n\n.env-grid\n    display: flex\n    flex-wrap: wrap\n    justify-content: center\n    width: 100%\n    box-sizing: border-box\n\n.env-grid__cell\n    display: flex\n    flex-direction: column\n    width: 180px\n    height: 180px\n    padding: 10px\n\n.cell__image-container\n    display: flex\n    height: 148px\n    justify-content: center\n\n.cell__image-container img\n    max-height: 100%\n    object-fit: contain\n\n.cell__title\n    display: flex\n    justify-content: center\n    text-align: center\n    align-items: flex-end\n    height: 32px\n    line-height: 16px\n\n.more-btn\n    width: 240px\n    margin: 12px auto\n    display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n    overflow: hidden\n\nbody\n    --farama-header-height: 52px\n    --farama-header-logo-margin: 10px\n    --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n    position: absolute\n    display: flex\n    width: 100%\n    height: var(--farama-header-height)\n    border-bottom: 1px solid var(--color-header-border)\n    background-color: var(--color-background-secondary)\n    padding: 0 36px 0 24px\n    box-sizing: border-box\n    z-index: 95\n\n    .farama-header__container\n        width: 100%\n        max-width: 1400px\n        display: flex\n        margin: 0 auto\n        justify-content: space-between\n\n    a\n        color: var(--color-foreground-primary)\n        text-decoration: none\n        transition: color 0.125s ease\n\n        &:hover\n            color: var(--color-foreground-secondary)\n\n    .farama-header__logo\n        max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n        margin: var(--farama-header-logo-margin)\n\n    .farama-header__title\n        font-size: var(--font-size--normal)\n        font-weight: normal\n        margin: 0 0 2px 0\n        padding: 0 0 0 4px\n        align-self: center\n\n    .farama-header__left\n        display: flex\n\n        a\n            display: flex\n\n    .farama-header__left--mobile\n        display: none\n\n        .nav-overlay-icon svg\n            width: 20px\n            stroke: var(--color-foreground-primary)\n            fill: var(--color-foreground-primary)\n            stroke-width: 2px\n            padding: 0 6px\n\n    .farama-header__right\n        display: flex\n        align-items: center\n        z-index: 2\n\n        .farama-header__nav\n            display: flex\n            list-style: none\n            height: 100%\n\n            li\n                text-decoration: none\n                margin-left: 20px\n                display: flex\n                align-items: center\n                cursor: pointer\n\n                a\n                    height: 100%\n                    display: flex\n                    align-items: center\n\n                .farama-header__dropdown-container\n                    position: relative\n                    display: flex\n                    align-items: center\n                    height: 100%\n\n                    &:hover\n                        .farama-header__dropdown-menu\n                            display: block\n\n                    svg\n                        width: 32px\n                        fill: var(--color-foreground-primary)\n\n                    .farama-header__dropdown-menu\n                        position: absolute\n                        top: var(--farama-header-height)\n                        right: 0\n                        border: 1px solid var(--color-background-border)\n                        background: var(--color-background-hover)\n                        z-index: 9999\n                        display: none\n\n                        ul\n                            display: inherit\n                            margin: 0\n                            padding: 6px 14px\n\n                        li\n                            margin: 0\n                            padding: 6px 0\n\n        .farama-header-menu\n            position: relative\n            display: flex\n            justify-content: center\n\n            .farama-header-menu__btn\n                display: flex\n                background: none\n                border: none\n                cursor: pointer\n\n                img\n                    width: 26px\n                svg\n                    width: 14px\n                    stroke: var(--color-foreground-primary)\n                    stroke-width: 2px\n                    align-self: center\n\n\n            &.active .farama-header-menu-container\n                transform: translateY(100vh)\n\n            .farama-header-menu-container\n                position: fixed\n                z-index: 99\n                right: 0\n                top: -100vh\n                width: 100%\n                height: calc(100vh - calc(100vh - 100%))\n                transform: translateY(0)\n                box-sizing: border-box\n                transition: transform 0.2s ease-in\n                background-color: var(--color-background-secondary)\n                border-left: 1px solid var(--color-background-border)\n                overflow: auto\n\n                .farama-header-menu__header\n                    position: relative\n                    width: 100%\n                    max-width: 1400px\n                    box-sizing: border-box\n                    margin: 0 auto\n                    padding: 7px 52px\n                    border-bottom: 1px solid var(--color-background-border)\n                    display: flex\n                    align-items: center\n\n                    a\n                        display: flex\n                        align-items: center\n\n                        .farama-header-menu__logo\n                            width: 36px\n\n                        span\n                            color: var(--color-sidebar-brand-text)\n                            padding-left: 8px\n\n                    .farama-header-menu-header__right\n                        position: absolute\n                        right: 0\n                        padding-right: inherit\n\n                        button\n                            display: flex\n                            background: none\n                            border: none\n                            cursor: pointer\n\n                            svg\n                                width: 20px\n                                color: var(--color-foreground-primary)\n\n                .farama-header-menu__body\n                    display: flex\n                    width: 100%\n                    max-width: 1500px\n                    padding: 22px 52px\n                    box-sizing: border-box\n                    margin: 0 auto\n                    flex-wrap: wrap\n\n                    .farama-header-menu__section\n                        min-width: 220px\n                        margin-bottom: 24px\n                        padding-left: 18px\n\n                        .farama-header-menu__section-title\n                            display: block\n                            font-size: var(--font-size--small)\n                            font-weight: 600\n                            text-transform: uppercase\n                            padding: 0 12px 12px\n\n                        .farama-header-menu__subsections-container\n\n                            .farama-header-menu__subsection\n                                min-width: 210px\n\n                                &:not(:last-child)\n                                    margin-right: 12px\n\n                                .farama-header-menu__subsection-title\n                                    display: block\n                                    font-size: var(--font-size--small--3)\n                                    color: var(--color-foreground-secondary)\n                                    font-weight: 700\n                                    text-transform: uppercase\n                                    padding: 20px 12px 10px\n\n                        .farama-header-menu-list\n                            display: inherit\n                            margin: 0\n                            padding: 0\n                            list-style: none\n\n                            li\n                                border-radius: var(--sidebar-item-border-radius)\n\n                                &:hover\n                                    background-color: var(--color-farama-header-background-hover)\n\n                                a\n                                    display: flex\n                                    padding: 12px 14px\n                                    align-items: center\n\n                                    &:hover\n                                        color: inherit\n\n                                    img\n                                        width: 26px\n                                        margin-right: 10px\n\n.farama-sidebar__title\n    display: flex\n    align-items: center\n    padding-right: 4px\n    min-height: calc(52px - var(--sidebar-search-space-above))\n    margin-top: 0.6rem\n    margin-left: var(--sidebar-search-space-lateral)\n    text-decoration: none\n\n    img\n        height: calc(var(--farama-header-height) - 20px)\n        margin: var(--farama-sidebar-logo-margin)\n    span\n        color: var(--color-foreground-primary)\n        &:hover\n            text-decoration: none\n\n.sidebar-brand\n    flex-direction: row\n    padding: var(--sidebar-item-spacing-vertical)\n    align-items: center\n\n    .sidebar-logo-container\n        display: flex\n        max-width: 55px\n        height: auto\n\n    .sidebar-brand-text\n        font-size: 1.3rem\n        padding-left: 11px\n\n.farama-sidebar-donate\n    width: 76%\n    padding: 8px 16px 20px\n    margin: 0 auto\n\n    .farama-donate-btn\n        width: 100%\n        padding: 8px 12px\n        color: #fff\n        background: $farama-background\n        background-blend-mode: color\n        background-color: transparent\n        transition: background-color 0.2s ease\n        border: none\n        border-radius: 6px\n        cursor: pointer\n\n        &:hover\n            background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n    display: none\n    padding: 16px 3em\n    width: 100%\n    box-sizing: border-box\n    background-color: var(--color-highlighted-background)\n\n    &.active\n        display: flex\n\n    .farama-donate-banner__text\n        flex: 1\n        display: flex\n        justify-content: center\n        align-items: center\n        font-size: 1.1em\n\n    .farama-donate-banner__btns\n        display: flex\n        align-items: center\n\n        a\n            text-decoration: none\n\n        button\n            margin-left: 22px\n            height: 36px\n            position: relative\n            border: none\n            border-radius: 6px\n            display: flex\n            justify-content: center\n            align-items: center\n            cursor: pointer\n\n        .farama-donate-banner__go\n            color: #fff\n            background: $farama-background\n            background-blend-mode: color\n            background-color: transparent\n            transition: background-color 0.2s ease\n            padding: 0 26px\n\n            &:hover\n                background-color: rgb(255 255 255 / 10%)\n\n        .farama-donate-banner__cancel\n            transition: background-color 0.2s ease\n\n            svg\n                height: 26px\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        .farama-donate-banner__cancel\n            background-color: rgb(0 0 0 / 10%)\n            &:hover\n                background: rgb(0 0 0 / 20%)\n            svg\n                stroke: #fff\n\n    body[data-theme=\"light\"]\n        .farama-donate-banner__cancel\n            background-color: rgb(25 25 25 / 10%)\n            &:hover\n                    background: rgb(255 255 255 / 20%)\n            svg\n                stroke: #666\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        .farama-donate-banner__cancel\n            background-color: rgb(25 25 25 / 10%)\n            &:hover\n                    background: rgb(255 255 255 / 20%)\n            svg\n                stroke: #666\n\n    body[data-theme=\"dark\"]\n        .farama-donate-banner__cancel\n            background-color: rgb(0 0 0 / 10%)\n            &:hover\n                background: rgb(0 0 0 / 20%)\n            svg\n                stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n    margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n    text-align: center\n    padding: 0 0 1.6rem 0\n    margin: 0\n\n.farama-project-logo img\n    width: 65%\n\n.mobile-header\n    .header-center\n        transition: opacity 0.2s easy-in\n        opacity: 0\n\n.mobile-header.scrolled\n    .header-center\n        opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n    color: var(--color-foreground-secondary)\n    display: flex\n    gap: 0.5em\n\n.sphx-glr-script-out::before\n    content: \"Out:\"\n    line-height: 1.4\n    padding-top: 10px\n\n.sphx-glr-script-out .highlight\n    overflow-x: auto\n\n.sphx-glr-thumbcontainer\n    z-index: 1\n\ndiv.sphx-glr-download a\n    width: 340px\n    max-width: 100%\n    box-sizing: border-box\n    background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n    background: #0d3a4e\n    box-shadow: none\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        div.sphx-glr-download a\n            background: #0f4a65\n        div.sphx-glr-download a:hover\n            background: #0d3a4e\n    body[data-theme=\"light\"]\n        div.sphx-glr-download a\n            background: #f9d4a1\n        div.sphx-glr-download a:hover\n            background: #d9b481\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        div.sphx-glr-download a\n            background: #f9d4a1\n        div.sphx-glr-download a:hover\n            background: #d9b481\n    body[data-theme=\"dark\"]\n        div.sphx-glr-download a\n            background: #0f4a65\n        div.sphx-glr-download a:hover\n            background: #0d3a4e\n\nbody[data-theme=\"light\"]\n    div.sphx-glr-download a\n        background: #f9d4a1\n    div.sphx-glr-download a:hover\n        background: #d9b481\n\n.sphx-glr-thumbcontainer img\n    background-color: white\n    border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n    background: var(--color-api-background)\n    border-radius: 6px\n\n.tab-set > input + label\n    font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n    color: var(--color-brand-secondary)\n    border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n    background: var(--color-api-background)\n    border: none\n    box-shadow: none\n\n    div.code_cell, div.highlight\n        border: none\n        border-radius: 0\n\n    div.code_cell pre\n        padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n        background: #202020\n        color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n    div.jupyter_container div.highlight\n        background: #202020\n        color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n    .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n        padding: 7px 42px\n\n    .farama-header .farama-header-menu__btn-name\n        display: none\n\n\n@media (max-width: 600px)\n    .farama-header\n        padding: 0 4px\n\n        .farama-header__title\n            font-size: var(--font-size--small)\n\n        .farama-header__right .farama-header-menu .farama-header-menu-container\n            .farama-header-menu__header\n                padding: 8px 12px\n            .farama-header-menu__body\n                padding: 18px 12px\n\n    .farama-donate-banner\n        flex-direction: column\n\n\n        .farama-donate-banner__btns\n            margin-top: 1em\n            justify-content: end\n\n            button\n                margin-left: 12px\n                height: 36px\n\n            .farama-donate-banner__go\n                padding: 0 20px\n\n            .farama-donate-banner__cancel\n                svg\n                    height: 26px\n\n\n@media (max-width: 480px)\n    .farama-header\n        .farama-header__title\n            width: 110px\n\n        .farama-header-menu__btn-name\n            text-align: right\n            width: 100px\n\n    .farama-project-heading\n        text-align: left\n\n    .farama-header-menu__subsections-container\n        display: block !important\n\n@media (min-width: 1260px)\n    div.highlight\n        width: fit-content\n        max-width: 60vw\n\n@media (min-width: 2160px)\n    div.highlight\n        max-width: 50vw\n\n@media (prefers-color-scheme: light)\n    body:not([data-theme=\"dark\"])\n        .farama-white-logo-invert\n            filter: invert(1)\n\n    body[data-theme=\"dark\"]\n        .farama-black-logo-invert\n            filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n    body:not([data-theme=\"light\"])\n        // Github math render\n        img[src*=\"//render.githubusercontent.com/render/math\"]\n            filter: invert(90%)\n\n        .farama-black-logo-invert\n            filter: invert(1)\n\n    body[data-theme=\"light\"]\n        .farama-white-logo-invert\n            filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/versioning/versioning_menu.html b/_static/versioning/versioning_menu.html
index 1daf4cef7..68109cf86 100644
--- a/_static/versioning/versioning_menu.html
+++ b/_static/versioning/versioning_menu.html
@@ -122,15 +122,33 @@
         });
 
         const sortVersions = (a, b) => {
-            // Alpha versions
-            if (a.includes("a")) return 1;
-            if (b.includes("a")) return -1;
-            if (a.replace("v", "") > b.replace("v", ""))
-                return -1
-            else if (a.replace("v", "") < b.replace("v", ""))
-                return 1
-            else
-                return 0
+            const innerA = a.replace("v", "");
+            const innerB = b.replace("v", "");
+
+            if (innerA.match(/[a-z]/) && !innerB.match(/[a-z]/)) return 1;
+            if (!innerA.match(/[a-z]/) && innerB.match(/[a-z]/)) return -1;
+
+            const splittedInnerA = innerA.split("");
+            const splittedInnerB = innerB.split("");
+
+            while (splittedInnerA.length && splittedInnerB.length) {
+                const charA = splittedInnerA.shift();
+                const charB = splittedInnerB.shift();
+
+                if (charA === charB) continue;
+                else if (charA === ".") return 1;
+                else if (charB === ".") return -1;
+                else if (charA.match(/[0-9]/) && charB.match(/[0-9]/)) {
+                    return Number(charB) - Number(charA);
+                } else {
+                    if (charA < charB) return 1;
+                    else if (charA > charB) return -1;
+                    else return 0;
+                }
+            }
+            if (innerA < innerB) return 1;
+            else if (innerA > innerB) return -1;
+            else return 0;
         }
 
         if ((githubUser !== null && githubUser !== "") || (repo !== null && repo !== "")) {
@@ -204,4 +222,4 @@
             console.error("Invalid versioning configuration");
         }
     
-
\ No newline at end of file +
diff --git a/developing/index.html b/developing/index.html index dea7dd66e..ae3ae2444 100644 --- a/developing/index.html +++ b/developing/index.html @@ -11,11 +11,11 @@ - + Development - Stable-Retro Documentation - + - + @@ -279,36 +279,36 @@
-

Development#

+

Development

Adding new games can be done without recompiling Stable Retro, but if you need to work on the C++ code or make changes to the UI, you will want to compile Stable Retro from source.

-

Install Retro from source#

+

Install Retro from source

Building Stable Retro requires at least either gcc 5 or clang 3.4.

-

Prerequisites#

+

Prerequisites

To build Stable Retro you must first install CMake. You can do this either through your package manager, download from the official site or pip3 install cmake. If you’re using the official installer on Windows, make sure to tell CMake to add itself to the system PATH.

-

Mac prerequisites#

+

Mac prerequisites

Since LuaJIT does not work properly on macOS you must first install Lua 5.1 from homebrew:

brew install pkg-config lua@5.1
 
-

Windows prerequisites#

+

Windows prerequisites

Install docker

-

Linux prerequisites#

+

Linux prerequisites

sudo apt-get install zlib1g-dev
 
-

Building Linux and Mac#

+

Building Linux and Mac

git clone https://github.com/farama-foundation/stable-retro.git stable-retro
 cd stable-retro
 pip3 install -e .
@@ -316,7 +316,7 @@ 

Building Linux and Mac

-

Building Windows#

+

Building Windows

Run the following

docker/build_windows.bat
 
@@ -331,10 +331,10 @@

Building Windows -

Install Retro UI from source#

+

Install Retro UI from source

First make sure you can install Retro from source, after that follow the instructions for your platform:

-

macOS#

+

macOS

Note that for Mojave (10.14) you may need to install /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

brew install pkg-config capnp lua@5.1 qt5
 cmake . -DCMAKE_PREFIX_PATH=/usr/local/opt/qt -DBUILD_UI=ON -UPYLIB_DIRECTORY
@@ -344,7 +344,7 @@ 

macOS#<

-

Linux#

+

Linux

sudo apt-get install capnproto libcapnp-dev libqt5opengl5-dev qtbase5-dev zlib1g-dev
 cmake . -DBUILD_UI=ON -UPYLIB_DIRECTORY
 make -j$(grep -c ^processor /proc/cpuinfo)
@@ -353,7 +353,7 @@ 

Linux#<

-

Windows#

+

Windows

The Retro UI is not currently supported in native Windows but you can use it easily via WSL2 (Windows Subsystem for Linux) by following the instructions above for Linux. From within WSL2 just launch gym-retro-integration binary like you would on linux.

@@ -477,10 +477,62 @@

Windows#< - + + - - + + diff --git a/genindex/index.html b/genindex/index.html index 454a081b2..2119c406e 100644 --- a/genindex/index.html +++ b/genindex/index.html @@ -10,10 +10,10 @@ - Index - Stable-Retro Documentation - + Index - Stable-Retro Documentation + - + @@ -431,10 +431,62 @@

S

- + + - - + + diff --git a/getting_started/index.html b/getting_started/index.html index 8df87ed9b..b7a1dc426 100644 --- a/getting_started/index.html +++ b/getting_started/index.html @@ -11,11 +11,11 @@ - + Getting Started - Stable-Retro Documentation - + - + @@ -279,16 +279,16 @@
-

Getting Started#

+

Getting Started

Stable Retro requires one of the supported versions of Python (3,6 to 3.10). Please make sure to install the appropriate distribution for your OS beforehand. Please note that due to compatibility issues with some of the cores, 32-bit operating systems are not supported.

pip3 install stable-retro
 

See the section development if you want to build Stable Retro yourself (this is only useful if you want to change the C++ code, not required to integrate new games).

-

Create a Retro Environment#

+

Create a Retro Environment

After installing you can now create a Gymnasium environment in Python:

-
import retro
+
import retro
 env = retro.make(game='Airstriker-Genesis')
 
@@ -296,11 +296,11 @@

Create a Retro EnvironmentImporting ROMs for information about importing ROMs into Stable Retro.

-

Example Usage#

+

Example Usage

Stable Retro is useful primarily as a means to train RL on classic video games, though it can also be used to control those video games from Python.

Here are some example ways to use Stable Retro:

-

Interactive Script#

+

Interactive Script

There is a Python script that lets you interact with the game using the Gymnasium interface. Run it like this:

-

Random Agent#

+

Random Agent

A random agent that chooses a random action on each timestep looks much like the example random agent for Gymnasium:

-
import retro
+
import retro
 
 
-def main():
+def main():
     env = retro.make(game="Airstriker-Genesis")
     env.reset()
     while True:
@@ -336,7 +336,7 @@ 

Random Agent -

Brute#

+

Brute

There is a simple but effective reinforcement learning algorithm called “the Brute” from “Revisiting the Arcade Learning Environment” by Machado et al. which works on deterministic environments like Stable Retro games and is easy to implement. To run the example:

python3 -m retro.examples.brute --game Airstriker-Genesis
 
@@ -344,7 +344,7 @@

Brute#<

This algorithm works by building up a sequence of button presses that do well in the game, it doesn’t look at the screen at all. It will print out the best reward seen so far while training.

-

PPO#

+

PPO

Using “Proximal Policy Optimization” by Schulman et al., you can train an agent to play many of the games, though it takes awhile and is much faster with a GPU.

This example requires installing Stable Baselines. Once installed, you can run it:

python3 -m retro.examples.ppo --game Airstriker-Genesis
@@ -354,16 +354,16 @@ 

PPO#

-

Integrations#

+

Integrations

What games have already been integrated? Note that this will display all defined environments, even ones for which ROMs are missing.

-
import retro
+
import retro
 retro.data.list_games()
 

The actual integration data can be see in the Stable Retro Github repo.

-

Importing ROMs#

+

Importing ROMs

If you have the correct ROMs on your computer (identified by the rom.sha file for each game integration), you can import them using the import script:

python3 -m retro.import /path/to/your/ROMs/directory/
 
@@ -486,10 +486,62 @@

Integrations + - - + + diff --git a/index.html b/index.html index e85b9e7be..5253e6b39 100644 --- a/index.html +++ b/index.html @@ -11,11 +11,11 @@ - + Stable-Retro Documentation - + - + @@ -287,7 +287,8 @@

-Stable-retro gif +Stable-retro gif +

Stable-Retro is a maintained fork of OpenAI’s Retro library.

stable-retro lets you turn classic video games into Gymnasium environments for reinforcement learning. Supported plateforms includes Sega Genesis, Sega 32X, Super Nintendo, Atari 2600 and more (full list here)

@@ -295,24 +296,24 @@

Train an agent using Proximal Policy Optimization from Stable Baselines 3 """ -import argparse +import argparse -import gymnasium as gym -import numpy as np -from gymnasium.wrappers.time_limit import TimeLimit -from stable_baselines3 import PPO -from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame -from stable_baselines3.common.vec_env import ( +import gymnasium as gym +import numpy as np +from gymnasium.wrappers.time_limit import TimeLimit +from stable_baselines3 import PPO +from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame +from stable_baselines3.common.vec_env import ( SubprocVecEnv, VecFrameStack, VecTransposeImage, ) -import retro +import retro -class StochasticFrameSkip(gym.Wrapper): - def __init__(self, env, n, stickprob): +class StochasticFrameSkip(gym.Wrapper): + def __init__(self, env, n, stickprob): gym.Wrapper.__init__(self, env) self.n = n self.stickprob = stickprob @@ -320,11 +321,11 @@

self.rng = np.random.RandomState() self.supports_want_render = hasattr(env, "supports_want_render") - def reset(self, **kwargs): + def reset(self, **kwargs): self.curac = None return self.env.reset(**kwargs) - def step(self, ac): + def step(self, ac): terminated = False truncated = False totrew = 0 @@ -352,7 +353,7 @@

return ob, totrew, terminated, truncated, info -def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs): +def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs): if state is None: state = retro.State.DEFAULT env = retro.make(game, state, **kwargs) @@ -362,7 +363,7 @@

return env -def wrap_deepmind_retro(env): +def wrap_deepmind_retro(env): """ Configure environment for retro games, using config similar to DeepMind-style Atari in openai/baseline's wrap_deepmind """ @@ -371,14 +372,14 @@

return env -def main(): +def main(): parser = argparse.ArgumentParser() parser.add_argument("--game", default="Airstriker-Genesis") parser.add_argument("--state", default=retro.State.DEFAULT) parser.add_argument("--scenario", default=None) args = parser.parse_args() - def make_env(): + def make_env(): env = make_retro(game=args.game, state=args.state, scenario=args.scenario) env = wrap_deepmind_retro(env) return env @@ -474,10 +475,62 @@

- + + - - + + diff --git a/integration/index.html b/integration/index.html index f0f633f03..20708209a 100644 --- a/integration/index.html +++ b/integration/index.html @@ -11,11 +11,11 @@ - + Game Integration - Stable-Retro Documentation - + - + @@ -279,7 +279,7 @@
-

Game Integration#

+

Game Integration

Integrating a game means taking a video game ROM file and setting it up as a reinforcement learning environment by defining 3 things:

  • A starting state

  • @@ -289,14 +289,14 @@

    Game IntegrationGymnasium environment.

    If you are going to integrate a new game, you’ll need a ROM for the correct system, see Supported ROM Types for a list.

    -

    Example Integration#

    +

    Example Integration

    This is a list of the integration files for the game Airstriker-Genesis.

    -

    Level1.state#

    +

    Level1.state

    This is a savestate from the beginning of the game, restarting the environment will put the agent at this point in the game.

    -

    data.json#

    +

    data.json

    This file defines the list of game-related variables that python can see based on their memory addresses in the games

    {
       "info": {
    @@ -318,7 +318,7 @@ 

    data.json

    -

    scenario.json#

    +

    scenario.json

    This file defines the reward function and done condition using the variables defined in data.json

    {
       "done": {
    @@ -345,7 +345,7 @@ 

    scenario.json

    -

    metadata.json#

    +

    metadata.json

    This file defines the default starting state if no state is specified by the user as well as some miscellaneous debugging information.

    {
       "default_state": "Level1",
    @@ -359,11 +359,11 @@ 

    metadata.json

    -

    rom.md#

    +

    rom.md

    This is the ROM file used for this game, with a few exceptions, ROM files are not included in Stable Retro, but will be in your local copy of Stable Retro after you import them.

    -

    rom.sha#

    +

    rom.sha

    This is the SHA1 hash of the rom.md file, used for importing ROMs.

    c67af162391fff4a63432be5a156eb9ca7b4da5a
     
    @@ -372,13 +372,13 @@

    rom.sha<

    -

    Integration Files#

    +

    Integration Files

    -

    States#

    +

    States

    Emulation allows the entire state of a video game system to be stored to disk and restored. These files are specific to the emulator, but always end with .state. These are identical to the versions used in the standalone versions of the emulators but gzipped.

    -

    Variable Locations data.json#

    +

    Variable Locations data.json

    Information about the inner workings of games are stored alongside the ROM in a file named data.json. This JSON file documents “ground truth” information about a game, including the locations and formats of variables in memory. These manifests are separated into sections, although only one section currently is defined:

    The info section of the manifest lists game variables’ memory addresses. Each entry in the info section consists of a key naming the memory address and the following values:

      @@ -399,7 +399,7 @@

      Variable Locations Appendix: Types.

    -

    Scenario scenario.json#

    +

    Scenario scenario.json

    Information pertaining to reward functions and done conditions can either be specified by manually overriding functions in retro.RetroEnv or can be done by writing a scenario file.

    Scenario files contain information that is used to compute the reward function and done condition from variables defined in the information manifest. Each variable specified in the scenario file is multiplied by a reward value if positive and a penalty value if negative and then summed up to create the reward for that step. Similarly, states of these variables can be checked to see if the game is over. By default the scenario file will be loaded from scenario.json, but alternative scenario files can be specified in the retro.RetroEnv constructor.

    Scenario files are again JSON and specified with the following sections:

    @@ -427,7 +427,7 @@

    Scenario scenar

    -

    The Integration UI#

    +

    The Integration UI

    The integration UI helps you easily find variables and see what is going on with the reward function.

    You can normally download the compiled UI package for your platform here:

      @@ -436,7 +436,7 @@

      Scenario scenar

    However, if those URLs no longer work, you can also download these packages from GitHub’s Releases

    -

    Integrating a new ROM#

    +

    Integrating a new ROM

    1. Open the Stable Retro Integration UI

    2. Load a new game — Command-Shift-O on Mac

    3. @@ -456,7 +456,7 @@

      Integrating a new ROM

    -

    Supported ROM Types#

    +

    Supported ROM Types

    ROM files contain the game itself. Each system has a unique file extension to denote which system a given ROM runs on:

    -

    Integrating a Game#

    +

    Integrating a Game

    To integrate a game you need to define a done condition and a reward function. The done condition lets Stable Retro know when to end a game session, while the reward function provides a simple numeric goal for machine learning agents to maximize.

    To define these, you find variables from the game’s memory, such as the player’s current score and lives remaining, and use those to create the done condition and reward function. An example done condition is when the lives variable is equal to 0, an example reward function is the change in the score variable.

    Note: if the game requires that you hit the Start button to play, for instance after dying, then you need to modify the scenario file to allow this as Start is disallowed by default. See the actions key in KidChameleon-Genesis for an example of this.

    -

    Done Condition#

    +

    Done Condition

    This is usually the easier of the two. The best done condition to use is the Game Over or Continue screen after you run out of lives. For some games this is when you have zero lives left, for some -1 lives, for others, it can be pretty hard.

    It’s better to have a simple and reliable but slightly incorrect done condition (e.g. ending the game when you still have 1 life left because it’s hard to detect the 0 life case) than to have a done condition that is unreliable, such as a gameover variable that detects when the gameover screen is present most of the time but also incorrectly fires when switching levels.

    If you create a gameover variable, make sure to test it with a replay that plays multiple levels in a row to make sure it doesn’t fire accidentally.

    -

    Reward Function#

    +

    Reward Function

    Reinforcement learning agents try to maximize the reward function. The ideal reward function would be that you get 1 point for beating the game. There’s no way to maximize that besides beating the game.

    That reward is impractical though, because existing reinforcement learning algorithms are unable to make progress with a reward that is so hard to get. Instead we can specify some easier to get reward that, if you maximize it, should result in beating the game.

    If the game has a score, this is often a good choice. In some games however, you can get as much score as you want by standing in one place and attacking the same enemy over and over as it respawns. Because that is so different from beating the game, it’s best to have an alternative reward, though these are often very game specific.

    @@ -492,7 +492,7 @@

    Reward Functionscore variable and set the reward such that the reward the agent receives matches the score displayed on the screen, make sure to check that you’re not off by a factor of 10 or 100 by comparing to the Cumulative value displayed in the Scenario Information pane of the UI.

    -

    Finding Variables#

    +

    Finding Variables

    It’s best to keep a consistent pattern for the different types of variables you might add to a game’s data.json file. Here are some tips:

    1. It’s pretty common for multiple different variables to group themselves together. When narrowing down the search for a particular variable, look at nearby memory addresses if you suspect you have a similar but incorrect variable (for instance you found the high score variable but are looking for the score variable).

    2. @@ -512,7 +512,7 @@

      Finding Variables -

      Common Errors#

      +

      Common Errors

    -

    Appendix: Types#

    +

    Appendix: Types

    The types consist of three parts, in order:

    • Endianness

    • @@ -646,7 +646,7 @@

      Using a Custom Integration from Python -

      Appendix: Operations#

      +

      Appendix: Operations

      Games can store information in memory in many various ways, and as such the specific information needed can vary in form too. The basic premise is that once a raw value is extracted from memory an operation may be defined to transform it to a useful form. Furthermore, we may want raw values in a given step or the deltas between two steps. Thus three properties are defined:

      • measurement: The method used for extracting the raw value. May be absolute for the current value and delta for the difference between the current and previous value. The default varies based on context.

      • @@ -802,10 +802,62 @@

        Using a Custom Integration from Python + - - + + diff --git a/python/index.html b/python/index.html index f3eb6f7da..f58d5a7b4 100644 --- a/python/index.html +++ b/python/index.html @@ -11,11 +11,11 @@ - + Python API - Stable-Retro Documentation - + - + @@ -279,19 +279,19 @@
        -

        Python API#

        +

        Python API

        -

        RetroEnv#

        +

        RetroEnv

        The Python API consists primarily of retro.make(), retro.RetroEnv, and a few enums. The main function most users will want is retro.make().

        -retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]#
        +retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]

        Create a Gym environment for the specified game

        -class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]#
        +class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]

        Gym Retro environment class

        Provides a Gym interface to classic video games

        @@ -299,18 +299,18 @@

        RetroEnv

        If you want to specify either the default state named in the game integration’s metadata.json or specify that you want to start from the initial power on state of the console, you can use the retro.State enum:

        -class retro.State(value)[source]#
        +class retro.State(value)[source]

        Special values for setting the restart state of the environment. You can also specify a string that is the name of the .state file

        -DEFAULT = -1#
        +DEFAULT = -1

        Start the game at the default savestate from metadata.json

        -NONE = 0#
        +NONE = 0

        Start the game at the power on screen for the emulator

        @@ -318,27 +318,27 @@

        RetroEnv

        -

        Actions#

        +

        Actions

        There are a few possible action spaces included with retro.RetroEnv:

        -class retro.Actions(value)[source]#
        +class retro.Actions(value)[source]

        Different settings for the action space of the environment

        -ALL = 0#
        +ALL = 0

        MultiBinary action space with no filtered actions

        -DISCRETE = 2#
        +DISCRETE = 2

        Discrete action space for filtered actions

        -MULTI_DISCRETE = 3#
        +MULTI_DISCRETE = 3

        MultiDiscete action space for filtered actions

        @@ -347,21 +347,21 @@

        Actions#<

        You can also create your own action spaces derived from these. For an example, see discretizer.py. This file shows how to use retro.Actions.Discrete as well as how to make a custom wrapper that reduces the action space from 126 actions to 7

        -

        Observations#

        +

        Observations

        The default observations are RGB images of the game, but you can view RAM values instead (often much smaller than the RGB images and also your agent can observe the game state more directly). If you want variable values, any variables defined in data.json will appear in the info dict after each step.

        -class retro.Observations(value)[source]#
        +class retro.Observations(value)[source]

        Different settings for the observation space of the environment

        -IMAGE = 0#
        +IMAGE = 0

        Use RGB image observations

        -RAM = 1#
        +RAM = 1

        Use RAM observations where you can see the memory of the game instead of the screen

        @@ -369,12 +369,12 @@

        Observations -

        Multiplayer Environments#

        +

        Multiplayer Environments

        A small number of games support multiplayer. To use this feature, pass players=<n> to retro.RetroEnv. Here is an example random agent that controls both paddles in Pong-Atari2600:

        -
        import retro
        +
        import retro
         
         
        -def main():
        +def main():
             env = retro.make(game="Pong-Atari2600", players=2)
             env.reset()
             while True:
        @@ -395,14 +395,14 @@ 

        Multiplayer Environments -

        Replay files#

        +

        Replay files

        Stable Retro can create .bk2 files which are recordings of an initial game state and a series of button presses. Because the emulators are deterministic, you will see the same output each time you play back this file. Because it only stores button presses, the file can be about 1000 times smaller than storing the full video.

        In addition, if you wish to use the stored button presses for training, they may be useful. For example, there are replay files for each Sonic The Hedgehog level that were made available for the Stable Retro Contest.

        You can create and view replay files using the The Integration UI (Game > Play Movie…). If you want to use replay files from Python, see the following sections.

        -

        Record#

        +

        Record

        If you have an agent playing a game, you can record the gameplay to a .bk2 file for later processing:

        -
        import retro
        +
        import retro
         
         env = retro.make(game='Airstriker-Genesis', record='.')
         env.reset()
        @@ -414,9 +414,9 @@ 

        Record#

        -

        Playback#

        +

        Playback

        Given a .bk2 file you can load it in python and either play it back or use the actions for training.

        -
        import retro
        +
        import retro
         
         movie = retro.Movie('Airstriker-Genesis-Level1-000000.bk2')
         movie.step()
        @@ -441,7 +441,7 @@ 

        Playback

        -

        Render to Video#

        +

        Render to Video

        This requires ffmpeg to be installed and writes the output to the directory that the input file is located in.

        python3 -m retro.scripts.playback_movie Airstriker-Genesis-Level1-000000.bk2
         
        @@ -586,10 +586,62 @@

        Render to Video + - - + + diff --git a/release_notes/index.html b/release_notes/index.html index edd1be513..f03c58290 100644 --- a/release_notes/index.html +++ b/release_notes/index.html @@ -11,11 +11,11 @@ - + Release Notes - Stable-Retro Documentation - + - + @@ -279,13 +279,64 @@
        -

        Release Notes#

        +

        Release Notes

        -

        stable-retro v0.9.3#

        -

        Released on 2024-01-12 - GitHub

        -
        +

        v0.9.3

        +

        Released on 2025-01-17 - GitHub

        +

        What's Changed

        + +

        New Contributors

        + +

        Full Changelog: v0.9.2...v0.9.3

        -

        stable-retro v0.9.2#

        +

        stable-retro v0.9.2

        Released on 2023-10-16 - GitHub

        What's Changed

          @@ -355,7 +406,7 @@

          New Contributors

        Full Changelog: v0.9.0...v0.9.2

        -

        stable-retro v0.9.1#

        +

        stable-retro v0.9.1

        Released on 2023-08-10 - GitHub

        What's Changed

          @@ -462,7 +513,7 @@

          New Contributors

          • Release Notes @@ -497,10 +548,62 @@

            New Contributors

            - + + - - + + diff --git a/search/index.html b/search/index.html index 4eb934581..e935d82ca 100644 --- a/search/index.html +++ b/search/index.html @@ -10,9 +10,9 @@ - Search - Stable-Retro Documentation + Search - Stable-Retro Documentation - + @@ -340,10 +340,62 @@ - + + - - + + diff --git a/searchindex.js b/searchindex.js index 49adbb783..afedf44a3 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "terms": {"thi": [1, 2, 3, 5, 6], "folder": [1, 5], "contain": [1, 2, 5, 6], "stableretro": 1, "If": [1, 2, 3, 5, 6], "you": [1, 2, 3, 4, 5, 6], "ar": [1, 3, 5, 6], "an": [1, 3, 4, 5, 6], "atari": [1, 4, 5], "pleas": [1, 3, 5], "follow": [1, 2, 5, 6], "below": [1, 5], "For": [1, 3, 5, 6], "more": [1, 3, 4, 5, 6], "inform": [1, 3, 5], "about": [1, 3, 5, 6], "how": [1, 5, 6], "contribut": [1, 7], "go": [1, 5], "our": 1, "md": [1, 7], "todo": 1, "add": [1, 2, 3, 5, 7], "detail": [1, 5], "instal": [1, 3, 6, 7], "requir": [1, 2, 3, 5, 6], "packag": [1, 2, 5], "your": [1, 2, 3, 5, 6], "fork": [1, 4], "pip": [1, 2, 7], "r": [1, 5], "txt": [1, 7], "To": [1, 2, 3, 5, 6], "onc": [1, 2, 3, 5], "cd": [1, 2, 7], "make": [1, 2, 3, 4, 5, 6], "dirhtml": 1, "rebuild": 1, "automat": 1, "everi": [1, 5], "time": [1, 5, 6], "chang": [1, 2, 3, 5, 7], "i": [1, 2, 3, 4, 5, 6], "made": [1, 6, 7], "sphinx": 1, "autobuild": 1, "b": 1, "_build": 1, "ad": [2, 5, 7], "new": [2, 3, 4, 7], "game": [2, 3, 4, 6], "can": [2, 3, 5, 6], "done": [2, 3, 6], "without": [2, 5], "recompil": 2, "stabl": [2, 3, 4, 5, 6], "need": [2, 5], "work": [2, 3, 5], "c": [2, 3, 7], "code": [2, 3, 5, 7], "want": [2, 3, 5, 6], "compil": [2, 5, 7], "least": 2, "either": [2, 5, 6], "gcc": 2, "5": [2, 5, 7], "clang": 2, "3": [2, 3, 4, 5, 6], "4": [2, 4, 5], "must": [2, 3], "first": [2, 4, 5, 7], "cmake": 2, "do": [2, 3, 5], "through": [2, 5], "manag": 2, "download": [2, 5], "offici": 2, "site": 2, "pip3": [2, 3], "re": [2, 5], "us": [2, 3, 4, 6, 7], "sure": [2, 3, 5], "tell": [2, 5], "itself": [2, 5], "system": [2, 3, 5], "path": [2, 3, 5], "sinc": [2, 5], "luajit": 2, "doe": [2, 5], "properli": [2, 3, 5], "lua": [2, 5], "1": [2, 3, 4, 5, 6], "homebrew": 2, "brew": 2, "pkg": 2, "config": [2, 4], "docker": [2, 7], "sudo": 2, "apt": 2, "get": [2, 5], "zlib1g": 2, "dev": 2, "git": [2, 7], "clone": 2, "http": 2, "github": [2, 3, 5, 7], "com": 2, "farama": [2, 7], "foundat": 2, "e": [2, 5], "run": [2, 3, 5], "build_window": 2, "bat": 2, "complet": [2, 5], "cp": 2, "copi": [2, 3, 5, 7], "whl": 2, "file": [2, 3, 7], "out": [2, 3, 5], "Then": [2, 5], "mai": [2, 5, 6], "after": [2, 3, 4, 5, 6], "instruct": 2, "platform": [2, 5], "note": [2, 3, 5], "mojav": 2, "10": [2, 3, 5, 7], "14": [2, 7], "librari": [2, 4], "commandlinetool": 2, "macos_sdk_headers_for_macos_10": 2, "capnp": 2, "qt5": 2, "dcmake_prefix_path": 2, "usr": 2, "local": [2, 5], "opt": 2, "qt": 2, "dbuild_ui": 2, "ON": 2, "upylib_directori": 2, "j": 2, "sysctl": 2, "hw": 2, "ncpu": 2, "cut": 2, "d": [2, 5], "f2": 2, "open": [2, 5], "gym": [2, 4, 6], "integr": [2, 6, 7], "app": 2, "capnproto": 2, "libcapnp": 2, "libqt5opengl5": 2, "qtbase5": 2, "grep": 2, "processor": 2, "proc": 2, "cpuinfo": 2, "The": [2, 3, 6], "current": [2, 3, 5], "support": [2, 3, 4, 6, 7], "nativ": [2, 5], "easili": [2, 5], "via": [2, 7], "wsl2": 2, "subsystem": 2, "abov": [2, 5], "within": [2, 5], "just": 2, "launch": 2, "binari": [2, 5], "like": [2, 3, 5], "would": [2, 5], "one": [3, 5], "version": [3, 5, 7], "python": 3, "6": [3, 5, 7], "appropri": [3, 5], "distribut": 3, "o": [3, 5], "beforehand": 3, "due": 3, "compat": 3, "issu": [3, 5], "some": [3, 5, 7], "core": [3, 7], "32": [3, 4, 5, 7], "bit": [3, 5], "oper": 3, "see": [3, 5, 6], "section": [3, 5, 6], "develop": 3, "build": [3, 7], "yourself": 3, "onli": [3, 5, 6], "now": [3, 6], "gymnasium": [3, 4, 5, 7], "env": [3, 4, 5, 6], "airstrik": [3, 4, 5, 6], "genesi": [3, 4, 5, 6], "ha": [3, 5], "non": [3, 5], "commerci": 3, "includ": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "other": [3, 5], "obtain": 3, "them": [3, 5], "most": [3, 5, 6], "hash": [3, 5], "sourc": [3, 5, 6], "from": [3, 4, 6, 7], "respect": 3, "No": 3, "intro": 3, "sha": 3, "sum": [3, 5], "primarili": [3, 6], "mean": [3, 5], "train": [3, 4, 6], "rl": 3, "classic": [3, 4, 6], "video": [3, 4, 5], "though": [3, 5], "also": [3, 5, 6], "control": [3, 5, 6], "those": [3, 5], "here": [3, 4, 5, 6], "wai": [3, 5], "There": [3, 5, 6], "let": [3, 4, 5], "interfac": [3, 6], "python3": [3, 6], "m": [3, 6], "arrow": 3, "kei": [3, 5, 6], "x": 3, "ship": 3, "fire": [3, 5], "try": [3, 5], "api": [3, 5], "quit": 3, "basic": [3, 5], "advanc": [3, 5], "tool": [3, 7], "check": [3, 5, 7], "ui": [3, 6], "A": [3, 5, 6], "choos": 3, "action": [3, 4, 5], "each": [3, 5, 6], "timestep": 3, "look": [3, 5], "much": [3, 5, 6], "def": [3, 4, 5, 6], "main": [3, 4, 5, 6], "reset": [3, 4, 6], "while": [3, 5, 6], "true": [3, 6], "action_spac": [3, 6], "sampl": [3, 6], "observ": 3, "reward": [3, 7], "termin": [3, 4, 6], "truncat": [3, 4, 6], "info": [3, 4, 5, 6], "step": [3, 4, 5, 6], "render": 3, "close": [3, 6], "__name__": [3, 4, 5, 6], "__main__": [3, 4, 5, 6], "full": [3, 4, 5, 6, 7], "featur": [3, 6], "avail": [3, 5, 6], "dir": 3, "random_ag": 3, "It": [3, 5], "print": [3, 5], "exit": 3, "when": [3, 5, 7], "scenario": [3, 4, 6], "throw": 3, "except": [3, 5], "data": [3, 6, 7], "defin": [3, 5, 6], "set": [3, 5, 6], "up": [3, 5], "function": [3, 6], "isn": 3, "t": [3, 5], "too": [3, 5], "gener": 3, "simpl": [3, 5], "effect": [3, 5], "reinforc": [3, 4, 5], "learn": [3, 4, 5], "algorithm": [3, 5], "call": [3, 5], "revisit": 3, "arcad": 3, "machado": 3, "et": 3, "al": 3, "which": [3, 5, 6], "determinist": [3, 6], "easi": [3, 5], "implement": 3, "sequenc": 3, "button": [3, 5, 6], "press": [3, 6], "well": [3, 5, 6], "doesn": [3, 5], "screen": [3, 5, 6], "all": [3, 5, 6], "best": [3, 5], "seen": 3, "so": [3, 5, 6], "far": 3, "proxim": [3, 4], "polici": [3, 4], "optim": [3, 4], "schulman": 3, "plai": [3, 5, 6], "mani": [3, 5], "take": [3, 5], "awhil": [3, 5], "faster": 3, "gpu": 3, "baselin": [3, 4], "progress": [3, 5], "goe": [3, 5], "found": [3, 5], "spin": 3, "what": [3, 5, 7], "have": [3, 5, 6], "alreadi": 3, "been": [3, 5], "displai": [3, 5], "even": 3, "ones": 3, "miss": 3, "list_gam": [3, 5], "actual": [3, 5], "repo": 3, "correct": [3, 5], "comput": [3, 5], "identifi": 3, "directori": [3, 5, 6], "match": [3, 5, 7], "correspond": [3, 5], "type": 3, "list": [3, 4, 5, 6], "should": [3, 5], "collect": 3, "archiv": 3, "org": 3, "search": [3, 5], "insid": [3, 5], "zip": 3, "retro": [4, 5, 6], "maintain": 4, "openai": [4, 7], "": [4, 5, 6, 7], "turn": 4, "environ": [4, 5], "plateform": 4, "sega": [4, 5, 7], "32x": [4, 7], "super": [4, 5], "nintendo": [4, 5], "2600": [4, 5], "agent": [4, 5, 6], "import": [4, 5, 6], "argpars": 4, "numpi": 4, "np": 4, "wrapper": [4, 6], "time_limit": 4, "timelimit": 4, "stable_baselines3": 4, "ppo": 4, "common": 4, "atari_wrapp": 4, "cliprewardenv": 4, "warpfram": 4, "vec_env": 4, "subprocvecenv": 4, "vecframestack": 4, "vectransposeimag": 4, "class": [4, 6], "stochasticframeskip": 4, "__init__": 4, "self": 4, "n": [4, 5, 6], "stickprob": 4, "curac": 4, "none": [4, 6], "rng": 4, "random": [4, 6], "randomst": 4, "supports_want_rend": 4, "hasattr": 4, "kwarg": [4, 6], "return": [4, 5], "ac": 4, "fals": [4, 6], "totrew": 4, "0": [4, 5, 6, 7], "rang": [4, 6], "substep": 4, "delai": 4, "probabl": [4, 5], "elif": 4, "rand": 4, "second": 4, "definit": 4, "kick": 4, "ob": [4, 6], "rew": [4, 6], "want_rend": 4, "els": 4, "break": [4, 6], "make_retro": 4, "state": [4, 6], "max_episode_step": 4, "4500": 4, "25": [4, 7], "wrap_deepmind_retro": 4, "configur": 4, "similar": [4, 5], "deepmind": 4, "style": [4, 7], "wrap_deepmind": 4, "parser": 4, "argumentpars": 4, "add_argu": 4, "arg": 4, "parse_arg": 4, "make_env": 4, "venv": 4, "8": [4, 5, 6], "n_stack": 4, "model": 4, "cnnpolici": 4, "learning_r": 4, "lambda": 4, "f": 4, "2": [4, 5, 6], "5e": 4, "n_step": 4, "128": [4, 5], "batch_siz": 4, "n_epoch": 4, "gamma": 4, "99": 4, "gae_lambda": 4, "95": 4, "clip_rang": 4, "ent_coef": 4, "01": [4, 7], "verbos": 4, "total_timestep": 4, "100_000_000": 4, "log_interv": 4, "thing": 5, "start": [5, 6], "abl": 5, "ll": 5, "savest": [5, 6], "begin": 5, "restart": [5, 6], "put": 5, "point": 5, "relat": 5, "base": 5, "memori": [5, 6], "address": 5, "gameov": 5, "16712294": 5, "u2": 5, "live": 5, "16712282": 5, "score": 5, "16712270": 5, "u4": 5, "op": 5, "equal": 5, "refer": 5, "zero": 5, "specifi": [5, 6], "user": [5, 6], "miscellan": 5, "debug": [5, 7], "default_st": 5, "whitelist": 5, "suspici": 5, "few": [5, 6], "sha1": 5, "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "These": 5, "next": 5, "describ": 5, "emul": [5, 6, 7], "allow": [5, 6], "entir": 5, "store": [5, 6], "disk": 5, "restor": 5, "specif": 5, "alwai": 5, "end": 5, "ident": 5, "standalon": 5, "gzip": 5, "inner": 5, "alongsid": 5, "name": [5, 6], "document": 5, "ground": 5, "truth": 5, "format": 5, "manifest": 5, "separ": 5, "although": 5, "entri": 5, "consist": [5, 6], "valu": [5, 6], "ram": [5, 6], "arrai": 5, "byte": 5, "descriptor": 5, "addendum": 5, "show": [5, 6], "wide": 5, "unsign": 5, "big": 5, "endian": 5, "possibl": [5, 6], "pertain": 5, "manual": 5, "overrid": 5, "retroenv": 5, "write": [5, 6], "multipli": 5, "posit": [5, 7], "penalti": 5, "neg": 5, "creat": [5, 6], "similarli": 5, "over": 5, "By": 5, "load": [5, 6], "altern": 5, "constructor": 5, "again": [5, 7], "calcul": 5, "split": 5, "subsect": 5, "coeffici": 5, "extract": 5, "measur": 5, "delta": 5, "pass": [5, 6], "raw": 5, "impli": 5, "addit": [5, 6], "instead": [5, 6], "subtract": 5, "off": 5, "taken": 5, "two": [5, 7], "reach": 5, "At": 5, "top": [5, 6], "level": [5, 6], "properti": 5, "combin": 5, "ani": [5, 6], "fulfil": 5, "per": 5, "absolut": 5, "ignor": 5, "help": 5, "normal": 5, "window": [5, 7], "mac": 5, "howev": 5, "url": 5, "longer": 5, "releas": 5, "command": 5, "shift": 5, "select": 5, "menu": 5, "option": 5, "mode": 5, "charact": 5, "etc": 5, "final": 5, "playabl": 5, "moment": 5, "paus": 5, "p": [5, 6], "save": 5, "hard": 5, "might": 5, "back": [5, 6], "exact": 5, "chose": 5, "previou": 5, "g": 5, "sailormoon": 5, "queenberylscastl": 5, "we": 5, "prefer": 5, "usa": 5, "denot": 5, "europ": 5, "japan": 5, "bin": 5, "extens": [5, 7], "renam": [5, 7], "applic": 5, "uniqu": 5, "given": [5, 6], "known": 5, "mega": 5, "drive": 5, "sfc": 5, "entertain": 5, "famicom": 5, "ne": 5, "a26": 5, "gb": 5, "boi": 5, "gba": 5, "gbc": 5, "color": 5, "gg": 5, "gear": 5, "pce": 5, "nec": 5, "turbografx": 5, "16": [5, 6, 7], "pc": 5, "engin": 5, "sm": 5, "master": 5, "sometim": 5, "differ": [5, 6], "gen": 5, "aforement": 5, "case": [5, 7], "know": 5, "session": 5, "provid": [5, 6], "numer": 5, "goal": 5, "machin": 5, "maxim": 5, "player": [5, 6], "remain": [5, 6], "hit": 5, "instanc": 5, "dy": 5, "modifi": 5, "disallow": 5, "kidchameleon": 5, "usual": 5, "easier": 5, "continu": 5, "left": 5, "pretti": 5, "better": 5, "reliabl": 5, "slightli": 5, "incorrect": 5, "still": 5, "life": 5, "becaus": [5, 6], "detect": 5, "than": [5, 6], "unreli": 5, "present": 5, "incorrectli": 5, "switch": 5, "test": [5, 7], "replai": 5, "multipl": 5, "row": 5, "accident": 5, "ideal": 5, "beat": 5, "besid": 5, "That": 5, "impract": 5, "exist": 5, "unabl": 5, "result": 5, "often": [5, 6], "good": 5, "choic": 5, "In": [5, 6], "stand": 5, "place": 5, "attack": 5, "same": [5, 6], "enemi": 5, "respawn": 5, "veri": 5, "Be": 5, "care": 5, "thei": [5, 6], "tricki": 5, "right": 5, "sens": 5, "receiv": 5, "factor": 5, "100": 5, "compar": 5, "cumul": 5, "pane": 5, "keep": 5, "pattern": 5, "tip": 5, "group": 5, "themselv": 5, "togeth": 5, "narrow": 5, "down": 5, "particular": 5, "nearbi": 5, "suspect": 5, "high": 5, "occasion": 5, "individu": 5, "123400": 5, "updat": [5, 7], "broken": [5, 7], "digit": 5, "bob": 5, "sne": 5, "number": [5, 6], "across": 5, "frame": 5, "script": [5, 6], "1942": 5, "uncommon": 5, "length": 5, "don": 5, "nice": 5, "neat": 5, "short": 5, "certain": 5, "track": 5, "long": 5, "suddenli": 5, "jump": 5, "between": 5, "decid": 5, "shorter": 5, "safer": 5, "bet": 5, "sai": 5, "2400": 5, "24": 5, "transpos": 5, "123456": 5, "012345": 5, "rather": 5, "fix": [5, 7], "health": 5, "symbol": 5, "bar": 5, "could": 5, "repres": 5, "9999999": 5, "becom": 5, "99999": 5, "lose": 5, "unit": 5, "And": 5, "consecut": 5, "ve": 5, "avoid": 5, "later": [5, 6], "One": 5, "correctli": 5, "d2": 5, "d4": 5, "maximum": 5, "9999": 5, "increas": 5, "viewer": 5, "10000": 5, "wrong": 5, "d3": 5, "999999": 5, "watch": 5, "increment": 5, "decrement": 5, "255": 5, "sign": 5, "u": 5, "appear": [5, 6], "16769105": 5, "i2": 5, "littl": 5, "notic": 5, "uneven": 5, "unusu": 5, "eg": 5, "u1": 5, "7e094d": 5, "144": 5, "137": 5, "d1": 5, "90": 5, "89": 5, "higher": 5, "reveal": 5, "didn": 5, "origin": 5, "until": 5, "someth": 5, "give": 5, "larg": 5, "die": 5, "upon": 5, "unless": 5, "befor": 5, "happen": 5, "forgot": 5, "upper": 5, "lower": 5, "kill": 5, "bug": [5, 7], "diverg": 5, "guardianlegend": 5, "custom_integr": 5, "structur": 5, "depend": 5, "addamsfamili": 5, "atari2600": [5, 6, 7], "adventur": 5, "gameboi": 5, "aerostar": 5, "gbadvanc": 5, "mariokart": 5, "gbcolor": 5, "pokemonpinbal": 5, "gamegear": 5, "mortalkombat": 5, "pcengin": 5, "soldierblad": 5, "add_custom_path": 5, "script_dir": 5, "dirnam": 5, "abspath": 5, "__file__": 5, "join": 5, "fakegam": 5, "inttyp": [5, 6], "directli": [5, 6], "three": 5, "part": 5, "order": 5, "hex": 5, "string": [5, 6], "0x01020304": 5, "0x01": 5, "0x02": 5, "0x03": 5, "0x04": 5, "middl": 5, "outsid": 5, "sigil": 5, "singl": 5, "nb": 5, "rare": 5, "plu": 5, "gx": 5, "thu": 5, "aka": 5, "As": 5, "groom": 5, "0x81": 5, "decim": 5, "129": 5, "127": 5, "81": 5, "low": 5, "nybbl": 5, "0xa": 5, "0xf": 5, "cannot": 5, "occur": 5, "last": 5, "piec": 5, "occupi": 5, "power": [5, 6], "mario": 5, "bro": 5, "size": 5, "less": 5, "0x0102": 5, "four": 5, "1234": 5, "0x12": 5, "0x34": 5, "u3": 5, "0x010203": 5, "0x1": 5, "n2": 5, "12": [5, 7], "intel": 5, "arm": 5, "cpu": 5, "powerpc": 5, "valid": 5, "recommend": 5, "undefin": 5, "invalid": 5, "q2": 5, "i0": 5, "variou": 5, "vari": 5, "form": 5, "premis": 5, "transform": 5, "furthermor": 5, "method": 5, "context": 5, "appli": 5, "nonzero": 5, "otherwis": 5, "greater": 5, "enum": 6, "use_restricted_act": 6, "filter": 6, "obs_typ": 6, "imag": 6, "render_mod": 6, "human": 6, "metadata": 6, "json": [6, 7], "initi": 6, "consol": 6, "special": 6, "space": 6, "multibinari": 6, "discret": 6, "multi_discret": 6, "multidiscet": 6, "own": 6, "deriv": 6, "exampl": [6, 7], "py": [6, 7], "custom": 6, "reduc": 6, "126": 6, "7": [6, 7], "rgb": 6, "view": 6, "smaller": 6, "variabl": 6, "dict": 6, "where": 6, "small": 6, "both": 6, "paddl": 6, "pong": [6, 7], "bottom": 6, "half": 6, "player_1_rew": 6, "player_2_rew": 6, "bk2": 6, "seri": 6, "output": 6, "1000": 6, "wish": 6, "sonic": 6, "hedgehog": 6, "were": 6, "contest": 6, "movi": 6, "gameplai": 6, "process": 6, "_": 6, "level1": 6, "000000": 6, "get_gam": 6, "everyth": 6, "initial_st": 6, "get_stat": 6, "num_button": 6, "append": 6, "get_kei": 6, "ffmpeg": 6, "input": 6, "locat": 6, "playback_movi": [6, 7], "2024": 7, "2023": 7, "ci": 7, "zbeucler2018": 7, "pseudo": 7, "rnd": 7, "thought": 7, "onaclov2000": 7, "remov": 7, "travi": 7, "setup": 7, "11": 7, "capabl": 7, "15": 7, "readm": 7, "matpoliquin": 7, "17": 7, "gcp": 7, "20": 7, "link": 7, "websit": 7, "23": 7, "doc": 7, "mgoulao": 7, "27": 7, "28": 7, "extra": 7, "18": 7, "duplic": 7, "30": 7, "publish": 7, "linux": 7, "31": 7, "appl": 7, "silicon": 7, "34": 7, "cmakelist": 7, "libzip": 7, "35": 7, "moonpatrol": 7, "36": 7, "pre": 7, "commit": 7, "hook": 7, "victorsevero": 7, "38": 7, "37": 7, "badg": 7, "elliottow": 7, "43": 7, "45": 7, "placehold": 7, "logo": 7, "screenshot": 7, "47": 7, "260": 7, "joohei": 7, "46": 7, "handl": 7, "log": 7, "48": 7, "saturn": 7, "virtua": 7, "fighter": 7, "49": 7, "whitespac": 7, "50": 7, "bump": 7, "setuptool": 7, "40": 7, "65": 7, "build_script": 7, "dependabot": 7, "39": 7, "21": 7, "41": 7, "certifi": 7, "2018": 7, "2022": 7, "42": 7, "wheel": 7, "adapt": 7, "yml": 7, "pettingzoo": 7, "workflow": 7, "51": 7, "52": 7, "54": 7, "53": 7, "mortal": 7, "kombat": 7, "55": 7, "58": 7, "cmd": 7, "line": 7, "59": 7, "disabl": 7, "multi": 7, "retro_env": 7, "61": 7, "misc": 7, "62": 7, "checker": 7, "63": 7, "nhl941on1": 7, "star": 7, "66": 7, "temp": 7, "segment": 7, "fault": 7, "67": 7, "typo": 7, "68": 7, "69": 7, "package_data": 7, "71": 7, "buld": 7, "manylinux": 7, "cibuildwheel": 7, "mwydmuch": 7, "73": 7, "contributor": 7, "changelog": 7, "08": 7}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "titleterms": {"404": 0, "page": [0, 1], "Not": 0, "found": 0, "The": [0, 5], "request": 0, "could": 0, "stabl": [1, 7], "retro": [1, 2, 3, 7], "doc": 1, "instruct": 1, "modifi": 1, "environ": [1, 3, 6], "build": [1, 2], "document": 1, "develop": 2, "instal": 2, "from": [2, 5], "sourc": 2, "prerequisit": 2, "mac": 2, "window": 2, "linux": 2, "ui": [2, 5], "maco": 2, "get": 3, "start": 3, "creat": 3, "exampl": [3, 5], "usag": 3, "interact": 3, "script": 3, "random": 3, "agent": 3, "brute": 3, "ppo": 3, "integr": [3, 5], "import": 3, "rom": [3, 5], "game": 5, "level1": 5, "state": 5, "data": 5, "json": 5, "scenario": 5, "metadata": 5, "md": 5, "sha": 5, "file": [5, 6], "variabl": 5, "locat": 5, "new": 5, "support": 5, "type": 5, "done": 5, "condit": 5, "reward": 5, "function": 5, "find": 5, "common": 5, "error": 5, "us": 5, "custom": 5, "python": [5, 6], "appendix": 5, "oper": 5, "api": 6, "retroenv": 6, "action": 6, "observ": 6, "multiplay": 6, "replai": 6, "record": 6, "playback": 6, "render": 6, "video": 6, "releas": 7, "note": 7, "v0": 7, "9": 7, "3": 7, "2": 7, "1": 7}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"404 - Page Not Found": [[0, "page-not-found"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Stable-retro docs": [[1, "stable-retro-docs"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Build the Documentation": [[1, "build-the-documentation"]], "Development": [[2, "development"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Prerequisites": [[2, "prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "macOS": [[2, "macos"]], "Linux": [[2, "linux"]], "Windows": [[2, "windows"]], "Getting Started": [[3, "getting-started"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Example Usage": [[3, "example-usage"]], "Interactive Script": [[3, "interactive-script"]], "Random Agent": [[3, "random-agent"]], "Brute": [[3, "brute"]], "PPO": [[3, "ppo"]], "Integrations": [[3, "integrations"]], "Importing ROMs": [[3, "importing-roms"]], "Game Integration": [[5, "game-integration"]], "Example Integration": [[5, "example-integration"]], "Level1.state": [[5, "level1-state"]], "data.json": [[5, "data-json"]], "scenario.json": [[5, "scenario-json"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "Integration Files": [[5, "integration-files"]], "States": [[5, "states"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "The Integration UI": [[5, "the-integration-ui"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Supported ROM Types": [[5, "supported-rom-types"]], "Integrating a Game": [[5, "integrating-a-game"]], "Done Condition": [[5, "done-condition"]], "Reward Function": [[5, "reward-function"]], "Finding Variables": [[5, "finding-variables"]], "Common Errors": [[5, "common-errors"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Appendix: Types": [[5, "appendix-types"]], "Appendix: Operations": [[5, "appendix-operations"]], "Python API": [[6, "python-api"]], "RetroEnv": [[6, "retroenv"]], "Actions": [[6, "actions"]], "Observations": [[6, "observations"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Replay files": [[6, "replay-files"]], "Record": [[6, "record"]], "Playback": [[6, "playback"]], "Render to Video": [[6, "render-to-video"]], "Release Notes": [[7, "release-notes"]], "stable-retro v0.9.3": [[7, "release-v0-9-3"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]]}, "indexentries": {"all (retro.actions attribute)": [[6, "retro.Actions.ALL"]], "actions (class in retro)": [[6, "retro.Actions"]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT"]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE"]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE"]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE"]], "none (retro.state attribute)": [[6, "retro.State.NONE"]], "observations (class in retro)": [[6, "retro.Observations"]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM"]], "retroenv (class in retro)": [[6, "retro.RetroEnv"]], "state (class in retro)": [[6, "retro.State"]], "make() (in module retro)": [[6, "retro.make"]]}}) \ No newline at end of file +Search.setIndex({"alltitles": {"404 - Page Not Found": [[0, null]], "Actions": [[6, "actions"]], "Appendix: Operations": [[5, "appendix-operations"]], "Appendix: Types": [[5, "appendix-types"]], "Brute": [[3, "brute"]], "Build the Documentation": [[1, "build-the-documentation"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Common Errors": [[5, "common-errors"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Development": [[2, null]], "Done Condition": [[5, "done-condition"]], "Example Integration": [[5, "example-integration"]], "Example Usage": [[3, "example-usage"]], "Finding Variables": [[5, "finding-variables"]], "Game Integration": [[5, null]], "Getting Started": [[3, null]], "Importing ROMs": [[3, "importing-roms"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Integrating a Game": [[5, "integrating-a-game"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Integration Files": [[5, "integration-files"]], "Integrations": [[3, "integrations"]], "Interactive Script": [[3, "interactive-script"]], "Level1.state": [[5, "level1-state"]], "Linux": [[2, "linux"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Observations": [[6, "observations"]], "PPO": [[3, "ppo"]], "Playback": [[6, "playback"]], "Prerequisites": [[2, "prerequisites"]], "Python API": [[6, null]], "Random Agent": [[3, "random-agent"]], "Record": [[6, "record"]], "Release Notes": [[7, null]], "Render to Video": [[6, "render-to-video"]], "Replay files": [[6, "replay-files"]], "RetroEnv": [[6, "retroenv"]], "Reward Function": [[5, "reward-function"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "Stable-retro docs": [[1, null]], "States": [[5, "states"]], "Supported ROM Types": [[5, "supported-rom-types"]], "The Integration UI": [[5, "the-integration-ui"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Windows": [[2, "windows"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "data.json": [[5, "data-json"]], "macOS": [[2, "macos"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "scenario.json": [[5, "scenario-json"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "v0.9.3": [[7, "release-v0-9-3"]]}, "docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "indexentries": {"actions (class in retro)": [[6, "retro.Actions", false]], "all (retro.actions attribute)": [[6, "retro.Actions.ALL", false]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT", false]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE", false]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE", false]], "make() (in module retro)": [[6, "retro.make", false]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE", false]], "none (retro.state attribute)": [[6, "retro.State.NONE", false]], "observations (class in retro)": [[6, "retro.Observations", false]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM", false]], "retroenv (class in retro)": [[6, "retro.RetroEnv", false]], "state (class in retro)": [[6, "retro.State", false]]}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "terms": {"": [4, 5, 6, 7], "0": [4, 5, 6, 7], "000000": 6, "01": [4, 7], "012345": 5, "08": 7, "0x01": 5, "0x0102": 5, "0x010203": 5, "0x01020304": 5, "0x02": 5, "0x03": 5, "0x04": 5, "0x1": 5, "0x12": 5, "0x34": 5, "0x81": 5, "0xa": 5, "0xf": 5, "1": [2, 3, 4, 5, 6], "10": [2, 3, 5, 7], "100": 5, "1000": 6, "10000": 5, "100_000_000": 4, "102": 7, "103": 7, "104": 7, "105": 7, "106": 7, "109": 7, "11": 7, "110": 7, "114": 7, "116": 7, "118": 7, "119": 7, "12": [5, 7], "120": 7, "122": 7, "123": 7, "1234": 5, "123400": 5, "123456": 5, "124": 7, "125": 7, "126": 6, "127": 5, "128": [4, 5], "129": [5, 7], "130": 7, "137": 5, "14": [2, 7], "144": 5, "15": 7, "16": [5, 6, 7], "16712270": 5, "16712282": 5, "16712294": 5, "16769105": 5, "17": 7, "18": 7, "1942": 5, "2": [4, 5, 6], "20": 7, "2018": 7, "2022": 7, "2023": 7, "2025": 7, "21": 7, "23": 7, "24": 5, "2400": 5, "25": [4, 7], "255": 5, "260": 7, "2600": [4, 5], "27": 7, "28": 7, "3": [2, 3, 4, 5, 6], "30": 7, "31": 7, "32": [3, 4, 5, 7], "32x": [4, 7], "34": 7, "35": 7, "36": 7, "37": 7, "38": 7, "39": 7, "4": [2, 4, 5, 7], "40": 7, "41": 7, "42": 7, "43": 7, "45": 7, "4500": 4, "46": 7, "47": 7, "48": 7, "49": 7, "5": [2, 5, 7], "50": 7, "51": 7, "52": 7, "53": 7, "54": 7, "55": 7, "58": 7, "59": 7, "5e": 4, "6": [3, 5, 7], "61": 7, "62": 7, "63": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "7": [6, 7], "70": 7, "71": 7, "73": 7, "74": 7, "75": 7, "76": 7, "78": 7, "79": 7, "7e094d": 5, "8": [4, 5, 6], "80": 7, "81": [5, 7], "82": 7, "83": 7, "84": 7, "85": 7, "86": 7, "87": 7, "88": 7, "89": [5, 7], "90": [5, 7], "92": 7, "93": 7, "94": 7, "95": [4, 7], "96": 7, "98": 7, "99": [4, 7], "9999": 5, "99999": 5, "999999": 5, "9999999": 5, "A": [3, 5, 6], "And": 5, "As": 5, "At": 5, "Be": 5, "By": 5, "For": [1, 3, 5, 6], "If": [1, 2, 3, 5, 6], "In": [5, 6], "It": [3, 5], "No": 3, "ON": 2, "One": 5, "That": 5, "The": [2, 3, 6], "Then": [2, 5], "There": [3, 5, 6], "These": 5, "To": [1, 2, 3, 5, 6], "_": 6, "__file__": 5, "__init__": 4, "__main__": [3, 4, 5, 6], "__name__": [3, 4, 5, 6], "_build": 1, "a26": 5, "abl": 5, "about": [1, 3, 5, 6], "abov": [2, 5], "absolut": 5, "abspath": 5, "ac": 4, "accident": 5, "across": 5, "action": [3, 4, 5, 7], "action_spac": [3, 6], "actual": [3, 5], "ad": [2, 5, 7], "adapt": 7, "add": [1, 2, 3, 5, 7], "add_argu": 4, "add_custom_path": 5, "addamsfamili": 5, "addendum": 5, "addit": [5, 6], "addr": 7, "address": [5, 7], "advanc": [3, 5], "adventur": 5, "aerostar": 5, "aforement": 5, "after": [2, 3, 4, 5, 6], "again": [5, 7], "agent": [4, 5, 6], "airstrik": [3, 4, 5, 6], "aka": 5, "al": 3, "algorithm": [3, 5], "all": [3, 5, 6], "allow": [5, 6], "alongsid": 5, "alreadi": 3, "also": [3, 5, 6], "altern": 5, "although": 5, "alwai": 5, "an": [1, 3, 4, 5, 6], "ani": [5, 6], "api": [3, 5], "app": 2, "appear": [5, 6], "append": 6, "appl": 7, "appli": 5, "applic": 5, "appropri": [3, 5], "apt": 2, "ar": [1, 3, 5, 6], "arcad": 3, "archiv": 3, "arg": 4, "argpars": 4, "argumentpars": 4, "arm": 5, "arrai": 5, "arrow": 3, "artifact": 7, "atari": [1, 4, 5], "atari2600": [5, 6, 7], "atari_wrapp": 4, "attack": 5, "autobuild": 1, "automat": 1, "avail": [3, 5, 6], "avoid": 5, "awhil": [3, 5], "b": 1, "back": [5, 6], "badfilm": 7, "badg": 7, "bar": 5, "base": 5, "baselin": [3, 4], "basic": [3, 5], "bat": 2, "batch_siz": 4, "beat": 5, "becaus": [5, 6], "becom": 5, "been": [3, 5], "befor": 5, "beforehand": 3, "begin": 5, "below": [1, 5], "besid": 5, "best": [3, 5], "bet": 5, "better": 5, "between": 5, "big": 5, "bin": 5, "binari": [2, 5], "bit": [3, 5], "bk2": 6, "black": 7, "bob": 5, "bogu": 7, "boi": 5, "both": 6, "bottom": 6, "break": [4, 6], "brew": 2, "bro": 5, "broken": [5, 7], "bug": [5, 7], "build": [3, 7], "build_script": 7, "build_window": 2, "buld": 7, "bump": 7, "button": [3, 5, 6], "byte": 5, "c": [2, 3, 7], "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "calcul": 5, "call": [3, 5], "can": [2, 3, 5, 6], "cannot": 5, "capabl": 7, "capnp": 2, "capnproto": [2, 7], "care": 5, "case": [5, 7], "cd": [1, 2, 7], "certain": 5, "certifi": 7, "chang": [1, 2, 3, 5, 7], "changelog": 7, "charact": 5, "check": [3, 5, 7], "checker": 7, "choic": 5, "choos": 3, "chose": 5, "ci": 7, "cibuildwheel": 7, "clang": 2, "class": [4, 6], "classic": [3, 4, 6], "clip_rang": 4, "cliprewardenv": 4, "clone": 2, "close": [3, 6], "cmake": 2, "cmakelist": 7, "cmd": 7, "cnnpolici": 4, "code": [2, 3, 5, 7], "coeffici": 5, "collect": 3, "color": 5, "com": 2, "combin": 5, "command": 5, "commandlinetool": 2, "commerci": 3, "commit": 7, "common": 4, "compar": 5, "compat": 3, "compil": [2, 5, 7], "complet": [2, 5], "comput": [3, 5], "conduct": 7, "config": [2, 4], "configur": 4, "consecut": 5, "consist": [5, 6], "consol": 6, "constructor": 5, "contain": [1, 2, 5, 6], "contest": 6, "context": 5, "continu": 5, "contribut": [1, 7], "contributor": 7, "control": [3, 5, 6], "copi": [2, 3, 5, 7], "core": [3, 7], "correct": [3, 5, 7], "correctli": 5, "correspond": [3, 5], "could": 5, "cp": 2, "cpu": 5, "cpuinfo": 2, "creat": [5, 6], "cumul": 5, "curac": 4, "current": [2, 3, 5], "custom": 6, "custom_integr": 5, "cut": 2, "d": [2, 5], "d1": 5, "d2": 5, "d3": 5, "d4": 5, "data": [3, 6, 7], "dbuild_ui": 2, "dcmake_prefix_path": 2, "debug": [5, 7], "decid": 5, "decim": 5, "decrement": 5, "deepmind": 4, "def": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "default_st": 5, "defin": [3, 5, 6], "definit": 4, "delai": 4, "delta": 5, "denot": 5, "depend": 5, "dependabot": 7, "deriv": 6, "describ": 5, "descriptor": 5, "detail": [1, 5], "detect": 5, "determinist": [3, 6], "dev": 2, "develop": 3, "dict": 6, "didn": 5, "die": 5, "differ": [5, 6], "digit": 5, "dir": 3, "directli": [5, 6], "directori": [3, 5, 6], "dirhtml": 1, "dirnam": 5, "disabl": 7, "disallow": 5, "discret": 6, "disk": 5, "displai": [3, 5], "distribut": 3, "diverg": 5, "do": [2, 3, 5], "doc": 7, "docker": [2, 7], "document": 5, "doe": [2, 5], "doesn": [3, 5], "don": 5, "done": [2, 3, 6], "down": 5, "download": [2, 5, 7], "drive": 5, "due": 3, "duplic": 7, "dy": 5, "e": [2, 5], "each": [3, 5, 6], "easi": [3, 5], "easier": 5, "easili": [2, 5], "effect": [3, 5], "eg": 5, "either": [2, 5, 6], "elif": 4, "elliottow": 7, "els": 4, "emul": [5, 6, 7], "enabl": 7, "end": 5, "endian": 5, "enemi": 5, "engin": 5, "ent_coef": 4, "entertain": 5, "entir": 5, "entri": 5, "enum": 6, "env": [3, 4, 5, 6, 7], "environ": [4, 5], "equal": 5, "error": 7, "et": 3, "etc": 5, "europ": 5, "even": 3, "everi": [1, 5], "everyth": 6, "exact": 5, "exampl": [6, 7], "except": [3, 5], "exist": 5, "exit": 3, "extens": [5, 7], "extra": 7, "extract": 5, "f": 4, "f2": 2, "factor": 5, "fakegam": 5, "fals": [4, 6], "famicom": 5, "far": 3, "farama": [2, 7], "faster": 3, "fault": 7, "featur": [3, 6], "few": [5, 6], "ffmpeg": 6, "fighter": 7, "file": [2, 3, 7], "filter": 6, "final": 5, "fire": [3, 5], "first": [2, 4, 5, 7], "fix": [5, 7], "folder": [1, 5], "follow": [1, 2, 5, 6], "forgot": 5, "fork": [1, 4], "form": 5, "format": 5, "found": [3, 5], "foundat": 2, "four": 5, "frame": 5, "from": [3, 4, 6, 7], "fulfil": 5, "full": [3, 4, 5, 6, 7], "fullstar": 7, "function": [3, 6, 7], "fund": 7, "furthermor": 5, "g": 5, "gae_lambda": 4, "game": [2, 3, 4, 6], "gameboi": 5, "gamegear": 5, "gameov": 5, "gameplai": 6, "gamma": 4, "gb": 5, "gba": 5, "gbadvanc": 5, "gbc": 5, "gbcolor": 5, "gcc": 2, "gcp": 7, "gear": 5, "gen": 5, "gener": 3, "genesi": [3, 4, 5, 6, 7], "get": [2, 5], "get_gam": 6, "get_kei": 6, "get_stat": 6, "getting_start": 7, "gg": 5, "git": [2, 7], "github": [2, 3, 5, 7], "give": 5, "given": [5, 6], "go": [1, 5], "goal": 5, "goe": [3, 5], "good": 5, "gpu": 3, "greater": 5, "grep": 2, "groom": 5, "ground": 5, "group": 5, "gtag": 7, "guardianlegend": 5, "gx": 5, "gym": [2, 4, 6], "gymnasium": [3, 4, 5, 7], "gzip": 5, "ha": [3, 5], "half": 6, "handl": 7, "happen": 5, "hard": 5, "hasattr": 4, "hash": [3, 5], "have": [3, 5, 6], "health": 5, "hedgehog": 6, "help": 5, "here": [3, 4, 5, 6], "hex": 5, "high": 5, "higher": 5, "hit": 5, "homebrew": 2, "hook": 7, "how": [1, 5, 6], "howev": 5, "http": 2, "human": 6, "hw": 2, "i": [1, 2, 3, 4, 5, 6], "i0": 5, "i2": 5, "ideal": 5, "ident": 5, "identifi": 3, "ignor": 5, "imag": 6, "implement": 3, "impli": 5, "import": [4, 5, 6], "impract": 5, "includ": [3, 4, 5, 6], "incorrect": 5, "incorrectli": 5, "increas": 5, "increment": 5, "individu": 5, "info": [3, 4, 5, 6], "inform": [1, 3, 5], "init": 7, "initi": 6, "initial_st": 6, "inner": 5, "input": 6, "insid": [3, 5], "instal": [1, 3, 6, 7], "instanc": 5, "instead": [5, 6], "instruct": [2, 7], "integr": [2, 6, 7], "intel": 5, "interfac": [3, 6], "intro": 3, "inttyp": [5, 6], "invalid": 5, "isn": 3, "issu": [3, 5, 7], "itself": [2, 5], "j": 2, "japan": 5, "join": 5, "joohei": 7, "json": [6, 7], "jump": 5, "just": 2, "keep": 5, "kei": [3, 5, 6], "kick": 4, "kidchameleon": 5, "kill": 5, "know": 5, "known": 5, "kombat": 7, "kwarg": [4, 6], "lambda": 4, "larg": 5, "last": 5, "later": [5, 6], "launch": 2, "learn": [3, 4, 5], "learning_r": 4, "least": 2, "left": 5, "length": 5, "less": 5, "let": [3, 4, 5], "level": [5, 6], "level1": 6, "libcapnp": 2, "libqt5opengl5": 2, "librari": [2, 4], "libzip": 7, "life": 5, "like": [2, 3, 5], "line": 7, "link": 7, "linux": 7, "list": [3, 4, 5, 6], "list_gam": [3, 5], "littl": 5, "live": 5, "ll": 5, "load": [5, 6], "local": [2, 5], "locat": 6, "log": 7, "log_interv": 4, "logo": 7, "long": 5, "longer": 5, "look": [3, 5], "lose": 5, "low": 5, "lower": 5, "lua": [2, 5], "luajit": 2, "m": [3, 6, 7], "mac": [5, 7], "machado": 3, "machin": 5, "macos_sdk_headers_for_macos_10": 2, "made": [1, 6, 7], "mai": [2, 5, 6], "main": [3, 4, 5, 6], "maintain": 4, "make": [1, 2, 3, 4, 5, 6], "make_env": 4, "make_retro": 4, "manag": 2, "mani": [3, 5], "manifest": 5, "manual": 5, "manylinux": 7, "mario": 5, "mariokart": 5, "master": 5, "match": [3, 5, 7], "matpoliquin": 7, "max_episode_step": 4, "maxim": 5, "maximum": 5, "md": [1, 7], "mean": [3, 5], "measur": 5, "mega": 5, "memori": [5, 6], "menu": 5, "metadata": 6, "method": 5, "mgoulao": 7, "middl": 5, "might": 5, "misc": 7, "miscellan": 5, "miss": 3, "mode": 5, "mode80": 7, "model": 4, "modifi": 5, "mojav": 2, "moment": 5, "moonpatrol": 7, "more": [1, 3, 4, 5, 6], "mortal": 7, "mortalkombat": 5, "most": [3, 5, 6], "movi": 6, "much": [3, 5, 6], "multi": 7, "multi_discret": 6, "multibinari": 6, "multidiscet": 6, "multipl": 5, "multipli": 5, "must": [2, 3], "mwydmuch": 7, "n": [4, 5, 6], "n2": 5, "n_epoch": 4, "n_stack": 4, "n_step": 4, "name": [5, 6], "narrow": 5, "nativ": [2, 5], "nb": 5, "ncpu": 2, "ne": 5, "nearbi": 5, "neat": 5, "nec": 5, "need": [2, 5], "neg": 5, "new": [2, 3, 4, 7], "next": 5, "nhl94": 7, "nhl941on1": 7, "nhl942on2": 7, "nice": 5, "nintendo": [4, 5], "non": [3, 5], "none": [4, 6], "nonzero": 5, "normal": 5, "note": [2, 3, 5], "notic": 5, "notif": 7, "now": [3, 6], "np": 4, "num_button": 6, "number": [5, 6], "numer": 5, "numpi": 4, "nybbl": 5, "o": [3, 5], "ob": [4, 6], "obs_typ": 6, "observ": 3, "obtain": 3, "occasion": 5, "occupi": 5, "occur": 5, "off": 5, "offici": 2, "often": [5, 6], "onaclov2000": 7, "onc": [1, 2, 3, 5], "one": [3, 5], "ones": 3, "onli": [3, 5, 6], "op": 5, "open": [2, 5], "openai": [4, 7], "oper": 3, "opt": 2, "optim": [3, 4], "option": 5, "order": 5, "org": 3, "origin": 5, "other": [3, 5], "otherwis": 5, "our": 1, "out": [2, 3, 5], "output": 6, "outsid": 5, "over": 5, "overrid": 5, "own": 6, "p": [5, 6], "p1_x": 7, "packag": [1, 2, 5], "package_data": 7, "paddl": 6, "pane": 5, "parse_arg": 4, "parser": 4, "part": 5, "particular": 5, "pass": [5, 6], "path": [2, 3, 5], "pattern": 5, "paus": 5, "pc": 5, "pce": 5, "pcengin": 5, "penalti": 5, "per": 5, "pertain": 5, "pettingzoo": 7, "piec": 5, "pip": [1, 2, 7], "pip3": [2, 3], "pkg": 2, "place": 5, "placehold": 7, "plai": [3, 5, 6], "plateform": 4, "platform": [2, 5], "playabl": 5, "playback_movi": [6, 7], "player": [5, 6, 7], "player_1_rew": 6, "player_2_rew": 6, "pleas": [1, 3, 5], "plu": 5, "point": 5, "pokemonpinbal": 5, "polici": [3, 4], "pong": [6, 7], "posit": [5, 7], "possibl": [5, 6], "power": [5, 6], "powerpc": 5, "ppo": 4, "pre": 7, "prefer": 5, "premis": 5, "present": 5, "press": [3, 6], "pretti": 5, "previou": 5, "primarili": [3, 6], "print": [3, 5], "probabl": [4, 5], "proc": 2, "process": 6, "processor": 2, "progress": [3, 5], "properli": [2, 3, 5], "properti": 5, "provid": [5, 6], "proxim": [3, 4], "pseudo": 7, "publish": 7, "put": 5, "py": [6, 7], "py311": 7, "py312": 7, "pypa": 7, "python": [3, 7], "python3": [3, 6], "q2": 5, "qemu": 7, "qt": 2, "qt5": 2, "qtbase5": 2, "queenberylscastl": 5, "quit": 3, "r": [1, 5], "ram": [5, 6, 7], "rand": 4, "random": [4, 6], "random_ag": 3, "randomst": 4, "rang": [4, 6], "rare": 5, "rather": 5, "raw": 5, "re": [2, 5], "reach": 5, "readm": 7, "rebuild": 1, "receiv": 5, "recommend": 5, "recompil": 2, "reduc": 6, "refer": 5, "reinforc": [3, 4, 5], "relat": 5, "releas": 5, "reliabl": 5, "remain": [5, 6], "remov": 7, "renam": [5, 7], "render": 3, "render_mod": 6, "replai": 5, "repo": [3, 7], "repres": 5, "requir": [1, 2, 3, 5, 6], "reset": [3, 4, 6], "respawn": 5, "respect": 3, "restart": [5, 6], "restor": 5, "result": 5, "retro": [4, 5, 6], "retro_env": 7, "retroenv": 5, "return": [4, 5], "reveal": 5, "revisit": 3, "rew": [4, 6], "reward": [3, 7], "rgb": 6, "right": 5, "rl": 3, "rnd": 7, "rng": 4, "row": 5, "run": [2, 3, 5], "safer": 5, "sai": 5, "sailormoon": 5, "same": [5, 6], "sampl": [3, 6], "saturn": 7, "save": 5, "savest": [5, 6], "scenario": [3, 4, 6], "schulman": 3, "score": 5, "screen": [3, 5, 6], "screenshot": 7, "script": [5, 6], "script_dir": 5, "seanpai96": 7, "search": [3, 5], "second": 4, "section": [3, 5, 6], "see": [3, 5, 6], "seen": 3, "sega": [4, 5, 7], "segment": 7, "select": 5, "self": 4, "sens": 5, "separ": 5, "sequenc": 3, "seri": [6, 7], "session": 5, "set": [3, 5, 6], "set_valu": 7, "setup": 7, "setuptool": 7, "sfc": 5, "sha": 3, "sha1": 5, "shift": 5, "ship": 3, "short": 5, "shorter": 5, "should": [3, 5], "show": [5, 6], "sigil": 5, "sign": 5, "silicon": 7, "similar": [4, 5], "similarli": 5, "simpl": [3, 5], "sinc": [2, 5], "singl": 5, "site": 2, "size": 5, "slightli": 5, "sm": 5, "small": 6, "smaller": 6, "sne": 5, "so": [3, 5, 6], "soldierblad": 5, "some": [3, 5, 7], "someth": 5, "sometim": 5, "sonic": 6, "sourc": [3, 5, 6], "space": 6, "special": 6, "specif": 5, "specifi": [5, 6], "sphinx": 1, "spin": 3, "split": 5, "stabl": [2, 3, 4, 5, 6], "stable_baselines3": 4, "stableretro": 1, "stand": 5, "standalon": 5, "star": 7, "start": [5, 6], "state": [4, 6, 7], "step": [3, 4, 5, 6], "stickprob": 4, "still": 5, "stochasticframeskip": 4, "store": [5, 6], "string": [5, 6], "structur": 5, "style": [4, 7], "subprocvecenv": 4, "subsect": 5, "substep": 4, "subsystem": 2, "subtract": 5, "suddenli": 5, "sudo": 2, "sum": [3, 5], "super": [4, 5], "support": [2, 3, 4, 6, 7], "supports_want_rend": 4, "sure": [2, 3, 5], "suspect": 5, "suspici": 5, "switch": 5, "symbol": 5, "sysctl": 2, "system": [2, 3, 5], "t": [3, 5], "take": [3, 5], "taken": 5, "tell": [2, 5], "temp": 7, "termin": [3, 4, 6], "test": [5, 7], "than": [5, 6], "thatguy11325": 7, "thei": [5, 6], "them": [3, 5], "themselv": 5, "thi": [1, 2, 3, 5, 6], "thing": 5, "those": [3, 5], "though": [3, 5], "thought": 7, "three": 5, "through": [2, 5], "throw": 3, "thu": 5, "time": [1, 5, 6], "time_limit": 4, "timelimit": 4, "timestep": 3, "tip": 5, "todo": 1, "togeth": 5, "too": [3, 5], "tool": [3, 7], "top": [5, 6], "total_timestep": 4, "totrew": 4, "track": 5, "train": [3, 4, 6], "transform": 5, "transpos": 5, "travi": 7, "tricki": 5, "true": [3, 6], "truncat": [3, 4, 6], "truth": 5, "try": [3, 5], "turbografx": 5, "turn": 4, "tutori": 7, "two": [5, 7], "txt": [1, 7], "type": [3, 7], "typo": 7, "u": 5, "u1": 5, "u2": 5, "u3": 5, "u4": 5, "ui": [3, 6, 7], "unabl": 5, "uncommon": 5, "undefin": 5, "uneven": 5, "uniqu": 5, "unit": 5, "unless": 5, "unreli": 5, "unsign": 5, "until": 5, "unusu": 5, "up": [3, 5], "updat": [5, 7], "upon": 5, "upper": 5, "upylib_directori": 2, "url": 5, "us": [2, 3, 4, 6, 7], "usa": 5, "use_restricted_act": 6, "user": [5, 6], "usr": 2, "usual": 5, "valid": 5, "valu": [5, 6], "var": 7, "vari": 5, "variabl": [6, 7], "variou": 5, "ve": 5, "vec_env": 4, "vecframestack": 4, "vectransposeimag": 4, "veloc": 7, "venv": 4, "verbos": 4, "veri": 5, "version": [3, 5, 7], "via": [2, 7], "victorsevero": 7, "video": [3, 4, 5], "view": 6, "viewer": 5, "virtua": 7, "wai": [3, 5], "want": [2, 3, 5, 6], "want_rend": 4, "warpfram": 4, "watch": 5, "we": 5, "websit": 7, "well": [3, 5, 6], "were": 6, "what": [3, 5, 7], "wheel": 7, "when": [3, 5, 7], "where": 6, "which": [3, 5, 6], "while": [3, 5, 6], "white": 7, "whitelist": 5, "whitespac": 7, "whl": 2, "wide": 5, "window": [5, 7], "wish": 6, "within": [2, 5], "without": [2, 5], "work": [2, 3, 5], "workflow": 7, "would": [2, 5], "wrap_deepmind": 4, "wrap_deepmind_retro": 4, "wrapper": [4, 6], "write": [5, 6], "wrong": 5, "wsl2": 2, "x": 3, "yml": 7, "you": [1, 2, 3, 4, 5, 6], "your": [1, 2, 3, 5, 6], "yourself": 3, "zbeucler2018": 7, "zero": 5, "zip": 3, "zlib1g": 2}, "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "titleterms": {"1": 7, "2": 7, "3": 7, "404": 0, "9": 7, "Not": 0, "The": [0, 5], "action": 6, "agent": 3, "api": 6, "appendix": 5, "brute": 3, "build": [1, 2], "common": 5, "condit": 5, "could": 0, "creat": 3, "custom": 5, "data": 5, "develop": 2, "doc": 1, "document": 1, "done": 5, "environ": [1, 3, 6], "error": 5, "exampl": [3, 5], "file": [5, 6], "find": 5, "found": 0, "from": [2, 5], "function": 5, "game": 5, "get": 3, "import": 3, "instal": 2, "instruct": 1, "integr": [3, 5], "interact": 3, "json": 5, "level1": 5, "linux": 2, "locat": 5, "mac": 2, "maco": 2, "md": 5, "metadata": 5, "modifi": 1, "multiplay": 6, "new": 5, "note": 7, "observ": 6, "oper": 5, "page": [0, 1], "playback": 6, "ppo": 3, "prerequisit": 2, "python": [5, 6], "random": 3, "record": 6, "releas": 7, "render": 6, "replai": 6, "request": 0, "retro": [1, 2, 3, 7], "retroenv": 6, "reward": 5, "rom": [3, 5], "scenario": 5, "script": 3, "sha": 5, "sourc": 2, "stabl": [1, 7], "start": 3, "state": 5, "support": 5, "type": 5, "ui": [2, 5], "us": 5, "usag": 3, "v0": 7, "variabl": 5, "video": 6, "window": 2}}) \ No newline at end of file